From 6b74d410cda154a44b88b072da7b29afc03601b2 Mon Sep 17 00:00:00 2001 From: zosimovaa Date: Tue, 7 Apr 2026 14:09:51 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=BE=D1=83=D1=82=D0=B5=D1=80=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82=20=D0=BD=D0=BE=D1=80?= =?UTF-8?q?=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=20=D0=B2=20process=20v2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +- _process.zip | Bin 17467 -> 31914 bytes _process/03. Intents.md | 59 ++ _process/03. RAG.md | 356 +++++++++ _process/04. Analitycs artefacts.md | 64 +- _process/05. MVP - process_v1.md | 100 +++ _process/05. MVP - process_v2.md | 220 ++++++ .../v2_intent_router_architecture.md | 269 +++++++ .../rag/architecture-overview.md | 24 +- .../rag/logic-indexing-pipeline.md | 2 - .../rag/logic-retrieval-ranking.md | 4 +- docs/intent-router-mvp.md | 32 + pipeline_setup_v3.md | 105 +++ .../req_33758fd1ed834100a23fe95871b34181.md | 171 ---- .../20260406-153629-250147960243.md | 265 +++++++ src/app/core/agent/__init__.py | 3 + src/app/core/agent/processes/__init__.py | 10 + src/app/core/agent/processes/base.py | 21 + src/app/core/agent/processes/v1/__init__.py | 3 + src/app/core/agent/processes/v1/process.py | 22 + .../agent/processes/v1/workflow/__init__.py | 3 + .../v1/workflow/flow_main/__init__.py | 7 + .../v1/workflow/flow_main/context.py | 13 + .../processes/v1/workflow/flow_main/graph.py | 24 + .../v1/workflow/flow_main/prompts.yml | 8 + .../v1/workflow/flow_main/steps/__init__.py | 9 + .../flow_main/steps/finalize_answer_step.py | 19 + .../flow_main/steps/generate_answer_step.py | 32 + .../steps/prepare_user_message_step.py | 16 + src/app/core/agent/processes/v2/__init__.py | 4 + .../core/agent/processes/v2/anchor_signals.py | 48 ++ .../agent/processes/v2/evidence/assembler.py | 226 ++++++ .../core/agent/processes/v2/evidence/gate.py | 76 ++ .../agent/processes/v2/general_prompts.yml | 8 + .../processes/v2/intent_router/__init__.py | 3 + .../processes/v2/intent_router/models.py | 17 + .../v2/intent_router/modules/__init__.py | 11 + .../v2/intent_router/modules/anchors.py | 157 ++++ .../v2/intent_router/modules/normalizer.py | 6 + .../v2/intent_router/modules/target_terms.py | 209 +++++ .../processes/v2/intent_router/router.py | 101 +++ .../v2/intent_router/routers/__init__.py | 5 + .../v2/intent_router/routers/confidence.py | 25 + .../v2/intent_router/routers/deterministic.py | 73 ++ .../routers/docs_subintent_resolver.py | 22 + .../v2/intent_router/routers/fallback.py | 86 ++ .../processes/v2/intent_router/routers/llm.py | 45 ++ .../v2/intent_router/routers/prompts.yml | 26 + .../v2/intent_router/routers/route_catalog.py | 20 + .../v2/intent_router/routers/validator.py | 34 + src/app/core/agent/processes/v2/models.py | 87 ++ src/app/core/agent/processes/v2/process.py | 357 +++++++++ src/app/core/agent/processes/v2/prompts.yml | 8 + .../agent/processes/v2/retrieval/__init__.py | 17 + .../processes/v2/retrieval/metadata_lookup.py | 66 ++ .../processes/v2/retrieval/policy_resolver.py | 118 +++ .../v2/retrieval/target_doc_seeding.py | 114 +++ .../processes/v2/retrieval/v2_rag_adapter.py | 33 + .../agent/processes/v2/workflows}/__init__.py | 0 .../docs_explain_find_files/__init__.py | 3 + .../docs_explain_find_files/context.py | 17 + .../docs_explain_find_files/graph.py | 16 + .../steps/finalize_find_files_answer_step.py | 25 + .../docs_explain_summary/__init__.py | 3 + .../workflows/docs_explain_summary/context.py | 20 + .../workflows/docs_explain_summary/graph.py | 17 + .../steps/generate_summary_answer_step.py | 68 ++ .../v2/workflows/general_summary/__init__.py | 3 + .../v2/workflows/general_summary/context.py | 19 + .../v2/workflows/general_summary/graph.py | 17 + .../generate_general_summary_answer_step.py | 57 ++ .../v2/workflows/v2_workflow_graph.py | 39 + src/app/core/agent/runtime/__init__.py | 13 + src/app/core/agent/runtime/agent_runtime.py | 107 +++ .../core/agent/runtime/execution_context.py | 20 + .../core/agent/runtime/process_registry.py | 13 + src/app/core/agent/runtime/process_runner.py | 9 + src/app/core/agent/runtime/publisher.py | 36 + src/app/core/agent/utils/__init__.py | 3 + src/app/core/agent/utils/llm/__init__.py | 4 + src/app/core/agent/utils/llm/prompt_loader.py | 43 + .../agent => core/agent/utils}/llm/service.py | 8 +- src/app/core/agent/utils/traces/__init__.py | 1 + src/app/core/agent/utils/workflow/__init__.py | 9 + src/app/core/agent/utils/workflow/context.py | 9 + src/app/core/agent/utils/workflow/graph.py | 44 ++ src/app/core/agent/utils/workflow/step.py | 22 + src/app/{modules => core}/api/__init__.py | 0 .../api/application/request_service.py | 16 +- .../application/session_bootstrap_service.py | 25 + .../core/api/application/session_service.py | 26 + .../api/application/stream_service.py | 6 +- .../api/controllers/rag_public_controller.py | 33 + .../api/controllers/request_controller.py | 4 +- .../api/controllers/session_controller.py | 23 + .../core/api/controllers/stream_controller.py | 17 + .../api/domain/events/client_event.py | 0 .../api/domain/models/agent_request.py | 0 .../core/api/domain/models/agent_session.py | 35 + .../domain/models/agent_session_message.py | 19 + .../infrastructure/ids/request_id_factory.py | 0 .../infrastructure/ids/session_id_factory.py | 0 .../stores/in_memory_request_store.py | 2 +- .../stores/in_memory_session_store.py | 2 +- .../infrastructure/streaming/replay_buffer.py | 2 +- .../infrastructure/streaming/sse_encoder.py | 2 +- .../streaming/sse_event_channel.py | 4 +- .../streaming/sse_response_builder.py | 39 + src/app/core/api/module.py | 40 + .../{modules => core}/api/public_router.py | 24 +- src/app/core/api/rag_public_router.py | 20 + src/app/core/application.py | 127 +++ src/app/{modules => core}/contracts.py | 0 src/app/{modules => core}/rag/README.md | 2 +- src/app/{modules => core}/rag/__init__.py | 2 +- src/app/core/rag/contracts/__init__.py | 17 + .../rag/contracts/documents.py | 2 +- .../{modules => core}/rag/contracts/enums.py | 1 + .../rag/contracts/evidence.py | 0 .../rag/contracts/retrieval.py | 0 .../rag/embedding/__init__.py | 2 +- .../rag/embedding/gigachat_embedder.py | 2 +- src/app/core/rag/indexing/__init__.py | 21 + .../rag/indexing/code/code_text/chunker.py | 0 .../code/code_text/document_builder.py | 6 +- .../code/edges/dataflow_document_builder.py | 6 +- .../code/edges/dataflow_slice_builder.py | 4 +- .../indexing/code/edges/document_builder.py | 6 +- .../rag/indexing/code/edges/extractor.py | 0 .../code/entrypoints/document_builder.py | 6 +- .../entrypoints/execution_trace_builder.py | 6 +- .../execution_trace_document_builder.py | 6 +- .../code/entrypoints/fastapi_detector.py | 2 +- .../code/entrypoints/flask_detector.py | 2 +- .../rag/indexing/code/entrypoints/registry.py | 0 .../code/entrypoints/typer_click_detector.py | 2 +- .../rag/indexing/code/file_filter.py | 2 +- .../rag/indexing/code/pipeline.py | 40 +- .../core/rag/indexing/code/roles/__init__.py | 9 + .../rag/indexing/code/roles/builder.py | 12 +- .../indexing/code/roles/document_builder.py | 6 +- .../rag/indexing/code/roles/models.py | 0 .../rag/indexing/code/roles/scorer.py | 10 +- .../rag/indexing/code/symbols/ast_parser.py | 0 .../indexing/code/symbols/document_builder.py | 6 +- .../rag/indexing/code/symbols/extractor.py | 0 .../rag/indexing/common/document_upserter.py | 4 +- .../rag/indexing/common/path_filter.py | 0 .../rag/indexing/common/report.py | 0 .../docs/chunkers/markdown_chunker.py | 2 +- .../indexing/docs/chunkers/text_chunker.py | 0 .../rag/indexing/docs/classifier.py | 2 +- .../core/rag/indexing/docs/content_parser.py | 61 ++ .../rag/indexing/docs/document_builder.py | 87 ++ .../rag/indexing/docs/entity_extractor.py | 0 .../rag/indexing/docs/fact_extractor.py | 0 .../rag/indexing/docs/file_filter.py | 2 +- .../rag/indexing/docs/frontmatter_parser.py | 0 .../rag/indexing/docs/frontmatter_view.py | 85 ++ .../indexing/docs/integration_extractor.py | 93 +++ .../rag/indexing/docs/models.py | 14 + .../rag/indexing/docs/pipeline.py | 49 +- .../rag/indexing/docs/relation_extractor.py | 87 ++ .../indexing/docs/support_layer_builder.py | 139 ++++ .../rag/indexing/docs/workflow_extractor.py | 16 +- .../rag => core/rag/indexing}/job_store.py | 2 +- .../rag/indexing/orchestrator.py} | 10 +- .../rag/indexing/service.py} | 17 +- src/app/core/rag/ingest_api.py | 11 + .../{modules => core}/rag/intent_router.md | 0 src/app/core/rag/module.py | 56 ++ src/app/core/rag/persistence/__init__.py | 17 + .../rag/persistence/cache_repository.py | 28 +- .../rag/persistence/document_repository.py | 2 +- .../rag/persistence/job_repository.py | 2 +- .../rag/persistence/query_repository.py | 103 ++- .../rag/persistence/repository.py | 34 +- .../retrieval_statement_builder.py | 9 +- .../rag/persistence/schema_migrator.py | 2 +- .../rag/persistence/schema_repository.py | 6 +- .../rag/persistence/schema_statements.py | 0 .../rag/persistence/session_repository.py | 2 +- .../rag/persistence}/session_store.py | 2 +- src/app/core/rag/retrieval/__init__.py | 21 + .../rag/retrieval/chunker.py | 0 .../rag/retrieval/query_terms.py | 0 .../rag/retrieval/scoring.py | 0 .../core/rag/retrieval/session_retriever.py | 97 +++ .../rag/retrieval/test_filter.py | 0 src/app/{modules => core}/shared/README.md | 14 +- src/app/{modules => core/shared}/__init__.py | 0 src/app/core/shared/config/__init__.py | 3 + .../shared/config}/env_loader.py | 0 src/app/core/shared/database/__init__.py | 13 + .../shared/database}/bootstrap.py | 2 +- .../shared/database}/checkpointer.py | 4 +- .../shared => core/shared/database}/db.py | 0 src/app/core/shared/database/readiness.py | 40 + .../shared/gigachat}/__init__.py | 0 .../shared/gigachat/client.py | 8 +- .../shared/gigachat/errors.py | 0 .../shared/gigachat/settings.py | 0 .../shared/gigachat/token_provider.py | 4 +- src/app/core/shared/messaging/__init__.py | 3 + .../shared/messaging}/event_bus.py | 0 src/app/core/shared/resilience/__init__.py | 4 + .../shared/resilience}/idempotency_store.py | 8 +- .../shared/resilience}/retry_executor.py | 2 +- src/app/core/shared/story_context/__init__.py | 3 + .../shared/story_context/schema_repository.py | 126 +++ src/app/{modules/shared => infra}/__init__.py | 0 src/app/{core => infra}/constants.py | 0 src/app/{core => infra}/error_handlers.py | 10 +- src/app/{core => infra}/exceptions.py | 0 src/app/{core => infra}/logging_setup.py | 0 src/app/infra/observability/__init__.py | 13 + .../observability/module_trace.py | 0 .../observability}/request_trace_logger.py | 66 +- .../observability/trace_file_path_builder.py | 21 + .../observability}/trace_markdown_writer.py | 0 src/app/main.py | 12 +- src/app/modules/agent/README.md | 37 - .../agent/intent_router_v2/__init__.py | 19 - .../intent_router_v2/analysis/__init__.py | 4 - .../analysis/ambiguity_detector.py | 64 -- .../analysis/anchor_extractor.py | 144 ---- .../analysis/anchor_span_validator.py | 22 - .../analysis/conversation_anchor_builder.py | 61 -- .../analysis/docs_query_signals.py | 75 -- .../analysis/docs_sub_intent_detector.py | 161 ---- .../analysis/followup_detector.py | 22 - .../analysis/keyword_hint_builder.py | 34 - .../analysis/keyword_hint_sanitizer.py | 50 -- .../analysis/negation_detector.py | 17 - .../analysis/normalization.py | 57 -- .../analysis/normalization_terms.py | 48 -- .../analysis/query_normalizer.py | 3 - .../analysis/query_plan_builder.py | 319 -------- .../analysis/sub_intent_detector.py | 116 --- .../intent_router_v2/analysis/symbol_rules.py | 51 -- .../intent_router_v2/analysis/term_mapping.py | 67 -- .../intent_router_v2/analysis/test_signals.py | 40 - .../modules/agent/intent_router_v2/factory.py | 27 - .../agent/intent_router_v2/intent/__init__.py | 5 - .../intent_router_v2/intent/classifier.py | 248 ------ .../intent/conversation_policy.py | 73 -- .../intent/graph_id_resolver.py | 18 - .../intent/llm_disambiguator.py | 55 -- .../agent/intent_router_v2/local_runner.py | 25 - .../modules/agent/intent_router_v2/logger.py | 24 - .../modules/agent/intent_router_v2/models.py | 250 ------ .../agent/intent_router_v2/protocols.py | 7 - .../modules/agent/intent_router_v2/readme.md | 37 - .../retrieval_planning/__init__.py | 4 - .../evidence_policy_factory.py | 41 - .../retrieval_planning/layer_query_builder.py | 29 - .../retrieval_constraints_factory.py | 118 --- .../retrieval_filter_builder.py | 120 --- .../retrieval_spec_factory.py | 227 ------ .../modules/agent/intent_router_v2/router.py | 186 ----- src/app/modules/agent/llm/__init__.py | 4 - src/app/modules/agent/llm/prompt_loader.py | 27 - src/app/modules/agent/llm/prompts.yml | 386 --------- .../adapters/intent_router_adapter.py | 24 - .../adapters/llm_chat_adapter.py | 32 - .../adapters/task_runtime_adapter.py | 44 -- .../context/execution_context.py | 22 - src/app/modules/agent/orchestration/facade.py | 72 -- .../messaging/client_message_publisher.py | 24 - .../messaging/status_message_factory.py | 15 - .../messaging/user_message_factory.py | 15 - .../agent/orchestration/processes/registry.py | 14 - .../orchestration/processes/v1/process.py | 9 - .../processes/v1/prompt_payload_builder.py | 11 - .../orchestration/processes/v1/prompts.yml | 12 - .../processes/v1/simple_llm_workflow.py | 42 - .../processes/v1/steps/bootstrap_step.py | 23 - .../v1/steps/execute_llm_workflow_step.py | 35 - .../processes/v1/steps/finalize_step.py | 20 - .../processes/v1/steps/run_llm_step.py | 26 - .../orchestration/processes/v2/README.md | 189 ----- .../orchestration/processes/v2/process.py | 9 - .../processes/v2/prompt_payload_builder.py | 35 - .../processes/v2/prompt_selector.py | 18 - .../orchestration/processes/v2/prompts.yml | 96 --- .../execute_documentation_workflow_step.py | 7 - .../steps/execute_fallback_workflow_step.py | 18 - .../steps/execute_general_qa_workflow_step.py | 7 - .../v2/steps/execute_openapi_workflow_step.py | 7 - .../processes/v2/steps/route_intent_step.py | 71 -- .../v2/steps/run_task_workflow_step.py | 30 - .../processes/v2/steps/workflow_step_base.py | 68 -- .../orchestration/runtime/process_runner.py | 12 - .../agent/orchestration/v2_progress.py | 17 - src/app/modules/agent/runtime/__init__.py | 22 - .../agent/runtime/code_qa_runner_adapter.py | 70 -- .../runtime/docs_qa_pipeline/__init__.py | 9 - .../docs_qa_pipeline/anchor_selector.py | 56 -- .../docs_qa_pipeline/answer_synthesizer.py | 43 - .../docs_qa_pipeline/diagnostics_builder.py | 259 ------ .../runtime/docs_qa_pipeline/doc_identity.py | 47 -- .../docs_qa_pipeline/evidence_builder.py | 91 --- .../docs_qa_pipeline/exact_anchor_matcher.py | 117 --- .../agent/runtime/docs_qa_pipeline/models.py | 114 --- .../openapi_evidence_extractor.py | 187 ----- .../docs_qa_pipeline/openapi_generator.py | 161 ---- .../docs_qa_pipeline/openapi_postprocessor.py | 37 - .../runtime/docs_qa_pipeline/pipeline.py | 702 ---------------- .../prompt_payload_builder.py | 35 - src/app/modules/agent/runtime/executor.py | 492 ------------ .../modules/agent/runtime/legacy_pipeline.py | 232 ------ src/app/modules/agent/runtime/models.py | 60 -- .../runtime/steps/answer_policy/__init__.py | 6 - .../runtime/steps/answer_policy/policy.py | 73 -- .../answer_policy/short_answer_formatter.py | 35 - .../agent/runtime/steps/context/__init__.py | 35 - .../steps/context/answer_fact_curator.py | 345 -------- .../runtime/steps/context/answer_synthesis.py | 71 -- .../agent/runtime/steps/context/contracts.py | 146 ---- .../runtime/steps/context/diagnostics.py | 135 ---- .../steps/context/evidence_bundle_builder.py | 57 -- .../context/retrieval_request_builder.py | 24 - .../steps/context/retrieval_result_builder.py | 241 ------ .../agent/runtime/steps/explain/__init__.py | 36 - .../agent/runtime/steps/explain/budgeter.py | 62 -- .../runtime/steps/explain/excerpt_planner.py | 59 -- .../runtime/steps/explain/graph_repository.py | 216 ----- .../runtime/steps/explain/intent_builder.py | 102 --- .../runtime/steps/explain/layered_gateway.py | 289 ------- .../agent/runtime/steps/explain/models.py | 91 --- .../runtime/steps/explain/retriever_v2.py | 328 -------- .../steps/explain/source_excerpt_fetcher.py | 53 -- .../runtime/steps/explain/trace_builder.py | 102 --- .../runtime/steps/finalization/__init__.py | 6 - .../runtime/steps/finalization/repair.py | 68 -- .../steps/finalization/result_assembler.py | 79 -- .../agent/runtime/steps/gates/__init__.py | 11 - .../runtime/steps/gates/post/__init__.py | 5 - .../runtime/steps/gates/post/post_gate.py | 287 ------- .../agent/runtime/steps/gates/pre/__init__.py | 5 - .../runtime/steps/gates/pre/evidence_gate.py | 72 -- .../runtime/steps/generation/__init__.py | 11 - .../runtime/steps/generation/generator.py | 18 - .../generation/prompt_payload_builder.py | 140 ---- .../steps/generation/prompt_selector.py | 32 - .../agent/runtime/steps/retrieval/__init__.py | 6 - .../agent/runtime/steps/retrieval/adapter.py | 337 -------- .../runtime/steps/retrieval/repo_context.py | 40 - .../agent/runtime/story_context_repository.py | 747 ------------------ .../modules/agent/task_runtime/__init__.py | 13 - src/app/modules/agent/task_runtime/context.py | 47 -- .../modules/agent/task_runtime/dispatcher.py | 37 - .../modules/agent/task_runtime/enrichment.py | 35 - src/app/modules/agent/task_runtime/facade.py | 92 --- src/app/modules/agent/task_runtime/models.py | 35 - .../agent/task_runtime/status_events.py | 28 - .../modules/agent/task_runtime/templates.py | 31 - .../agent/task_runtime/workflows/__init__.py | 11 - .../agent/task_runtime/workflows/base.py | 11 - .../task_runtime/workflows/docs_generation.py | 82 -- .../agent/task_runtime/workflows/docs_qa.py | 93 --- .../agent/task_runtime/workflows/fallback.py | 69 -- .../task_runtime/workflows/general_qa.py | 67 -- .../agent/task_runtime/workflows/openapi.py | 76 -- .../api/application/session_service.py | 45 -- .../api/controllers/session_controller.py | 39 - .../api/controllers/stream_controller.py | 37 - .../api/domain/models/agent_session.py | 22 - .../logging/trace_file_path_builder.py | 15 - src/app/modules/api/module.py | 30 - src/app/modules/application.py | 148 ---- src/app/modules/rag/contracts/__init__.py | 17 - .../rag/indexing/code/roles/__init__.py | 9 - .../rag/indexing/docs/content_parser.py | 58 -- .../rag/indexing/docs/document_builder.py | 153 ---- .../rag/indexing/docs/relation_extractor.py | 23 - src/app/modules/rag/module.py | 294 ------- src/app/modules/rag/webhook_service.py | 219 ----- src/app/modules/shared/gigachat/__init__.py | 0 src/app/schemas/agent_api.py | 27 +- src/app/schemas/rag_sessions.py | 19 +- .../conftest.cpython-312-pytest-9.0.2.pyc | Bin 873 -> 873 bytes tests/docs_qa_eval/fixture_adapter.py | 24 +- tests/docs_qa_eval/runner.py | 4 +- .../full_chain_docs_v2_matrix.yaml | 421 ++++++++++ .../router_only_docs_v2_matrix.yaml | 244 ++++++ tests/pipeline_setup_v3/cli/index_repo.py | 2 +- tests/pipeline_setup_v3/core/case_loader.py | 3 + tests/pipeline_setup_v3/core/models.py | 3 +- tests/pipeline_setup_v3/core/runner.py | 17 +- .../core/session_provider.py | 2 +- tests/pipeline_setup_v3/core/validators.py | 1 + tests/pipeline_setup_v3/run.py | 7 + tests/pipeline_setup_v3/runtime/__init__.py | 7 +- .../runtime/agent_runtime_adapter.py | 30 +- .../runtime/v2_process_adapter.py | 420 ++++++++++ tests/pipeline_setup_v3/shared/env_loader.py | 2 +- tests/pipeline_setup_v3/shared/rag_indexer.py | 6 +- ...s_v2_matrix_v2-docs-summary-01-health.json | 43 + ...ocs_v2_matrix_v2-docs-summary-01-health.md | 51 ++ ...ocs_v2_matrix_v2-docs-summary-02-send.json | 43 + ..._docs_v2_matrix_v2-docs-summary-02-send.md | 51 ++ ..._v2_matrix_v2-docs-summary-03-actions.json | 30 + ...cs_v2_matrix_v2-docs-summary-03-actions.md | 38 + ...rix_v2-docs-summary-04-runtime-health.json | 30 + ...atrix_v2-docs-summary-04-runtime-health.md | 38 + ..._v2-docs-summary-05-notification-loop.json | 33 + ...ix_v2-docs-summary-05-notification-loop.md | 41 + ...atrix_v2-docs-summary-06-architecture.json | 32 + ..._matrix_v2-docs-summary-06-architecture.md | 40 + ...s_v2_matrix_v2-docs-summary-07-worker.json | 32 + ...ocs_v2_matrix_v2-docs-summary-07-worker.md | 40 + ...ix_v2-docs-summary-08-health-statuses.json | 47 ++ ...trix_v2-docs-summary-08-health-statuses.md | 55 ++ ...matrix_v2-docs-summary-09-manual-send.json | 33 + ...2_matrix_v2-docs-summary-09-manual-send.md | 41 + ...-docs-summary-10-telegram-integration.json | 34 + ...v2-docs-summary-10-telegram-integration.md | 42 + ...ocs_v2_matrix_v2-find-files-01-health.json | 42 + ..._docs_v2_matrix_v2-find-files-01-health.md | 50 ++ ..._docs_v2_matrix_v2-find-files-02-send.json | 42 + ...in_docs_v2_matrix_v2-find-files-02-send.md | 50 ++ ...cs_v2_matrix_v2-find-files-03-actions.json | 42 + ...docs_v2_matrix_v2-find-files-03-actions.md | 50 ++ ...atrix_v2-find-files-04-runtime-health.json | 42 + ..._matrix_v2-find-files-04-runtime-health.md | 50 ++ ..._docs_v2_matrix_v2-find-files-05-loop.json | 42 + ...in_docs_v2_matrix_v2-find-files-05-loop.md | 50 ++ ..._matrix_v2-find-files-06-architecture.json | 40 + ...v2_matrix_v2-find-files-06-architecture.md | 50 ++ ...atrix_v2-find-files-07-errors-catalog.json | 42 + ..._matrix_v2-find-files-07-errors-catalog.md | 50 ++ ...v2_matrix_v2-find-files-08-docs-index.json | 40 + ...s_v2_matrix_v2-find-files-08-docs-index.md | 50 ++ ...rix_v2-find-files-09-telegram-bot-api.json | 43 + ...atrix_v2-find-files-09-telegram-bot-api.md | 51 ++ ...-find-files-10-telegram-notify-worker.json | 43 + ...v2-find-files-10-telegram-notify-worker.md | 51 ++ ..._matrix_v2-general-01-what-is-service.json | 27 + ...v2_matrix_v2-general-01-what-is-service.md | 35 + ..._docs_v2_matrix_v2-general-02-purpose.json | 25 + ...in_docs_v2_matrix_v2-general-02-purpose.md | 35 + ..._docs_v2_matrix_v2-general-03-problem.json | 27 + ...in_docs_v2_matrix_v2-general-03-problem.md | 35 + ...v2_matrix_v2-general-04-docs-contents.json | 43 + ...s_v2_matrix_v2-general-04-docs-contents.md | 51 ++ ...cs_v2_matrix_v2-general-05-main-parts.json | 27 + ...docs_v2_matrix_v2-general-05-main-parts.md | 35 + ...v2-general-06-high-level-architecture.json | 25 + ...x_v2-general-06-high-level-architecture.md | 35 + ...s_v2_matrix_v2-general-07-besides-api.json | 25 + ...ocs_v2_matrix_v2-general-07-besides-api.md | 35 + ...cs_v2_matrix_v2-general-08-components.json | 25 + ...docs_v2_matrix_v2-general-08-components.md | 35 + ...v2_matrix_v2-general-09-reading-order.json | 45 ++ ...s_v2_matrix_v2-general-09-reading-order.md | 53 ++ ...v2_matrix_v2-general-10-short-summary.json | 25 + ...s_v2_matrix_v2-general-10-short-summary.md | 35 + .../20260406_194106/summary.md | 153 ++++ ...s_v2_matrix_v2-docs-summary-01-health.json | 153 ++++ ...ocs_v2_matrix_v2-docs-summary-01-health.md | 186 +++++ ...ocs_v2_matrix_v2-docs-summary-02-send.json | 152 ++++ ..._docs_v2_matrix_v2-docs-summary-02-send.md | 185 +++++ ..._v2_matrix_v2-docs-summary-03-actions.json | 153 ++++ ...cs_v2_matrix_v2-docs-summary-03-actions.md | 186 +++++ ...rix_v2-docs-summary-04-runtime-health.json | 139 ++++ ...atrix_v2-docs-summary-04-runtime-health.md | 172 ++++ ..._v2-docs-summary-05-notification-loop.json | 143 ++++ ...ix_v2-docs-summary-05-notification-loop.md | 176 +++++ ...atrix_v2-docs-summary-06-architecture.json | 124 +++ ..._matrix_v2-docs-summary-06-architecture.md | 159 ++++ ...s_v2_matrix_v2-docs-summary-07-worker.json | 129 +++ ...ocs_v2_matrix_v2-docs-summary-07-worker.md | 162 ++++ ...ix_v2-docs-summary-08-health-statuses.json | 143 ++++ ...trix_v2-docs-summary-08-health-statuses.md | 176 +++++ ...matrix_v2-docs-summary-09-manual-send.json | 151 ++++ ...2_matrix_v2-docs-summary-09-manual-send.md | 184 +++++ ...-docs-summary-10-telegram-integration.json | 127 +++ ...v2-docs-summary-10-telegram-integration.md | 160 ++++ ...ocs_v2_matrix_v2-find-files-01-health.json | 137 ++++ ..._docs_v2_matrix_v2-find-files-01-health.md | 170 ++++ ..._docs_v2_matrix_v2-find-files-02-send.json | 137 ++++ ...in_docs_v2_matrix_v2-find-files-02-send.md | 170 ++++ ...cs_v2_matrix_v2-find-files-03-actions.json | 139 ++++ ...docs_v2_matrix_v2-find-files-03-actions.md | 172 ++++ ...atrix_v2-find-files-04-runtime-health.json | 141 ++++ ..._matrix_v2-find-files-04-runtime-health.md | 174 ++++ ..._docs_v2_matrix_v2-find-files-05-loop.json | 125 +++ ...in_docs_v2_matrix_v2-find-files-05-loop.md | 158 ++++ ..._matrix_v2-find-files-06-architecture.json | 134 ++++ ...v2_matrix_v2-find-files-06-architecture.md | 167 ++++ ...atrix_v2-find-files-07-errors-catalog.json | 125 +++ ..._matrix_v2-find-files-07-errors-catalog.md | 158 ++++ ...v2_matrix_v2-find-files-08-docs-index.json | 124 +++ ...s_v2_matrix_v2-find-files-08-docs-index.md | 157 ++++ ...rix_v2-find-files-09-telegram-bot-api.json | 126 +++ ...atrix_v2-find-files-09-telegram-bot-api.md | 159 ++++ ...-find-files-10-telegram-notify-worker.json | 126 +++ ...v2-find-files-10-telegram-notify-worker.md | 159 ++++ ..._matrix_v2-general-01-what-is-service.json | 122 +++ ...v2_matrix_v2-general-01-what-is-service.md | 157 ++++ ..._docs_v2_matrix_v2-general-02-purpose.json | 122 +++ ...in_docs_v2_matrix_v2-general-02-purpose.md | 157 ++++ ..._docs_v2_matrix_v2-general-03-problem.json | 122 +++ ...in_docs_v2_matrix_v2-general-03-problem.md | 157 ++++ ...v2_matrix_v2-general-04-docs-contents.json | 122 +++ ...s_v2_matrix_v2-general-04-docs-contents.md | 157 ++++ ...cs_v2_matrix_v2-general-05-main-parts.json | 124 +++ ...docs_v2_matrix_v2-general-05-main-parts.md | 157 ++++ ...v2-general-06-high-level-architecture.json | 124 +++ ...x_v2-general-06-high-level-architecture.md | 157 ++++ ...s_v2_matrix_v2-general-07-besides-api.json | 122 +++ ...ocs_v2_matrix_v2-general-07-besides-api.md | 157 ++++ ...cs_v2_matrix_v2-general-08-components.json | 129 +++ ...docs_v2_matrix_v2-general-08-components.md | 162 ++++ ...v2_matrix_v2-general-09-reading-order.json | 124 +++ ...s_v2_matrix_v2-general-09-reading-order.md | 157 ++++ ...v2_matrix_v2-general-10-short-summary.json | 122 +++ ...s_v2_matrix_v2-general-10-short-summary.md | 157 ++++ .../20260406_201415/summary.md | 153 ++++ ...s_v2_matrix_v2-docs-summary-01-health.json | 189 +++++ ...ocs_v2_matrix_v2-docs-summary-01-health.md | 226 ++++++ ...ocs_v2_matrix_v2-docs-summary-02-send.json | 172 ++++ ..._docs_v2_matrix_v2-docs-summary-02-send.md | 205 +++++ ..._v2_matrix_v2-docs-summary-03-actions.json | 189 +++++ ...cs_v2_matrix_v2-docs-summary-03-actions.md | 226 ++++++ ...rix_v2-docs-summary-04-runtime-health.json | 175 ++++ ...atrix_v2-docs-summary-04-runtime-health.md | 212 +++++ ..._v2-docs-summary-05-notification-loop.json | 196 +++++ ...ix_v2-docs-summary-05-notification-loop.md | 237 ++++++ ...atrix_v2-docs-summary-06-architecture.json | 195 +++++ ..._matrix_v2-docs-summary-06-architecture.md | 238 ++++++ ...s_v2_matrix_v2-docs-summary-07-worker.json | 175 ++++ ...ocs_v2_matrix_v2-docs-summary-07-worker.md | 212 +++++ ...ix_v2-docs-summary-08-health-statuses.json | 179 +++++ ...trix_v2-docs-summary-08-health-statuses.md | 216 +++++ ...matrix_v2-docs-summary-09-manual-send.json | 187 +++++ ...2_matrix_v2-docs-summary-09-manual-send.md | 224 ++++++ ...-docs-summary-10-telegram-integration.json | 188 +++++ ...v2-docs-summary-10-telegram-integration.md | 229 ++++++ ...ocs_v2_matrix_v2-find-files-01-health.json | 196 +++++ ..._docs_v2_matrix_v2-find-files-01-health.md | 237 ++++++ ..._docs_v2_matrix_v2-find-files-02-send.json | 196 +++++ ...in_docs_v2_matrix_v2-find-files-02-send.md | 237 ++++++ ...cs_v2_matrix_v2-find-files-03-actions.json | 198 +++++ ...docs_v2_matrix_v2-find-files-03-actions.md | 239 ++++++ ...atrix_v2-find-files-04-runtime-health.json | 177 +++++ ..._matrix_v2-find-files-04-runtime-health.md | 214 +++++ ..._docs_v2_matrix_v2-find-files-05-loop.json | 194 +++++ ...in_docs_v2_matrix_v2-find-files-05-loop.md | 235 ++++++ ..._matrix_v2-find-files-06-architecture.json | 176 +++++ ...v2_matrix_v2-find-files-06-architecture.md | 213 +++++ ...atrix_v2-find-files-07-errors-catalog.json | 186 +++++ ..._matrix_v2-find-files-07-errors-catalog.md | 227 ++++++ ...v2_matrix_v2-find-files-08-docs-index.json | 185 +++++ ...s_v2_matrix_v2-find-files-08-docs-index.md | 226 ++++++ ...rix_v2-find-files-09-telegram-bot-api.json | 187 +++++ ...atrix_v2-find-files-09-telegram-bot-api.md | 228 ++++++ ...-find-files-10-telegram-notify-worker.json | 195 +++++ ...v2-find-files-10-telegram-notify-worker.md | 236 ++++++ ..._matrix_v2-general-01-what-is-service.json | 183 +++++ ...v2_matrix_v2-general-01-what-is-service.md | 226 ++++++ ..._docs_v2_matrix_v2-general-02-purpose.json | 183 +++++ ...in_docs_v2_matrix_v2-general-02-purpose.md | 226 ++++++ ..._docs_v2_matrix_v2-general-03-problem.json | 183 +++++ ...in_docs_v2_matrix_v2-general-03-problem.md | 226 ++++++ ...v2_matrix_v2-general-04-docs-contents.json | 183 +++++ ...s_v2_matrix_v2-general-04-docs-contents.md | 226 ++++++ ...cs_v2_matrix_v2-general-05-main-parts.json | 185 +++++ ...docs_v2_matrix_v2-general-05-main-parts.md | 226 ++++++ ...v2-general-06-high-level-architecture.json | 185 +++++ ...x_v2-general-06-high-level-architecture.md | 226 ++++++ ...s_v2_matrix_v2-general-07-besides-api.json | 183 +++++ ...ocs_v2_matrix_v2-general-07-besides-api.md | 226 ++++++ ...cs_v2_matrix_v2-general-08-components.json | 198 +++++ ...docs_v2_matrix_v2-general-08-components.md | 239 ++++++ ...v2_matrix_v2-general-09-reading-order.json | 185 +++++ ...s_v2_matrix_v2-general-09-reading-order.md | 226 ++++++ ...v2_matrix_v2-general-10-short-summary.json | 183 +++++ ...s_v2_matrix_v2-general-10-short-summary.md | 226 ++++++ .../20260406_202730/summary.md | 153 ++++ ...s_v2_matrix_v2-docs-summary-01-health.json | 295 +++++++ ...ocs_v2_matrix_v2-docs-summary-01-health.md | 344 ++++++++ ...ocs_v2_matrix_v2-docs-summary-02-send.json | 259 ++++++ ..._docs_v2_matrix_v2-docs-summary-02-send.md | 304 +++++++ ..._v2_matrix_v2-docs-summary-03-actions.json | 299 +++++++ ...cs_v2_matrix_v2-docs-summary-03-actions.md | 348 ++++++++ ...rix_v2-docs-summary-04-runtime-health.json | 285 +++++++ ...atrix_v2-docs-summary-04-runtime-health.md | 334 ++++++++ ..._v2-docs-summary-05-notification-loop.json | 330 ++++++++ ...ix_v2-docs-summary-05-notification-loop.md | 383 +++++++++ ...atrix_v2-docs-summary-06-architecture.json | 390 +++++++++ ..._matrix_v2-docs-summary-06-architecture.md | 445 +++++++++++ ...s_v2_matrix_v2-docs-summary-07-worker.json | 281 +++++++ ...ocs_v2_matrix_v2-docs-summary-07-worker.md | 330 ++++++++ ...ix_v2-docs-summary-08-health-statuses.json | 289 +++++++ ...trix_v2-docs-summary-08-health-statuses.md | 338 ++++++++ ...matrix_v2-docs-summary-09-manual-send.json | 297 +++++++ ...2_matrix_v2-docs-summary-09-manual-send.md | 346 ++++++++ ...-docs-summary-10-telegram-integration.json | 338 ++++++++ ...v2-docs-summary-10-telegram-integration.md | 391 +++++++++ ...ocs_v2_matrix_v2-find-files-01-health.json | 298 +++++++ ..._docs_v2_matrix_v2-find-files-01-health.md | 351 ++++++++ ..._docs_v2_matrix_v2-find-files-02-send.json | 298 +++++++ ...in_docs_v2_matrix_v2-find-files-02-send.md | 351 ++++++++ ...cs_v2_matrix_v2-find-files-03-actions.json | 304 +++++++ ...docs_v2_matrix_v2-find-files-03-actions.md | 357 +++++++++ ...atrix_v2-find-files-04-runtime-health.json | 302 +++++++ ..._matrix_v2-find-files-04-runtime-health.md | 355 +++++++++ ..._docs_v2_matrix_v2-find-files-05-loop.json | 296 +++++++ ...in_docs_v2_matrix_v2-find-files-05-loop.md | 349 ++++++++ ..._matrix_v2-find-files-06-architecture.json | 344 ++++++++ ...v2_matrix_v2-find-files-06-architecture.md | 399 ++++++++++ ...atrix_v2-find-files-07-errors-catalog.json | 302 +++++++ ..._matrix_v2-find-files-07-errors-catalog.md | 355 +++++++++ ...v2_matrix_v2-find-files-08-docs-index.json | 314 ++++++++ ...s_v2_matrix_v2-find-files-08-docs-index.md | 369 +++++++++ ...rix_v2-find-files-09-telegram-bot-api.json | 288 +++++++ ...atrix_v2-find-files-09-telegram-bot-api.md | 341 ++++++++ ...-find-files-10-telegram-notify-worker.json | 304 +++++++ ...v2-find-files-10-telegram-notify-worker.md | 357 +++++++++ ..._matrix_v2-general-01-what-is-service.json | 326 ++++++++ ...v2_matrix_v2-general-01-what-is-service.md | 381 +++++++++ ..._docs_v2_matrix_v2-general-02-purpose.json | 339 ++++++++ ...in_docs_v2_matrix_v2-general-02-purpose.md | 394 +++++++++ ..._docs_v2_matrix_v2-general-03-problem.json | 326 ++++++++ ...in_docs_v2_matrix_v2-general-03-problem.md | 381 +++++++++ ...v2_matrix_v2-general-04-docs-contents.json | 326 ++++++++ ...s_v2_matrix_v2-general-04-docs-contents.md | 381 +++++++++ ...cs_v2_matrix_v2-general-05-main-parts.json | 328 ++++++++ ...docs_v2_matrix_v2-general-05-main-parts.md | 381 +++++++++ ...v2-general-06-high-level-architecture.json | 328 ++++++++ ...x_v2-general-06-high-level-architecture.md | 381 +++++++++ ...s_v2_matrix_v2-general-07-besides-api.json | 326 ++++++++ ...ocs_v2_matrix_v2-general-07-besides-api.md | 381 +++++++++ ...cs_v2_matrix_v2-general-08-components.json | 389 +++++++++ ...docs_v2_matrix_v2-general-08-components.md | 442 +++++++++++ ...v2_matrix_v2-general-09-reading-order.json | 328 ++++++++ ...s_v2_matrix_v2-general-09-reading-order.md | 381 +++++++++ ...v2_matrix_v2-general-10-short-summary.json | 326 ++++++++ ...s_v2_matrix_v2-general-10-short-summary.md | 381 +++++++++ .../20260406_212743/summary.md | 151 ++++ ...s_v2_matrix_v2-docs-summary-01-health.json | 306 +++++++ ...ocs_v2_matrix_v2-docs-summary-01-health.md | 355 +++++++++ ...ocs_v2_matrix_v2-docs-summary-02-send.json | 270 +++++++ ..._docs_v2_matrix_v2-docs-summary-02-send.md | 315 ++++++++ ..._v2_matrix_v2-docs-summary-03-actions.json | 310 ++++++++ ...cs_v2_matrix_v2-docs-summary-03-actions.md | 359 +++++++++ ...rix_v2-docs-summary-04-runtime-health.json | 296 +++++++ ...atrix_v2-docs-summary-04-runtime-health.md | 345 ++++++++ ..._v2-docs-summary-05-notification-loop.json | 341 ++++++++ ...ix_v2-docs-summary-05-notification-loop.md | 394 +++++++++ ...atrix_v2-docs-summary-06-architecture.json | 416 ++++++++++ ..._matrix_v2-docs-summary-06-architecture.md | 471 +++++++++++ ...s_v2_matrix_v2-docs-summary-07-worker.json | 292 +++++++ ...ocs_v2_matrix_v2-docs-summary-07-worker.md | 341 ++++++++ ...ix_v2-docs-summary-08-health-statuses.json | 300 +++++++ ...trix_v2-docs-summary-08-health-statuses.md | 349 ++++++++ ...matrix_v2-docs-summary-09-manual-send.json | 308 ++++++++ ...2_matrix_v2-docs-summary-09-manual-send.md | 357 +++++++++ ...-docs-summary-10-telegram-integration.json | 351 ++++++++ ...v2-docs-summary-10-telegram-integration.md | 404 ++++++++++ ...ocs_v2_matrix_v2-find-files-01-health.json | 308 ++++++++ ..._docs_v2_matrix_v2-find-files-01-health.md | 361 +++++++++ ..._docs_v2_matrix_v2-find-files-02-send.json | 308 ++++++++ ...in_docs_v2_matrix_v2-find-files-02-send.md | 361 +++++++++ ...cs_v2_matrix_v2-find-files-03-actions.json | 314 ++++++++ ...docs_v2_matrix_v2-find-files-03-actions.md | 367 +++++++++ ...atrix_v2-find-files-04-runtime-health.json | 312 ++++++++ ..._matrix_v2-find-files-04-runtime-health.md | 365 +++++++++ ..._docs_v2_matrix_v2-find-files-05-loop.json | 306 +++++++ ...in_docs_v2_matrix_v2-find-files-05-loop.md | 359 +++++++++ ..._matrix_v2-find-files-06-architecture.json | 412 ++++++++++ ...v2_matrix_v2-find-files-06-architecture.md | 467 +++++++++++ ...atrix_v2-find-files-07-errors-catalog.json | 312 ++++++++ ..._matrix_v2-find-files-07-errors-catalog.md | 365 +++++++++ ...v2_matrix_v2-find-files-08-docs-index.json | 399 ++++++++++ ...s_v2_matrix_v2-find-files-08-docs-index.md | 454 +++++++++++ ...rix_v2-find-files-09-telegram-bot-api.json | 296 +++++++ ...atrix_v2-find-files-09-telegram-bot-api.md | 349 ++++++++ ...-find-files-10-telegram-notify-worker.json | 314 ++++++++ ...v2-find-files-10-telegram-notify-worker.md | 367 +++++++++ ..._matrix_v2-general-01-what-is-service.json | 339 ++++++++ ...v2_matrix_v2-general-01-what-is-service.md | 394 +++++++++ ..._docs_v2_matrix_v2-general-02-purpose.json | 352 +++++++++ ...in_docs_v2_matrix_v2-general-02-purpose.md | 407 ++++++++++ ..._docs_v2_matrix_v2-general-03-problem.json | 339 ++++++++ ...in_docs_v2_matrix_v2-general-03-problem.md | 394 +++++++++ ...v2_matrix_v2-general-04-docs-contents.json | 339 ++++++++ ...s_v2_matrix_v2-general-04-docs-contents.md | 394 +++++++++ ...cs_v2_matrix_v2-general-05-main-parts.json | 341 ++++++++ ...docs_v2_matrix_v2-general-05-main-parts.md | 394 +++++++++ ...v2-general-06-high-level-architecture.json | 341 ++++++++ ...x_v2-general-06-high-level-architecture.md | 394 +++++++++ ...s_v2_matrix_v2-general-07-besides-api.json | 339 ++++++++ ...ocs_v2_matrix_v2-general-07-besides-api.md | 394 +++++++++ ...cs_v2_matrix_v2-general-08-components.json | 415 ++++++++++ ...docs_v2_matrix_v2-general-08-components.md | 468 +++++++++++ ...v2_matrix_v2-general-09-reading-order.json | 341 ++++++++ ...s_v2_matrix_v2-general-09-reading-order.md | 394 +++++++++ ...v2_matrix_v2-general-10-short-summary.json | 339 ++++++++ ...s_v2_matrix_v2-general-10-short-summary.md | 394 +++++++++ .../20260406_215439/summary.md | 151 ++++ ...s_v2_matrix_v2-docs-summary-01-health.json | 311 ++++++++ ...ocs_v2_matrix_v2-docs-summary-01-health.md | 360 +++++++++ ...ocs_v2_matrix_v2-docs-summary-02-send.json | 275 +++++++ ..._docs_v2_matrix_v2-docs-summary-02-send.md | 320 ++++++++ ..._v2_matrix_v2-docs-summary-03-actions.json | 315 ++++++++ ...cs_v2_matrix_v2-docs-summary-03-actions.md | 364 +++++++++ ...rix_v2-docs-summary-04-runtime-health.json | 301 +++++++ ...atrix_v2-docs-summary-04-runtime-health.md | 350 ++++++++ ..._v2-docs-summary-05-notification-loop.json | 346 ++++++++ ...ix_v2-docs-summary-05-notification-loop.md | 399 ++++++++++ ...atrix_v2-docs-summary-06-architecture.json | 421 ++++++++++ ..._matrix_v2-docs-summary-06-architecture.md | 476 +++++++++++ ...s_v2_matrix_v2-docs-summary-07-worker.json | 297 +++++++ ...ocs_v2_matrix_v2-docs-summary-07-worker.md | 346 ++++++++ ...ix_v2-docs-summary-08-health-statuses.json | 305 +++++++ ...trix_v2-docs-summary-08-health-statuses.md | 354 +++++++++ ...matrix_v2-docs-summary-09-manual-send.json | 313 ++++++++ ...2_matrix_v2-docs-summary-09-manual-send.md | 362 +++++++++ ...-docs-summary-10-telegram-integration.json | 356 +++++++++ ...v2-docs-summary-10-telegram-integration.md | 409 ++++++++++ ...ocs_v2_matrix_v2-find-files-01-health.json | 313 ++++++++ ..._docs_v2_matrix_v2-find-files-01-health.md | 366 +++++++++ ..._docs_v2_matrix_v2-find-files-02-send.json | 313 ++++++++ ...in_docs_v2_matrix_v2-find-files-02-send.md | 366 +++++++++ ...cs_v2_matrix_v2-find-files-03-actions.json | 319 ++++++++ ...docs_v2_matrix_v2-find-files-03-actions.md | 372 +++++++++ ...atrix_v2-find-files-04-runtime-health.json | 317 ++++++++ ..._matrix_v2-find-files-04-runtime-health.md | 370 +++++++++ ..._docs_v2_matrix_v2-find-files-05-loop.json | 311 ++++++++ ...in_docs_v2_matrix_v2-find-files-05-loop.md | 364 +++++++++ ..._matrix_v2-find-files-06-architecture.json | 417 ++++++++++ ...v2_matrix_v2-find-files-06-architecture.md | 472 +++++++++++ ...atrix_v2-find-files-07-errors-catalog.json | 317 ++++++++ ..._matrix_v2-find-files-07-errors-catalog.md | 370 +++++++++ ...v2_matrix_v2-find-files-08-docs-index.json | 404 ++++++++++ ...s_v2_matrix_v2-find-files-08-docs-index.md | 459 +++++++++++ ...rix_v2-find-files-09-telegram-bot-api.json | 301 +++++++ ...atrix_v2-find-files-09-telegram-bot-api.md | 354 +++++++++ ...-find-files-10-telegram-notify-worker.json | 319 ++++++++ ...v2-find-files-10-telegram-notify-worker.md | 372 +++++++++ ..._matrix_v2-general-01-what-is-service.json | 344 ++++++++ ...v2_matrix_v2-general-01-what-is-service.md | 399 ++++++++++ ..._docs_v2_matrix_v2-general-02-purpose.json | 357 +++++++++ ...in_docs_v2_matrix_v2-general-02-purpose.md | 412 ++++++++++ ..._docs_v2_matrix_v2-general-03-problem.json | 344 ++++++++ ...in_docs_v2_matrix_v2-general-03-problem.md | 399 ++++++++++ ...v2_matrix_v2-general-04-docs-contents.json | 344 ++++++++ ...s_v2_matrix_v2-general-04-docs-contents.md | 399 ++++++++++ ...cs_v2_matrix_v2-general-05-main-parts.json | 346 ++++++++ ...docs_v2_matrix_v2-general-05-main-parts.md | 399 ++++++++++ ...v2-general-06-high-level-architecture.json | 346 ++++++++ ...x_v2-general-06-high-level-architecture.md | 399 ++++++++++ ...s_v2_matrix_v2-general-07-besides-api.json | 344 ++++++++ ...ocs_v2_matrix_v2-general-07-besides-api.md | 399 ++++++++++ ...cs_v2_matrix_v2-general-08-components.json | 420 ++++++++++ ...docs_v2_matrix_v2-general-08-components.md | 473 +++++++++++ ...v2_matrix_v2-general-09-reading-order.json | 346 ++++++++ ...s_v2_matrix_v2-general-09-reading-order.md | 399 ++++++++++ ...v2_matrix_v2-general-10-short-summary.json | 344 ++++++++ ...s_v2_matrix_v2-general-10-short-summary.md | 399 ++++++++++ .../20260406_222632/summary.md | 151 ++++ .../20260407_095532.zip | Bin 0 -> 143270 bytes ...s_v2_matrix_v2-docs-summary-01-health.json | 278 +++++++ ...ocs_v2_matrix_v2-docs-summary-01-health.md | 327 ++++++++ ...ocs_v2_matrix_v2-docs-summary-02-send.json | 242 ++++++ ..._docs_v2_matrix_v2-docs-summary-02-send.md | 287 +++++++ ..._v2_matrix_v2-docs-summary-03-actions.json | 246 ++++++ ...cs_v2_matrix_v2-docs-summary-03-actions.md | 291 +++++++ ...rix_v2-docs-summary-04-runtime-health.json | 219 +++++ ...atrix_v2-docs-summary-04-runtime-health.md | 264 +++++++ ..._v2-docs-summary-05-notification-loop.json | 279 +++++++ ...ix_v2-docs-summary-05-notification-loop.md | 328 ++++++++ ...atrix_v2-docs-summary-06-architecture.json | 343 ++++++++ ..._matrix_v2-docs-summary-06-architecture.md | 398 ++++++++++ ...s_v2_matrix_v2-docs-summary-07-worker.json | 229 ++++++ ...ocs_v2_matrix_v2-docs-summary-07-worker.md | 274 +++++++ ...ix_v2-docs-summary-08-health-statuses.json | 223 ++++++ ...trix_v2-docs-summary-08-health-statuses.md | 268 +++++++ ...matrix_v2-docs-summary-09-manual-send.json | 244 ++++++ ...2_matrix_v2-docs-summary-09-manual-send.md | 289 +++++++ ...-docs-summary-10-telegram-integration.json | 259 ++++++ ...v2-docs-summary-10-telegram-integration.md | 308 ++++++++ ...ocs_v2_matrix_v2-find-files-01-health.json | 295 +++++++ ..._docs_v2_matrix_v2-find-files-01-health.md | 348 ++++++++ ..._docs_v2_matrix_v2-find-files-02-send.json | 295 +++++++ ...in_docs_v2_matrix_v2-find-files-02-send.md | 348 ++++++++ ...cs_v2_matrix_v2-find-files-03-actions.json | 301 +++++++ ...docs_v2_matrix_v2-find-files-03-actions.md | 354 +++++++++ ...atrix_v2-find-files-04-runtime-health.json | 299 +++++++ ..._matrix_v2-find-files-04-runtime-health.md | 352 +++++++++ ..._docs_v2_matrix_v2-find-files-05-loop.json | 293 +++++++ ...in_docs_v2_matrix_v2-find-files-05-loop.md | 346 ++++++++ ..._matrix_v2-find-files-06-architecture.json | 339 ++++++++ ...v2_matrix_v2-find-files-06-architecture.md | 394 +++++++++ ...atrix_v2-find-files-07-errors-catalog.json | 299 +++++++ ..._matrix_v2-find-files-07-errors-catalog.md | 352 +++++++++ ...v2_matrix_v2-find-files-08-docs-index.json | 334 ++++++++ ...s_v2_matrix_v2-find-files-08-docs-index.md | 389 +++++++++ ...rix_v2-find-files-09-telegram-bot-api.json | 283 +++++++ ...atrix_v2-find-files-09-telegram-bot-api.md | 336 ++++++++ ...-find-files-10-telegram-notify-worker.json | 301 +++++++ ...v2-find-files-10-telegram-notify-worker.md | 354 +++++++++ ..._matrix_v2-general-01-what-is-service.json | 245 ++++++ ...v2_matrix_v2-general-01-what-is-service.md | 296 +++++++ ..._docs_v2_matrix_v2-general-02-purpose.json | 225 ++++++ ...in_docs_v2_matrix_v2-general-02-purpose.md | 270 +++++++ ..._docs_v2_matrix_v2-general-03-problem.json | 212 +++++ ...in_docs_v2_matrix_v2-general-03-problem.md | 257 ++++++ ...v2_matrix_v2-general-04-docs-contents.json | 211 +++++ ...s_v2_matrix_v2-general-04-docs-contents.md | 256 ++++++ ...cs_v2_matrix_v2-general-05-main-parts.json | 212 +++++ ...docs_v2_matrix_v2-general-05-main-parts.md | 257 ++++++ ...v2-general-06-high-level-architecture.json | 211 +++++ ...x_v2-general-06-high-level-architecture.md | 256 ++++++ ...s_v2_matrix_v2-general-07-besides-api.json | 211 +++++ ...ocs_v2_matrix_v2-general-07-besides-api.md | 256 ++++++ ...cs_v2_matrix_v2-general-08-components.json | 342 ++++++++ ...docs_v2_matrix_v2-general-08-components.md | 395 +++++++++ ...v2_matrix_v2-general-09-reading-order.json | 247 ++++++ ...s_v2_matrix_v2-general-09-reading-order.md | 296 +++++++ ...v2_matrix_v2-general-10-short-summary.json | 209 +++++ ...s_v2_matrix_v2-general-10-short-summary.md | 256 ++++++ .../20260407_095532/summary.md | 155 ++++ ...s_v2_matrix_v2-docs-summary-01-health.json | 295 +++++++ ...ocs_v2_matrix_v2-docs-summary-01-health.md | 344 ++++++++ ...ocs_v2_matrix_v2-docs-summary-02-send.json | 259 ++++++ ..._docs_v2_matrix_v2-docs-summary-02-send.md | 304 +++++++ ..._v2_matrix_v2-docs-summary-03-actions.json | 299 +++++++ ...cs_v2_matrix_v2-docs-summary-03-actions.md | 348 ++++++++ ...rix_v2-docs-summary-04-runtime-health.json | 285 +++++++ ...atrix_v2-docs-summary-04-runtime-health.md | 334 ++++++++ ..._v2-docs-summary-05-notification-loop.json | 330 ++++++++ ...ix_v2-docs-summary-05-notification-loop.md | 383 +++++++++ ...atrix_v2-docs-summary-06-architecture.json | 390 +++++++++ ..._matrix_v2-docs-summary-06-architecture.md | 445 +++++++++++ ...s_v2_matrix_v2-docs-summary-07-worker.json | 281 +++++++ ...ocs_v2_matrix_v2-docs-summary-07-worker.md | 330 ++++++++ ...ix_v2-docs-summary-08-health-statuses.json | 289 +++++++ ...trix_v2-docs-summary-08-health-statuses.md | 338 ++++++++ ...matrix_v2-docs-summary-09-manual-send.json | 297 +++++++ ...2_matrix_v2-docs-summary-09-manual-send.md | 346 ++++++++ ...-docs-summary-10-telegram-integration.json | 338 ++++++++ ...v2-docs-summary-10-telegram-integration.md | 391 +++++++++ ...ocs_v2_matrix_v2-find-files-01-health.json | 298 +++++++ ..._docs_v2_matrix_v2-find-files-01-health.md | 351 ++++++++ ..._docs_v2_matrix_v2-find-files-02-send.json | 298 +++++++ ...in_docs_v2_matrix_v2-find-files-02-send.md | 351 ++++++++ ...cs_v2_matrix_v2-find-files-03-actions.json | 304 +++++++ ...docs_v2_matrix_v2-find-files-03-actions.md | 357 +++++++++ ...atrix_v2-find-files-04-runtime-health.json | 302 +++++++ ..._matrix_v2-find-files-04-runtime-health.md | 355 +++++++++ ..._docs_v2_matrix_v2-find-files-05-loop.json | 296 +++++++ ...in_docs_v2_matrix_v2-find-files-05-loop.md | 349 ++++++++ ..._matrix_v2-find-files-06-architecture.json | 344 ++++++++ ...v2_matrix_v2-find-files-06-architecture.md | 399 ++++++++++ ...atrix_v2-find-files-07-errors-catalog.json | 302 +++++++ ..._matrix_v2-find-files-07-errors-catalog.md | 355 +++++++++ ...v2_matrix_v2-find-files-08-docs-index.json | 314 ++++++++ ...s_v2_matrix_v2-find-files-08-docs-index.md | 369 +++++++++ ...rix_v2-find-files-09-telegram-bot-api.json | 288 +++++++ ...atrix_v2-find-files-09-telegram-bot-api.md | 341 ++++++++ ...-find-files-10-telegram-notify-worker.json | 304 +++++++ ...v2-find-files-10-telegram-notify-worker.md | 357 +++++++++ ..._matrix_v2-general-01-what-is-service.json | 326 ++++++++ ...v2_matrix_v2-general-01-what-is-service.md | 381 +++++++++ ..._docs_v2_matrix_v2-general-02-purpose.json | 339 ++++++++ ...in_docs_v2_matrix_v2-general-02-purpose.md | 394 +++++++++ ..._docs_v2_matrix_v2-general-03-problem.json | 326 ++++++++ ...in_docs_v2_matrix_v2-general-03-problem.md | 381 +++++++++ ...v2_matrix_v2-general-04-docs-contents.json | 326 ++++++++ ...s_v2_matrix_v2-general-04-docs-contents.md | 381 +++++++++ ...cs_v2_matrix_v2-general-05-main-parts.json | 328 ++++++++ ...docs_v2_matrix_v2-general-05-main-parts.md | 381 +++++++++ ...v2-general-06-high-level-architecture.json | 328 ++++++++ ...x_v2-general-06-high-level-architecture.md | 381 +++++++++ ...s_v2_matrix_v2-general-07-besides-api.json | 326 ++++++++ ...ocs_v2_matrix_v2-general-07-besides-api.md | 381 +++++++++ ...cs_v2_matrix_v2-general-08-components.json | 389 +++++++++ ...docs_v2_matrix_v2-general-08-components.md | 442 +++++++++++ ...v2_matrix_v2-general-09-reading-order.json | 328 ++++++++ ...s_v2_matrix_v2-general-09-reading-order.md | 381 +++++++++ ...v2_matrix_v2-general-10-short-summary.json | 326 ++++++++ ...s_v2_matrix_v2-general-10-short-summary.md | 381 +++++++++ .../20260407_100346/summary.md | 151 ++++ ...s_v2_matrix_v2-docs-summary-01-health.json | 295 +++++++ ...ocs_v2_matrix_v2-docs-summary-01-health.md | 344 ++++++++ ...ocs_v2_matrix_v2-docs-summary-02-send.json | 259 ++++++ ..._docs_v2_matrix_v2-docs-summary-02-send.md | 304 +++++++ ..._v2_matrix_v2-docs-summary-03-actions.json | 299 +++++++ ...cs_v2_matrix_v2-docs-summary-03-actions.md | 348 ++++++++ ...rix_v2-docs-summary-04-runtime-health.json | 285 +++++++ ...atrix_v2-docs-summary-04-runtime-health.md | 334 ++++++++ ..._v2-docs-summary-05-notification-loop.json | 330 ++++++++ ...ix_v2-docs-summary-05-notification-loop.md | 383 +++++++++ ...atrix_v2-docs-summary-06-architecture.json | 390 +++++++++ ..._matrix_v2-docs-summary-06-architecture.md | 445 +++++++++++ ...s_v2_matrix_v2-docs-summary-07-worker.json | 281 +++++++ ...ocs_v2_matrix_v2-docs-summary-07-worker.md | 330 ++++++++ ...ix_v2-docs-summary-08-health-statuses.json | 289 +++++++ ...trix_v2-docs-summary-08-health-statuses.md | 338 ++++++++ ...matrix_v2-docs-summary-09-manual-send.json | 297 +++++++ ...2_matrix_v2-docs-summary-09-manual-send.md | 346 ++++++++ ...-docs-summary-10-telegram-integration.json | 338 ++++++++ ...v2-docs-summary-10-telegram-integration.md | 391 +++++++++ ...ocs_v2_matrix_v2-find-files-01-health.json | 298 +++++++ ..._docs_v2_matrix_v2-find-files-01-health.md | 351 ++++++++ ..._docs_v2_matrix_v2-find-files-02-send.json | 298 +++++++ ...in_docs_v2_matrix_v2-find-files-02-send.md | 351 ++++++++ ...cs_v2_matrix_v2-find-files-03-actions.json | 304 +++++++ ...docs_v2_matrix_v2-find-files-03-actions.md | 357 +++++++++ ...atrix_v2-find-files-04-runtime-health.json | 302 +++++++ ..._matrix_v2-find-files-04-runtime-health.md | 355 +++++++++ ..._docs_v2_matrix_v2-find-files-05-loop.json | 296 +++++++ ...in_docs_v2_matrix_v2-find-files-05-loop.md | 349 ++++++++ ..._matrix_v2-find-files-06-architecture.json | 344 ++++++++ ...v2_matrix_v2-find-files-06-architecture.md | 399 ++++++++++ ...atrix_v2-find-files-07-errors-catalog.json | 302 +++++++ ..._matrix_v2-find-files-07-errors-catalog.md | 355 +++++++++ ...v2_matrix_v2-find-files-08-docs-index.json | 314 ++++++++ ...s_v2_matrix_v2-find-files-08-docs-index.md | 369 +++++++++ ...rix_v2-find-files-09-telegram-bot-api.json | 288 +++++++ ...atrix_v2-find-files-09-telegram-bot-api.md | 341 ++++++++ ...-find-files-10-telegram-notify-worker.json | 304 +++++++ ...v2-find-files-10-telegram-notify-worker.md | 357 +++++++++ ..._matrix_v2-general-01-what-is-service.json | 326 ++++++++ ...v2_matrix_v2-general-01-what-is-service.md | 381 +++++++++ ..._docs_v2_matrix_v2-general-02-purpose.json | 339 ++++++++ ...in_docs_v2_matrix_v2-general-02-purpose.md | 394 +++++++++ ..._docs_v2_matrix_v2-general-03-problem.json | 326 ++++++++ ...in_docs_v2_matrix_v2-general-03-problem.md | 381 +++++++++ ...v2_matrix_v2-general-04-docs-contents.json | 326 ++++++++ ...s_v2_matrix_v2-general-04-docs-contents.md | 381 +++++++++ ...cs_v2_matrix_v2-general-05-main-parts.json | 328 ++++++++ ...docs_v2_matrix_v2-general-05-main-parts.md | 381 +++++++++ ...v2-general-06-high-level-architecture.json | 328 ++++++++ ...x_v2-general-06-high-level-architecture.md | 381 +++++++++ ...s_v2_matrix_v2-general-07-besides-api.json | 326 ++++++++ ...ocs_v2_matrix_v2-general-07-besides-api.md | 381 +++++++++ ...cs_v2_matrix_v2-general-08-components.json | 389 +++++++++ ...docs_v2_matrix_v2-general-08-components.md | 442 +++++++++++ ...v2_matrix_v2-general-09-reading-order.json | 328 ++++++++ ...s_v2_matrix_v2-general-09-reading-order.md | 381 +++++++++ ...v2_matrix_v2-general-10-short-summary.json | 326 ++++++++ ...s_v2_matrix_v2-general-10-short-summary.md | 381 +++++++++ .../20260407_100457/summary.md | 151 ++++ ...trix_v2-router-docs-summary-01-health.json | 59 ++ ...matrix_v2-router-docs-summary-01-health.md | 78 ++ ...matrix_v2-router-docs-summary-02-send.json | 59 ++ ...2_matrix_v2-router-docs-summary-02-send.md | 78 ++ ...rix_v2-router-docs-summary-03-actions.json | 63 ++ ...atrix_v2-router-docs-summary-03-actions.md | 82 ++ ...router-docs-summary-04-runtime-health.json | 61 ++ ...2-router-docs-summary-04-runtime-health.md | 80 ++ ...ter-docs-summary-05-notification-loop.json | 61 ++ ...outer-docs-summary-05-notification-loop.md | 80 ++ ...2-router-docs-summary-06-architecture.json | 61 ++ ..._v2-router-docs-summary-06-architecture.md | 80 ++ ...trix_v2-router-docs-summary-07-worker.json | 57 ++ ...matrix_v2-router-docs-summary-07-worker.md | 76 ++ ...outer-docs-summary-08-health-statuses.json | 61 ++ ...-router-docs-summary-08-health-statuses.md | 80 ++ ...v2-router-docs-summary-09-manual-send.json | 61 ++ ...x_v2-router-docs-summary-09-manual-send.md | 80 ++ ...-docs-summary-10-telegram-integration.json | 57 ++ ...er-docs-summary-10-telegram-integration.md | 74 ++ ...matrix_v2-router-find-files-01-health.json | 59 ++ ...2_matrix_v2-router-find-files-01-health.md | 78 ++ ...2_matrix_v2-router-find-files-02-send.json | 59 ++ ..._v2_matrix_v2-router-find-files-02-send.md | 78 ++ ...atrix_v2-router-find-files-03-actions.json | 63 ++ ..._matrix_v2-router-find-files-03-actions.md | 82 ++ ...2-router-find-files-04-runtime-health.json | 61 ++ ..._v2-router-find-files-04-runtime-health.md | 80 ++ ...2_matrix_v2-router-find-files-05-loop.json | 57 ++ ..._v2_matrix_v2-router-find-files-05-loop.md | 76 ++ ..._v2-router-find-files-06-architecture.json | 61 ++ ...ix_v2-router-find-files-06-architecture.md | 80 ++ ...2-router-find-files-07-errors-catalog.json | 61 ++ ..._v2-router-find-files-07-errors-catalog.md | 80 ++ ...ix_v2-router-find-files-08-docs-index.json | 61 ++ ...trix_v2-router-find-files-08-docs-index.md | 80 ++ ...router-find-files-09-telegram-bot-api.json | 53 ++ ...2-router-find-files-09-telegram-bot-api.md | 72 ++ ...-find-files-10-telegram-notify-worker.json | 57 ++ ...er-find-files-10-telegram-notify-worker.md | 76 ++ ..._v2-router-general-01-what-is-service.json | 53 ++ ...ix_v2-router-general-01-what-is-service.md | 72 ++ ...2_matrix_v2-router-general-02-purpose.json | 53 ++ ..._v2_matrix_v2-router-general-02-purpose.md | 72 ++ ...2_matrix_v2-router-general-03-problem.json | 53 ++ ..._v2_matrix_v2-router-general-03-problem.md | 72 ++ ...ix_v2-router-general-04-docs-contents.json | 53 ++ ...trix_v2-router-general-04-docs-contents.md | 72 ++ ...atrix_v2-router-general-05-main-parts.json | 53 ++ ..._matrix_v2-router-general-05-main-parts.md | 72 ++ ...er-general-06-high-level-architecture.json | 53 ++ ...uter-general-06-high-level-architecture.md | 72 ++ ...trix_v2-router-general-07-besides-api.json | 53 ++ ...matrix_v2-router-general-07-besides-api.md | 72 ++ ...atrix_v2-router-general-08-components.json | 61 ++ ..._matrix_v2-router-general-08-components.md | 78 ++ ...ix_v2-router-general-09-reading-order.json | 53 ++ ...trix_v2-router-general-09-reading-order.md | 72 ++ ...ix_v2-router-general-10-short-summary.json | 53 ++ ...trix_v2-router-general-10-short-summary.md | 72 ++ .../20260407_102851/summary.md | 40 + ...trix_v2-router-docs-summary-01-health.json | 59 ++ ...matrix_v2-router-docs-summary-01-health.md | 78 ++ ...matrix_v2-router-docs-summary-02-send.json | 59 ++ ...2_matrix_v2-router-docs-summary-02-send.md | 78 ++ ...rix_v2-router-docs-summary-03-actions.json | 63 ++ ...atrix_v2-router-docs-summary-03-actions.md | 82 ++ ...router-docs-summary-04-runtime-health.json | 61 ++ ...2-router-docs-summary-04-runtime-health.md | 80 ++ ...ter-docs-summary-05-notification-loop.json | 61 ++ ...outer-docs-summary-05-notification-loop.md | 80 ++ ...2-router-docs-summary-06-architecture.json | 61 ++ ..._v2-router-docs-summary-06-architecture.md | 80 ++ ...trix_v2-router-docs-summary-07-worker.json | 57 ++ ...matrix_v2-router-docs-summary-07-worker.md | 76 ++ ...outer-docs-summary-08-health-statuses.json | 61 ++ ...-router-docs-summary-08-health-statuses.md | 80 ++ ...v2-router-docs-summary-09-manual-send.json | 61 ++ ...x_v2-router-docs-summary-09-manual-send.md | 80 ++ ...-docs-summary-10-telegram-integration.json | 54 ++ ...er-docs-summary-10-telegram-integration.md | 71 ++ ...matrix_v2-router-find-files-01-health.json | 60 ++ ...2_matrix_v2-router-find-files-01-health.md | 79 ++ ...2_matrix_v2-router-find-files-02-send.json | 60 ++ ..._v2_matrix_v2-router-find-files-02-send.md | 79 ++ ...atrix_v2-router-find-files-03-actions.json | 64 ++ ..._matrix_v2-router-find-files-03-actions.md | 83 ++ ...2-router-find-files-04-runtime-health.json | 62 ++ ..._v2-router-find-files-04-runtime-health.md | 81 ++ ...2_matrix_v2-router-find-files-05-loop.json | 58 ++ ..._v2_matrix_v2-router-find-files-05-loop.md | 77 ++ ..._v2-router-find-files-06-architecture.json | 62 ++ ...ix_v2-router-find-files-06-architecture.md | 81 ++ ...2-router-find-files-07-errors-catalog.json | 61 ++ ..._v2-router-find-files-07-errors-catalog.md | 80 ++ ...ix_v2-router-find-files-08-docs-index.json | 61 ++ ...trix_v2-router-find-files-08-docs-index.md | 80 ++ ...router-find-files-09-telegram-bot-api.json | 53 ++ ...2-router-find-files-09-telegram-bot-api.md | 72 ++ ...-find-files-10-telegram-notify-worker.json | 58 ++ ...er-find-files-10-telegram-notify-worker.md | 77 ++ ..._v2-router-general-01-what-is-service.json | 51 ++ ...ix_v2-router-general-01-what-is-service.md | 70 ++ ...2_matrix_v2-router-general-02-purpose.json | 51 ++ ..._v2_matrix_v2-router-general-02-purpose.md | 70 ++ ...2_matrix_v2-router-general-03-problem.json | 51 ++ ..._v2_matrix_v2-router-general-03-problem.md | 70 ++ ...ix_v2-router-general-04-docs-contents.json | 51 ++ ...trix_v2-router-general-04-docs-contents.md | 70 ++ ...atrix_v2-router-general-05-main-parts.json | 51 ++ ..._matrix_v2-router-general-05-main-parts.md | 70 ++ ...er-general-06-high-level-architecture.json | 51 ++ ...uter-general-06-high-level-architecture.md | 70 ++ ...trix_v2-router-general-07-besides-api.json | 51 ++ ...matrix_v2-router-general-07-besides-api.md | 70 ++ ...atrix_v2-router-general-08-components.json | 60 ++ ..._matrix_v2-router-general-08-components.md | 77 ++ ...ix_v2-router-general-09-reading-order.json | 51 ++ ...trix_v2-router-general-09-reading-order.md | 70 ++ ...ix_v2-router-general-10-short-summary.json | 51 ++ ...trix_v2-router-general-10-short-summary.md | 70 ++ .../20260407_114412/summary.md | 40 + ...trix_v2-router-docs-summary-01-health.json | 59 ++ ...matrix_v2-router-docs-summary-01-health.md | 78 ++ ...matrix_v2-router-docs-summary-02-send.json | 59 ++ ...2_matrix_v2-router-docs-summary-02-send.md | 78 ++ ...rix_v2-router-docs-summary-03-actions.json | 63 ++ ...atrix_v2-router-docs-summary-03-actions.md | 82 ++ ...router-docs-summary-04-runtime-health.json | 61 ++ ...2-router-docs-summary-04-runtime-health.md | 80 ++ ...ter-docs-summary-05-notification-loop.json | 61 ++ ...outer-docs-summary-05-notification-loop.md | 80 ++ ...2-router-docs-summary-06-architecture.json | 61 ++ ..._v2-router-docs-summary-06-architecture.md | 80 ++ ...trix_v2-router-docs-summary-07-worker.json | 57 ++ ...matrix_v2-router-docs-summary-07-worker.md | 76 ++ ...outer-docs-summary-08-health-statuses.json | 61 ++ ...-router-docs-summary-08-health-statuses.md | 80 ++ ...v2-router-docs-summary-09-manual-send.json | 61 ++ ...x_v2-router-docs-summary-09-manual-send.md | 80 ++ ...-docs-summary-10-telegram-integration.json | 54 ++ ...er-docs-summary-10-telegram-integration.md | 71 ++ ...matrix_v2-router-find-files-01-health.json | 60 ++ ...2_matrix_v2-router-find-files-01-health.md | 79 ++ ...2_matrix_v2-router-find-files-02-send.json | 60 ++ ..._v2_matrix_v2-router-find-files-02-send.md | 79 ++ ...atrix_v2-router-find-files-03-actions.json | 64 ++ ..._matrix_v2-router-find-files-03-actions.md | 83 ++ ...2-router-find-files-04-runtime-health.json | 62 ++ ..._v2-router-find-files-04-runtime-health.md | 81 ++ ...2_matrix_v2-router-find-files-05-loop.json | 58 ++ ..._v2_matrix_v2-router-find-files-05-loop.md | 77 ++ ..._v2-router-find-files-06-architecture.json | 62 ++ ...ix_v2-router-find-files-06-architecture.md | 81 ++ ...2-router-find-files-07-errors-catalog.json | 61 ++ ..._v2-router-find-files-07-errors-catalog.md | 80 ++ ...ix_v2-router-find-files-08-docs-index.json | 61 ++ ...trix_v2-router-find-files-08-docs-index.md | 80 ++ ...router-find-files-09-telegram-bot-api.json | 53 ++ ...2-router-find-files-09-telegram-bot-api.md | 72 ++ ...-find-files-10-telegram-notify-worker.json | 58 ++ ...er-find-files-10-telegram-notify-worker.md | 77 ++ ..._v2-router-general-01-what-is-service.json | 51 ++ ...ix_v2-router-general-01-what-is-service.md | 70 ++ ...2_matrix_v2-router-general-02-purpose.json | 51 ++ ..._v2_matrix_v2-router-general-02-purpose.md | 70 ++ ...2_matrix_v2-router-general-03-problem.json | 51 ++ ..._v2_matrix_v2-router-general-03-problem.md | 70 ++ ...ix_v2-router-general-04-docs-contents.json | 51 ++ ...trix_v2-router-general-04-docs-contents.md | 70 ++ ...atrix_v2-router-general-05-main-parts.json | 51 ++ ..._matrix_v2-router-general-05-main-parts.md | 70 ++ ...er-general-06-high-level-architecture.json | 51 ++ ...uter-general-06-high-level-architecture.md | 70 ++ ...trix_v2-router-general-07-besides-api.json | 51 ++ ...matrix_v2-router-general-07-besides-api.md | 70 ++ ...atrix_v2-router-general-08-components.json | 60 ++ ..._matrix_v2-router-general-08-components.md | 77 ++ ...ix_v2-router-general-09-reading-order.json | 51 ++ ...trix_v2-router-general-09-reading-order.md | 70 ++ ...ix_v2-router-general-10-short-summary.json | 51 ++ ...trix_v2-router-general-10-short-summary.md | 70 ++ .../20260407_111829/summary.md | 40 + ...trix_v2-router-docs-summary-01-health.json | 59 ++ ...matrix_v2-router-docs-summary-01-health.md | 78 ++ ...matrix_v2-router-docs-summary-02-send.json | 59 ++ ...2_matrix_v2-router-docs-summary-02-send.md | 78 ++ ...rix_v2-router-docs-summary-03-actions.json | 63 ++ ...atrix_v2-router-docs-summary-03-actions.md | 82 ++ ...router-docs-summary-04-runtime-health.json | 61 ++ ...2-router-docs-summary-04-runtime-health.md | 80 ++ ...ter-docs-summary-05-notification-loop.json | 61 ++ ...outer-docs-summary-05-notification-loop.md | 80 ++ ...2-router-docs-summary-06-architecture.json | 61 ++ ..._v2-router-docs-summary-06-architecture.md | 80 ++ ...trix_v2-router-docs-summary-07-worker.json | 57 ++ ...matrix_v2-router-docs-summary-07-worker.md | 76 ++ ...outer-docs-summary-08-health-statuses.json | 61 ++ ...-router-docs-summary-08-health-statuses.md | 80 ++ ...v2-router-docs-summary-09-manual-send.json | 61 ++ ...x_v2-router-docs-summary-09-manual-send.md | 80 ++ ...-docs-summary-10-telegram-integration.json | 54 ++ ...er-docs-summary-10-telegram-integration.md | 71 ++ ...matrix_v2-router-find-files-01-health.json | 60 ++ ...2_matrix_v2-router-find-files-01-health.md | 79 ++ ...2_matrix_v2-router-find-files-02-send.json | 60 ++ ..._v2_matrix_v2-router-find-files-02-send.md | 79 ++ ...atrix_v2-router-find-files-03-actions.json | 64 ++ ..._matrix_v2-router-find-files-03-actions.md | 83 ++ ...2-router-find-files-04-runtime-health.json | 62 ++ ..._v2-router-find-files-04-runtime-health.md | 81 ++ ...2_matrix_v2-router-find-files-05-loop.json | 58 ++ ..._v2_matrix_v2-router-find-files-05-loop.md | 77 ++ ..._v2-router-find-files-06-architecture.json | 62 ++ ...ix_v2-router-find-files-06-architecture.md | 81 ++ ...2-router-find-files-07-errors-catalog.json | 61 ++ ..._v2-router-find-files-07-errors-catalog.md | 80 ++ ...ix_v2-router-find-files-08-docs-index.json | 61 ++ ...trix_v2-router-find-files-08-docs-index.md | 80 ++ ...router-find-files-09-telegram-bot-api.json | 53 ++ ...2-router-find-files-09-telegram-bot-api.md | 72 ++ ...-find-files-10-telegram-notify-worker.json | 58 ++ ...er-find-files-10-telegram-notify-worker.md | 77 ++ ..._v2-router-general-01-what-is-service.json | 51 ++ ...ix_v2-router-general-01-what-is-service.md | 70 ++ ...2_matrix_v2-router-general-02-purpose.json | 51 ++ ..._v2_matrix_v2-router-general-02-purpose.md | 70 ++ ...2_matrix_v2-router-general-03-problem.json | 51 ++ ..._v2_matrix_v2-router-general-03-problem.md | 70 ++ ...ix_v2-router-general-04-docs-contents.json | 51 ++ ...trix_v2-router-general-04-docs-contents.md | 70 ++ ...atrix_v2-router-general-05-main-parts.json | 51 ++ ..._matrix_v2-router-general-05-main-parts.md | 70 ++ ...er-general-06-high-level-architecture.json | 51 ++ ...uter-general-06-high-level-architecture.md | 70 ++ ...trix_v2-router-general-07-besides-api.json | 51 ++ ...matrix_v2-router-general-07-besides-api.md | 70 ++ ...atrix_v2-router-general-08-components.json | 60 ++ ..._matrix_v2-router-general-08-components.md | 77 ++ ...ix_v2-router-general-09-reading-order.json | 51 ++ ...trix_v2-router-general-09-reading-order.md | 70 ++ ...ix_v2-router-general-10-short-summary.json | 51 ++ ...trix_v2-router-general-10-short-summary.md | 70 ++ .../20260407_113944/summary.md | 40 + tests/pipeline_setup_v4/README.md | 25 + tests/pipeline_setup_v4/__init__.py | 1 + .../router_only_docs_v2_matrix.yaml | 243 ++++++ ...trix_v2-router-docs-summary-01-health.json | 81 ++ ...matrix_v2-router-docs-summary-01-health.md | 91 +++ ...matrix_v2-router-docs-summary-02-send.json | 81 ++ ...2_matrix_v2-router-docs-summary-02-send.md | 91 +++ ...rix_v2-router-docs-summary-03-actions.json | 85 ++ ...atrix_v2-router-docs-summary-03-actions.md | 95 +++ ...router-docs-summary-04-runtime-health.json | 83 ++ ...2-router-docs-summary-04-runtime-health.md | 93 +++ ...ter-docs-summary-05-notification-loop.json | 90 +++ ...outer-docs-summary-05-notification-loop.md | 98 +++ ...2-router-docs-summary-06-architecture.json | 95 +++ ..._v2-router-docs-summary-06-architecture.md | 105 +++ ...trix_v2-router-docs-summary-07-worker.json | 79 ++ ...matrix_v2-router-docs-summary-07-worker.md | 89 +++ ...outer-docs-summary-08-health-statuses.json | 88 +++ ...-router-docs-summary-08-health-statuses.md | 96 +++ ...v2-router-docs-summary-09-manual-send.json | 90 +++ ...x_v2-router-docs-summary-09-manual-send.md | 98 +++ ...-docs-summary-10-telegram-integration.json | 79 ++ ...er-docs-summary-10-telegram-integration.md | 89 +++ ...matrix_v2-router-find-files-01-health.json | 83 ++ ...2_matrix_v2-router-find-files-01-health.md | 93 +++ ...2_matrix_v2-router-find-files-02-send.json | 81 ++ ..._v2_matrix_v2-router-find-files-02-send.md | 91 +++ ...atrix_v2-router-find-files-03-actions.json | 85 ++ ..._matrix_v2-router-find-files-03-actions.md | 95 +++ ...2-router-find-files-04-runtime-health.json | 87 ++ ..._v2-router-find-files-04-runtime-health.md | 97 +++ ...2_matrix_v2-router-find-files-05-loop.json | 79 ++ ..._v2_matrix_v2-router-find-files-05-loop.md | 89 +++ ..._v2-router-find-files-06-architecture.json | 83 ++ ...ix_v2-router-find-files-06-architecture.md | 93 +++ ...2-router-find-files-07-errors-catalog.json | 87 ++ ..._v2-router-find-files-07-errors-catalog.md | 97 +++ ...ix_v2-router-find-files-08-docs-index.json | 81 ++ ...trix_v2-router-find-files-08-docs-index.md | 91 +++ ...router-find-files-09-telegram-bot-api.json | 87 ++ ...2-router-find-files-09-telegram-bot-api.md | 95 +++ ...-find-files-10-telegram-notify-worker.json | 85 ++ ...er-find-files-10-telegram-notify-worker.md | 95 +++ ..._v2-router-general-01-what-is-service.json | 69 ++ ...ix_v2-router-general-01-what-is-service.md | 79 ++ ...2_matrix_v2-router-general-02-purpose.json | 79 ++ ..._v2_matrix_v2-router-general-02-purpose.md | 89 +++ ...2_matrix_v2-router-general-03-problem.json | 75 ++ ..._v2_matrix_v2-router-general-03-problem.md | 85 ++ ...ix_v2-router-general-04-docs-contents.json | 73 ++ ...trix_v2-router-general-04-docs-contents.md | 83 ++ ...atrix_v2-router-general-05-main-parts.json | 75 ++ ..._matrix_v2-router-general-05-main-parts.md | 85 ++ ...er-general-06-high-level-architecture.json | 73 ++ ...uter-general-06-high-level-architecture.md | 83 ++ ...trix_v2-router-general-07-besides-api.json | 79 ++ ...matrix_v2-router-general-07-besides-api.md | 89 +++ ...atrix_v2-router-general-08-components.json | 89 +++ ..._matrix_v2-router-general-08-components.md | 99 +++ ...ix_v2-router-general-09-reading-order.json | 73 ++ ...trix_v2-router-general-09-reading-order.md | 83 ++ ...ix_v2-router-general-10-short-summary.json | 71 ++ ...trix_v2-router-general-10-short-summary.md | 81 ++ .../20260407_124956/summary.md | 42 + ...trix_v2-router-docs-summary-01-health.json | 81 ++ ...matrix_v2-router-docs-summary-01-health.md | 91 +++ ...matrix_v2-router-docs-summary-02-send.json | 81 ++ ...2_matrix_v2-router-docs-summary-02-send.md | 91 +++ ...rix_v2-router-docs-summary-03-actions.json | 85 ++ ...atrix_v2-router-docs-summary-03-actions.md | 95 +++ ...router-docs-summary-04-runtime-health.json | 83 ++ ...2-router-docs-summary-04-runtime-health.md | 93 +++ ...ter-docs-summary-05-notification-loop.json | 87 ++ ...outer-docs-summary-05-notification-loop.md | 97 +++ ...2-router-docs-summary-06-architecture.json | 95 +++ ..._v2-router-docs-summary-06-architecture.md | 105 +++ ...trix_v2-router-docs-summary-07-worker.json | 79 ++ ...matrix_v2-router-docs-summary-07-worker.md | 89 +++ ...outer-docs-summary-08-health-statuses.json | 85 ++ ...-router-docs-summary-08-health-statuses.md | 95 +++ ...v2-router-docs-summary-09-manual-send.json | 87 ++ ...x_v2-router-docs-summary-09-manual-send.md | 97 +++ ...-docs-summary-10-telegram-integration.json | 79 ++ ...er-docs-summary-10-telegram-integration.md | 89 +++ ...matrix_v2-router-find-files-01-health.json | 83 ++ ...2_matrix_v2-router-find-files-01-health.md | 93 +++ ...2_matrix_v2-router-find-files-02-send.json | 81 ++ ..._v2_matrix_v2-router-find-files-02-send.md | 91 +++ ...atrix_v2-router-find-files-03-actions.json | 85 ++ ..._matrix_v2-router-find-files-03-actions.md | 95 +++ ...2-router-find-files-04-runtime-health.json | 87 ++ ..._v2-router-find-files-04-runtime-health.md | 97 +++ ...2_matrix_v2-router-find-files-05-loop.json | 79 ++ ..._v2_matrix_v2-router-find-files-05-loop.md | 89 +++ ..._v2-router-find-files-06-architecture.json | 83 ++ ...ix_v2-router-find-files-06-architecture.md | 93 +++ ...2-router-find-files-07-errors-catalog.json | 87 ++ ..._v2-router-find-files-07-errors-catalog.md | 97 +++ ...ix_v2-router-find-files-08-docs-index.json | 81 ++ ...trix_v2-router-find-files-08-docs-index.md | 91 +++ ...router-find-files-09-telegram-bot-api.json | 85 ++ ...2-router-find-files-09-telegram-bot-api.md | 95 +++ ...-find-files-10-telegram-notify-worker.json | 85 ++ ...er-find-files-10-telegram-notify-worker.md | 95 +++ ..._v2-router-general-01-what-is-service.json | 69 ++ ...ix_v2-router-general-01-what-is-service.md | 79 ++ ...2_matrix_v2-router-general-02-purpose.json | 79 ++ ..._v2_matrix_v2-router-general-02-purpose.md | 89 +++ ...2_matrix_v2-router-general-03-problem.json | 75 ++ ..._v2_matrix_v2-router-general-03-problem.md | 85 ++ ...ix_v2-router-general-04-docs-contents.json | 73 ++ ...trix_v2-router-general-04-docs-contents.md | 83 ++ ...atrix_v2-router-general-05-main-parts.json | 75 ++ ..._matrix_v2-router-general-05-main-parts.md | 85 ++ ...er-general-06-high-level-architecture.json | 73 ++ ...uter-general-06-high-level-architecture.md | 83 ++ ...trix_v2-router-general-07-besides-api.json | 79 ++ ...matrix_v2-router-general-07-besides-api.md | 89 +++ ...atrix_v2-router-general-08-components.json | 89 +++ ..._matrix_v2-router-general-08-components.md | 99 +++ ...ix_v2-router-general-09-reading-order.json | 73 ++ ...trix_v2-router-general-09-reading-order.md | 83 ++ ...ix_v2-router-general-10-short-summary.json | 71 ++ ...trix_v2-router-general-10-short-summary.md | 81 ++ .../20260407_125007/summary.md | 36 + ...trix_v2-router-docs-summary-01-health.json | 77 ++ ...matrix_v2-router-docs-summary-01-health.md | 87 ++ ...matrix_v2-router-docs-summary-02-send.json | 77 ++ ...2_matrix_v2-router-docs-summary-02-send.md | 87 ++ ...rix_v2-router-docs-summary-03-actions.json | 83 ++ ...atrix_v2-router-docs-summary-03-actions.md | 93 +++ ...router-docs-summary-04-runtime-health.json | 81 ++ ...2-router-docs-summary-04-runtime-health.md | 91 +++ ...ter-docs-summary-05-notification-loop.json | 83 ++ ...outer-docs-summary-05-notification-loop.md | 93 +++ ...2-router-docs-summary-06-architecture.json | 93 +++ ..._v2-router-docs-summary-06-architecture.md | 103 +++ ...trix_v2-router-docs-summary-07-worker.json | 77 ++ ...matrix_v2-router-docs-summary-07-worker.md | 87 ++ ...outer-docs-summary-08-health-statuses.json | 81 ++ ...-router-docs-summary-08-health-statuses.md | 91 +++ ...v2-router-docs-summary-09-manual-send.json | 85 ++ ...x_v2-router-docs-summary-09-manual-send.md | 95 +++ ...-docs-summary-10-telegram-integration.json | 79 ++ ...er-docs-summary-10-telegram-integration.md | 89 +++ ...matrix_v2-router-find-files-01-health.json | 83 ++ ...2_matrix_v2-router-find-files-01-health.md | 93 +++ ...2_matrix_v2-router-find-files-02-send.json | 79 ++ ..._v2_matrix_v2-router-find-files-02-send.md | 89 +++ ...atrix_v2-router-find-files-03-actions.json | 83 ++ ..._matrix_v2-router-find-files-03-actions.md | 93 +++ ...2-router-find-files-04-runtime-health.json | 85 ++ ..._v2-router-find-files-04-runtime-health.md | 95 +++ ...2_matrix_v2-router-find-files-05-loop.json | 79 ++ ..._v2_matrix_v2-router-find-files-05-loop.md | 89 +++ ..._v2-router-find-files-06-architecture.json | 81 ++ ...ix_v2-router-find-files-06-architecture.md | 91 +++ ...2-router-find-files-07-errors-catalog.json | 85 ++ ..._v2-router-find-files-07-errors-catalog.md | 95 +++ ...ix_v2-router-find-files-08-docs-index.json | 79 ++ ...trix_v2-router-find-files-08-docs-index.md | 89 +++ ...router-find-files-09-telegram-bot-api.json | 85 ++ ...2-router-find-files-09-telegram-bot-api.md | 95 +++ ...-find-files-10-telegram-notify-worker.json | 81 ++ ...er-find-files-10-telegram-notify-worker.md | 91 +++ ..._v2-router-general-01-what-is-service.json | 69 ++ ...ix_v2-router-general-01-what-is-service.md | 79 ++ ...2_matrix_v2-router-general-02-purpose.json | 73 ++ ..._v2_matrix_v2-router-general-02-purpose.md | 83 ++ ...2_matrix_v2-router-general-03-problem.json | 75 ++ ..._v2_matrix_v2-router-general-03-problem.md | 85 ++ ...ix_v2-router-general-04-docs-contents.json | 73 ++ ...trix_v2-router-general-04-docs-contents.md | 83 ++ ...atrix_v2-router-general-05-main-parts.json | 73 ++ ..._matrix_v2-router-general-05-main-parts.md | 83 ++ ...er-general-06-high-level-architecture.json | 73 ++ ...uter-general-06-high-level-architecture.md | 83 ++ ...trix_v2-router-general-07-besides-api.json | 75 ++ ...matrix_v2-router-general-07-besides-api.md | 85 ++ ...atrix_v2-router-general-08-components.json | 89 +++ ..._matrix_v2-router-general-08-components.md | 99 +++ ...ix_v2-router-general-09-reading-order.json | 73 ++ ...trix_v2-router-general-09-reading-order.md | 83 ++ ...ix_v2-router-general-10-short-summary.json | 71 ++ ...trix_v2-router-general-10-short-summary.md | 81 ++ .../20260407_125827/summary.md | 36 + ..._first_v3_v3-docs-summary-01-endpoint.json | 77 ++ ...lm_first_v3_v3-docs-summary-01-endpoint.md | 87 ++ ...st_v3_v3-docs-summary-02-architecture.json | 83 ++ ...irst_v3_v3-docs-summary-02-architecture.md | 93 +++ ...m_first_v3_v3-docs-summary-03-process.json | 75 ++ ...llm_first_v3_v3-docs-summary-03-process.md | 85 ++ ...lm_first_v3_v3-docs-summary-04-entity.json | 83 ++ ..._llm_first_v3_v3-docs-summary-04-entity.md | 93 +++ ..._first_v3_v3-find-files-01-which-file.json | 83 ++ ...lm_first_v3_v3-find-files-01-which-file.md | 93 +++ ...lm_first_v3_v3-find-files-02-show-doc.json | 83 ++ ..._llm_first_v3_v3-find-files-02-show-doc.md | 93 +++ ...t_v3_v3-find-files-03-where-described.json | 83 ++ ...rst_v3_v3-find-files-03-where-described.md | 93 +++ ...r_llm_first_v3_v3-general-01-overview.json | 73 ++ ...ter_llm_first_v3_v3-general-01-overview.md | 83 ++ ...irst_v3_v3-general-02-what-is-service.json | 69 ++ ..._first_v3_v3-general-02-what-is-service.md | 79 ++ ...er_llm_first_v3_v3-general-03-purpose.json | 73 ++ ...uter_llm_first_v3_v3-general-03-purpose.md | 83 ++ ...m_first_v3_v3-negative-01-operational.json | 77 ++ ...llm_first_v3_v3-negative-01-operational.md | 87 ++ ...uter_llm_first_v3_v3-negative-02-meta.json | 71 ++ ...router_llm_first_v3_v3-negative-02-meta.md | 81 ++ ..._llm_first_v3_v3-negative-03-non-docs.json | 75 ++ ...er_llm_first_v3_v3-negative-03-non-docs.md | 85 ++ ...r_llm_first_v3_v3-noisy-01-colloquial.json | 87 ++ ...ter_llm_first_v3_v3-noisy-01-colloquial.md | 97 +++ ...outer_llm_first_v3_v3-noisy-02-abbrev.json | 85 ++ .../router_llm_first_v3_v3-noisy-02-abbrev.md | 95 +++ ...lm_first_v3_v3-noisy-03-broken-phrase.json | 85 ++ ..._llm_first_v3_v3-noisy-03-broken-phrase.md | 95 +++ .../20260407_125805/summary.md | 22 + ..._first_v3_v3-docs-summary-01-endpoint.json | 79 ++ ...lm_first_v3_v3-docs-summary-01-endpoint.md | 89 +++ ...st_v3_v3-docs-summary-02-architecture.json | 83 ++ ...irst_v3_v3-docs-summary-02-architecture.md | 93 +++ ...m_first_v3_v3-docs-summary-03-process.json | 75 ++ ...llm_first_v3_v3-docs-summary-03-process.md | 85 ++ ...lm_first_v3_v3-docs-summary-04-entity.json | 83 ++ ..._llm_first_v3_v3-docs-summary-04-entity.md | 93 +++ ..._first_v3_v3-find-files-01-which-file.json | 83 ++ ...lm_first_v3_v3-find-files-01-which-file.md | 93 +++ ...lm_first_v3_v3-find-files-02-show-doc.json | 83 ++ ..._llm_first_v3_v3-find-files-02-show-doc.md | 93 +++ ...t_v3_v3-find-files-03-where-described.json | 83 ++ ...rst_v3_v3-find-files-03-where-described.md | 93 +++ ...r_llm_first_v3_v3-general-01-overview.json | 73 ++ ...ter_llm_first_v3_v3-general-01-overview.md | 83 ++ ...irst_v3_v3-general-02-what-is-service.json | 69 ++ ..._first_v3_v3-general-02-what-is-service.md | 79 ++ ...er_llm_first_v3_v3-general-03-purpose.json | 75 ++ ...uter_llm_first_v3_v3-general-03-purpose.md | 85 ++ ...m_first_v3_v3-negative-01-operational.json | 77 ++ ...llm_first_v3_v3-negative-01-operational.md | 87 ++ ...uter_llm_first_v3_v3-negative-02-meta.json | 71 ++ ...router_llm_first_v3_v3-negative-02-meta.md | 81 ++ ..._llm_first_v3_v3-negative-03-non-docs.json | 75 ++ ...er_llm_first_v3_v3-negative-03-non-docs.md | 85 ++ ...r_llm_first_v3_v3-noisy-01-colloquial.json | 89 +++ ...ter_llm_first_v3_v3-noisy-01-colloquial.md | 97 +++ ...outer_llm_first_v3_v3-noisy-02-abbrev.json | 85 ++ .../router_llm_first_v3_v3-noisy-02-abbrev.md | 95 +++ ...lm_first_v3_v3-noisy-03-broken-phrase.json | 85 ++ ..._llm_first_v3_v3-noisy-03-broken-phrase.md | 95 +++ .../20260407_124942/summary.md | 25 + ..._first_v3_v3-docs-summary-01-endpoint.json | 79 ++ ...lm_first_v3_v3-docs-summary-01-endpoint.md | 89 +++ ...st_v3_v3-docs-summary-02-architecture.json | 83 ++ ...irst_v3_v3-docs-summary-02-architecture.md | 93 +++ ...m_first_v3_v3-docs-summary-03-process.json | 75 ++ ...llm_first_v3_v3-docs-summary-03-process.md | 85 ++ ...lm_first_v3_v3-docs-summary-04-entity.json | 83 ++ ..._llm_first_v3_v3-docs-summary-04-entity.md | 93 +++ ..._first_v3_v3-find-files-01-which-file.json | 83 ++ ...lm_first_v3_v3-find-files-01-which-file.md | 93 +++ ...lm_first_v3_v3-find-files-02-show-doc.json | 83 ++ ..._llm_first_v3_v3-find-files-02-show-doc.md | 93 +++ ...t_v3_v3-find-files-03-where-described.json | 83 ++ ...rst_v3_v3-find-files-03-where-described.md | 93 +++ ...r_llm_first_v3_v3-general-01-overview.json | 73 ++ ...ter_llm_first_v3_v3-general-01-overview.md | 83 ++ ...irst_v3_v3-general-02-what-is-service.json | 69 ++ ..._first_v3_v3-general-02-what-is-service.md | 79 ++ ...er_llm_first_v3_v3-general-03-purpose.json | 75 ++ ...uter_llm_first_v3_v3-general-03-purpose.md | 85 ++ ...m_first_v3_v3-negative-01-operational.json | 77 ++ ...llm_first_v3_v3-negative-01-operational.md | 87 ++ ...uter_llm_first_v3_v3-negative-02-meta.json | 71 ++ ...router_llm_first_v3_v3-negative-02-meta.md | 81 ++ ..._llm_first_v3_v3-negative-03-non-docs.json | 75 ++ ...er_llm_first_v3_v3-negative-03-non-docs.md | 85 ++ ...r_llm_first_v3_v3-noisy-01-colloquial.json | 87 ++ ...ter_llm_first_v3_v3-noisy-01-colloquial.md | 97 +++ ...outer_llm_first_v3_v3-noisy-02-abbrev.json | 85 ++ .../router_llm_first_v3_v3-noisy-02-abbrev.md | 95 +++ ...lm_first_v3_v3-noisy-03-broken-phrase.json | 85 ++ ..._llm_first_v3_v3-noisy-03-broken-phrase.md | 95 +++ .../20260407_124956/summary.md | 22 + ...trix_v2-router-docs-summary-01-health.json | 99 +++ ...matrix_v2-router-docs-summary-01-health.md | 109 +++ ...matrix_v2-router-docs-summary-02-send.json | 99 +++ ...2_matrix_v2-router-docs-summary-02-send.md | 109 +++ ...rix_v2-router-docs-summary-03-actions.json | 99 +++ ...atrix_v2-router-docs-summary-03-actions.md | 109 +++ ...router-docs-summary-04-runtime-health.json | 103 +++ ...2-router-docs-summary-04-runtime-health.md | 113 +++ ...ter-docs-summary-05-notification-loop.json | 103 +++ ...outer-docs-summary-05-notification-loop.md | 113 +++ ...2-router-docs-summary-06-architecture.json | 115 +++ ..._v2-router-docs-summary-06-architecture.md | 125 +++ ...trix_v2-router-docs-summary-07-worker.json | 95 +++ ...matrix_v2-router-docs-summary-07-worker.md | 105 +++ ...outer-docs-summary-08-health-statuses.json | 99 +++ ...-router-docs-summary-08-health-statuses.md | 109 +++ ...v2-router-docs-summary-09-manual-send.json | 107 +++ ...x_v2-router-docs-summary-09-manual-send.md | 117 +++ ...-docs-summary-10-telegram-integration.json | 98 +++ ...er-docs-summary-10-telegram-integration.md | 106 +++ ...matrix_v2-router-find-files-01-health.json | 99 +++ ...2_matrix_v2-router-find-files-01-health.md | 109 +++ ...2_matrix_v2-router-find-files-02-send.json | 95 +++ ..._v2_matrix_v2-router-find-files-02-send.md | 105 +++ ...atrix_v2-router-find-files-03-actions.json | 99 +++ ..._matrix_v2-router-find-files-03-actions.md | 109 +++ ...2-router-find-files-04-runtime-health.json | 103 +++ ..._v2-router-find-files-04-runtime-health.md | 113 +++ ...2_matrix_v2-router-find-files-05-loop.json | 91 +++ ..._v2_matrix_v2-router-find-files-05-loop.md | 101 +++ ..._v2-router-find-files-06-architecture.json | 95 +++ ...ix_v2-router-find-files-06-architecture.md | 105 +++ ...2-router-find-files-07-errors-catalog.json | 103 +++ ..._v2-router-find-files-07-errors-catalog.md | 113 +++ ...ix_v2-router-find-files-08-docs-index.json | 91 +++ ...trix_v2-router-find-files-08-docs-index.md | 101 +++ ...router-find-files-09-telegram-bot-api.json | 99 +++ ...2-router-find-files-09-telegram-bot-api.md | 109 +++ ...-find-files-10-telegram-notify-worker.json | 95 +++ ...er-find-files-10-telegram-notify-worker.md | 105 +++ ..._v2-router-general-01-what-is-service.json | 83 ++ ...ix_v2-router-general-01-what-is-service.md | 93 +++ ...2_matrix_v2-router-general-02-purpose.json | 87 ++ ..._v2_matrix_v2-router-general-02-purpose.md | 97 +++ ...2_matrix_v2-router-general-03-problem.json | 91 +++ ..._v2_matrix_v2-router-general-03-problem.md | 101 +++ ...ix_v2-router-general-04-docs-contents.json | 91 +++ ...trix_v2-router-general-04-docs-contents.md | 101 +++ ...atrix_v2-router-general-05-main-parts.json | 87 ++ ..._matrix_v2-router-general-05-main-parts.md | 97 +++ ...er-general-06-high-level-architecture.json | 87 ++ ...uter-general-06-high-level-architecture.md | 97 +++ ...trix_v2-router-general-07-besides-api.json | 95 +++ ...matrix_v2-router-general-07-besides-api.md | 105 +++ ...atrix_v2-router-general-08-components.json | 106 +++ ..._matrix_v2-router-general-08-components.md | 114 +++ ...ix_v2-router-general-09-reading-order.json | 83 ++ ...trix_v2-router-general-09-reading-order.md | 93 +++ ...ix_v2-router-general-10-short-summary.json | 87 ++ ...trix_v2-router-general-10-short-summary.md | 97 +++ .../smoke_v4/20260407_120038/summary.md | 40 + .../smoke_v4_pass/20260407_120104.zip | Bin 0 -> 91192 bytes ...trix_v2-router-docs-summary-01-health.json | 99 +++ ...matrix_v2-router-docs-summary-01-health.md | 109 +++ ...matrix_v2-router-docs-summary-02-send.json | 99 +++ ...2_matrix_v2-router-docs-summary-02-send.md | 109 +++ ...rix_v2-router-docs-summary-03-actions.json | 99 +++ ...atrix_v2-router-docs-summary-03-actions.md | 109 +++ ...router-docs-summary-04-runtime-health.json | 103 +++ ...2-router-docs-summary-04-runtime-health.md | 113 +++ ...ter-docs-summary-05-notification-loop.json | 103 +++ ...outer-docs-summary-05-notification-loop.md | 113 +++ ...2-router-docs-summary-06-architecture.json | 115 +++ ..._v2-router-docs-summary-06-architecture.md | 125 +++ ...trix_v2-router-docs-summary-07-worker.json | 95 +++ ...matrix_v2-router-docs-summary-07-worker.md | 105 +++ ...outer-docs-summary-08-health-statuses.json | 99 +++ ...-router-docs-summary-08-health-statuses.md | 109 +++ ...v2-router-docs-summary-09-manual-send.json | 107 +++ ...x_v2-router-docs-summary-09-manual-send.md | 117 +++ ...-docs-summary-10-telegram-integration.json | 95 +++ ...er-docs-summary-10-telegram-integration.md | 105 +++ ...matrix_v2-router-find-files-01-health.json | 99 +++ ...2_matrix_v2-router-find-files-01-health.md | 109 +++ ...2_matrix_v2-router-find-files-02-send.json | 95 +++ ..._v2_matrix_v2-router-find-files-02-send.md | 105 +++ ...atrix_v2-router-find-files-03-actions.json | 99 +++ ..._matrix_v2-router-find-files-03-actions.md | 109 +++ ...2-router-find-files-04-runtime-health.json | 103 +++ ..._v2-router-find-files-04-runtime-health.md | 113 +++ ...2_matrix_v2-router-find-files-05-loop.json | 91 +++ ..._v2_matrix_v2-router-find-files-05-loop.md | 101 +++ ..._v2-router-find-files-06-architecture.json | 95 +++ ...ix_v2-router-find-files-06-architecture.md | 105 +++ ...2-router-find-files-07-errors-catalog.json | 103 +++ ..._v2-router-find-files-07-errors-catalog.md | 113 +++ ...ix_v2-router-find-files-08-docs-index.json | 91 +++ ...trix_v2-router-find-files-08-docs-index.md | 101 +++ ...router-find-files-09-telegram-bot-api.json | 99 +++ ...2-router-find-files-09-telegram-bot-api.md | 109 +++ ...-find-files-10-telegram-notify-worker.json | 95 +++ ...er-find-files-10-telegram-notify-worker.md | 105 +++ ..._v2-router-general-01-what-is-service.json | 83 ++ ...ix_v2-router-general-01-what-is-service.md | 93 +++ ...2_matrix_v2-router-general-02-purpose.json | 87 ++ ..._v2_matrix_v2-router-general-02-purpose.md | 97 +++ ...2_matrix_v2-router-general-03-problem.json | 91 +++ ..._v2_matrix_v2-router-general-03-problem.md | 101 +++ ...ix_v2-router-general-04-docs-contents.json | 91 +++ ...trix_v2-router-general-04-docs-contents.md | 101 +++ ...atrix_v2-router-general-05-main-parts.json | 87 ++ ..._matrix_v2-router-general-05-main-parts.md | 97 +++ ...er-general-06-high-level-architecture.json | 87 ++ ...uter-general-06-high-level-architecture.md | 97 +++ ...trix_v2-router-general-07-besides-api.json | 95 +++ ...matrix_v2-router-general-07-besides-api.md | 105 +++ ...atrix_v2-router-general-08-components.json | 103 +++ ..._matrix_v2-router-general-08-components.md | 113 +++ ...ix_v2-router-general-09-reading-order.json | 83 ++ ...trix_v2-router-general-09-reading-order.md | 93 +++ ...ix_v2-router-general-10-short-summary.json | 87 ++ ...trix_v2-router-general-10-short-summary.md | 97 +++ .../smoke_v4_pass/20260407_120104/summary.md | 36 + .../router_llm_first_v3.yaml | 147 ++++ .../20260407_130039.zip | Bin 0 -> 45169 bytes ..._first_v3_v3-docs-summary-01-endpoint.json | 77 ++ ...lm_first_v3_v3-docs-summary-01-endpoint.md | 87 ++ ...st_v3_v3-docs-summary-02-architecture.json | 81 ++ ...irst_v3_v3-docs-summary-02-architecture.md | 91 +++ ...m_first_v3_v3-docs-summary-03-process.json | 75 ++ ...llm_first_v3_v3-docs-summary-03-process.md | 85 ++ ...lm_first_v3_v3-docs-summary-04-entity.json | 81 ++ ..._llm_first_v3_v3-docs-summary-04-entity.md | 91 +++ ..._first_v3_v3-find-files-01-which-file.json | 83 ++ ...lm_first_v3_v3-find-files-01-which-file.md | 93 +++ ...lm_first_v3_v3-find-files-02-show-doc.json | 81 ++ ..._llm_first_v3_v3-find-files-02-show-doc.md | 91 +++ ...t_v3_v3-find-files-03-where-described.json | 81 ++ ...rst_v3_v3-find-files-03-where-described.md | 91 +++ ...r_llm_first_v3_v3-general-01-overview.json | 73 ++ ...ter_llm_first_v3_v3-general-01-overview.md | 83 ++ ...irst_v3_v3-general-02-what-is-service.json | 69 ++ ..._first_v3_v3-general-02-what-is-service.md | 79 ++ ...er_llm_first_v3_v3-general-03-purpose.json | 73 ++ ...uter_llm_first_v3_v3-general-03-purpose.md | 83 ++ ...m_first_v3_v3-negative-01-operational.json | 77 ++ ...llm_first_v3_v3-negative-01-operational.md | 87 ++ ...uter_llm_first_v3_v3-negative-02-meta.json | 71 ++ ...router_llm_first_v3_v3-negative-02-meta.md | 81 ++ ..._llm_first_v3_v3-negative-03-non-docs.json | 75 ++ ...er_llm_first_v3_v3-negative-03-non-docs.md | 85 ++ ...r_llm_first_v3_v3-noisy-01-colloquial.json | 87 ++ ...ter_llm_first_v3_v3-noisy-01-colloquial.md | 97 +++ ...outer_llm_first_v3_v3-noisy-02-abbrev.json | 85 ++ .../router_llm_first_v3_v3-noisy-02-abbrev.md | 95 +++ ...lm_first_v3_v3-noisy-03-broken-phrase.json | 83 ++ ..._llm_first_v3_v3-noisy-03-broken-phrase.md | 93 +++ .../20260407_130039/summary.md | 22 + ..._first_v3_v3-docs-summary-01-endpoint.json | 77 ++ ...lm_first_v3_v3-docs-summary-01-endpoint.md | 87 ++ ...st_v3_v3-docs-summary-02-architecture.json | 83 ++ ...irst_v3_v3-docs-summary-02-architecture.md | 93 +++ ...m_first_v3_v3-docs-summary-03-process.json | 73 ++ ...llm_first_v3_v3-docs-summary-03-process.md | 83 ++ ...lm_first_v3_v3-docs-summary-04-entity.json | 81 ++ ..._llm_first_v3_v3-docs-summary-04-entity.md | 91 +++ ..._first_v3_v3-find-files-01-which-file.json | 77 ++ ...lm_first_v3_v3-find-files-01-which-file.md | 87 ++ ...lm_first_v3_v3-find-files-02-show-doc.json | 79 ++ ..._llm_first_v3_v3-find-files-02-show-doc.md | 89 +++ ...t_v3_v3-find-files-03-where-described.json | 83 ++ ...rst_v3_v3-find-files-03-where-described.md | 93 +++ ...r_llm_first_v3_v3-general-01-overview.json | 73 ++ ...ter_llm_first_v3_v3-general-01-overview.md | 83 ++ ...irst_v3_v3-general-02-what-is-service.json | 69 ++ ..._first_v3_v3-general-02-what-is-service.md | 79 ++ ...er_llm_first_v3_v3-general-03-purpose.json | 69 ++ ...uter_llm_first_v3_v3-general-03-purpose.md | 79 ++ ...m_first_v3_v3-negative-01-operational.json | 77 ++ ...llm_first_v3_v3-negative-01-operational.md | 87 ++ ...uter_llm_first_v3_v3-negative-02-meta.json | 71 ++ ...router_llm_first_v3_v3-negative-02-meta.md | 81 ++ ..._llm_first_v3_v3-negative-03-non-docs.json | 75 ++ ...er_llm_first_v3_v3-negative-03-non-docs.md | 85 ++ ...r_llm_first_v3_v3-noisy-01-colloquial.json | 69 ++ ...ter_llm_first_v3_v3-noisy-01-colloquial.md | 79 ++ ...outer_llm_first_v3_v3-noisy-02-abbrev.json | 81 ++ .../router_llm_first_v3_v3-noisy-02-abbrev.md | 91 +++ ...lm_first_v3_v3-noisy-03-broken-phrase.json | 81 ++ ..._llm_first_v3_v3-noisy-03-broken-phrase.md | 91 +++ .../20260407_140409/summary.md | 22 + ..._first_v3_v3-docs-summary-01-endpoint.json | 77 ++ ...lm_first_v3_v3-docs-summary-01-endpoint.md | 87 ++ ...st_v3_v3-docs-summary-02-architecture.json | 83 ++ ...irst_v3_v3-docs-summary-02-architecture.md | 93 +++ ...m_first_v3_v3-docs-summary-03-process.json | 73 ++ ...llm_first_v3_v3-docs-summary-03-process.md | 83 ++ ...lm_first_v3_v3-docs-summary-04-entity.json | 81 ++ ..._llm_first_v3_v3-docs-summary-04-entity.md | 91 +++ ..._first_v3_v3-find-files-01-which-file.json | 77 ++ ...lm_first_v3_v3-find-files-01-which-file.md | 87 ++ ...lm_first_v3_v3-find-files-02-show-doc.json | 79 ++ ..._llm_first_v3_v3-find-files-02-show-doc.md | 89 +++ ...t_v3_v3-find-files-03-where-described.json | 83 ++ ...rst_v3_v3-find-files-03-where-described.md | 93 +++ ...r_llm_first_v3_v3-general-01-overview.json | 73 ++ ...ter_llm_first_v3_v3-general-01-overview.md | 83 ++ ...irst_v3_v3-general-02-what-is-service.json | 69 ++ ..._first_v3_v3-general-02-what-is-service.md | 79 ++ ...er_llm_first_v3_v3-general-03-purpose.json | 69 ++ ...uter_llm_first_v3_v3-general-03-purpose.md | 79 ++ ...m_first_v3_v3-negative-01-operational.json | 77 ++ ...llm_first_v3_v3-negative-01-operational.md | 87 ++ ...uter_llm_first_v3_v3-negative-02-meta.json | 71 ++ ...router_llm_first_v3_v3-negative-02-meta.md | 81 ++ ..._llm_first_v3_v3-negative-03-non-docs.json | 75 ++ ...er_llm_first_v3_v3-negative-03-non-docs.md | 85 ++ ...r_llm_first_v3_v3-noisy-01-colloquial.json | 69 ++ ...ter_llm_first_v3_v3-noisy-01-colloquial.md | 79 ++ ...outer_llm_first_v3_v3-noisy-02-abbrev.json | 79 ++ .../router_llm_first_v3_v3-noisy-02-abbrev.md | 89 +++ ...lm_first_v3_v3-noisy-03-broken-phrase.json | 81 ++ ..._llm_first_v3_v3-noisy-03-broken-phrase.md | 91 +++ .../20260407_140431/summary.md | 22 + .../test_runs/Архив.zip | Bin 0 -> 99479 bytes tests/pipeline_setup_v4/core/__init__.py | 1 + tests/pipeline_setup_v4/core/artifacts.py | 114 +++ tests/pipeline_setup_v4/core/case_loader.py | 59 ++ tests/pipeline_setup_v4/core/models.py | 46 ++ tests/pipeline_setup_v4/core/runner.py | 34 + tests/pipeline_setup_v4/core/validators.py | 17 + tests/pipeline_setup_v4/executors/__init__.py | 1 + .../executors/process_v2_router_executor.py | 121 +++ tests/pipeline_setup_v4/executors/registry.py | 18 + tests/pipeline_setup_v4/run.py | 40 + tests/pipeline_setup_v4/shared/__init__.py | 1 + tests/pipeline_setup_v4/shared/env_loader.py | 40 + .../agent/test_application_startup.py | 19 + .../agent/test_gigachat_client_retry.py | 4 +- .../agent/test_llm_service_logging.py | 4 +- tests/unit_tests/agent/test_logging_setup.py | 2 +- .../agent/test_repo_webhook_service.py | 98 --- .../unit_tests/agent/test_session_service.py | 26 + .../agent/test_v2_evidence_ranking.py | 80 ++ .../unit_tests/agent/test_v2_intent_router.py | 98 +++ .../agent/test_v2_intent_router_extraction.py | 67 ++ tests/unit_tests/agent/test_v2_process.py | 286 +++++++ .../agent/test_v2_retrieval_policy.py | 49 ++ tests/unit_tests/api/test_route_map.py | 43 + tests/unit_tests/rag/asserts_intent_router.py | 4 +- tests/unit_tests/rag/intent_router_testkit.py | 12 +- .../rag/test_code_indexing_pipeline.py | 4 +- .../rag/test_docs_indexing_pipeline.py | 64 +- .../unit_tests/rag/test_docs_prompt_layer.py | 41 +- tests/unit_tests/rag/test_docs_qa_pipeline.py | 359 ++++++++- .../rag/test_docs_retrieval_plan_mapping.py | 32 + .../rag/test_explain_intent_builder.py | 2 +- .../rag/test_intent_router_e2e_flows.py | 38 +- .../rag/test_intent_router_invariants.py | 275 +++---- .../test_intent_router_llm_disambiguation.py | 97 +-- tests/unit_tests/rag/test_layered_gateway.py | 2 +- tests/unit_tests/rag/test_path_filter.py | 2 +- .../rag/test_query_normalization.py | 2 +- tests/unit_tests/rag/test_query_terms.py | 2 +- .../rag/test_rag_service_filtering.py | 40 +- .../rag/test_rag_session_retriever.py | 26 + .../rag/test_retrieval_statement_builder.py | 4 +- .../rag/test_retriever_v2_no_fallback.py | 2 +- .../unit_tests/rag/test_retriever_v2_pack.py | 4 +- .../rag/test_retriever_v2_production_first.py | 4 +- tests/unit_tests/rag/test_trace_builder.py | 4 +- 1748 files changed, 216679 insertions(+), 14208 deletions(-) create mode 100644 _process/03. RAG.md create mode 100644 _process/05. MVP - process_v1.md create mode 100644 _process/05. MVP - process_v2.md create mode 100644 _process/components/v2_intent_router_architecture.md create mode 100644 docs/intent-router-mvp.md create mode 100644 pipeline_setup_v3.md delete mode 100644 runtime_traces/agent_requests/20260401/req_33758fd1ed834100a23fe95871b34181.md create mode 100644 runtime_traces/agent_requests/20260406-153629-250147960243.md create mode 100644 src/app/core/agent/__init__.py create mode 100644 src/app/core/agent/processes/__init__.py create mode 100644 src/app/core/agent/processes/base.py create mode 100644 src/app/core/agent/processes/v1/__init__.py create mode 100644 src/app/core/agent/processes/v1/process.py create mode 100644 src/app/core/agent/processes/v1/workflow/__init__.py create mode 100644 src/app/core/agent/processes/v1/workflow/flow_main/__init__.py create mode 100644 src/app/core/agent/processes/v1/workflow/flow_main/context.py create mode 100644 src/app/core/agent/processes/v1/workflow/flow_main/graph.py create mode 100644 src/app/core/agent/processes/v1/workflow/flow_main/prompts.yml create mode 100644 src/app/core/agent/processes/v1/workflow/flow_main/steps/__init__.py create mode 100644 src/app/core/agent/processes/v1/workflow/flow_main/steps/finalize_answer_step.py create mode 100644 src/app/core/agent/processes/v1/workflow/flow_main/steps/generate_answer_step.py create mode 100644 src/app/core/agent/processes/v1/workflow/flow_main/steps/prepare_user_message_step.py create mode 100644 src/app/core/agent/processes/v2/__init__.py create mode 100644 src/app/core/agent/processes/v2/anchor_signals.py create mode 100644 src/app/core/agent/processes/v2/evidence/assembler.py create mode 100644 src/app/core/agent/processes/v2/evidence/gate.py create mode 100644 src/app/core/agent/processes/v2/general_prompts.yml create mode 100644 src/app/core/agent/processes/v2/intent_router/__init__.py create mode 100644 src/app/core/agent/processes/v2/intent_router/models.py create mode 100644 src/app/core/agent/processes/v2/intent_router/modules/__init__.py create mode 100644 src/app/core/agent/processes/v2/intent_router/modules/anchors.py create mode 100644 src/app/core/agent/processes/v2/intent_router/modules/normalizer.py create mode 100644 src/app/core/agent/processes/v2/intent_router/modules/target_terms.py create mode 100644 src/app/core/agent/processes/v2/intent_router/router.py create mode 100644 src/app/core/agent/processes/v2/intent_router/routers/__init__.py create mode 100644 src/app/core/agent/processes/v2/intent_router/routers/confidence.py create mode 100644 src/app/core/agent/processes/v2/intent_router/routers/deterministic.py create mode 100644 src/app/core/agent/processes/v2/intent_router/routers/docs_subintent_resolver.py create mode 100644 src/app/core/agent/processes/v2/intent_router/routers/fallback.py create mode 100644 src/app/core/agent/processes/v2/intent_router/routers/llm.py create mode 100644 src/app/core/agent/processes/v2/intent_router/routers/prompts.yml create mode 100644 src/app/core/agent/processes/v2/intent_router/routers/route_catalog.py create mode 100644 src/app/core/agent/processes/v2/intent_router/routers/validator.py create mode 100644 src/app/core/agent/processes/v2/models.py create mode 100644 src/app/core/agent/processes/v2/process.py create mode 100644 src/app/core/agent/processes/v2/prompts.yml create mode 100644 src/app/core/agent/processes/v2/retrieval/__init__.py create mode 100644 src/app/core/agent/processes/v2/retrieval/metadata_lookup.py create mode 100644 src/app/core/agent/processes/v2/retrieval/policy_resolver.py create mode 100644 src/app/core/agent/processes/v2/retrieval/target_doc_seeding.py create mode 100644 src/app/core/agent/processes/v2/retrieval/v2_rag_adapter.py rename src/app/{modules/agent/orchestration => core/agent/processes/v2/workflows}/__init__.py (100%) create mode 100644 src/app/core/agent/processes/v2/workflows/docs_explain_find_files/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/docs_explain_find_files/context.py create mode 100644 src/app/core/agent/processes/v2/workflows/docs_explain_find_files/graph.py create mode 100644 src/app/core/agent/processes/v2/workflows/docs_explain_find_files/steps/finalize_find_files_answer_step.py create mode 100644 src/app/core/agent/processes/v2/workflows/docs_explain_summary/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/docs_explain_summary/context.py create mode 100644 src/app/core/agent/processes/v2/workflows/docs_explain_summary/graph.py create mode 100644 src/app/core/agent/processes/v2/workflows/docs_explain_summary/steps/generate_summary_answer_step.py create mode 100644 src/app/core/agent/processes/v2/workflows/general_summary/__init__.py create mode 100644 src/app/core/agent/processes/v2/workflows/general_summary/context.py create mode 100644 src/app/core/agent/processes/v2/workflows/general_summary/graph.py create mode 100644 src/app/core/agent/processes/v2/workflows/general_summary/steps/generate_general_summary_answer_step.py create mode 100644 src/app/core/agent/processes/v2/workflows/v2_workflow_graph.py create mode 100644 src/app/core/agent/runtime/__init__.py create mode 100644 src/app/core/agent/runtime/agent_runtime.py create mode 100644 src/app/core/agent/runtime/execution_context.py create mode 100644 src/app/core/agent/runtime/process_registry.py create mode 100644 src/app/core/agent/runtime/process_runner.py create mode 100644 src/app/core/agent/runtime/publisher.py create mode 100644 src/app/core/agent/utils/__init__.py create mode 100644 src/app/core/agent/utils/llm/__init__.py create mode 100644 src/app/core/agent/utils/llm/prompt_loader.py rename src/app/{modules/agent => core/agent/utils}/llm/service.py (89%) create mode 100644 src/app/core/agent/utils/traces/__init__.py create mode 100644 src/app/core/agent/utils/workflow/__init__.py create mode 100644 src/app/core/agent/utils/workflow/context.py create mode 100644 src/app/core/agent/utils/workflow/graph.py create mode 100644 src/app/core/agent/utils/workflow/step.py rename src/app/{modules => core}/api/__init__.py (100%) rename src/app/{modules => core}/api/application/request_service.py (61%) create mode 100644 src/app/core/api/application/session_bootstrap_service.py create mode 100644 src/app/core/api/application/session_service.py rename src/app/{modules => core}/api/application/stream_service.py (80%) create mode 100644 src/app/core/api/controllers/rag_public_controller.py rename src/app/{modules => core}/api/controllers/request_controller.py (92%) create mode 100644 src/app/core/api/controllers/session_controller.py create mode 100644 src/app/core/api/controllers/stream_controller.py rename src/app/{modules => core}/api/domain/events/client_event.py (100%) rename src/app/{modules => core}/api/domain/models/agent_request.py (100%) create mode 100644 src/app/core/api/domain/models/agent_session.py create mode 100644 src/app/core/api/domain/models/agent_session_message.py rename src/app/{modules => core}/api/infrastructure/ids/request_id_factory.py (100%) rename src/app/{modules => core}/api/infrastructure/ids/session_id_factory.py (100%) rename src/app/{modules => core}/api/infrastructure/stores/in_memory_request_store.py (87%) rename src/app/{modules => core}/api/infrastructure/stores/in_memory_session_store.py (87%) rename src/app/{modules => core}/api/infrastructure/streaming/replay_buffer.py (89%) rename src/app/{modules => core}/api/infrastructure/streaming/sse_encoder.py (87%) rename src/app/{modules => core}/api/infrastructure/streaming/sse_event_channel.py (90%) create mode 100644 src/app/core/api/infrastructure/streaming/sse_response_builder.py create mode 100644 src/app/core/api/module.py rename src/app/{modules => core}/api/public_router.py (53%) create mode 100644 src/app/core/api/rag_public_router.py create mode 100644 src/app/core/application.py rename src/app/{modules => core}/contracts.py (100%) rename src/app/{modules => core}/rag/README.md (98%) rename src/app/{modules => core}/rag/__init__.py (90%) create mode 100644 src/app/core/rag/contracts/__init__.py rename src/app/{modules => core}/rag/contracts/documents.py (97%) rename src/app/{modules => core}/rag/contracts/enums.py (94%) rename src/app/{modules => core}/rag/contracts/evidence.py (100%) rename src/app/{modules => core}/rag/contracts/retrieval.py (100%) rename src/app/{modules => core}/rag/embedding/__init__.py (55%) rename src/app/{modules => core}/rag/embedding/gigachat_embedder.py (81%) create mode 100644 src/app/core/rag/indexing/__init__.py rename src/app/{modules => core}/rag/indexing/code/code_text/chunker.py (100%) rename src/app/{modules => core}/rag/indexing/code/code_text/document_builder.py (76%) rename src/app/{modules => core}/rag/indexing/code/edges/dataflow_document_builder.py (86%) rename src/app/{modules => core}/rag/indexing/code/edges/dataflow_slice_builder.py (98%) rename src/app/{modules => core}/rag/indexing/code/edges/document_builder.py (82%) rename src/app/{modules => core}/rag/indexing/code/edges/extractor.py (100%) rename src/app/{modules => core}/rag/indexing/code/entrypoints/document_builder.py (90%) rename src/app/{modules => core}/rag/indexing/code/entrypoints/execution_trace_builder.py (95%) rename src/app/{modules => core}/rag/indexing/code/entrypoints/execution_trace_document_builder.py (85%) rename src/app/{modules => core}/rag/indexing/code/entrypoints/fastapi_detector.py (97%) rename src/app/{modules => core}/rag/indexing/code/entrypoints/flask_detector.py (93%) rename src/app/{modules => core}/rag/indexing/code/entrypoints/registry.py (100%) rename src/app/{modules => core}/rag/indexing/code/entrypoints/typer_click_detector.py (93%) rename src/app/{modules => core}/rag/indexing/code/file_filter.py (85%) rename src/app/{modules => core}/rag/indexing/code/pipeline.py (62%) create mode 100644 src/app/core/rag/indexing/code/roles/__init__.py rename src/app/{modules => core}/rag/indexing/code/roles/builder.py (72%) rename src/app/{modules => core}/rag/indexing/code/roles/document_builder.py (86%) rename src/app/{modules => core}/rag/indexing/code/roles/models.py (100%) rename src/app/{modules => core}/rag/indexing/code/roles/scorer.py (95%) rename src/app/{modules => core}/rag/indexing/code/symbols/ast_parser.py (100%) rename src/app/{modules => core}/rag/indexing/code/symbols/document_builder.py (82%) rename src/app/{modules => core}/rag/indexing/code/symbols/extractor.py (100%) rename src/app/{modules => core}/rag/indexing/common/document_upserter.py (81%) rename src/app/{modules => core}/rag/indexing/common/path_filter.py (100%) rename src/app/{modules => core}/rag/indexing/common/report.py (100%) rename src/app/{modules => core}/rag/indexing/docs/chunkers/markdown_chunker.py (96%) rename src/app/{modules => core}/rag/indexing/docs/chunkers/text_chunker.py (100%) rename src/app/{modules => core}/rag/indexing/docs/classifier.py (91%) create mode 100644 src/app/core/rag/indexing/docs/content_parser.py create mode 100644 src/app/core/rag/indexing/docs/document_builder.py rename src/app/{modules => core}/rag/indexing/docs/entity_extractor.py (100%) rename src/app/{modules => core}/rag/indexing/docs/fact_extractor.py (100%) rename src/app/{modules => core}/rag/indexing/docs/file_filter.py (92%) rename src/app/{modules => core}/rag/indexing/docs/frontmatter_parser.py (100%) create mode 100644 src/app/core/rag/indexing/docs/frontmatter_view.py create mode 100644 src/app/core/rag/indexing/docs/integration_extractor.py rename src/app/{modules => core}/rag/indexing/docs/models.py (78%) rename src/app/{modules => core}/rag/indexing/docs/pipeline.py (52%) create mode 100644 src/app/core/rag/indexing/docs/relation_extractor.py create mode 100644 src/app/core/rag/indexing/docs/support_layer_builder.py rename src/app/{modules => core}/rag/indexing/docs/workflow_extractor.py (80%) rename src/app/{modules/rag => core/rag/indexing}/job_store.py (97%) rename src/app/{modules/rag/indexing_service.py => core/rag/indexing/orchestrator.py} (95%) rename src/app/{modules/rag/services/rag_service.py => core/rag/indexing/service.py} (93%) create mode 100644 src/app/core/rag/ingest_api.py rename src/app/{modules => core}/rag/intent_router.md (100%) create mode 100644 src/app/core/rag/module.py create mode 100644 src/app/core/rag/persistence/__init__.py rename src/app/{modules => core}/rag/persistence/cache_repository.py (78%) rename src/app/{modules => core}/rag/persistence/document_repository.py (98%) rename src/app/{modules => core}/rag/persistence/job_repository.py (98%) rename src/app/{modules => core}/rag/persistence/query_repository.py (55%) rename src/app/{modules => core}/rag/persistence/repository.py (82%) rename src/app/{modules => core}/rag/persistence/retrieval_statement_builder.py (97%) rename src/app/{modules => core}/rag/persistence/schema_migrator.py (98%) rename src/app/{modules => core}/rag/persistence/schema_repository.py (80%) rename src/app/{modules => core}/rag/persistence/schema_statements.py (100%) rename src/app/{modules => core}/rag/persistence/session_repository.py (96%) rename src/app/{modules/rag => core/rag/persistence}/session_store.py (94%) create mode 100644 src/app/core/rag/retrieval/__init__.py rename src/app/{modules => core}/rag/retrieval/chunker.py (100%) rename src/app/{modules => core}/rag/retrieval/query_terms.py (100%) rename src/app/{modules => core}/rag/retrieval/scoring.py (100%) create mode 100644 src/app/core/rag/retrieval/session_retriever.py rename src/app/{modules => core}/rag/retrieval/test_filter.py (100%) rename src/app/{modules => core}/shared/README.md (74%) rename src/app/{modules => core/shared}/__init__.py (100%) create mode 100644 src/app/core/shared/config/__init__.py rename src/app/{modules/shared => core/shared/config}/env_loader.py (100%) create mode 100644 src/app/core/shared/database/__init__.py rename src/app/{modules/shared => core/shared/database}/bootstrap.py (90%) rename src/app/{modules/shared => core/shared/database}/checkpointer.py (81%) rename src/app/{modules/shared => core/shared/database}/db.py (100%) create mode 100644 src/app/core/shared/database/readiness.py rename src/app/{modules/agent => core/shared/gigachat}/__init__.py (100%) rename src/app/{modules => core}/shared/gigachat/client.py (92%) rename src/app/{modules => core}/shared/gigachat/errors.py (100%) rename src/app/{modules => core}/shared/gigachat/settings.py (100%) rename src/app/{modules => core}/shared/gigachat/token_provider.py (93%) create mode 100644 src/app/core/shared/messaging/__init__.py rename src/app/{modules/shared => core/shared/messaging}/event_bus.py (100%) create mode 100644 src/app/core/shared/resilience/__init__.py rename src/app/{modules/shared => core/shared/resilience}/idempotency_store.py (82%) rename src/app/{modules/shared => core/shared/resilience}/retry_executor.py (93%) create mode 100644 src/app/core/shared/story_context/__init__.py create mode 100644 src/app/core/shared/story_context/schema_repository.py rename src/app/{modules/shared => infra}/__init__.py (100%) rename src/app/{core => infra}/constants.py (100%) rename src/app/{core => infra}/error_handlers.py (85%) rename src/app/{core => infra}/exceptions.py (100%) rename src/app/{core => infra}/logging_setup.py (100%) create mode 100644 src/app/infra/observability/__init__.py rename src/app/{modules/agent => infra}/observability/module_trace.py (100%) rename src/app/{modules/api/infrastructure/logging => infra/observability}/request_trace_logger.py (55%) create mode 100644 src/app/infra/observability/trace_file_path_builder.py rename src/app/{modules/api/infrastructure/logging => infra/observability}/trace_markdown_writer.py (100%) delete mode 100644 src/app/modules/agent/README.md delete mode 100644 src/app/modules/agent/intent_router_v2/__init__.py delete mode 100644 src/app/modules/agent/intent_router_v2/analysis/__init__.py delete mode 100644 src/app/modules/agent/intent_router_v2/analysis/ambiguity_detector.py delete mode 100644 src/app/modules/agent/intent_router_v2/analysis/anchor_extractor.py delete mode 100644 src/app/modules/agent/intent_router_v2/analysis/anchor_span_validator.py delete mode 100644 src/app/modules/agent/intent_router_v2/analysis/conversation_anchor_builder.py delete mode 100644 src/app/modules/agent/intent_router_v2/analysis/docs_query_signals.py delete mode 100644 src/app/modules/agent/intent_router_v2/analysis/docs_sub_intent_detector.py delete mode 100644 src/app/modules/agent/intent_router_v2/analysis/followup_detector.py delete mode 100644 src/app/modules/agent/intent_router_v2/analysis/keyword_hint_builder.py delete mode 100644 src/app/modules/agent/intent_router_v2/analysis/keyword_hint_sanitizer.py delete mode 100644 src/app/modules/agent/intent_router_v2/analysis/negation_detector.py delete mode 100644 src/app/modules/agent/intent_router_v2/analysis/normalization.py delete mode 100644 src/app/modules/agent/intent_router_v2/analysis/normalization_terms.py delete mode 100644 src/app/modules/agent/intent_router_v2/analysis/query_normalizer.py delete mode 100644 src/app/modules/agent/intent_router_v2/analysis/query_plan_builder.py delete mode 100644 src/app/modules/agent/intent_router_v2/analysis/sub_intent_detector.py delete mode 100644 src/app/modules/agent/intent_router_v2/analysis/symbol_rules.py delete mode 100644 src/app/modules/agent/intent_router_v2/analysis/term_mapping.py delete mode 100644 src/app/modules/agent/intent_router_v2/analysis/test_signals.py delete mode 100644 src/app/modules/agent/intent_router_v2/factory.py delete mode 100644 src/app/modules/agent/intent_router_v2/intent/__init__.py delete mode 100644 src/app/modules/agent/intent_router_v2/intent/classifier.py delete mode 100644 src/app/modules/agent/intent_router_v2/intent/conversation_policy.py delete mode 100644 src/app/modules/agent/intent_router_v2/intent/graph_id_resolver.py delete mode 100644 src/app/modules/agent/intent_router_v2/intent/llm_disambiguator.py delete mode 100644 src/app/modules/agent/intent_router_v2/local_runner.py delete mode 100644 src/app/modules/agent/intent_router_v2/logger.py delete mode 100644 src/app/modules/agent/intent_router_v2/models.py delete mode 100644 src/app/modules/agent/intent_router_v2/protocols.py delete mode 100644 src/app/modules/agent/intent_router_v2/readme.md delete mode 100644 src/app/modules/agent/intent_router_v2/retrieval_planning/__init__.py delete mode 100644 src/app/modules/agent/intent_router_v2/retrieval_planning/evidence_policy_factory.py delete mode 100644 src/app/modules/agent/intent_router_v2/retrieval_planning/layer_query_builder.py delete mode 100644 src/app/modules/agent/intent_router_v2/retrieval_planning/retrieval_constraints_factory.py delete mode 100644 src/app/modules/agent/intent_router_v2/retrieval_planning/retrieval_filter_builder.py delete mode 100644 src/app/modules/agent/intent_router_v2/retrieval_planning/retrieval_spec_factory.py delete mode 100644 src/app/modules/agent/intent_router_v2/router.py delete mode 100644 src/app/modules/agent/llm/__init__.py delete mode 100644 src/app/modules/agent/llm/prompt_loader.py delete mode 100644 src/app/modules/agent/llm/prompts.yml delete mode 100644 src/app/modules/agent/orchestration/adapters/intent_router_adapter.py delete mode 100644 src/app/modules/agent/orchestration/adapters/llm_chat_adapter.py delete mode 100644 src/app/modules/agent/orchestration/adapters/task_runtime_adapter.py delete mode 100644 src/app/modules/agent/orchestration/context/execution_context.py delete mode 100644 src/app/modules/agent/orchestration/facade.py delete mode 100644 src/app/modules/agent/orchestration/messaging/client_message_publisher.py delete mode 100644 src/app/modules/agent/orchestration/messaging/status_message_factory.py delete mode 100644 src/app/modules/agent/orchestration/messaging/user_message_factory.py delete mode 100644 src/app/modules/agent/orchestration/processes/registry.py delete mode 100644 src/app/modules/agent/orchestration/processes/v1/process.py delete mode 100644 src/app/modules/agent/orchestration/processes/v1/prompt_payload_builder.py delete mode 100644 src/app/modules/agent/orchestration/processes/v1/prompts.yml delete mode 100644 src/app/modules/agent/orchestration/processes/v1/simple_llm_workflow.py delete mode 100644 src/app/modules/agent/orchestration/processes/v1/steps/bootstrap_step.py delete mode 100644 src/app/modules/agent/orchestration/processes/v1/steps/execute_llm_workflow_step.py delete mode 100644 src/app/modules/agent/orchestration/processes/v1/steps/finalize_step.py delete mode 100644 src/app/modules/agent/orchestration/processes/v1/steps/run_llm_step.py delete mode 100644 src/app/modules/agent/orchestration/processes/v2/README.md delete mode 100644 src/app/modules/agent/orchestration/processes/v2/process.py delete mode 100644 src/app/modules/agent/orchestration/processes/v2/prompt_payload_builder.py delete mode 100644 src/app/modules/agent/orchestration/processes/v2/prompt_selector.py delete mode 100644 src/app/modules/agent/orchestration/processes/v2/prompts.yml delete mode 100644 src/app/modules/agent/orchestration/processes/v2/steps/execute_documentation_workflow_step.py delete mode 100644 src/app/modules/agent/orchestration/processes/v2/steps/execute_fallback_workflow_step.py delete mode 100644 src/app/modules/agent/orchestration/processes/v2/steps/execute_general_qa_workflow_step.py delete mode 100644 src/app/modules/agent/orchestration/processes/v2/steps/execute_openapi_workflow_step.py delete mode 100644 src/app/modules/agent/orchestration/processes/v2/steps/route_intent_step.py delete mode 100644 src/app/modules/agent/orchestration/processes/v2/steps/run_task_workflow_step.py delete mode 100644 src/app/modules/agent/orchestration/processes/v2/steps/workflow_step_base.py delete mode 100644 src/app/modules/agent/orchestration/runtime/process_runner.py delete mode 100644 src/app/modules/agent/orchestration/v2_progress.py delete mode 100644 src/app/modules/agent/runtime/__init__.py delete mode 100644 src/app/modules/agent/runtime/code_qa_runner_adapter.py delete mode 100644 src/app/modules/agent/runtime/docs_qa_pipeline/__init__.py delete mode 100644 src/app/modules/agent/runtime/docs_qa_pipeline/anchor_selector.py delete mode 100644 src/app/modules/agent/runtime/docs_qa_pipeline/answer_synthesizer.py delete mode 100644 src/app/modules/agent/runtime/docs_qa_pipeline/diagnostics_builder.py delete mode 100644 src/app/modules/agent/runtime/docs_qa_pipeline/doc_identity.py delete mode 100644 src/app/modules/agent/runtime/docs_qa_pipeline/evidence_builder.py delete mode 100644 src/app/modules/agent/runtime/docs_qa_pipeline/exact_anchor_matcher.py delete mode 100644 src/app/modules/agent/runtime/docs_qa_pipeline/models.py delete mode 100644 src/app/modules/agent/runtime/docs_qa_pipeline/openapi_evidence_extractor.py delete mode 100644 src/app/modules/agent/runtime/docs_qa_pipeline/openapi_generator.py delete mode 100644 src/app/modules/agent/runtime/docs_qa_pipeline/openapi_postprocessor.py delete mode 100644 src/app/modules/agent/runtime/docs_qa_pipeline/pipeline.py delete mode 100644 src/app/modules/agent/runtime/docs_qa_pipeline/prompt_payload_builder.py delete mode 100644 src/app/modules/agent/runtime/executor.py delete mode 100644 src/app/modules/agent/runtime/legacy_pipeline.py delete mode 100644 src/app/modules/agent/runtime/models.py delete mode 100644 src/app/modules/agent/runtime/steps/answer_policy/__init__.py delete mode 100644 src/app/modules/agent/runtime/steps/answer_policy/policy.py delete mode 100644 src/app/modules/agent/runtime/steps/answer_policy/short_answer_formatter.py delete mode 100644 src/app/modules/agent/runtime/steps/context/__init__.py delete mode 100644 src/app/modules/agent/runtime/steps/context/answer_fact_curator.py delete mode 100644 src/app/modules/agent/runtime/steps/context/answer_synthesis.py delete mode 100644 src/app/modules/agent/runtime/steps/context/contracts.py delete mode 100644 src/app/modules/agent/runtime/steps/context/diagnostics.py delete mode 100644 src/app/modules/agent/runtime/steps/context/evidence_bundle_builder.py delete mode 100644 src/app/modules/agent/runtime/steps/context/retrieval_request_builder.py delete mode 100644 src/app/modules/agent/runtime/steps/context/retrieval_result_builder.py delete mode 100644 src/app/modules/agent/runtime/steps/explain/__init__.py delete mode 100644 src/app/modules/agent/runtime/steps/explain/budgeter.py delete mode 100644 src/app/modules/agent/runtime/steps/explain/excerpt_planner.py delete mode 100644 src/app/modules/agent/runtime/steps/explain/graph_repository.py delete mode 100644 src/app/modules/agent/runtime/steps/explain/intent_builder.py delete mode 100644 src/app/modules/agent/runtime/steps/explain/layered_gateway.py delete mode 100644 src/app/modules/agent/runtime/steps/explain/models.py delete mode 100644 src/app/modules/agent/runtime/steps/explain/retriever_v2.py delete mode 100644 src/app/modules/agent/runtime/steps/explain/source_excerpt_fetcher.py delete mode 100644 src/app/modules/agent/runtime/steps/explain/trace_builder.py delete mode 100644 src/app/modules/agent/runtime/steps/finalization/__init__.py delete mode 100644 src/app/modules/agent/runtime/steps/finalization/repair.py delete mode 100644 src/app/modules/agent/runtime/steps/finalization/result_assembler.py delete mode 100644 src/app/modules/agent/runtime/steps/gates/__init__.py delete mode 100644 src/app/modules/agent/runtime/steps/gates/post/__init__.py delete mode 100644 src/app/modules/agent/runtime/steps/gates/post/post_gate.py delete mode 100644 src/app/modules/agent/runtime/steps/gates/pre/__init__.py delete mode 100644 src/app/modules/agent/runtime/steps/gates/pre/evidence_gate.py delete mode 100644 src/app/modules/agent/runtime/steps/generation/__init__.py delete mode 100644 src/app/modules/agent/runtime/steps/generation/generator.py delete mode 100644 src/app/modules/agent/runtime/steps/generation/prompt_payload_builder.py delete mode 100644 src/app/modules/agent/runtime/steps/generation/prompt_selector.py delete mode 100644 src/app/modules/agent/runtime/steps/retrieval/__init__.py delete mode 100644 src/app/modules/agent/runtime/steps/retrieval/adapter.py delete mode 100644 src/app/modules/agent/runtime/steps/retrieval/repo_context.py delete mode 100644 src/app/modules/agent/runtime/story_context_repository.py delete mode 100644 src/app/modules/agent/task_runtime/__init__.py delete mode 100644 src/app/modules/agent/task_runtime/context.py delete mode 100644 src/app/modules/agent/task_runtime/dispatcher.py delete mode 100644 src/app/modules/agent/task_runtime/enrichment.py delete mode 100644 src/app/modules/agent/task_runtime/facade.py delete mode 100644 src/app/modules/agent/task_runtime/models.py delete mode 100644 src/app/modules/agent/task_runtime/status_events.py delete mode 100644 src/app/modules/agent/task_runtime/templates.py delete mode 100644 src/app/modules/agent/task_runtime/workflows/__init__.py delete mode 100644 src/app/modules/agent/task_runtime/workflows/base.py delete mode 100644 src/app/modules/agent/task_runtime/workflows/docs_generation.py delete mode 100644 src/app/modules/agent/task_runtime/workflows/docs_qa.py delete mode 100644 src/app/modules/agent/task_runtime/workflows/fallback.py delete mode 100644 src/app/modules/agent/task_runtime/workflows/general_qa.py delete mode 100644 src/app/modules/agent/task_runtime/workflows/openapi.py delete mode 100644 src/app/modules/api/application/session_service.py delete mode 100644 src/app/modules/api/controllers/session_controller.py delete mode 100644 src/app/modules/api/controllers/stream_controller.py delete mode 100644 src/app/modules/api/domain/models/agent_session.py delete mode 100644 src/app/modules/api/infrastructure/logging/trace_file_path_builder.py delete mode 100644 src/app/modules/api/module.py delete mode 100644 src/app/modules/application.py delete mode 100644 src/app/modules/rag/contracts/__init__.py delete mode 100644 src/app/modules/rag/indexing/code/roles/__init__.py delete mode 100644 src/app/modules/rag/indexing/docs/content_parser.py delete mode 100644 src/app/modules/rag/indexing/docs/document_builder.py delete mode 100644 src/app/modules/rag/indexing/docs/relation_extractor.py delete mode 100644 src/app/modules/rag/module.py delete mode 100644 src/app/modules/rag/webhook_service.py delete mode 100644 src/app/modules/shared/gigachat/__init__.py create mode 100644 tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml create mode 100644 tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml create mode 100644 tests/pipeline_setup_v3/runtime/v2_process_adapter.py create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-05-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-05-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-02-purpose.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-02-purpose.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-03-problem.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-03-problem.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-05-main-parts.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-05-main-parts.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-07-besides-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-07-besides-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-08-components.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-08-components.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-09-reading-order.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-09-reading-order.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-10-short-summary.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-10-short-summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-05-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-05-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-02-purpose.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-02-purpose.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-03-problem.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-03-problem.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-05-main-parts.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-05-main-parts.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-07-besides-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-07-besides-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-08-components.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-08-components.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-09-reading-order.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-09-reading-order.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-10-short-summary.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-10-short-summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-05-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-05-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-02-purpose.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-02-purpose.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-03-problem.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-03-problem.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-05-main-parts.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-05-main-parts.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-07-besides-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-07-besides-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-08-components.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-08-components.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-09-reading-order.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-09-reading-order.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-10-short-summary.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-10-short-summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-05-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-05-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-02-purpose.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-02-purpose.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-03-problem.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-03-problem.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-05-main-parts.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-05-main-parts.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-07-besides-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-07-besides-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-08-components.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-08-components.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-09-reading-order.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-09-reading-order.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-10-short-summary.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-10-short-summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-05-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-05-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-02-purpose.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-02-purpose.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-03-problem.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-03-problem.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-05-main-parts.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-05-main-parts.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-07-besides-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-07-besides-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-08-components.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-08-components.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-09-reading-order.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-09-reading-order.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-10-short-summary.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-10-short-summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-05-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-05-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-02-purpose.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-02-purpose.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-03-problem.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-03-problem.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-05-main-parts.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-05-main-parts.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-07-besides-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-07-besides-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-08-components.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-08-components.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-09-reading-order.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-09-reading-order.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-10-short-summary.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-10-short-summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532.zip create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-05-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-05-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-02-purpose.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-02-purpose.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-03-problem.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-03-problem.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-05-main-parts.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-05-main-parts.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-07-besides-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-07-besides-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-08-components.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-08-components.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-09-reading-order.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-09-reading-order.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-10-short-summary.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-10-short-summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-05-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-05-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-02-purpose.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-02-purpose.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-03-problem.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-03-problem.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-05-main-parts.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-05-main-parts.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-07-besides-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-07-besides-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-08-components.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-08-components.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-09-reading-order.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-09-reading-order.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-10-short-summary.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-10-short-summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-05-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-05-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-02-purpose.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-02-purpose.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-03-problem.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-03-problem.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-05-main-parts.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-05-main-parts.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-07-besides-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-07-besides-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-08-components.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-08-components.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-09-reading-order.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-09-reading-order.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-10-short-summary.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-10-short-summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-02-purpose.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-02-purpose.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-03-problem.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-03-problem.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-08-components.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-08-components.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-02-purpose.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-02-purpose.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-03-problem.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-03-problem.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-08-components.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-08-components.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-02-purpose.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-02-purpose.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-03-problem.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-03-problem.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-08-components.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-08-components.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-01-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-01-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-02-send.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-02-send.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-02-purpose.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-02-purpose.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-03-problem.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-03-problem.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-08-components.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-08-components.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md create mode 100644 tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/summary.md create mode 100644 tests/pipeline_setup_v4/README.md create mode 100644 tests/pipeline_setup_v4/__init__.py create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-01-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-01-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-02-send.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-02-send.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-02-purpose.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-02-purpose.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-03-problem.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-03-problem.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-08-components.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-08-components.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/summary.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-01-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-01-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-02-send.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-02-send.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-02-purpose.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-02-purpose.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-03-problem.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-03-problem.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-08-components.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-08-components.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/summary.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-01-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-01-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-02-send.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-02-send.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-02-purpose.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-02-purpose.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-03-problem.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-03-problem.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-08-components.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-08-components.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/summary.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-01-endpoint.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-01-endpoint.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-02-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-02-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-03-process.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-03-process.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-04-entity.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-04-entity.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-01-which-file.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-01-which-file.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-02-show-doc.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-02-show-doc.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-03-where-described.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-03-where-described.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-01-overview.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-01-overview.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-02-what-is-service.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-02-what-is-service.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-03-purpose.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-03-purpose.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-01-operational.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-01-operational.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-02-meta.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-02-meta.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-03-non-docs.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-03-non-docs.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-01-colloquial.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-01-colloquial.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-02-abbrev.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-02-abbrev.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-03-broken-phrase.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-03-broken-phrase.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/summary.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-01-endpoint.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-01-endpoint.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-02-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-02-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-03-process.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-03-process.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-04-entity.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-04-entity.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-01-which-file.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-01-which-file.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-02-show-doc.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-02-show-doc.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-03-where-described.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-03-where-described.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-01-overview.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-01-overview.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-02-what-is-service.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-02-what-is-service.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-03-purpose.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-03-purpose.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-01-operational.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-01-operational.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-02-meta.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-02-meta.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-03-non-docs.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-03-non-docs.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-01-colloquial.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-01-colloquial.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-02-abbrev.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-02-abbrev.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-03-broken-phrase.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-03-broken-phrase.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/summary.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-01-endpoint.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-01-endpoint.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-02-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-02-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-03-process.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-03-process.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-04-entity.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-04-entity.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-01-which-file.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-01-which-file.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-02-show-doc.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-02-show-doc.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-03-where-described.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-03-where-described.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-01-overview.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-01-overview.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-02-what-is-service.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-02-what-is-service.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-03-purpose.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-03-purpose.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-01-operational.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-01-operational.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-02-meta.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-02-meta.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-03-non-docs.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-03-non-docs.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-01-colloquial.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-01-colloquial.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-02-abbrev.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-02-abbrev.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-03-broken-phrase.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-03-broken-phrase.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/summary.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-01-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-01-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-02-send.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-02-send.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-02-purpose.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-02-purpose.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-03-problem.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-03-problem.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-08-components.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-08-components.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/summary.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104.zip create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-01-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-01-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-02-send.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-02-send.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-02-purpose.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-02-purpose.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-03-problem.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-03-problem.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-08-components.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-08-components.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md create mode 100644 tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/summary.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/router_llm_first_v3.yaml create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039.zip create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-docs-summary-01-endpoint.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-docs-summary-01-endpoint.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-docs-summary-02-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-docs-summary-02-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-docs-summary-03-process.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-docs-summary-03-process.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-docs-summary-04-entity.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-docs-summary-04-entity.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-find-files-01-which-file.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-find-files-01-which-file.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-find-files-02-show-doc.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-find-files-02-show-doc.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-find-files-03-where-described.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-find-files-03-where-described.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-general-01-overview.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-general-01-overview.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-general-02-what-is-service.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-general-02-what-is-service.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-general-03-purpose.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-general-03-purpose.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-negative-01-operational.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-negative-01-operational.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-negative-02-meta.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-negative-02-meta.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-negative-03-non-docs.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-negative-03-non-docs.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-noisy-01-colloquial.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-noisy-01-colloquial.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-noisy-02-abbrev.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-noisy-02-abbrev.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-noisy-03-broken-phrase.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/router_llm_first_v3_v3-noisy-03-broken-phrase.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039/summary.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-docs-summary-01-endpoint.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-docs-summary-01-endpoint.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-docs-summary-02-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-docs-summary-02-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-docs-summary-03-process.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-docs-summary-03-process.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-docs-summary-04-entity.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-docs-summary-04-entity.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-find-files-01-which-file.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-find-files-01-which-file.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-find-files-02-show-doc.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-find-files-02-show-doc.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-find-files-03-where-described.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-find-files-03-where-described.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-general-01-overview.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-general-01-overview.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-general-02-what-is-service.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-general-02-what-is-service.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-general-03-purpose.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-general-03-purpose.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-negative-01-operational.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-negative-01-operational.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-negative-02-meta.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-negative-02-meta.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-negative-03-non-docs.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-negative-03-non-docs.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-noisy-01-colloquial.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-noisy-01-colloquial.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-noisy-02-abbrev.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-noisy-02-abbrev.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-noisy-03-broken-phrase.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/router_llm_first_v3_v3-noisy-03-broken-phrase.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_check/20260407_140409/summary.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-docs-summary-01-endpoint.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-docs-summary-01-endpoint.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-docs-summary-02-architecture.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-docs-summary-02-architecture.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-docs-summary-03-process.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-docs-summary-03-process.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-docs-summary-04-entity.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-docs-summary-04-entity.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-find-files-01-which-file.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-find-files-01-which-file.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-find-files-02-show-doc.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-find-files-02-show-doc.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-find-files-03-where-described.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-find-files-03-where-described.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-general-01-overview.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-general-01-overview.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-general-02-what-is-service.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-general-02-what-is-service.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-general-03-purpose.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-general-03-purpose.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-negative-01-operational.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-negative-01-operational.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-negative-02-meta.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-negative-02-meta.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-negative-03-non-docs.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-negative-03-non-docs.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-noisy-01-colloquial.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-noisy-01-colloquial.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-noisy-02-abbrev.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-noisy-02-abbrev.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-noisy-03-broken-phrase.json create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/router_llm_first_v3_v3-noisy-03-broken-phrase.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_target_terms_final/20260407_140431/summary.md create mode 100644 tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/Архив.zip create mode 100644 tests/pipeline_setup_v4/core/__init__.py create mode 100644 tests/pipeline_setup_v4/core/artifacts.py create mode 100644 tests/pipeline_setup_v4/core/case_loader.py create mode 100644 tests/pipeline_setup_v4/core/models.py create mode 100644 tests/pipeline_setup_v4/core/runner.py create mode 100644 tests/pipeline_setup_v4/core/validators.py create mode 100644 tests/pipeline_setup_v4/executors/__init__.py create mode 100644 tests/pipeline_setup_v4/executors/process_v2_router_executor.py create mode 100644 tests/pipeline_setup_v4/executors/registry.py create mode 100644 tests/pipeline_setup_v4/run.py create mode 100644 tests/pipeline_setup_v4/shared/__init__.py create mode 100644 tests/pipeline_setup_v4/shared/env_loader.py create mode 100644 tests/unit_tests/agent/test_application_startup.py delete mode 100644 tests/unit_tests/agent/test_repo_webhook_service.py create mode 100644 tests/unit_tests/agent/test_session_service.py create mode 100644 tests/unit_tests/agent/test_v2_evidence_ranking.py create mode 100644 tests/unit_tests/agent/test_v2_intent_router.py create mode 100644 tests/unit_tests/agent/test_v2_intent_router_extraction.py create mode 100644 tests/unit_tests/agent/test_v2_process.py create mode 100644 tests/unit_tests/agent/test_v2_retrieval_policy.py create mode 100644 tests/unit_tests/api/test_route_map.py create mode 100644 tests/unit_tests/rag/test_docs_retrieval_plan_mapping.py create mode 100644 tests/unit_tests/rag/test_rag_session_retriever.py diff --git a/README.md b/README.md index d00da1f..9b25976 100644 --- a/README.md +++ b/README.md @@ -915,15 +915,15 @@ flowchart TD ### 4.1.3. Канонический MVP runtime (CODE-first) -Единая точка входа исполнения — пакет `app.modules.agent.runtime`: +Единая точка входа исполнения — пакет `app.core.agent.runtime`: -- **Роутер:** `app.modules.agent.intent_router_v2`; он отвечает и за routing, и за retrieval planning. -- **LLM-слой:** `app.modules.agent.llm`; здесь живут `AgentLlmService`, `PromptLoader` и системные prompt assets. -- **Runtime:** `app.modules.agent.runtime`; внутри него stages разложены по подпакетам `retrieval`, `context`, `gates`, `answer_policy`, `generation`, `finalization`. +- **Роутер:** `app.core.agent.intent_router`; он отвечает и за routing, и за retrieval planning. +- **LLM-слой:** `app.core.agent.llm`; здесь живут `AgentLlmService`, `PromptLoader` и системные prompt assets. +- **Runtime:** `app.core.agent.runtime`; внутри него stages разложены по подпакетам `retrieval`, `context`, `gates`, `answer_policy`, `generation`, `finalization`. - **Цепочка:** запрос → `IntentRouterV2` → retrieval planning → runtime retrieval adapter → нормализованный context/evidence → evidence gate 1 → answer policy → LLM generation → evidence gate 2 → finalization → diagnostics. - **Evidence gates:** pre/post проверки достаточности evidence и качества ответа по сценарию. - **Диагностика:** runtime возвращает machine-readable diagnostics и trace по стадиям. -- **RAG:** `app.modules.rag` больше не содержит agent use-case слоев; он остается инфраструктурой indexing/retrieval/storage. +- **RAG:** `app.core.rag` больше не содержит agent use-case слоев; он остается инфраструктурой indexing/retrieval/storage. Тесты: `pipeline_setup_v3` и связанные suite-ы проверяют канонический runtime и его stage-based execution. diff --git a/_process.zip b/_process.zip index 8577803259644e01462a652e90d592dc0eb0b8d0..c954819affda63eb12d3ad1bbdd88d0eb6e77b60 100644 GIT binary patch delta 23484 zcmb5VbBr(F*6!Q3ZQHi(UTxd9@on3-ZQHi3)wWk-wa;(w_uV=7yf-Jgw~|>Ssgat= z{Nt%P>hp}*9RXbR1`Pj878DE(=wFwoZAc`hl_f@YHZzmy(&v)N`lqdx<#lmpX4^sM zq1lsd5C3iukgs^O+(GzCN7>TjXb#cWFxKtFC_o?>$9tqldpkVe?1`2i(;pW<_Tl8v z11X=c{Xld(0t&mwM+g9i_r_S@!MhtFwFDJIJlF)UYn;<|yS~_642*j`xU~4x7=RnEw8$nuUqsawga;&X@v0R#3efuB&Q$$KTbRYUfU$ z4ArXyEk}-f$ySG9} z-R&U^06iyEFOzdNJ16T-DFt7=`ltIb1i&l)JRg{lmx{EbX`m!70dw^>i`;X!p2+8& zii(JY_b3Kj2vAv0lBif*)Q6^iR0lA8xoWyU@R*g;<3%T-Q3*# zB*?b-F!FM#W-HDjy0t-h5%x^FvqPK#2!Xza8J!mfE!uQ0f-iD~__K`*kdL5QyJDk- zSSdSACQ)uq1O_bdJ_kAbh9t>C$wNiuNTG#NvFFgQR9T@C_c=vRMB^~DVkJ<;?pFg( z;=8>Dbwmwg6Te@PBH?qaH?q?WBSSqAd31Ht)e3!){~~xif{_)m?h@s$#o7N2s7WXx z@ExB9A5b^Wb>9bvnL_RM&`+$D{1+ySlpLa1c#>% zoU$nBu46;!XzCzl!Pp0!_{55eWn=I_d30ootomnuNL%seKA|X(07hitJC@;DrZ01< zBZw6=2DVC9R9i?Ia<3v{Ntydcn#JJ*o(iY+v+XYFaXbkHpNO82-L2s=S~6M9ThC56cx$CAUR& zpg+K^Euo)rImFBH*>on@=l3UBjVf06o%A_M-G^QOA7O!axr~k_7_XOqABRP;un}3Un<`34#c* z=|5iYpeChd*(T~e!1ctko1l9Wn1Kre?B{A~$1~X5^&`GavU~>N^*!9U=$%fa;2{Ck ztwq#d*2%ZZh7}@t3CxSK!|rbADMQWSj+Gp{3JfC{jb#*Iyxn>W;E5f>FLy^2!iCr< zzEv`MM_-%53@LKXYsTIp) zFJi#@fXsb;kfBB&TX$;u22ClnGx)vS++xB(L}{80d=}vakVopWP;-C^4IXgKD;&j= zIs7*3fV#}b}P^~$-_%{32T7#6Gm7eS0&T$3u$zGEx_^ucD8fd z)+>sGl3iBC*Y!Ql&}hdY*UcYQ2+#*n;%w}>g`ujIC-rC_E`kOI5j*axp4j%p6^~wG zN3(5SK6kcuo=@T_K5$zactOx0Gi;}XSzbDy;>7|0iU)3G(4Fc-!ng?(x5(?>#}JnV zf}2N7v%uI6##es}*{e-##5Yx<(OQf{Z{(TsbhywGY+z5ihAIQb*?`=)Ldi~`dAmQ0 zbzSP59e!V3)%2)YGY-E_A_z7`G|^LsXUf}t=3-o+Jmo&HBwZC!WR%AZ@diM{TMCWa zK6Rr3k_F|QJ)u;*VE0-lVukL`q$%qBSz~{$j4rb0C{VZ2`=k_)O{M+AI`6HMP}!6x zpk=cN_oI7h_-|FV~4 zXi0#9U?NgC%H6{&bxLto&eU(3Ri#gV_!jKxA9p%Gp3CJ%?PARo+?ik75Evk}#WJvU z<+#I%K_u?~O;`yf5pM0lZZ`j=N=8N52JDXIFZ+f*STzA_wmc0%U&}q28xE~^I>2xW z5OI{EA)E8W5{)Z?b|c1_PfCCC7wwnXAmw!?Z0IPZ2he~oQt!il)J%l-?l6;=NyCdSpc{=`^_15bu~Y)(9Y_IyF@C13+0EtM#)q-HyJLF z+x!uP7i?)Auk_(n{nyGN)iPa`*Rq=d5#|UmUs-iX0mG)aR!y*fWm&R(UujHyxK~Mo zOZZ;Pij44a6<$=uPb)~9$Z2YaGKmv)F!InSS-Z&&4KAol>k`$9 z(3T<(HNJ~*nKmX_8i7ui7d8i=h*Qs^ZI!nVri}8vGG$iacX+_F-9_jj#g;VE6Tk9t z*KeTam$Rf5OY8B@ZiNv-)z^$4CSuku`a|6q53)>T=3FkfO+=%-kz(ILP2dCmTneS{%+c$N`H@VpdNHV( zCH8Top0F4(I=+Fc36yxiG}ZK4de%U2vMVqo`u_kF_@t>5fTt6ai*(-rSK$?9Y>I;` zuQ!V68Uk zRyn|4C}0)hg83UdaLsy)rkNbPU;hF>mO7<(iY|&rM8cSxt&My_L4FyYNHIF#E;al6 zNs>)oTsdcBxl)P@ptW23v8<=l&)3n>?y~~4uy|Y@SrsaybnWZvJA?b0ds`aR#)OAJ zmqM>TENjm&FtUvB+;|>fs+##RQfw^Mz#sQn2R9U^w{osF&5fw~ktT=@cJzt?-fG9~czEbvx5(fQ|{cpR!kuY@kFo3l)G1 z1%;&=+o1l6a;Z|V&*6fzkufjl(Quxq;G(ENpuy%TS&NJBy0oX!tlgB#aD*gJim@&5 zZ|P%>idc&RJbfKgqX-{i-yVZ86)?w0krS?!zw^*qO?t^MZ9hU)62KRrTDh0KY-DmJ z2qvK$sN~7uYGJB_%dOWyB{SA`4krn%6q}M+y*t-M$-B8Ty?PxzWX$#JU)h{k^6fG* zJSPuOI%B0wBs~X@FC3p;_)3yuU{n3CP9~&zu$G$vlRYU{0XW|vB4mjfn&q=IeXL1ie+xpwnMi;a4w@Jwn5b!fbugyPfBx* zhoX|wj<4%ptx2jFtUkl{yp}V!0>7fjbzxOS$)RUBtZ?PC6Jt%Gv9+OrgIowzYVDT$ z3d~8o73eX7$BffEEJ=aJ(8tB`W=*~2fb&eG_Jy^&@K6bPq1S?uZcn?Xv%%BlyE*!7 zf4S#`&j%#PvOQ#5)o8-FyGIhxuT)}c*9jp*zW+;1palXSBA$V;K~f2;T9nRjtAjDS zg)q7rgeqR7p2s(K7{6}Qe8NOLfJAa5BeWK8O$7m^4lJ2 zlnmt)v5kVtUMXEQ>(nnwxWbC)0r)QoofF|F6Pi=1(c5n}WUpL9PJV%h0w{w@EZ37} zooQLl^)iDyAqy(%--$Ve#}|2yJek<;v+tgEH)-hmW-3ObS^a&c2fefk%>>R;@AZMf_d0rf{5bg^B~S(wFcoIrHLG(=>j{`a{em0Zj!R5Tw~In{zm zI#0VH3&!nFa$a^l^DBi&Jz&B#piZEuTa@LmYF3c%0Yy<~x?h$6_HImaO%EG*N+91w zDIBbPJdFRitZ&(A`DJrUwE2MIqYbWVD=Y~U?S3j-isr0`kYS04$~z-he~iQsS>F_$UJ z#%nYF+-w;7?xbHkSQ_FFe7*X;zK`}kRgXhG!(K*rXB(SCJ)MEU%maGfq-!%YkY?_Z zt%LS^YD)9v%jDeO!md(b^O_5^onK7q+e$-!et5~C`S)}IG^so&Y%1%NIMnAQX^rWq z6x2WU;gDrYVHIdRVE$dliyeqN+S#&zftw;;;(l3!N|qE(okw;PQUo>d;d71>tMtYu zHj2`4E2ygbn<&s{uci-DF?ChwyqNxj-R8(V$xpfNz}oD7R0>%H3f=Dty$4Trm)EWN z%Ly|F9=;p1r~quy^SF*GcyLO;SFqG%SNS;$k8~~?oQmvyLTBuMrL#s&Rv;t2a6;`k4$ zOiY)jj9`qvMCqa_h5u&)NGMBGGA{Lhm}T)l<9|=6ni!T03(N<&pIQDlto&EZRh4(x z5<=?z(5M+f=Xy!V2A8#lwuLE^Q3z92jmlc0k@uk>&X-3kX$jA(`UVp@6oKOc7`+lc z&(^%bRaU`l*4%7zI_&jqrZ{Rt&aMqoPRo>veGh+(*~4DNRGjtdwkkx+Ura^m9lOm< zPj^i~t*!&?(5sm1p#2+vH3}#v;#}DHNibqFY)W6LCRspW_B36kmHJod_!Wj-3h#3O zOGtSX-U6?Rb4UUX?MxgT${$Yk)|#sFJ=|lJammD5 z)oC_U?bd>1?oiA6&?eS~vrDQRD?#34LP$1kv?N^4dukH&CVO3dGymA2bFWsw3$#a0 z^s;v$F+@8CbxDmvx$>-(T!Xm9u|fra6eIi=Cakvc13U1ib2kd8iMI~<0Bf)#P0A{< z@FN1C3Yn!u{ql?YF>>$3O2M3{bzXGev7$F{!)&3v#$St={Ef=G%bZulFt`6r;wLuL zK*bC^YO~Op^$_)fjmE^HoIsm5DZdF5myHOcprp=Cd?7g&86q&Y2Pts@>u1@5bzmF` zByuZf>j&4leXTqciVw}LMBXqR*SN^@*xUzD0XAX5KHRrujVWz9lUYZ^TTjnM-}d11 zkYObgFvoaa_3gOTY*1l!D%r}A&60yvgk6yS2hO#PgQpH+V3$q0Lyb@+;wm5sDP#F{ z60LiD-u#d?XU!I2E9A%#T6!-Q1`^ZD)K9a%KE#Yqo6F_EtZFhx4UWOvEDF)yh>rp8 zPFIY!1vBd?YuwVgauv4g7#})*^KJaL^S8P-Ye?@I?CCZHH5DK|_pCfKpqmPD)3;yM zpcto>#hitj36ypcd%*P}&2d568#jk_!WNh#TJOrFUWpnl&`#sFhSFf)|KlVOKx6}F zV~F*EWl+4y#D{%lX562UO+9!v04~|0P4U|1UChPYnA%Oa-F< z!&G2rAd*-AMMO{Z-!_ARJIlWv2IkrS679cYtndn)}i zv_GZ&xSykUZ~P~OAC&%rmTz`|^VctZilcs+7-fG+@azR2B-_Ob(i{Q_5kag2!~+w; z@xS;v;2#7Z;e#fCeL~ud*4iemepoxEJ;5YkJIw+@zC`||CfL%04x#uubG>O|y7U37*MUH~CvSykP&|o=9IEwhw z;AnSyDf#5{@VZ_jG!|NRf+Ko@cC2IMG@f|~|4|fr zEwH!cfoZz{oj{!fmp4edRtU1&0N+}VgzAR;LHK3tQz2!Ib0|_FgibwsH*a3{XR4MX z*ILD^wY3bOqnA0WJ5#+ckh!TO=hp!{Z{=OrY_CBfJY>g`Mw-Ilkv*$BC8_r-=7SEm z1;d8p5ADVga;7BVw_P%aW^zNWo;FJRO-;91xwf-8>)mjGAI~Ai6IQ?wZaZbVO=)YG zin@pO-pz^3je=>}xFMtKr#xHU=1jdJH?(xvN82FaiEdiktw(K}-okNiiGJIrO3^=C zsjAW4WwiOKJw?xBb!lg46?dUR)yS!G|I=#LiVYLrVV9nJ<63q46w0A?%T)s(t5pQ$ zG@sAEZlD&t*{QIhWq(yhp%{2pZCo}JHNeOUjMnt&X{mgfB~Pagqu_+*q8;e+1iJ8O ze7ykBTY%pBtGc5!HfXs*ZOtvcb9!S~ADVYI^~Re^*r>4qj1bd^xLrL};9z0&O7@>6 zjfEGDbxI6t^=e7;$6D0yJ0a;!NFTJ<2*IM|c-J0q*z8G6ZSYQ8U$8a;6M*fF(E{}A zH|*V*@gfFJwvTF>sp-aG}U3wu+i4ekDLWu?-s(} znR5mE7kAZ5PY>+3o|)gkS`Yo9F-vwtMR3qj{)26?27mrw^FV(E)D~EQ==*}kF*ei> z>tUkLcJoEJfLG79p7o2(!2jUXKIz z0r*cY0mOrg7;FTxWXpZWcSWN7K?dCw(wcv59-`L4*`T zK?iKa?*nwutY64=Zz}TpJj-e(^l9B!i`t-Ukai}9A*DA8sI_3Jtl@qquP0Un##(ZG%G$dx60t2^e=q zshz;u5TN(BSt6e=o=$M~wN|GNe#3!$z8ZUiEiBt)d;_^I#2qH63wnU)G}5NRt3DC{ z3rK-JM>(Oi4>jOELVP+4VE{uqBx@5uDhiQ!r2YiQDK?Cc!{F#!k|HA;M63YL+bJ8u zsYUGIJy<;`Px|i>kNP!npTr5Cbfb0j61X(zl3gj9v^2v&x$0igRe(^)?NZR(2SSRX zlfrL$i3wID6vhZe?dD1na5vp@oKI4(udk#=57b3qoG#j&Zos&|CNj*3G@A5d-7yj`JZ=@;G zFERPKGa1w;O08gyxEOkW3TaEnjPat9&pRP^yH@IQidex;wNmyLh2cgw=1hDSu!Fhh z_k=1YVu5Eu+lOEZh!_IsFkASI;pNt%NmXcoL7dyoR7fm01N9CulPV~QHMhzvgEU8oVg_~M4tb-cJD;xIYqUa)v>kqLQcK$9@SqF3RKtJT zX~?!)>w_W`rspQ7LI2gRQcLIN(mpWn7hW9K4sX~FZZbmX z8IR_G`|2ZNUoTcHJ0<4!N?DLhGmnT~(YH`}fTHk6<|)u@shuey{t#2O(~pVh3wO*Q zco3%I@r?m2|KYRJyu5bzXe$sUxpFrN=RE16B+l_JkN)o$4S15XP8&Fi6y{U_?J!-W zRpmxbqR68D9W_kg)E&IaY32_ka-;;ffd~qBepo6Qr)X_z-2*b5hL|OU*C%0yfT=OeNWvrY;KS#2d+VgjSdpEHm$f)m048QMr%f3_}vsPAvea8W5ckKBz2P z2{q}j#=Gv7%adbPrJ&#um8@?{iC>$knbaSLA@|7g<>iZs?;NktGp|$*-sXZ>>q7=j zp$OnH3MEiB?_gi6%|{IuQAGfa@U$E06DI6Uu{EXjM2Uaynz9{`3BL}j=7Va<>oqR@ za43>MF0xpD!*jlcC1vI(_?(@Hn<2kFJ6b3>UlA(7$s3qaH!`cf4x3Wg6hVEMYs?Lwe`&2h~C((V}t`O>}95nrVG7 z%gOo;RcjDAL&OxF)dJ!yLo}$}FC619dEt0s0S0-VFES7=Q`8o7gtVFNkvw87aWf z33`B}RmvNI%rjTL2PICedm&%JE$bWK)|QVceV zoNK0T(>#+`DIvXaE!NsZN_@#7dqQ_DvC*3n4c|bad^cR|hzRfgV;c7NAT+t@2ufZf zH70Oi*jW==f`ixy+c$pnIOiPdKZHTWn^?KpfyFCa)We`y6@PqUGC)LYf{Zw*&An2Hjwgq$Ss(qvz3Fhzy+Rd^uregM*s8;D=yoriMGj0RF-c8T z$39UUkL-!Q!R(aTt|dT~p)j-%5e*cB#R|?8pCR-zh*l#`nSoGvgIjzG2MSZET%mnV_c_ zy=M*6k;mKxyA8E;jR`G&Mv|ELb%VFjW4uGAST|XeeJT!x!7c~l@v^LlzQavlzmzg# z36+dV894j#M|}Jyd^`B99}$2$(Wli`M2Aa9-V$lM)4-Qb+F=b0?>y^>Jni(|d@n={6@XL6r8eH29Y?gO+X`?Rf56CA_`)BK z@v@l`s9pr<#(43|2)D#e$sNI%D28++P`kPgFTE~i7&ost77t~ofSx#8Cs*}l59xj! zEsZaJ3?o{r9p*`K{cXZHf?MZxvGPTS^K0FsQ@6W?*81L};R3=~H*T4dfyiofirlfr zqGdFmL`a=%9k*0#*9I5_cZ^F^pBrC>!1+#ShDBmcXVOqxKi6OZo51ITIahKfAVOPkf^WG_TClKGZhVohd&Xp;%gQ8{l-Q#) za>rM%L=}(EAnUU6RdPsDV>H#o%4#Qhkj)nMjV=2Uh0cagkN}Y4D^PqwgyHgT0bx#5 z(aSejx;Klbk?1Zt(hoMZ+RbQ=czfZOXe2Q3XTSjX?O5un0Pbsh@x&ul(ECc}R+5F% z>}cCN@lPC-$Noj^+xe0=`rS(xVV&umYzjFVf8=Nz3U3@$(6U^QYSkv#-!PxQk*poh z+;cGFgBL7JMF9L>{j3=D2Q%%{t-Py~SQ8`lGeggFuKb(`SfWNbxHyd?66tWv2w%4y zugwGLXn~~nJW?h7Wl2b?u@PgX7UE)bbnwpPLt><{9uJj!K`uBO%3~&rwUp`US#Zi- zJ}o}3AW*XU;F+k-4JdjLGOk=a$v6HD#5Po&6Xi1jqJ)zj>o{fed z;gFYGMK9pbHWO#!70=`!p$oF|gcY}kC18g`lM4?SSVT~~F{kFp6o8P`NSynC0vvoy zH%rgtu&9ZKnN??)cWgbD|7mGDtqpw5MB*U65&*qO{32e7vSfzWEp9^nUPALXlM(q* ziz#q`W%{GV)V8bBeql-Xhfw0Wy}Is3n#F~UWr*ra%eW`)-@5xo0X?`^g?Lod$?H;I zlGw}hnj}~-U7(v~SjH>w+8*`B-cIk{!!%nl{bkP{YF`8~1Y-=46Rj^f>LeQ;$jvhQDra*2DVC40n@ zibqQn`#s@N#QZK?`hz-G%WLPfpbU@?)t9#FB{eebIZHRT7zRm?usaoU>9E1MaZ}$q zgfo-`A!hgV?i?T8vDtY#3Vc&(;`#mjb$~xAAWbcaHD&S4-c8pW*Q?pLQ#e)>HJpY} ztMhL!Zkt9FPidcOC8n0Bj{-9LD*Pg^}U8dfP8=WEo8*X{%^7q|S%o>$&t-!<2r?zCsD^?D}^s>kt$fCv9m zpG&?yP;dQ~`G$9#SN<#qV;9sLiXYyRN4+G;y~{@dkx{=gG}U2MkWmr+4ogUCxzqU_ zMljto8S^jq3fqGM?sNn6Qrmqud6m&`An&>&`va}*-5>y@UU~J5_Y#`4XnAOApm&$i z&wWS7gX%$Du~doA;cb)2h6}u2E%G{oG_1bk>n0DMNY7rZWlnZ5{Y@vgAXJ3ee$TSX zMW}cMZ0|Z{`;On|??4{ZqgRjq2%b(nxh40@fD)_Vk>W?kA8x@+zBDfT<{ z7se7Zc6@zZX$$r1*dDc7<4)U6RMWL&8q`UD{z?x@R>UOl{u(~rktx5w%{jCwm{vbv zk&1-XGotkrSJJ`$%@JZ+rZp5s$!e3EYaVLT`eD~QU9H;9H17|)GezJkF6=gix_;K1 zg_3|*mRHyl-Nt*D<3y|gkVGUpblF0zGL6;GPmKu0n4pn$TG!s9`efJKopeaDzktPw~A32w+-aR= zCqt-X=edf-qOa?$EM6!iJ9$}o5U#rmu;X$$H2h8ct*Jc8W98VtVM%y_0>D5#k3SOZBm=EM@r$ZcHgAyfcO z)+eb!t00oShBR3vpWs^h8z|E(0{@yz^G5UIj@uD(@8}GZ{Hz&qsq>aRXE6PY{QNTl zH%#vzbBW8Q1_H^jBLqs}=W$v$G3CkAm~| zgv~|1O|vflI#B!1!A6&D{|-@-T+ z7aTeGz*vi+URyFZ;(L@+_nha5d68NML=d=r^O%j43XSKA`o6IU|DFSE8wgXrMmuD| zk~R2dmS*~B-?zU1u0L4(Qb2=`kKGm?s(uYYJQYJ%)0elDZOWzs%xBT@<4Df;N}ppB zme>d8EIS%}N%2BaoGOuty%!P)9{aMH>848)2W{9?8uS{$bxY>ML_YM4NfINy9vDeU z7Ep{*3X|+%q|Y*go8SP{=P33`cL-PD(hxTesuS-Ud}$2Ic|W8V-ck{RK|Rt#om`(B z8$=(HSY?9C@nsBMqfiIL&CN{oG^XXKsIbULm7-~fnan%gCQL8PY9vt+JSYj}gm(~9 zFWO=8prb}nq&d>?*&-FVQL{#4pKbT@S=|6#bzf=~N zXus)!U(FqsA2NBaKbE?xg)0sn8e_J3~k|F@#z-`hLvf42Akt{Onms)CZIaiste z|9vp!UvZUx+gWEk@$PR_WCr`6rQwZAW#sflyNE{ z*-}$Zsxd{J%9Z@6Q_l1D+L{O%aUf>{je+Am?03@5_Dm)>W`b){ZwCqtS9)e%UZ2N5 z6(_kHdwq~Y@WHvXBi@sQ4uEC@{(Vs3^M?#8#(l+-_B=jsG5zfR!pac~E*KPC5iWRm zk)sDpaY(dxk#dj-tD*q&da~5WF=tYD2-`7E5WHTZKS=VOhAVUu;vTBciN`x}5)2S2 zzZBe=Oo@GCx_WLB=*i>_^7;Yxp{p8vLeg}7u3#eU`{R=Ta%r{t= zl@UM<>6tI7907#~{Ot!)+>6B@+^7KM3Umh@xIsxIILscK_h4B*h-3~OcMw`WxM<1S z7hu%D%bYkG?k>qYh@0^hGOqD7ab-xj7t}qxk6wsPur&(lSlSU#e*X|r5C-cdv_oi^ zH;-h+v>y$&gTcZL4j{cbYQ^I6JWIj&1}VE3Y-;;^fEr}n0w2u_EJk{$PlI&`#i-K?;oPJT6T9*1cDJmFai)# zE;4F~#_G#GWF_t-P!;)nKvV|m3q+tm9pIl`VWSk94a7k@0Bk=I0|>m~TAqO(#;8dM z)?r0$NvY&KfcA;?2M5O;$i2~nKE`dLI8s@2PWPs3j6gRXti@Aw4IBSj8cifKQnL6N^^3K=#i28i^F zcxKwUBjd5Z1K0;$qI|*wZjozqnC{>L)AOLHT6T57$bXT1{;-Pk0%BgFqeM$oKp+cc zO*xHs3XODkSV+Qvhc?GYgXk{6A!Asx!1M`G+~Xt|6UUR%<8#z5*P?14`RhaSr)#yH zhOc%U)Gus$z3SDe>(;YVA<40hZLs#?lQa$ioqN7+oha09QmJR7cd6Uir`W_6t)H*(WV@c|_g;LQyqF_HY$m)` z?U?|ldA#skU$3{d{E|Z<`>O!G6PQpMp|F>xxPlI8!L>u4a%VCE(sPt?@ch!suOY91lN$S{@c%W*rr29WKDu6Q7lFEm1qcWgG@A8|-cGNyPh zqiTYaBH3En{HG*MOfGp#{AF9D6p;q`2@SEaIwL>Q(up~|B1Ss>pMFzKC(sBHo(`Ly zd;GoDLQQg~Xo*dnb&&0{su4SUKRJ-pk*?O(MZeg?C^ghQ2^j(jS5{G*7vy6CB%vk> zaX=4=8(D>_kMEYn0A3LOoX}rGYD>km85d)(e-1%}Y=szm%u>Lis&=ZgBe)iJp(c5S zDT|;+E%y2m_w)9Z)0q7o_O2y7j$bjy1qUKv<;UVu6 z4l6>|KhQ{m=eO|(8=HVAVkuN5ini_O1Kk}skH!J(l)FfBxHpmK8m zk@&!@e8Dcbi7w&gpzcn~=Iz_tT?oP@3*s=HGfN{i5=u%wkM4jc|2?ocR47~(E`W^V zSCrgKj0s2rfJn%esnWRhjOW5(k$ly61=s&o; z_8=HAPp=g7)2-X6X&alSNp!1s_5+X5EQ_txrReux1Ye{rx8?iqifGsA+pB)bbdv8| z;vJZzI+w!@9CJ?Nx=G+L55pUV0VrvZqPiD8VwMHovjUzSj^BjE25qz<8Mj{4 z9{}a1r_993pW;eUIQjXGJ( zT;{Lwb~0pbj3+2>dB>?q!PHI=z%g*=oMisMX<%*^*~O*<2*Njlq@4CI)=utLr*nrp zH?4rfnWwF%p(UT=m|1(iVpuU*Mru!4h--MD0~Pv@R8Ak%IL6@lB& zw%2#@oRH>lsc1&?5J)W^Y&x0@H9MFaYzh!SXAf6&ot*gsM~cl)92hKeYE1w(6TTb` zduiXjd2XA+i(k*rEX+FQn(a8*h-LOcd?jaAcOZl#*1A_?KSgys6Pj`E!bgRsKVFkI ziSw1hbrKO%YsbM}cLqq%Py%Aj)H%SsiF9;@rKgXa%S|#QE}n?%R>q?SULP?6jRPzm znlzYzvLMx9DSw6@TZ!Ch@=-Wf;Z=u-!z!X|1=W3H@uT0CK_LPg;awhyW!$sy!fcVl zrr+ZDkl1MMSwVw}9yo{H=V(n;hR`HF3^!V)4@8OB)0ri{p5MX0`!tvMY4J|D?AsHc zD=rmx>N2QQV+<3C_B1Z>=v|lX4^-ligJ@Ikw*C_^oA$>}* z?hB;{xb?UT<5HhUbRy)lq<@;X>peuxc8@A_Z+9B}N;O}d)?G3@Y8N?0K{#or)$lx~ zHOyc>4+-!c2jKaD)iQlUnXvKPnD^ec{;8GULSc4baEdY-pRnE@B=YM`E)>#iH4TAq zdKdu2t=lHMbG76&2b=0|8}nyQ*pQPzWKy8Sj}~Cb&$tf*FAo!7s~%@ShO6K$n@lAr zwYdf`Sn*`j%^b>A@a#rO#pI-C9NUs5s`_Pd@T%BKM{bp8lQB3}Ub0vNC4lR+Jc+vd z#r+z(M=BWpNfl=kK=|EhN^JkRYh}{gmldCB?T|srG5S-97D4@A0KQ{HK<7S3Q-3U<6&#Yny-vc7PJV zmognko~@pMDXWfmr+U~1+Dj*sjP%^J14I2t5_tC$srk~WL6joDT)>w)7!|{=C0h;8 z^eB_Hi*S%WcyH)1+wNSd;^Vn^f!Y?_9{9%J_T^9C_RxR5wngwB>uXW`f(2|meHZT4 z3h|-R+L}Iz>@*{b_w_)H+OYMVTMPxLzu@5hxHyeS+8>f_F{hxAlVUfGjf|x38Vx?? zLYHzvO+%?mp^!{ixcvLpgAl%9oP}+FDxSWAgP7eKWnr~(FJElBZu9J2>%^$K*H(ui z7;X9pj3ba4gV2Gw^0;)FMbi6pe~F$sJ)a_dv8$D<1MJuntKNKcFzhkyMo13`fk&jO z>Hxm{d_O)mr2usiBr?;X4i>4#Sm%U2?k&EZoh}&do_&D`WAvS8M6tQBIFI(4QT`*t zZw*@icl5H$zpX2eQ%Is7$>2?02x8AyH8^x4*%3RTOX-OdH&reO8YSEf&bE$P$eI8g zWWY_FBRJvGp2XUF-90mX7rs^p({Gf;(0WZY&8dV_FI#iw=!x}FhPl>hBzZFAic8w=Fn~D-(`&6I{Ht|WapVkVG1RW{109}B5W0ptg5&->+B*eua-dg=~z}}_- z_NH=wx#9?lArPV(B9cKSIRQH5uL40J2|$xC6O=O7RYFZzI90tH7x$l*_sjf&-3Oi% zZG4P;Elo|iDM5VgIUXB0ahgDSY6WK&9)*p?=(&yY92P7Nwf@r#f-!G|ad4m2$r%oLjf6)@kk$eEXTbzMQu~-<0+1mrItnd>N_k zh@}W>W1<9VDQxc{|M+`2Avwckuz)!4iUZ{axB46)Mz59b2^Fm-|I6YaANq!`2N`fU ztX0a)j!L?(h44~-Lb)S_x+hJy$@K6S%hW3dYup^2+Zr9446{y&V7_VQ&*Fj&n|w5` z8K$Uo1U6|JbP<36`$e%N;pJvONCm+%3Rp3NlGG;f0bsiuuTlQ%DPZ}KkrbgV`E%S) zc7xF76`^xXp`2&YVvBn{+oF`&sf7R(9Jk+Y3iuVeedgEy>f@|~;%K)#j0ATL4uOHe zEjR&!y99TK;O+q$f(K`C5AN;(f@^TM1PQJ|g2TdhckkxAd+%2NF+E*<&ik95Q`J?| z&pZJZ9s|8p1=dhbCp=ZoGF7Rq9(FFHjtOy9p3Fk1?r!qta8aG77U63uNo5s**YM zcv{bXL`P8+|E$JKx)R5Y0LNa!Cb*RU6&uA*ah+kc-@vVn*#`<1Im;83;YEs$>0>j; zCMEPsKXxSzB9dJWCFs~%biV9QxqkjOf|bDBxBX4N==Zs7FNlLh+X<3uI$HX%RhyDZ0rc4zcrh$1XziL8+N;D@;>o5m_V{Conpz)<&Www-glk7agSfFF zJm});HH^tMVIrH9Ah{um;QK$46R2SJVBMH z(0L#WIl(s{$1s_KrrA*ZAP((CSrofE05e9qGnrco8LbWhm7>hgfh?qJ-?L5-dS|X` z<*$jqoJ{=Qe~ur!#(at!G%W;KmsnMomifsBZKXqIgSANQSmd}&iJ%(53UqRM-12?! zNdDn$P(1>DOBO;1L1;yXHTIv?r~vb!CLv%~N`AnUe#=kKRfg>BOm}r)C+JLNuLjnM z5ob+RvM0<88aFHPXU3jeu$-!e$=$6a`Hi>ep{0OXo6xr?mspbHbih}01wEh|P+}K!=^oS>jK*ZHLU-QA0xi_1y z9a?_5ThDchJ98i1INy&9ofs4G5r9~os{-6$&gCg%a7vK;3y)K7BV z^tv)JwxrIpz&9|&M=F{KVU})%xa}&ecCd9cGmVaFI#tc0IF_41k+b^SNRd@(<0D|(FpZs(eD^HIMLdWHZ>1i5vJ6U?|K2X;1C=<9F8ovuYF%9p1 zcfV8;?{}dr@o{(J&3dJDu+Cuj9B8&YF0!WzCMk1Kv@d2bDp-V$u>NDy}N?!&? zERaU|`ogYR=eUTWM2$tG^>&2M;W0j{O}ihVDLu3M-l%P}7$8W!?PE9Rca2af8qN%a zz3lyQ!w3lH>2T-`877nk;EyzEC$#kMxkv>l*9fqIGo6(HV-fyy92`oO#xcbBVVy4| zR0JFC3*O1sQZpsVMylj=(^2Q2_4P0J&XH8Lng_fv+k=MC+RHv%4r5r4G~Cdhy;FDy z2dV@kuVF-Y00P#IDGOJAo@)*RVZYQ>XnN=~Fhu6@66;EfVE>|Cq0|3dvi|#_3!>^Q zzL1ApjS>xuRG@8Rf@^G*=8}Z{Q2BUUcRJy5e?no>^tq5()cA_9|gY}r%W5D znc$>zeSY_cg?=am()#s}f-b*9qK0E)Zv7Fco5BmD0sMt;gt^2!5tG#oXdk}|>2iCM z7YhY!ny)tZeZ)A)ID-Z3S56+4VJ$cuheo)B%8c!ig@_^Fk)iqh?c=hmVodll;#U!e zJ+pgie&r|5#oUSSEwly30F%XZmnSp~wF$gcn6Y-<6yP%vv5^$p3Mq+#QTDIE4QCbl_1cacKZ=zAnu7I7s{dGxFkl#OA~;=>(K=G zX~73~klvY?eZ@^ey<=ge&^{y}yQVsrE=*rU3vQNzv&}?e1mQTLdz1x#mpZcWz)UadTMkURTkp6`3~j3JUJ?STw)Q&5#gI249PK3 z0Z9E@Uzfh_JiFSx`}+FL^z>fO*v({TW~(FgboP}KCF75s#QdjBL(miVGi7YM<=E#2;k0F^hd)S z!rGCPP+K<|Hf94#muya>4W%hNKFHO)d@*P67%&XGz>Rr%Tq()r#@J&6>`PS^s9oyP zbHh#6I$ek2Qsu=nCV7Q{&iT}j(x^AD9X}h5tPa6O97sF-_)Toe79?@1nhOSc9 zEzZ36E7|cjiW4q3_kkH}0HZa2dZ$@gSVHRFFOot~ij*mmlUIFF%1*1xg0eVJ(xGdJ zu`D5SnEGM`oK={$!@2EK}{YqtGHn~U?u02PSb-YtsGY_|z)WP+Iv5DeUpL|&M$M7wpx zIBsm`I;(SX2;$7{V~1pKRd^akuK5|})$#Mb8OuKD`Fz=wJ2T(al|$1^F2Qf{>hn=G z`2EYuj7AMg-qjBTD6(&ah2H8w38l_8txv@AF6WA;f7n0yGR*~r;EB=MYoYpv*KWi( zCn=Jo8H09&jMr(*79bVFBFv~vqbO*Ebr>T{8@1b&B+8#0S4HhS!w=XS|MCm>8mTab zayOeRC}_P)9=zfDA^hta>+4&Q!3E#b_i?dvinI@M6CsNEe$;JLc=>v+rzbwQOxDLBv@!SJ%L zOYeGZi5x2R>{c2rk~=t&N0BuwAy{GB#D)bA<0WU+i$v8ka`wqLD^+7l3`Y!WWll-b z&Pi^cYWQ2uUmOy;uoGpp8j>GG@Qzqtj!$%@+A(A2t2Qx{dUd;S;hMOF8_7(brH3xc za&Rh`x!;(6h5{T-t3Av$md!+xcgwltXlo&vE?|&Ueh;#NAss(na|q8Q=ALL5wj_}g zM$TtYLg3^YT>NH<)7K@B4!F$%qU3_z25kzbPDy3Zt^7js8LmY<^A>FcrmS}l!mkH7 z#it*->J7hn(@g3`v3BS}sy^BfrK0G{GH&V4fYLcQOKB4oPywCQ?gOXD(*&5THFw{OpRI~a3U zuRyyVOoKfR>@u>iE$#)heX{r#q#kjSxa3HGe_B)N^~12B>PmuI3@+pNat0e5kB?~j4w?hxfHeg z*(-LzLS@BP^g1vuZNc_!o@MLXsmEkEjndiEz53unZi2G)1?_A7+}#Z$+`aXm9Nm$> zzs`6XuaL6|X4#_cDG$M9-R?-cW`-VUSnN7>Jm3M*e0YLjwY<<<;T#Ov^^M&fYG>3h z43$k(ielIkMHXBaw!~5I-|I;mL`5#Vy%-yK=ZJ_FBKDS30^%_vX{Q0rp2+wxy`xAA zVJPCHpHrKfZT7er*9aHV8Rblk=D7^0)E@y0(5LWDXW+USWPZ_W<^0O3F)44;aL)D_ z1S|lf*77Nr8bZ3>?v}4?1F1?}yk%?+M2}%eju{eR6$3`@jXjOL9va97jQ63fLAFo- z(+JB+m7p6bC{Ci8%<8?&*IBj1o!e5MQ zz(`8kvInE$7`YPpEomsZOKvF$4pp%?vbF(S+_F&;B7j|~Y zNLy`4XoO@ZfM%5)UG2Qgw(if?Rw;sqR2xlYqK}WvK?cN2+H3C;9r?^-k~=w%#^|{5 zvwte`FnsAkk(DK1)>6<;S92vf&QlAN!%sC=y_j?>e{j+S=Rp0i&>IBuZ_uaI5un&6XYR} zE0_ms>SpT4$|tuUvd)&iMfQT7%G?K3iS2)X&SV26)p7aI{)#ik)`aSGv-UDtTiH#) z5b4sSeQ;UCwrQyloaLTvSZ_YdZu$yk!G+xgQRk#FwG6_dyJ?l*w34jrOQN$oZxE}Z z_DRLK=&$!KQu#PmuD&Nlz?q*2L-GMwL4&z}T=S~uqhAXcs8_#xz%-MhU06={L5 zkS{vcx1>G!zbl|Sxlbqehr?cLS5WdUpHu8O9`2rQeUrl`Eq8KVLiH3&2@A_>iGVR* zMO)ct&88a2UpAPkw)1EF+cR7_T#9hhLJ8H5e)tqyG64{YVN zk*3@f-!71=7Qamv5eyPktWW#su~5k0y88TC!MC< z^CEWdWy^jAxgBeSf-Kd;xzI)y4++ z{G-Y$U=g*@%4vv&;7DDuGam})G_J$9?S@6<_ zm8E%*(0Vjauah~YLnb|Ewhv|y^;vAPL7*kou7xFzvP4vEVyPRAczt+ZCcU2JP^-y! zQInzRHc-Z-0L$Y1-dhQ^vw3(YlCC)A9W3-V3OfBj6URGX^5AE}LaAelJ!xDdStD^e zRaJDX)v=@G=r0wAS5BD&?6eR^s}}3wPVz_tljNtTzAwQ;O=_j*$52XAyizy$8MQH^ zq-cI33?mY~)_NAO>*55tzH2kETw>%4mzruQvDx1xweJwv_PxZlhL3>o0?GZC zg;~A3{){Y=j6ZC?nGS2uN^#}z)?&TNi2M|16S(yQnawi9-iT@{bqTV{W9W+Rr;_bv zUena#^4`q6g6HgkRPUC{S?$zYVQu{zr%wXA7H}rpxVgJ;2lZ0;Djg8t3f&{m?9LR= zB{qK`#zkdjR$yTn`{8TP`No{j88%R|f8$rX)2D_D#gGMPy|^W1e?xfS3(sYEa|(Za zhi0b!2Lq_~!Cqg@ekqO6SFCmlc&`raV8_OahG}-o+~+M7O&D+eeK(k7Qe`vwI4d1~ z4FH^?cw424u)HnqIcfabUq(D(EZt4}zg*^3NElBO*Ym}=Lrx$0lp|+u4dSvFaKz~j zJEASyS;bG}rKBdTs-!YH2Iv^)s>P&t_Ou~kVXPie@P)ZY5e?WH6k<{b*TxooG<(Rtw0wiY0CD-XeQnEDC-3J&SuO7yFSXz^mN` z`_A|BXhl0ec)RjSp?OURhWBcixt@H>dZwy?l05Fzj^Hs0M6*MY_MKSkDC0U^`daL! zVgc9s29;nfWxA;vscv)anjPD9wsK|9fVLjc8ngq?f6>@Vles4FR_iT7oLG z{Cam6(c?BhU>Rb4KcJipC%EUIAOB?)`j4{ zhJ%8BHirD!=lT3UMImHR1pjm$=lPrALD)oI!vE88{BK)48AWve^dr3dTMIBg1VfmK z^;wbd=eo~Df38dUx1v14=XD{8&}7O_ng6x+nY90t!Ke6JtrZc}AA070&)@&`Ii3;x zKO;T2{WB87-`X-TK1ccwJU=e{Q_QD+kV0Vw*c(PDhy)BB2x7F7{?hWh@*{r;XmTH^oD|BU+mmH(Oc`!oMvtf2jSq5m19zvuT<_z(I2>c{bv z|6lt(&8_aABTemj8G1z95Ie4eT2!TvMIbK##ClKF3iwyuADx9LLkr2njigMS`6 P%%@H5X-~-Q`Q3j3V^-J( delta 9505 zcmY+KWl$Vjx3KZxE`z(fJ0!Tf1t++>%iyjVT!Om?21(Gt2_77R4elht?MuG%p7-9n zcdhEZyjNBK=i!eVGB!z19s{9S2IfoT{V#4RSn_W#O1PGlJ5|L@chLi^V- z7(5KxR&zu_{o{gxNpcDV@eztK*ZxWUD}SRjl;8Yy{dfIOslU<9#PVqWM*maGy#;|i z9}WIL3TRXoyM;~|7UN$7yoXyLNLO6}h+;KtkN!vgUKhkyJd8#%F7DzR<`O1gsgypa zXHS&HGce~^Ygs9<#1+C|ccgP6!6Ff*4zfrplvxW)%d3!84uj&MLRV|^^Ka>>!_fL_ zg8GLz@09nQezZSwP#w{=bl{?PDBm7^w>2ZtZ>T!)CkP@%k5-TPUc|eu2kZ}-!NA;p zeJ&DQ*B&@45)D!_GwrLi?RV!wPR1AGMox|qy~Gtm!SaqSMCdN63|Dib%0lY5XYfR{ z?Gt_hbdkK^QXJK6p);KH)7}lQxCw$#UdZyw;5`}DdDg$xY>&XXyWZiS`=Z=*kM6#w z*rM~pp!J=NxxQ7u!Fe%q0L9O&M{nAkYDA`t&6A{5!a zbx!3cYZo1Ja|LV6%&|orBt~7eEk%KS8<>4SPlJK9uG)7d!%%5n29)k1gnx69KMV1- z$i-xH%%eQV!yh0wFs8&#ihWe+$7by458&%~PR#T|_;qXdQcCA>MBVAN1ts2b>JX2k z8ls{;Jw7|eZE|}gP*conO9_P2pz=U|j1h_p86$D%5FK-r^N=oyJwGEYLkhTOQlg6V z&2O|+h|Gi)rRZwD0&cHH2^CtCBsa`3+9OoMxGX5umexPS`U`!|lcKz=hU!*=| zbwvEtbLVheCY+a7t=Xx98(%7b&sG z>{Sntl2IXnMGVRqV@wE=@NX*F5~~afMA;GQkUsA;CwwW{pQL?XqFfa0D2c_WiMbop zas1e`&JGmyeiVM|?7$QOH8a}pR+kI!EwJWcP{pRpD+FMsUPVo6xRr~q(ME^qe*8V) zOxffD0qTlHpqaqoWVxkhvA@#9SH=P^pcz%ed`u}0%C-lJ>~Yx);DpomBqd56nnPxa z4`$qwc(Xenk~N7z9P~7&O*=@~QC@CKe%pavj_}P&JA_G}`5O@1RCVLlM4qw{SmL}L z9ZMfch6rjIx{}hxVh?Si7f)$N#i>HARO9_*fyW9O)i-yo)1kr$qWNK${aQ1h*m4dA zf0A%HB7;$e&hu0ObX6Yp4rGT?-i&m=$jT!b@Jj=~N`>48t7j-*##|c;4*J@mq*)C; zYjY{4>^=(AlWE|1Y*66^LACr!ti9xdBG6@NyC98pq#}z?$cbqfGS*VnZwW=+u9q(} zff#IQa#@KI5d}{9>R+id12OeUb9^V#AuW{TjG7gf{t{Lxl?)U1Cwqzwa$3ot`RBvI%)Z^3;G6ie=SB_Qbus@ z%m2nE4+*7XoF#H6RqFXv8YLZ}gY|=mB)Fz^7HUu|!1;N5U#TkAiMBVjZ=NJWjyM$v zC#PItz}D8qSdR{%e*q_Iow2+imLk7WTOvy~RZC$RWTFSRJ5xM0I0K$e`SX$(fMSRs znSQ0^cV+YVe(4T;tfsvBE&=74S<-<_y_(G~ei;tmzOY?>GcnunG`;e~>LN7b{x)AK z&azNLVEDl*GoZyVqyu)4<-5#cLwfIC#8Kw=w!)AfQictBHTq8;_S${3LXeU1ay^vL zG1m+MheW;)(MEmfKx&pX%-|W0c-F5okBQ$U9&$skU3c$IW%?Zr-*B$p=v@JAt@gR8 zK~J)p@g#+XZe7>S%^-0-Mp#XdwH__-f)tI69=l297?(ZnT>wH7{G20$3^$c-2!!vu zvRB7k5-v%)LSoXrOFTPA0%pOD1SuW4UT&)xkMilHjXQ@66@YjM-)ZU6{%eR)>3R^Vatjf#{ z=(l$FL&)!)2`7t?^NmN=+!0s#9e>jD{g{klXh7opiZ9v=GFOZ0@a*Pxv=;R5f5ZYh^iVTaH1QEax#05yv@^k713icTjkkuq8KD}o-rhb4DHmpssQc5_Yk?Az+QPqe;h?|>gECigsY z9IWBk;*2L^M?)9h|6;%g3gK#+$fl(a%pAOX7oyVQJtM^2+9n`QmLASaERf1D*gASw zuT^`dUZvF1x-rhzO`>AZ-uQX<$iaQqyUfk8OY9a63LFVU)+v7abwt@YnYcy z0`pnMHl6=fHbenNK7GFI}BgYf_YoX-U9)pKDluE#4VP+0+_RHW9p>{eyP%A56q0l*yL04 zsW+_EJ;9RNb3SpnYEfXIEZzo<9fm$e8X6kE*DcGUFzIFRywAa9?tWx#`395R-n?Sx ze|H&By+elZ=vb+RFSKOK~MrxoCzZ3S5u!b3^lX-+BfTP}&)`jkfs< zZP4(682IpkqGi5ID!5xQL28&FrM?CAPda0yG8g=(`T${& zdHA3OIc%OIYHF^07>t_wlI73y zBkK*A=$E7_Zx4ist2_g)0V>%bXld; z3f+PO&5d6N>Q92cm?Mv^-AMdQnUg6d?CXihuH;eI4NR|!^exZY z7^dRT(dDGU55k{%G~df;5L5WNfmlCuEi zXM-eLg4KXy`PVwbBqfwAL1ox$l*0V`NF#1K`tr1kPQ9wME zvm8vKDpEdqi?SyUH&&XV* zT4gTgu!TRSZC&>2waC#vBg^5%V?iKqO^Ut=_p8&zjDXqi7?FKc z>oU$G)0UDgx=-%yf^%U^9Xb12Fc4Sr*BSi+ZZ9Iu)f{Tl=2P(2{D2jmt|vMDt>9`aw2o#$ zRD>T#=ySo5B9lM=b;|9*Jg!zo8)!bI=_kSPx}eeCesj!MNgsinr4{!9xk$qnRCZln zB8ZPu7R)fZw1^QDptT?9GIqOxV_kzRg%96ZzOKmZqZIU@5NWfj0pxC0#R?gVk5qZ> z_RG8*1=z%1S|to=K8x05hhBe>6Z>YTai&i7^KFwR{CVMga;&cM2-y1cF?#5Y?Z-W# zc~CreEE4Lu>@>a}B@l<|aep#+yHDD^(R80P&MToJftZcheWrw1zgDY#*!bX_Sz-mp za|bc7!_xB0XUuic%xcjCzoegw61GWlcbWo}HWFG3sL^Zl@~B|i;Hr$pE|Oq4T|Jg2 zib&UDj|fi3je)sRhtg_^@t}0j>keg|I&DuM_9``;-*MgOZ(;W83ar*2_FEpj=mJL8Sp?nrslC4tF=ILhVUI*nciw!PM>djuh*fHqH*4AC zsF&1JF}+`i*XQ8({9>0ZrSr)NhCqqn+Emo{Wyp0tA^td7_-j&5Qy7$o4nb<`U7Vab z^Eq6eFs&Cn0r2#b!y47$(}4HDZQ8^4>_GMmqr02}Xm2~m9gz8o-%x17DvwmJ9B;@o z5e2A%`79uBQMY6KF}o>Mn`KhfEvOtI&}`%2{=GKg*C)e{Pa5}yIy|R798EtBKOrVy zAEk>G;GvKd49}y=BLzbIf{pGx(o+W6Jk^;(6X3czMu7%5s}ke*{3$lw0Ynkar2r;2 zNnfUeS31hDxYT{rbGu$c!{#Q3G_%(?*(ODY7f?!8tXd(7m)<@%y9~=aC{`11p$8c+ zV3%eO*Mws=F_jIR%9HkyEJ^EkXzOFASG>bxkWx8BLbc9Vr~<8)Yv&;x!khWb5LF0J zEJaGM1g>(RJTM@z{|>M+zH+Qe`EW9!RgDRWS5l0LrDR69wvtWZmJZq=L8szedYCl18paIeWLt#bKT z(?vfG&NcGsQTk{kLJP+i4qLamws2`thC7;q3M5fo=c(N=GBFuf+&*&Ao4xC-5?=Fk z(1M^oAw&o)Zqkjz%sw-;&eUTvg8bBZ@Iy!{)?@^|$Pv`4TPwU-Z zfruR@fL=9qv5>y8q=!Tt9fxPU#1I$)z3h*EDO>W=8t3{?A!)R{=@g)%fS zO(3kt8QSx;x=mRVT4HzoMTp$f7B_xG>(**oSVdk-wo}nPQnqV}Ii$ep4o9*l_3&57 zhsMYSsf_L1y{%rAP+`Kfi=#P9LuCg^*1cPe(9mJkrt~ue%TFhH5oTBg@aWj}K+#9;u;7kY`|SDTc74oz0~p_Kt*LHFsbFWUg{MtTi&=d;!`B+iA5}i zMU~qs1DaC&w)$_RPQ}r^JUu1Rx2((E2kl))nbF(G2jl8@EfBhF#z&dOr&{p;V)X+N*r#pTNGe6Ao)=*V7?@(9hN1KRqh3G?T z2AT3Eo;NS;Y1C21at=W|N>O70n}vKw!ewJI7xI_UY62hJIcLFX562NI_R6*q*Q<8DR1M?o4?-NJI4_zkIEdfWB~Wb zOdAzzMdG+%9*l8ZprRlPqWV@;=+{%^d6IRPbY(3ULh;RPwSUElNqKOlXoK>~H;^E5 zoQI^N&-F=Qxyh8a;PH+tpiNP}?nA_MREwKXWNi-Ow;; za+=fbXy?gMPZV0+-28A)wZF&1r?rQ#c#OMT)A_=8|G94)&W$ z7}GV9!DS!h*Op(gV0GVir^(*~JlbGrkYam1u7E^F&{&+bBjAwMZ%Wof=!@QqIHUIWA(W>KP zNo4@|jtoq${6Q#SIGUmcFDFT0;fFxFI#XxPj{uq6VKly&=jN@|I+p;j!;kNz=z3Qw z;NL|Xm(4#vCbPMzg(OhiRQ&3D;3~QcYU5WRLnPztmrWtB?!ilYMr9YrT<+b`WE?nH zcBERr1>y!9;8IRU7jlm@ef=4~Hck66R!+91+HuWIO!P$Q!NXx9nh0NHQ!#wTO#wm2 zk}pm_c&BY9t=a0TQVu9ZydG)D&QIyb&Tq{hRxRIScz2}Lu;Dk+NfC4%AaSHQHduUK z*7P`c+6^h_yk99fU*1^cZ&rNyTriT$chMNs1iU=o30g&F)ET==oDxFoMsw?Ge2*!H zA@KOC{Jy#~Fn}tdKCmvWwcY{~4R?W0MfiOhX0p^n%UzG(8?hwF@#*-nl4cCRT%7Id z)3KOw-Bf^B`-3vrzCFVib9?u5QwSH1UL|aYJ}8;z!}+e>^xn#S^}-6V2j9-t zATWX6(mC^C`4ffS-9TU=uB~hmsmXJg-bVxFsEn2By`x)>=!jAPi}sI?isC(A^U|K2 zoE)R%-wz*Uzxyz}*db}VE-OD)=%(irbwEV4+1s1mDpXq|6yn5WAta{;SZ-B|h>!lN zz=MA=wUK8M-7VAWUhZb=@7}+v0~paVZUdI6Nu*v|?*?K0W_~D3y-BQg3U}1Wx426T z;$BO-um<%B$d!-=&azWdQD+kA>v`}dpf$xrA0H5A?%Q$)aDzqK{TeUN-*l{6;m+Cg zexQbuj_!!NS>&>jABy6=8Ago)&xAW#flHxVM*hOfkT_n$1{&e@-&BY0XGcHx zRZ{TC>)ozb`TS*anw!f+5>Y1lNWUyuyp>N?7Vfp9hxRKOGdAL5K7Z{adrJ!Ra?|)Z zP@=B*#Aj2Y{jm`B72*#$ucCFi*s_q zj0ssyRY#b2jb3C%f9w#(Gp?J#!OZTNQee2%RrUPoi=RoGv!`%8@Nqhw(w*+N=3;{m zsPqt0h12kMTA}+g=(F*zOjawf;KQ3Ih$zAoWPY4wYp@?()Cv=l4@&lsQP>W8 z+Gx7^S{HnS189?STHJQP9a1&w#zZpqdKOV^`8Fnq|8;u6fPx&MrWucsKZuUHD`LU+ zpoE?^r`L`cvO^N$-e@$mtM(gFpWQnJU$eS~vHs(pI?3pq;)-jSK zCzX+u!K?-!n)P*>^|}v0@iDkJeH^1%d6RPGsu(+D5(7dcHGMia^H<;mT3N0Xu?$_Z zAUb7DAat1waUnyvC&MB6VcpgVU^IFb6vv;N>Vo&V!oAb?(rrOAe|hOmKMJReh^0!| zx5@f4YAn2>&6NBG;O*~r1?3%e#+lg$%xUyQ8{sUEK0Vkx%{MzhVsT!l+KI!ylg$A` z#pbE+Ggjd}Rzk-37R__tmd{s4ewvPIHBawk5x{d32B!!kl}lfh9DD8uAT(wPXyATy zW+`qLz^IjtSQPpA!e5>hW|ok}Em)GvSI(@G^Chc{V?CiHsUFixhd;)aB1y_X3soFa zoJBYE&5bSDET6a+DBvm1@vEL;*-q5t0xm2#Q72Hn3PRzVm`Wh@ES32#CsEroy^Qb1 z?ulfeY<2aEnC5W3q30ocRC+|2<=(Wk2xSl=zM;$fw~hUB0V>nT{uuEb8uYe(kOEKb z-hl*8s;ROL;__^rU0muDs#;C`tGMnW`kI8~cQD@p58PTm@bEh&PlQcr8rtzx=DbH% zFkp#$k-1zQQM1}ZR{ze}Cd*4#aS<+Kf>M!pBn1tC!v2`(BJs?G`GCk)P25(N+3nq^ zxc&MydleAnAQ5s09ku8@D4K{rc!co0?3-`LNlm*H*j^IWvO_u&4`ydzx;6iX! zI*R@I4MQwKG#c7EIv`rwTjs$Jw0(AD(W59lAz#`U}rZ1N}&Z1OWmZF}c8MsNnt zd(VX1UEook3k=b_yZjUt$>N6?q9)tf!|0q>Lc|C(G;L*N&)f5cNawQe?Qi{B#V9UV zEA5P4)uPE~=sVd7kZms8(OM)63wqR163eR>ZV|TDj89{{6TPAUaL|1noH?hZW}uu2 zzoKpTz|0Ek1rOe8h;eS3O&DD_i@=5FTqKt6j!@mGexiO^vJ~PuZR=qe7S1J^h*$J8kmW z1)%Ul54u_RzPf7{|Cnuw!n^!;;${LUA-&x_rtJF7ukjb@$1j$t5xsWb-vD;hIJz5z9)Y-Ww3GP1T+5r3nf`V@maUkZE8l~sn$I0INd8GcO{}}R zR@sS?Gq-<$4|%l@|5GH|n; zY6f)?O$z>Pdih$Wd?i7!`{Knk>tP%n$4!oM{h`jR_1%@~jbg}mS#=$YuTtQd`&XpD zd<~wEgRclJ3=FFe49tJ{8l*o!&R>co-Pbw|}+&2Q}O4i~s-t diff --git a/_process/03. Intents.md b/_process/03. Intents.md index e69de29..ebdc3dd 100644 --- a/_process/03. Intents.md +++ b/_process/03. Intents.md @@ -0,0 +1,59 @@ +# Intents + +## Domains + +- `DOCS` +- `GENERAL` +- `CODE` - временно отключен + +## GENERAL + +### Intent `GENERAL_QA` + +Общий интент для вопросов без точного маршрута. +В дальнейшем может использоваться как fallback. + +Subintents: +- `SUMMARY` - ответы на общие вопросы по SUMMARY + + + +## DOCS + +### Intent `ARCHITECTURE` + +Обработка вопросов по архитектуре. +Subintents пока отсутствуют. +Интент запланирован, без реализации. + +### Intent `DOC_EXPLAIN` + +Объяснение по документации. + +Subintents: +- `SUMMARY` - краткое объяснение темы по SUMMARY-блокам документации +- `FIND_FILES` - поиск файлов с релевантной информацией +- `EXPLAIN_API` - объяснение работы метода +- `COMPONENT_INTEGRATIONS` - перечень интеграций компонента, API, UI, сущности, внешних систем +- `ENTITY_INTEGRATIONS` - перечень интеграций сущности + +В текущем узком MVP реально реализованы только: + +- `SUMMARY` +- `FIND_FILES` + +Для запросов по интеграциям целевым retrieval-слоем является `D6_INTEGRATION_INDEX`. + +### Intent `OPENAPI_GENERATION` + +Генерация OpenAPI-спеки. + +Subintents: +- `FULL_SPEC` - создание полной спецификации + +### Intent `DOC_GENERATION` + +Редактирование документации. + +Subintents: +- `FROM_FEATURE` - создание документации из системной аналитики на фичу diff --git a/_process/03. RAG.md b/_process/03. RAG.md new file mode 100644 index 0000000..be00cc4 --- /dev/null +++ b/_process/03. RAG.md @@ -0,0 +1,356 @@ +# RAG + +## Состояние as is + +RAG сейчас используется как общее ядро индексации и retrieval по коду и документации. +Основной storage - `rag_session` и многослойный индекс в БД. + +## Основные части + +- `RagService` - фасад индексации и retrieval +- `DocsIndexingPipeline` - индексация документации +- `CodeIndexingPipeline` - индексация кода +- `RagRepository` - persistence и retrieval +- `IntentRouterV2` - планирование retrieval: слои, фильтры, ограничения +- `RuntimeRetrievalAdapter` - выполнение retrieval в runtime + +## Индексация + +Индексация идет по двум направлениям: + +- `DOCS` +- `CODE` + +На вход подается snapshot или changes. +Для каждого файла выбирается подходящий pipeline. +На выходе формируются документы по слоям и сохраняются в RAG-хранилище. + +## Структура БД + +Все слои сохраняются в общую таблицу `rag_chunks`. + +### Общие поля по слоям + +| Поле БД | Назначение | +|---|---| +| `rag_session_id` | идентификатор сессии индексации | +| `path` | путь исходного файла | +| `content` | основной текст записи для retrieval | +| `layer` | идентификатор слоя | +| `title` | короткий заголовок записи | +| `lang` | язык исходного содержимого, в основном для code-слоев | +| `repo_id` | идентификатор репозитория или проекта | +| `commit_sha` | версия кода или документов на момент индексации | +| `span_start`, `span_end` | диапазон строк в исходном файле, если он есть | +| `embedding` | векторное представление записи | +| `metadata_json` | структурированные атрибуты конкретного слоя | + +### Поля со смыслом слоя + +Смысл конкретного слоя хранится в `metadata_json`. +Именно эти атрибуты определяют, какой объект был извлечен и как его интерпретировать в retrieval. +Домены и поддомены должны храниться в `metadata_json` явно. + +## Слои DOCS + +### `D0_DOC_CHUNKS` + +Задача: +Хранит текстовые фрагменты документации для retrieval по содержимому разделов. + +Формирование: +Документ сначала разбирается на frontmatter и body, затем body режется на секции через markdown chunker. +Для каждой секции создается отдельная запись слоя. +Нарезка идет по разделам документа. +Только в fallback-сценарии, когда markdown-структура не найдена, используется нарезка по фиксированным текстовым чанкам. + +Фиксация в БД: +| Атрибут в `metadata_json` | Описание | Источник | +|---|---|---| +| `document_id` | идентификатор документа-источника | `frontmatter.id`, иначе путь файла | +| `type` | тип документа из frontmatter | `frontmatter.type` | +| `module` | модуль документа | `frontmatter.module` | +| `domain` | домен документа | `frontmatter.domain` | +| `subdomain` | поддомен документа | `frontmatter.subdomain` | +| `tags` | теги документа | `frontmatter.tags` | +| `section_path` | полный путь секции в иерархии заголовков | результат `MarkdownDocChunker` | +| `section_title` | заголовок текущей секции | результат `MarkdownDocChunker` | +| `order` | порядок секции внутри документа | результат `MarkdownDocChunker` | +| `doc_kind` | классификация документа, например `readme`, `spec`, `runbook` | `DocsClassifier.classify(path)` | +| `source_path` | исходный путь документа | путь файла | +| `artifact_type` | тип артефакта, здесь `DOCS` | константа builder | + +Связанные классы: +`DocsIndexingPipeline`, `DocsContentParser`, `MarkdownDocChunker`, `DocsDocumentBuilder` + +### `D1_DOCUMENT_CATALOG` + +Задача: +Хранит карточку документа как точку входа в документ и его краткое описание. + +Формирование: +Источник данных - frontmatter, fallback title, summary и doc kind, вычисленный классификатором документации. +Данные извлекаются структурированно по атрибутам. +В `content` попадает summary документа, а не склейка всех частей документа в сплошной текст. + +Фиксация в БД: +| Атрибут в `metadata_json` | Описание | Источник | +|---|---|---| +| `document_id` | идентификатор документа | `frontmatter.id`, иначе путь файла | +| `type` | тип документа из frontmatter | `frontmatter.type` | +| `name` | системное имя документа | `frontmatter.name` | +| `title` | человекочитаемый заголовок документа | `frontmatter.title`, иначе fallback title | +| `module` | модуль документа | `frontmatter.module` | +| `domain` | домен документа | `frontmatter.domain` | +| `subdomain` | поддомен документа | `frontmatter.subdomain` | +| `layer` | логический слой, указанный в frontmatter документа | `frontmatter.layer` | +| `status` | статус документа | `frontmatter.status` | +| `updated_at` | дата или отметка последнего обновления | `frontmatter.updated_at` | +| `tags` | теги документа | `frontmatter.tags` | +| `entities` | сущности, связанные с документом | `frontmatter.entities` | +| `parent` | родительский документ | `frontmatter.parent` | +| `children` | дочерние документы | `frontmatter.children` | +| `links` | ссылки на связанные материалы | `frontmatter.links` | +| `source_path` | исходный путь документа | путь файла | +| `summary_text` | краткое содержание документа | секция `# Summary` | +| `doc_kind` | классификация документа, например `readme`, `spec`, `runbook` | `DocsClassifier.classify(path)` | + +Связанные классы: +`DocsIndexingPipeline`, `DocsFrontmatterParser`, `DocsClassifier`, `DocsContentParser`, `DocsDocumentBuilder` + +### `D2_FACT_INDEX` + +Задача: +Хранит атомарные факты в форме `subject-predicate-object` для точного retrieval по утверждениям. + +Формирование: +Факты извлекаются из frontmatter и секций документа, после чего каждая найденная тройка превращается в отдельную запись. + +Фиксация в БД: +| Атрибут в `metadata_json` | Описание | Источник | +|---|---|---| +| `fact_id` | идентификатор факта | вычисляется builder из содержимого факта и пути | +| `subject_id` | субъект факта | `DocsFactExtractor` | +| `predicate` | предикат или тип связи | `DocsFactExtractor` | +| `object` | значение или объект факта | `DocsFactExtractor` | +| `object_ref` | ссылка на объект, если она выделена отдельно | `DocsFactExtractor` | +| `anchor` | место в документе, откуда взят факт | `DocsFactExtractor` | +| `tags` | теги факта | `DocsFactExtractor` | +| `source_path` | исходный путь документа | путь файла | + +Связанные классы: +`DocsIndexingPipeline`, `DocsFactExtractor`, `DocsDocumentBuilder` + +### `D3_ENTITY_CATALOG` + +Задача: +Хранит сущности, найденные в документации, чтобы искать документы и связи вокруг конкретной сущности. + +Формирование: +Сущности извлекаются из frontmatter документа, после чего каждая сущность сохраняется отдельной записью. + +Фиксация в БД: +| Атрибут в `metadata_json` | Описание | Источник | +|---|---|---| +| `entity_name` | имя сущности | `DocsEntityExtractor` | +| `document_id` | идентификатор документа, где найдена сущность | `frontmatter.id`, иначе путь файла | +| `document_type` | тип документа-источника | `frontmatter.type` | +| `module` | модуль документа | `frontmatter.module` | +| `domain` | домен документа | `frontmatter.domain` | +| `subdomain` | поддомен документа | `frontmatter.subdomain` | +| `tags` | теги документа или сущности | `frontmatter.tags` | +| `source_path` | исходный путь документа | путь файла | + +Связанные классы: +`DocsIndexingPipeline`, `DocsEntityExtractor`, `DocsDocumentBuilder` + +### `D4_WORKFLOW_INDEX` + +Задача: +Хранит workflow и сценарии из документации для ответов про flow, шаги и жизненный цикл процесса. + +Формирование: +Workflow извлекаются из detail sections документа и сохраняются как отдельные сценарии. +Извлечение идет из структуры `Details -> ## Сценарий`. + +Фиксация в БД: +| Атрибут в `metadata_json` | Описание | Источник | +|---|---|---| +| `workflow_id` | идентификатор сценария | вычисляется builder из названия, anchor и документа | +| `document_id` | идентификатор документа-источника | `frontmatter.id`, иначе путь файла | +| `workflow_name` | название сценария | блок `Details -> ## Сценарий -> **Название**` | +| `preconditions` | предусловия сценария | блок `Details -> ## Сценарий -> **Предусловия**` | +| `trigger` | триггер или событие запуска | блок `Details -> ## Сценарий -> **Триггер**` | +| `main_flow` | основной сценарий | блок `Details -> ## Сценарий -> **Основной сценарий**` | +| `alternative_flow` | альтернативные ветки | блок `Details -> ## Сценарий -> **Альтернативный сценарий**` | +| `error_handling` | обработка ошибок | блок `Details -> ## Сценарий -> **Обработка ошибок**` | +| `postconditions` | постусловия | блок `Details -> ## Сценарий -> **Постусловие**` | +| `source_path` | исходный путь документа | путь файла | + +Связанные классы: +`DocsIndexingPipeline`, `DocsWorkflowExtractor`, `DocsDocumentBuilder` + +### `D5_RELATION_GRAPH` + +Задача: +Хранит связи между документами и сущностями документации для navigation и related docs retrieval. + +Формирование: +Связи извлекаются из frontmatter и сохраняются как отдельные relation edges. + +Фиксация в БД: +| Атрибут в `metadata_json` | Описание | Источник | +|---|---|---| +| `relation_id` | идентификатор связи | вычисляется builder из source, target, relation type и anchor | +| `source_id` | источник связи | `frontmatter.id` или source документа в extractor | +| `relation_type` | тип связи | `DocsRelationExtractor` | +| `target_id` | целевой объект связи | `DocsRelationExtractor` | +| `anchor` | место в документе, где обнаружена связь | `DocsRelationExtractor` | +| `source_path` | исходный путь документа | путь файла | + +Связанные классы: +`DocsIndexingPipeline`, `DocsRelationExtractor`, `DocsDocumentBuilder` + +### `D6_INTEGRATION_INDEX` + +Задача: +Хранит прикладные интеграции компонента, API, UI, сущности или внешней системы. +Используется для ответов на вопросы вида "какие интеграции есть у компонента". + +Формирование: +Интеграции извлекаются из блока `## Integrations` документа. +Одна интеграция должна превращаться в отдельную запись слоя. +Описание интеграции может быть развернутым, а структурированные атрибуты должны выделяться в словарь. + +Фиксация в БД: +| Атрибут в `metadata_json` | Описание | Источник | +|---|---|---| +| `integration_id` | идентификатор интеграции | вычисляется builder из source, target и anchor | +| `source_id` | идентификатор объекта, для которого описана интеграция | `frontmatter.id` документа-источника | +| `source_type` | тип исходного объекта | `frontmatter.doc_type` | +| `target` | целевой объект интеграции | блок `## Integrations` | +| `target_type` | тип целевого объекта, например `api`, `ui`, `entity`, `service`, `external_system` | блок `## Integrations` | +| `direction` | направление интеграции | блок `## Integrations` | +| `interaction` | тип взаимодействия | блок `## Integrations` | +| `via` | технический канал интеграции | блок `## Integrations` | +| `purpose` | назначение интеграции | блок `## Integrations` | +| `details` | дополнительные атрибуты интеграции в виде словаря | блок `## Integrations` | +| `domain` | домен документа | `frontmatter.domain` | +| `subdomain` | поддомен документа | `frontmatter.subdomain` | +| `source_path` | исходный путь документа | путь файла | +| `anchor` | место в документе, где описана интеграция | блок `## Integrations` | + +Связанные классы: +`DocsIndexingPipeline`, `DocsIntegrationExtractor`, `DocsDocumentBuilder` + +## Слои CODE + +### `C0_SOURCE_CHUNKS` + +Задача: +Хранит фрагменты исходного кода как базовый слой для цитирования, explain и точечной догрузки кода. + +Формирование: +Исходный файл режется на кодовые чанки, и для каждого чанка создается отдельная запись. + +Фиксация в БД: +| Атрибут в `metadata_json` | Описание | Источник | +|---|---|---| +| `chunk_index` | порядковый номер чанка в файле | индекс чанка при нарезке | +| `chunk_type` | тип чанка, например функция, класс или текстовый блок | `CodeTextChunker` | +| `module_or_unit` | модуль, к которому относится chunk | вычисляется из пути файла | +| `is_test` | признак тестового файла | `is_test_path(path)` | + +Связанные классы: +`CodeIndexingPipeline`, `CodeTextChunker`, `CodeTextDocumentBuilder` + +### `C1_SYMBOL_CATALOG` + +Задача: +Хранит символы кода: классы, функции и методы. Используется для поиска по именам и структуре кода. + +Формирование: +Символы извлекаются `SymbolExtractor`, и каждый символ сохраняется как отдельная запись. + +Фиксация в БД: +| Атрибут в `metadata_json` | Описание | Источник | +|---|---|---| +| `symbol_id` | идентификатор символа | `SymbolExtractor` | +| `qname` | полное квалифицированное имя | `SymbolExtractor` | +| `kind` | тип символа: класс, функция, метод | `SymbolExtractor` | +| `signature` | сигнатура символа | `SymbolExtractor` | +| `parent_symbol_id` | родительский символ | `SymbolExtractor` | +| `package_or_module` | модуль или пакет символа | вычисляется из пути файла | +| `is_test` | признак тестового файла | `is_test_path(path)` | + +Связанные классы: +`CodeIndexingPipeline`, `PythonAstParser`, `SymbolExtractor`, `SymbolDocumentBuilder` + +### `C2_DEPENDENCY_GRAPH` + +Задача: +Хранит связи между символами кода: вызовы, импорты, наследование. Используется для анализа зависимостей и flow. + +Формирование: +Связи строятся `EdgeExtractor` по AST и списку символов, после чего каждая связь сохраняется отдельной записью. + +Фиксация в БД: +| Атрибут в `metadata_json` | Описание | Источник | +|---|---|---| +| `edge_id` | идентификатор связи | `EdgeExtractor` | +| `edge_type` | тип связи: вызов, импорт, наследование | `EdgeExtractor` | +| `src_symbol_id` | исходный символ | `EdgeExtractor` | +| `src_qname` | полное имя исходного символа | `EdgeExtractor` | +| `dst_symbol_id` | целевой символ, если он разрешен | `EdgeExtractor` | +| `dst_ref` | текстовая ссылка на целевой символ | `EdgeExtractor` | +| `resolution` | статус разрешения связи | `EdgeExtractor` | +| `is_test` | признак тестового файла | `is_test_path(path)` | + +Связанные классы: +`CodeIndexingPipeline`, `EdgeExtractor`, `EdgeDocumentBuilder` + +### `C3_ENTRYPOINTS` + +Задача: +Хранит точки входа приложения: HTTP routes, CLI commands и другие entrypoints. + +Формирование: +Детекторы ищут HTTP и CLI точки входа по символам файла, после чего каждый найденный entrypoint сохраняется отдельной записью. + +Фиксация в БД: +| Атрибут в `metadata_json` | Описание | Источник | +|---|---|---| +| `entry_id` | идентификатор точки входа | detector entrypoint model | +| `entry_type` | тип точки входа | detector entrypoint model | +| `framework` | framework, в котором найдена точка входа | detector entrypoint model | +| `route_or_command` | route или команда | detector entrypoint model | +| `handler_symbol_id` | идентификатор обработчика | detector entrypoint model | +| `handler_symbol` | имя обработчика | detector entrypoint model | +| `declaring_symbol` | символ, в котором объявлен entrypoint | detector entrypoint model | +| `entrypoint_kind` | вид точки входа | detector entrypoint model | +| `http_method` | HTTP-метод | detector entrypoint model | +| `route_path` | путь маршрута | detector entrypoint model | +| `decorator_text` | текст декоратора или объявления | detector entrypoint model | +| `summary_text` | краткое описание точки входа | detector entrypoint model | +| `is_test` | признак тестового файла | `is_test_path(path)` | +| `lang_payload` | дополнительные данные детектора | detector metadata | +| `artifact_type` | тип артефакта, здесь `CODE` | константа builder | + +Связанные классы: +`CodeIndexingPipeline`, `EntrypointDetectorRegistry`, `FastApiEntrypointDetector`, `FlaskEntrypointDetector`, `TyperClickEntrypointDetector`, `EntrypointDocumentBuilder` + +### `C4_SEMANTIC_ROLES` + +Задача: +Слой объявлен в enum и retrieval-планах как слой семантических ролей кода. + +Формирование: +Слой формируется на основе символов, связей, dataflow slices и execution traces. +В текущем runtime этот слой не используется как активный маршрут, так как домен `CODE` отключен. + +Фиксация в БД: +Смысловые атрибуты слоя сохраняются в `rag_chunks.metadata_json`. +Точное краткое описание состава этих атрибутов в текущем документе пока не зафиксировано. + +Связанные классы: +`CodeIndexingPipeline`, `SemanticRoleBuilder`, `SemanticRoleDocumentBuilder` diff --git a/_process/04. Analitycs artefacts.md b/_process/04. Analitycs artefacts.md index 74d9a83..2415f32 100644 --- a/_process/04. Analitycs artefacts.md +++ b/_process/04. Analitycs artefacts.md @@ -314,11 +314,71 @@ LLM не должна каждый раз тонуть в полном доку - функциональные требования; - 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`. @@ -428,6 +488,7 @@ UI-элементы должны храниться в **табличном** и ## Технический use case ## Функциональные требования ## Contract +## Integrations ## Errors ## Нефункциональные требования ## Связанные блоки логики @@ -454,6 +515,7 @@ UI-элементы должны храниться в **табличном** и ## Контекст ## Технический use case ## Функциональные требования +## Integrations ## Ограничения и условия вызова ## Нефункциональные требования ## Связанные API / UI / integration points @@ -787,4 +849,4 @@ DOCS и CROSS_DOMAIN остаются частью target architecture; в те - полноценные execution paths для всей системы; - богатые fact-индексы по всем доменам; - полный reference graph документации; -- глубокая автоматизация подготовки системной аналитики. \ No newline at end of file +- глубокая автоматизация подготовки системной аналитики. diff --git a/_process/05. MVP - process_v1.md b/_process/05. MVP - process_v1.md new file mode 100644 index 0000000..51c3d8a --- /dev/null +++ b/_process/05. MVP - process_v1.md @@ -0,0 +1,100 @@ +# MVP: процесс v1 + +## 1. Общее описание + +Запрос пользователя обрабатывается цепочкой API → рантайм агента → зарегистрированный процесс версии `v1` → один workflow из трёх последовательных шагов. Процесс **не** обращается к RAG и **не** маршрутизирует интенты: текст сообщения передаётся в LLM по фиксированному промпту. Ответ агента — результат генерации с лёгкой постобработкой (trim). + +```mermaid +flowchart LR + subgraph api [API] + RS[RequestService] + end + subgraph runtime [Agent runtime] + AR[AgentRuntime] + PR[ProcessRunner] + end + subgraph v1 [Процесс v1] + P1[V1Process] + WG[V1FlowMainGraph] + end + subgraph wf [Workflow v1.flow_main] + S1[PrepareUserMessageStep] + S2[GenerateAnswerStep] + S3[FinalizeAnswerStep] + end + LLM[AgentLlmService] + RS --> AR + AR --> PR + PR --> P1 + P1 --> WG + WG --> S1 --> S2 --> S3 + S2 --> LLM +``` + +Клиент создаёт запрос с `process_version: v1`. `AgentRuntime` поднимает `RuntimeExecutionContext` (запрос, сессия, publisher, trace), выбирает `V1Process` из реестра и вызывает `run`. `V1Process` собирает `V1FlowContext` и прогоняет линейный граф: подготовка текста, один вызов LLM, финализация строки ответа. Итог попадает в `ProcessResult.answer` и дальше в ответ пользователю. + +--- + +## 2. Шаги и контракты + +### 2.1. Вход в процесс: `V1Process.run` + +| | | +|--|--| +| **Название** | Запуск процесса v1 | +| **Задача** | Собрать контекст workflow и выполнить граф до готового ответа. | +| **Вход** | `RuntimeExecutionContext`: `request` (в т.ч. `message`), `session`, `publisher`, `trace`. | +| **Выход** | `ProcessResult` с полем `answer: str`. | +| **Как работает** | Создаётся `V1FlowContext` с `prompt_name` по умолчанию `v1_flow_main.answer`. Вызывается `V1FlowMainGraph.run`. Возвращается ответ из контекста workflow. | + +Код: `src/app/core/agent/processes/v1/process.py`. + +--- + +### 2.2. Шаг workflow: `PrepareUserMessageStep` + +| | | +|--|--| +| **Название** | Подготовка сообщения пользователя | +| **Задача** | Сформировать строку, которая уйдёт в LLM как пользовательский ввод. | +| **Вход** | `V1FlowContext` с заполненным `runtime` и `prompt_name`. | +| **Выход** | Тот же контекст с `prepared_message: str`. | +| **Как работает** | Берётся `context.runtime.request.message` и обрезаются пробелы по краям (`strip`). Результат пишется в `prepared_message`. Других преобразований нет. | + +Код: `src/app/core/agent/processes/v1/workflow/flow_main/steps/prepare_user_message_step.py`. + +--- + +### 2.3. Шаг workflow: `GenerateAnswerStep` + +| | | +|--|--| +| **Название** | Вызов LLM | +| **Задача** | Сгенерировать ответ по выбранному промпту и подготовленному сообщению. | +| **Вход** | `V1FlowContext` с `prepared_message`, `prompt_name`, `runtime.trace` для модуля LLM. | +| **Выход** | Контекст с `answer: str` (сырой ответ модели). | +| **Как работает** | Асинхронно в пуле потоков вызывается `AgentLlmService.generate(prompt_name, prepared_message, ...)`. В trace подключается модуль `workflow.v1.llm`. Идентификатор запроса передаётся в `log_context` для логов. | + +Код: `src/app/core/agent/processes/v1/workflow/flow_main/steps/generate_answer_step.py`. + +--- + +### 2.4. Шаг workflow: `FinalizeAnswerStep` + +| | | +|--|--| +| **Название** | Финализация ответа | +| **Задача** | Нормализовать строку ответа перед выдачей пользователю. | +| **Вход** | `V1FlowContext` с заполненным `answer` после LLM. | +| **Выход** | Контекст с обновлённым `answer`. | +| **Как работает** | К ответу применяется `strip()` по краям. Другой логики нет. | + +Код: `src/app/core/agent/processes/v1/workflow/flow_main/steps/finalize_answer_step.py`. + +--- + +### 2.5. Транспорт: `WorkflowGraph` (v1) + +Граф для v1 использует стандартный `WorkflowGraph`: на каждом шаге пишутся события `workflow_started`, `step_started`, `step_completed`, `workflow_completed` в `runtime_traces` через `context.runtime.trace`. + +Код: `src/app/core/agent/utils/workflow/graph.py`, обёртка `V1FlowMainGraph` в `src/app/core/agent/processes/v1/workflow/flow_main/graph.py`. diff --git a/_process/05. MVP - process_v2.md b/_process/05. MVP - process_v2.md new file mode 100644 index 0000000..b019846 --- /dev/null +++ b/_process/05. MVP - process_v2.md @@ -0,0 +1,220 @@ +# MVP: процесс v2 + +## 1. Общее описание + +Процесс v2 в текущем MVP ориентирован в первую очередь на **документацию проекта**, но роутер также поддерживает `GENERAL / GENERAL_QA / SUMMARY` для общих обзорных вопросов. Для документных веток нужна активная RAG-сессия с проиндексированными документами. + +Это **узкий MVP**, а не полная target architecture. Поддерживаются три маршрута: + +- `GENERAL` +- `GENERAL_QA` +- `SUMMARY` +- `DOCS` +- `DOC_EXPLAIN` +- `SUMMARY` +- `FIND_FILES` + +Запрос проходит следующие смысловые этапы: + +1. проверка готовности сессии; +2. intent routing; +3. формирование retrieval-параметров; +4. retrieval из `DOCS RAG`; +5. минимальная сборка evidence; +6. запуск task-focused workflow нужной ветки; +7. формирование ответа. + +```mermaid +flowchart TB + subgraph api [API] + RS[RequestService] + end + subgraph runtime [Agent runtime] + AR[AgentRuntime] + PR[ProcessRunner] + end + subgraph v2 [Процесс v2] + P2[V2Process] + IR[V2IntentRouter] + POL[V2RetrievalPolicyResolver] + AD[V2RagRetrievalAdapter] + RSR[RagSessionRetriever] + ASM[DocsEvidenceAssembler] + end + subgraph rag [Пакет rag] + RR[RagRepository] + end + subgraph wf [Workflow] + SUM[DocsExplainSummaryGraph] + FF[DocsExplainFindFilesGraph] + end + LLM[AgentLlmService] + RS --> AR --> PR --> P2 + P2 --> IR --> POL --> AD --> RSR --> RR + AD --> ASM + ASM --> SUM + ASM --> FF + SUM --> LLM +``` + +Клиент указывает `process_version: v2`. Без `active_rag_session_id` в сессии процесс возвращает сообщение об ошибке. Иначе выполняется цепочка: + +маршрутизация → `RetrievalPlan` → retrieval строк из `DOCS RAG` → минимальная сборка evidence → ветвление по `subintent` → запуск workflow. + +### Реализованные домены, интенты и сабинтенты + +В коде заданы константы `V2Domain`, `V2Intent`, `V2Subintent`. Сейчас процесс intentionally ограничен одной рабочей областью. + +| Уровень | Значение (строка) | Реализация | +|--------|-------------------|------------| +| **Домен (routing_domain)** | `DOCS` | Единственный поддерживаемый домен: документация проекта. | +| **Интент** | `DOC_EXPLAIN` | Единственный интент: объяснение по документации. | +| **Сабинтент** | `SUMMARY` | Объяснение темы по SUMMARY-блокам документации. | +| **Сабинтент** | `FIND_FILES` | Поиск путей к документам, где описана нужная сущность или тема. | + +Итого в текущем MVP реализована **одна** рабочая тройка домен×интент: `DOCS` + `DOC_EXPLAIN`, с **двумя** ветками по сабинтенту. + +--- + +## 2. Этапы вне workflow (внутри `V2Process.run`) + +### 2.1. `V2IntentRouter.route` + +| | | +|--|--| +| **Название** | Маршрутизация запроса (v2) | +| **Задача** | Определить домен, интент, subintent и извлечь якоря из текста. | +| **Вход** | `user_query: str` (текст сообщения пользователя). | +| **Выход** | `V2RouteResult`: `routing_domain`, `intent`, `subintent`, `user_query`, `normalized_query`, `target_terms`, `anchors` (`V2RouteAnchors`), `confidence`. | +| **Как работает** | Router реализован по схеме **LLM-first**: `normalization` → `target_terms`/`anchors extraction` → `LLM router` → `deterministic validator` → `fallback`. LLM является **основным селектором маршрута**. Deterministic-слой больше не выбирает маршрут по умолчанию: он отвечает только за extraction, валидацию enum/комбинаций и fallback при сломанном или невалидном ответе LLM. В trace пишется событие `intent_routed`. | + +Код: `src/app/core/agent/processes/v2/intent_router/router.py`, `modules/normalizer.py`, `modules/target_terms.py`, `modules/anchors.py`, `routers/llm.py`, `routers/validator.py`, `routers/fallback.py`. + +--- + +### 2.2. `V2RetrievalPolicyResolver.resolve` + +| | | +|--|--| +| **Название** | Политика retrieval для v2 | +| **Задача** | По результату роутинга выбрать профиль, список слоёв RAG и лимит строк выдачи. | +| **Вход** | `V2RouteResult`. | +| **Выход** | `RetrievalPlan`: `profile`, `layers`, `limit`, опционально `filters`. | +| **Как работает** | Это отдельный смысловой шаг между routing и retrieval. Он не ходит в БД и не извлекает данные, а только подготавливает параметры поиска. Для `FIND_FILES` выбирается один профиль слоёв и лимит, для `SUMMARY` — другой. Лог: `retrieval_plan_resolved`. | + +Код: `src/app/core/agent/processes/v2/retrieval/policy_resolver.py`. + +--- + +### 2.3. `V2RagRetrievalAdapter` → `RagSessionRetriever.retrieve` + +| | | +|--|--| +| **Название** | Загрузка сырых строк из RAG по плану | +| **Задача** | Делегировать поиск в единственную реализацию retrieval в пакете `rag`. | +| **Вход** | `rag_session_id`, `query_text` (нормализованный запрос), `RetrievalPlan`. | +| **Выход** | `list[dict]` — строки чанков в формате `RagRepository.retrieve` (поля `path`, `layer`, `metadata`, и т.д.). | +| **Как работает** | Выполняется retrieval по уже сформированному плану: профиль, список слоёв и лимит. На этом шаге происходит только извлечение сырых строк из `DOCS RAG`. Лог: `rag_rows_fetched`. | + +Код адаптера: `src/app/core/agent/processes/v2/retrieval/v2_rag_adapter.py`. +Код API: `src/app/core/rag/retrieval/session_retriever.py`. + +--- + +### 2.4. `DocsEvidenceAssembler` + +| | | +|--|--| +| **Название** | Сборка evidence для задачи | +| **Задача** | Превратить сырые строки retrieval в списки summary или кандидатов файлов с дедупом и скорингом. | +| **Вход** | Список строк `rows`, `V2RouteResult` (для `target_terms`). | +| **Выход** | `list[RetrievedSummary]` или `list[RetrievedFile]`. | +| **Как работает** | Это **минимальная evidence-проверка**, достаточная для MVP. Для `SUMMARY` отбрасываются записи без summary-текста и summary-like секции, затем применяется дедуп и простой скоринг по терминам. Для `FIND_FILES` остаются только релевантные пути документов, также с дедупом и простым скорингом. Здесь нет сложной многоступенчатой валидации: задача шага — отфильтровать очевидный шум и передать в workflow компактное evidence. Лог: `evidence_assembled`. | + +Код: `src/app/core/agent/processes/v2/evidence/assembler.py`. + +--- + +## 3. Шаги workflow + +Текущие workflow являются **task-focused**: каждая ветка решает одну узкую прикладную задачу и не содержит общей универсальной логики для всех типов вопросов. + +### 3.1. Ветка `SUMMARY`: `GenerateSummaryAnswerStep` + +| | | +|--|--| +| **Название** | Сборка ответа по summary | +| **Задача** | Сформировать ответ пользователю по найденным SUMMARY-блокам или сообщить об отсутствии. | +| **Вход** | `DocsExplainSummaryContext`: `runtime`, `route`, `rag_session_id`, `prompt_name`, `documents` (список `RetrievedSummary`). | +| **Выход** | Контекст с `answer: str`, `prompt_input` при успешном вызове LLM. | +| **Как работает** | Workflow получает уже отобранные summary-документы. Если документов нет — возвращает честный fallback-ответ. Иначе собирает prompt input из запроса пользователя и найденных summary-блоков и вызывает LLM. Workflow не занимается retrieval и не строит retrieval-план: он решает только задачу генерации ответа по уже подготовленному evidence. | + +Код: `src/app/core/agent/processes/v2/workflows/docs_explain_summary/steps/generate_summary_answer_step.py`. +Граф: `DocsExplainSummaryGraph` (`V2WorkflowGraph`). + +--- + +### 3.2. Ветка `FIND_FILES`: `FinalizeFindFilesAnswerStep` + +| | | +|--|--| +| **Название** | Сборка списка файлов | +| **Задача** | Вывести пользователю markdown-список путей к файлам документации. | +| **Вход** | `DocsExplainFindFilesContext`: `runtime`, `route`, `rag_session_id`, `files` (`RetrievedFile`). | +| **Выход** | Контекст с `answer: str`. | +| **Как работает** | Workflow получает уже собранный список файлов и формирует финальный ответ. Если файлов нет — возвращает fallback. Если файлы есть — отдает детерминированный список путей. Эта ветка intentionally не использует LLM, потому что задача сводится к выдаче путей, а не к генерации объяснения. | + +Код: `src/app/core/agent/processes/v2/workflows/docs_explain_find_files/steps/finalize_find_files_answer_step.py`. +Граф: `DocsExplainFindFilesGraph` (`V2WorkflowGraph`). + +--- + +### 3.3. Транспорт: `V2WorkflowGraph` + +| | | +|--|--| +| **Название** | Workflow v2 с буфером trace | +| **Задача** | Выполнить шаги без пошаговых `step_started`/`step_completed` в trace; один раз сбросить сводку. | +| **Вход** | Контекст workflow (`DocsExplainSummaryContext` или `DocsExplainFindFilesContext`). | +| **Выход** | Обновлённый контекст. | +| **Как работает** | Для каждого шага: `trace_input` до `run`, затем `run`, затем `trace_output`; записи копятся в список. В trace уходят `workflow_started`, затем `workflow_trace_flushed` с массивом шагов, затем `workflow_completed`. Статусы пользователю публикуются через `publisher` как и раньше. | + +Код: `src/app/core/agent/processes/v2/workflows/v2_workflow_graph.py`. + +--- + +## 4. Сборка в приложении + +В `ModularApplication` создаются `RagSessionRetriever`, `V2RagRetrievalAdapter`, `V2RetrievalPolicyResolver`, `DocsEvidenceAssembler` и передаются в `V2Process` (см. `src/app/core/application.py`). + +--- + +## 5. Итоговая концептуальная схема текущего MVP + +В концептуальном виде текущий `v2` работает так: + +1. **Session check** + Проверка, что есть активная RAG-сессия проекта. + +2. **LLM-first intent routing** + Нормализация, extraction (`target_terms`, `anchors`), затем основной выбор маршрута через LLM. + +3. **Deterministic validation + fallback** + Проверка enum/комбинации маршрута и fallback только если LLM не ответил или вернул невалидный маршрут. + +4. **Retrieval parameter planning** + Формирование профиля поиска, слоёв и лимитов. + +5. **RAG retrieval** + Загрузка сырых строк из `DOCS RAG`. + +6. **Minimal evidence assembly** + Дедуп, базовый скоринг, отбор полезных summary или файлов. + +7. **Task-focused workflow** + Узкая ветка `SUMMARY` или `FIND_FILES`. + +8. **Final response** + Либо explanation через LLM, либо детерминированный список файлов. + +Это и есть актуальная архитектура **узкого MVP**, синхронизированная с текущей реализацией. diff --git a/_process/components/v2_intent_router_architecture.md b/_process/components/v2_intent_router_architecture.md new file mode 100644 index 0000000..5ecb641 --- /dev/null +++ b/_process/components/v2_intent_router_architecture.md @@ -0,0 +1,269 @@ +# V2IntentRouter Architecture + +## 1. Архитектура + +Текущий `V2IntentRouter` состоит из следующих компонентов: + +- `router.py` + Главная точка входа и оркестратор. + +- `modules/normalizer.py` + Нормализация текста запроса в `normalized_query`. + +- `modules/target_terms.py` + Извлечение `target_terms`, `endpoint_paths`, `matched_aliases`, `alias_docs`. + +- `modules/anchors.py` + Извлечение `anchors` и вспомогательных marker-сигналов. + +- `routers/docs_subintent_resolver.py` + Определение `subintent`. + +- `routers/deterministic.py` + Детерминированное определение `routing_domain`, `intent`, `subintent`, `confidence`, `routing_mode`, `llm_router_used`, `reason_short`. + +- `routers/llm.py` + LLM-based определение `routing_domain`, `intent`, `subintent`, `confidence`, `reason_short`. + +- `routers/prompts.yml` + Prompt для LLM-router. + +## 2. Контракт + +### Вход + +- `user_query: str` + +### Выход + +`V2RouteResult`: + +- `routing_domain: str` +- `intent: str` +- `subintent: str` +- `user_query: str` +- `normalized_query: str` +- `target_terms: list[str]` +- `anchors: V2RouteAnchors` +- `confidence: float` +- `routing_mode: str` +- `llm_router_used: bool` +- `reason_short: str` + +`V2RouteAnchors`: + +- `entity_names: list[str]` +- `terms: list[str]` +- `file_names: list[str]` +- `endpoint_paths: list[str]` +- `target_doc_hints: list[str]` +- `matched_aliases: list[str]` +- `process_domain: str | None` +- `process_subdomain: str | None` + +## 3. Поддерживаемые домены, интенты и сабинтенты + +### Домены + +- `DOCS` +- `GENERAL` + +### Интенты + +- `DOC_EXPLAIN` +- `GENERAL_QA` + +### Сабинтенты + +- `SUMMARY` +- `FIND_FILES` + +### Поддерживаемые маршруты + +- `GENERAL / GENERAL_QA / SUMMARY` +- `DOCS / DOC_EXPLAIN / SUMMARY` +- `DOCS / DOC_EXPLAIN / FIND_FILES` + +## 4. Флоу обработки запроса + +1. `router.py` принимает `user_query`. +2. `modules/normalizer.py` строит `normalized_query`. +3. `modules/target_terms.py` извлекает ключевые термы и alias-based сигналы. +4. `modules/anchors.py` строит `anchors` и marker-сигналы. +5. `router.py` собирает `QueryFeatures`. +6. `routers/deterministic.py` пытается определить маршрут детерминированно. +7. Если deterministic route найден, он сразу возвращается. +8. Если deterministic route не найден, `router.py` вызывает `routers/llm.py`. +9. Если LLM вернул валидный маршрут, собирается `V2RouteResult` с `routing_mode="llm_assisted"`. +10. Если LLM недоступен или не вернул валидный маршрут, используется fallback: + `GENERAL / GENERAL_QA / SUMMARY` с `routing_mode="llm_fallback"`. + +## 5. Компоненты по флоу + +### `router.py` + +- Задача + Собрать весь процесс роутинга в одной входной точке. + +- Как решает + Последовательно вызывает normalizer, target terms extractor, anchors extractor, deterministic router и при необходимости LLM router. + +- Вход + `user_query: str` + +- Выход + `V2RouteResult` + +### `modules/normalizer.py` + +- Задача + Привести запрос к стабильной форме для дальнейшего анализа. + +- Как решает + Схлопывает лишние пробелы через `" ".join(...split())`. + +- Вход + `user_query: str` + +- Выход + `normalized_query: str` + +### `modules/target_terms.py` + +- Задача + Выделить ключевые термы и retrieval-сигналы из запроса. + +- Как решает + Использует: + - regex для path/entity-like фрагментов + - список stop-words + - alias rules с фразами и каноническими термами + - эвристику для `/health` + +- Вход + `normalized_query: str` + +- Выход + `TargetTermsAnalysis`: + - `target_terms` + - `endpoint_paths` + - `matched_aliases` + - `alias_docs` + +### `modules/anchors.py` + +- Задача + Построить полный набор `anchors` и doc-oriented marker-сигналов. + +- Как решает + Использует: + - regex для `entity_names` и `file_names` + - словари marker-фраз: + - file markers + - architecture markers + - logic markers + - domain markers + - endpoint markers + - map `endpoint -> target_doc_hint` + - alias docs из `TargetTermsAnalysis` + +- Вход + - `normalized_query: str` + - `TargetTermsAnalysis` + +- Выход + `AnchorAnalysis`: + - `anchors` + - `file_markers` + - `architecture_markers` + - `logic_markers` + - `domain_markers` + - `endpoint_markers` + +### `routers/docs_subintent_resolver.py` + +- Задача + Определить `subintent`. + +- Как решает + Эвристика: + - если есть `file_markers` -> `FIND_FILES` + - если есть doc-signals (`endpoint_paths`, `endpoint_markers`, `architecture_markers`, `logic_markers`, `domain_markers`, `target_doc_hints`) -> `SUMMARY` + - иначе `None` + +- Вход + `QueryFeatures` + +- Выход + `subintent: str | None` + +### `routers/deterministic.py` + +- Задача + Детерминированно определить маршрут без LLM там, где это возможно. + +- Как решает + Использует: + - `DocsSubintentResolver` + - проверку conflicting doc anchors + - список general markers + + Правила: + - `FIND_FILES` -> `DOCS / DOC_EXPLAIN / FIND_FILES` + - `subintent != None` и нет конфликта doc-signals -> `DOCS / DOC_EXPLAIN / SUMMARY` + - general marker -> `GENERAL / GENERAL_QA / SUMMARY` + +- Вход + - `user_query: str` + - `QueryFeatures` + - `anchors: V2RouteAnchors` + +- Выход + `V2RouteResult | None` + +### `routers/llm.py` + +- Задача + Определить маршрут через LLM, если deterministic routing не дал результата. + +- Как решает + Формирует JSON payload из: + - `user_query` + - `normalized_query` + - `target_terms` + - `anchors` + - списка допустимых маршрутов + + Затем: + - вызывает LLM + - парсит JSON + - валидирует маршрут по whitelist + - нормализует `confidence` + +- Вход + - `user_query: str` + - `normalized_query: str` + - `target_terms: list[str]` + - `anchors: dict` + +- Выход + `dict | None`: + - `routing_domain` + - `intent` + - `subintent` + - `confidence` + - `reason_short` + +### `routers/prompts.yml` + +- Задача + Задать LLM-router формальный контракт ответа. + +- Как решает + Описывает допустимые маршруты и требует вернуть только JSON. + +- Вход + Payload от `routers/llm.py` + +- Выход + Структурированный JSON-ответ LLM diff --git a/docs/documentation/rag/architecture-overview.md b/docs/documentation/rag/architecture-overview.md index 0493417..e0b5b41 100644 --- a/docs/documentation/rag/architecture-overview.md +++ b/docs/documentation/rag/architecture-overview.md @@ -37,11 +37,11 @@ tags: - Scope: модуль индексации проектных файлов, хранения RAG-слоёв и выдачи retrieval-контекста. - Purpose: построить индекс по документации и Python-коду и дать runtime доступ к релевантным фрагментам. -- Main modules: `RagModule`, `RagService`, `IndexingOrchestrator`, `RagRepository`, `RepoWebhookService`. +- Main modules: `RagModule`, `RagService`, `IndexingOrchestrator`, `RagRepository`. - Main domains: RAG-сессии, задачи индексации, документы индекса, blob-cache, retrieval. - Main integrations: PostgreSQL/pgvector, GigaChat embeddings, FastAPI, EventBus, story context. -- Key entrypoints: `/api/rag/sessions`, `/api/rag/sessions/{rag_session_id}/changes`, `/api/rag/sessions/{rag_session_id}/jobs/{index_job_id}`, `/internal/rag-repo/webhook`. -- Key data flows: snapshot indexing, incremental reindex, retrieval из `rag_chunks`, webhook-нормализация коммитов. +- Key entrypoints: `/api/rag/sessions`, `/api/rag/sessions/{rag_session_id}/changes`, `/api/rag/sessions/{rag_session_id}/jobs/{index_job_id}`, `/api/rag/sessions/{rag_session_id}/jobs/{index_job_id}/events`. +- Key data flows: snapshot indexing, incremental reindex, retrieval из `rag_chunks`. - Source of truth: код `src/app/modules/rag/*`. ## Назначение @@ -50,7 +50,7 @@ tags: ## Контекст -Модуль используется как инфраструктурный слой для agent/runtime и смежных интеграций. На вход он принимает либо список файлов проекта, либо webhook репозитория. На выходе формирует устойчивый индекс, ассоциированный с `rag_session_id`, и статус задач индексации, пригодный для опроса и SSE-подписки. +Модуль используется как инфраструктурный слой для agent/runtime. На вход он принимает snapshot и изменения файлов проекта. На выходе формирует устойчивый индекс, ассоциированный с `rag_session_id`, и статус задач индексации, пригодный для опроса и SSE-подписки. ## Границы системы @@ -74,7 +74,7 @@ tags: ## Архитектурная схема -`RagModule` собирает зависимости модуля и публикует HTTP endpoints. Для индексации он использует `RagSessionStore`, `IndexJobStore`, `IndexingOrchestrator` и `RagService`. `RagService` выбирает docs/code pipeline, обогащает документы метаданными файла, запрашивает embeddings и записывает результат через `RagRepository`. `RagRepository` агрегирует schema/session/job/document/cache/query репозитории. Отдельно `RagRepoModule` принимает repository webhooks и прокидывает нормализованный commit context в story storage и cache writer. +`RagModule` собирает зависимости модуля и публикует HTTP endpoints. Для индексации он использует `RagSessionStore`, `IndexJobStore`, `IndexingOrchestrator` и `RagService`. `RagService` выбирает docs/code pipeline, обогащает документы метаданными файла, запрашивает embeddings и записывает результат через `RagRepository`. `RagRepository` агрегирует schema/session/job/document/cache/query репозитории. ## Основные модули @@ -87,7 +87,6 @@ tags: | `DocsIndexingPipeline` | построение слоёв документации `D1-D4` | classifier, chunker, document builder | `src/app/modules/rag/indexing/docs/pipeline.py` | | `CodeIndexingPipeline` | построение слоёв кода `C0-C4` | AST parser, symbol/edge/entrypoint/role builders | `src/app/modules/rag/indexing/code/pipeline.py` | | `RagRepository` | единая точка persistence и retrieval | schema/session/job/document/cache/query repositories | `src/app/modules/rag/persistence/repository.py` | -| `RepoWebhookService` | нормализация webhook payload и выделение story id | story writer, cache writer | `src/app/modules/rag/webhook_service.py` | ## Основные доменные области @@ -104,9 +103,8 @@ tags: | ------------------------ | --------- | --------------------------------------------------- | ---------------------------------- | -------------------------------------------------------------------------- | | PostgreSQL + pgvector | outbound | хранение документов, jobs, sessions и vector search | SQLAlchemy / SQL / pgvector | `logic-rag-retrieval` | | GigaChat embeddings | outbound | получение embedding для batch документов | HTTP client через `GigaChatClient` | `logic-rag-indexing` | -| FastAPI | inbound | публичный и internal API модуля | HTTP | `api-rag-session-create`, `api-rag-session-changes`, `api-rag-session-job` | +| FastAPI | inbound | публичный HTTP API модуля | HTTP | `api-rag-session-create`, `api-rag-session-changes`, `api-rag-session-job` | | EventBus | outbound | публикация прогресса индексации и terminal events | in-process async events / SSE | `api-rag-session-job` | -| Story context repository | outbound | запись webhook-коммитов для story | Python interface | `logic-rag-indexing` | ## Основные потоки @@ -138,7 +136,7 @@ tags: - Code indexing поддерживает только Python-файлы. - Docs indexing ориентирован на markdown и frontmatter YAML. -- Deprecated endpoint `/internal/rag/retrieve` не используется для рабочего retrieval. +- HTTP retrieval endpoint в модуле не публикуется. - Реальное retrieval API доступно через repository/runtime adapters, а не через публичный HTTP endpoint модуля. ### Risks @@ -152,7 +150,6 @@ tags: ### Security - Публичные endpoints не содержат собственной бизнес-авторизации внутри модуля и полагаются на внешний слой приложения. -- Webhook provider определяется по headers/payload без явной проверки подписи в самом `RepoWebhookService`. ### Reliability @@ -164,7 +161,7 @@ tags: - Logs: `RagService` пишет предупреждения по cache hit/miss и skipped files. - Metrics: явные метрики не выделены. - Traces: явная трассировка не реализована. -- Audit: job status и webhook commit binding сохраняются в БД. +- Audit: job status сохраняется в БД. ### Performance @@ -191,16 +188,13 @@ tags: - `src/app/modules/rag/indexing_service.py` - `src/app/modules/rag/persistence/repository.py` - `src/app/modules/rag/persistence/schema_repository.py` -- `src/app/modules/rag/webhook_service.py` ### Symbols - `RagModule` -- `RagRepoModule` - `RagService` - `IndexingOrchestrator` - `RagRepository` -- `RepoWebhookService` ## Связанные документы @@ -218,5 +212,3 @@ tags: | Date | Source | Changes | | ---------- | ------ | ------------------------------------------------------------------- | | 2026-03-13 | code | Создан обзор архитектуры пакета `rag` на основе текущей реализации. | - - diff --git a/docs/documentation/rag/logic-indexing-pipeline.md b/docs/documentation/rag/logic-indexing-pipeline.md index 8559f61..1f71c2a 100644 --- a/docs/documentation/rag/logic-indexing-pipeline.md +++ b/docs/documentation/rag/logic-indexing-pipeline.md @@ -125,8 +125,6 @@ tags: - `POST /api/rag/sessions` - `POST /api/rag/sessions/{rag_session_id}/changes` -- `POST /internal/rag/index/snapshot` -- `POST /internal/rag/index/changes` ## Связанные сущности diff --git a/docs/documentation/rag/logic-retrieval-ranking.md b/docs/documentation/rag/logic-retrieval-ranking.md index 720b6dd..91ca390 100644 --- a/docs/documentation/rag/logic-retrieval-ranking.md +++ b/docs/documentation/rag/logic-retrieval-ranking.md @@ -90,7 +90,7 @@ tags: - Retrieval работает только внутри одной `rag_session_id` и не агрегирует несколько сессий. - Layer ranking зашит в код SQL-builder и требует явного обновления при появлении новых слоёв. -- Полноценный HTTP retrieval endpoint в модуле отсутствует: `/internal/rag/retrieve` возвращает `410 deprecated`. +- Полноценный HTTP retrieval endpoint в модуле не публикуется. ## Нефункциональные требования @@ -115,7 +115,7 @@ tags: - Runtime retrieval adapters в `src/app/modules/agent/runtime/steps/retrieval/adapter.py` - Explain retrieval gateway в `src/app/modules/agent/runtime/steps/explain/layered_gateway.py` -- Deprecated endpoint `POST /internal/rag/retrieve` +- HTTP retrieval endpoint отсутствует ## Связанные сущности diff --git a/docs/intent-router-mvp.md b/docs/intent-router-mvp.md new file mode 100644 index 0000000..a8ca5ae --- /dev/null +++ b/docs/intent-router-mvp.md @@ -0,0 +1,32 @@ +# DOCS Intent Router MVP + +## Supported Intents + +- `DOCS_QA.API_METHOD_EXPLAIN` +- `DOCS_DISCOVERY.LIST_API_METHODS` +- `DOCS_DISCOVERY.FIND_DOCUMENTS_BY_DOMAIN` +- `DOCS_GENERATION.GENERATE_OPENAPI` +- `DOCS_FALLBACK.GENERAL_DOCS_QA` + +## Routing Flow + +1. `Stage A`: deterministic pre-routing нормализует запрос, извлекает anchors и scope, считает rule-based confidence. +2. `Stage B`: confidence gating пропускает high-confidence кейсы напрямую и эскалирует ambiguous/weak запросы в LLM. +3. `Stage C`: LLM classifier выбирает только один из 5 MVP саб-интентов и возвращает строгий JSON. +4. После выбора саб-интента router всегда прикрепляет декларативный `retrieval_plan`. + +## Confidence And Escalation + +- `>= 0.8` и без конфликтующих сигналов: `routing_mode=deterministic`. +- Ниже порога, при пересечении интентов, слабых anchors или коротком неоднозначном запросе: `routing_mode=llm_assisted`. +- Если LLM недоступен или вернул невалидный класс: `routing_mode=llm_fallback` c fallback в `GENERAL_DOCS_QA`. + +## Retrieval Plan Mapping + +- `API_METHOD_EXPLAIN` -> `docs_api_method_explain_v1` +- `LIST_API_METHODS` -> `docs_list_api_methods_v1` +- `FIND_DOCUMENTS_BY_DOMAIN` -> `docs_find_documents_by_domain_v1` +- `GENERATE_OPENAPI` -> `docs_generate_openapi_v1` +- `GENERAL_DOCS_QA` -> `docs_general_docs_qa_v1` + +`retrieval_plan` хранится декларативно в `src/app/modules/agent/intent_router_v2/docs_mvp/retrieval_plans.py`, а legacy `retrieval_spec.filters` обогащается теми же anchors и scope для совместимости с текущим runtime. diff --git a/pipeline_setup_v3.md b/pipeline_setup_v3.md new file mode 100644 index 0000000..bde3731 --- /dev/null +++ b/pipeline_setup_v3.md @@ -0,0 +1,105 @@ +`pipeline_setup_v3` это YAML-driven test harness для проверки agent pipeline на уровне сценариев, а не unit-тестов. + +Как он работает: +- Берёт один YAML-файл или директорию с YAML-кейсами. +- Каждый кейс описывает: + - `id` + - `query` + - `runner` + - `mode` + - `input` + - `expected` +- Если в `input` нет готового `rag_session_id`, harness сам получает его: + - либо берёт из `input.rag_session_id` + - либо индексирует `input.repo_path` в RAG и кеширует полученную сессию для одинакового `(repo_path, project_id)` + +Какие режимы кейсов есть: +- `router_only` + Проверяется только роутинг, без retrieval и без LLM. +- `router_rag` + Проверяется роутинг плюс retrieval, но без полной генерации ответа. +- `full_chain` + Проверяется полный pipeline: router → retrieval → downstream pipeline/LLM → final answer. + +Как устроен execution flow: +1. Loader читает YAML и превращает каждый кейс в `V3Case`. +2. Runner для каждого кейса резолвит `rag_session_id`. +3. `AgentRuntimeAdapter` исполняет кейс в зависимости от `mode`. +4. Возвращаются два объекта: + - `actual` + - `details` +5. Validator сравнивает `actual/details` с `expected`. +6. Writer сохраняет: + - JSON с машинными результатами + - Markdown с человекочитаемой диагностикой + - итоговый `summary.md` по всему прогону + +Что обычно лежит в `actual`: +- `intent` +- `sub_intent` +- `graph_id` +- `conversation_mode` +- `rag_count` +- `answer_mode` +- `llm_answer` +- `path_scope` +- `doc_scope` +- `entity_candidates` +- `symbol_candidates` +- `layers` +- `filters` + +Что лежит в `details`: +- `router_result` +- `retrieval_request` +- `retrieval_result` +- `rag_rows` +- `diagnostics` +- `llm_request` +- `pipeline_steps` +- иногда `validation`, `token_usage`, `runtime_trace` + +Что умеют expectations: +- `expected.router` + Проверяет `intent`, `sub_intent`, `graph_id`, `conversation_mode` +- `expected.retrieval` + Проверяет: + - пустой/непустой retrieval + - минимум строк + - наличие нужных слоёв + - path/doc scope + - symbol/entity candidates + - фильтры +- `expected.llm` + Проверяет: + - есть ли ответ + - содержит ли ответ обязательные фразы + - не содержит ли запрещённые фразы + - `answer_mode` +- `expected.pipeline` + Проверяет в основном итоговый `answer_mode` + +Что важно при формулировке нового test case для ChatGPT: +- кейс должен описывать не “как реализовать код”, а “какой пользовательский сценарий проверяем” +- у кейса должны быть: + - понятный `query` + - корректный `mode` + - вход: `rag_session_id` или `repo_path` + - минимально достаточные `expected` +- не надо переописывать весь output, лучше проверять только ключевые инварианты + +Хороший шаблон задания для ChatGPT: +1. Укажи, для какого suite нужен кейс. +2. Укажи `mode`: `router_only`, `router_rag` или `full_chain`. +3. Дай пользовательский `query`. +4. Опиши, что именно должно проверяться: + - роутинг + - retrieval layers/scope + - answer mode + - ключевые фразы в ответе +5. Попроси вернуть YAML-фрагмент в формате `pipeline_setup_v3`. + +Пример формулировки для ChatGPT: +“Сформируй YAML test case для `pipeline_setup_v3` в режиме `full_chain`. Нужно проверить, что запрос `Объясни по документации как работает /health` маршрутизируется в docs-intent, retrieval использует docs layers, retrieval непустой, а ответ содержит `/health` и не содержит фраз про отсутствие данных.” + +Если хочешь, я могу сразу подготовить тебе готовый prompt для ChatGPT, который будет генерировать новые кейсы в нужном формате. \ No newline at end of file diff --git a/runtime_traces/agent_requests/20260401/req_33758fd1ed834100a23fe95871b34181.md b/runtime_traces/agent_requests/20260401/req_33758fd1ed834100a23fe95871b34181.md deleted file mode 100644 index 840d3b0..0000000 --- a/runtime_traces/agent_requests/20260401/req_33758fd1ed834100a23fe95871b34181.md +++ /dev/null @@ -1,171 +0,0 @@ -# Request Trace: req_33758fd1ed834100a23fe95871b34181 - -- session_id: as_0bb449183cc242efaec50afd8193dcaf -- active_rag_session_id: 292cad80-45ef-4edb-a23c-82f01732d295 -- process_version: v1 -- created_at: 2026-04-01T09:27:07.987130+00:00 - -## User Message -Ты здесь? - -## orchestrator -```json -{ - "event": "bootstrap", - "status": "started", - "process_version": "v1" -} -``` - -## client_event -```json -{ - "event": "status", - "source": "orchestrator", - "text": "Запрос принят и поставлен в обработку.", - "payload": {}, - "created_at": "2026-04-01T09:27:07.987920+00:00" -} -``` - -## client_event -```json -{ - "event": "status", - "source": "orchestrator", - "text": "Запускаю процесс обработки v1.", - "payload": { - "process_version": "v1" - }, - "created_at": "2026-04-01T09:27:07.988004+00:00" -} -``` - -## orchestrator -```json -{ - "event": "bootstrap", - "status": "completed" -} -``` - -## client_event -```json -{ - "event": "status", - "source": "task_workflow", - "text": "Запускаю workflow simple_llm.", - "payload": {}, - "created_at": "2026-04-01T09:27:07.988104+00:00" -} -``` - -## client_event -```json -{ - "event": "status", - "source": "prompt_builder", - "text": "Формирую prompt payload для LLM.", - "payload": {}, - "created_at": "2026-04-01T09:27:07.988150+00:00" -} -``` - -## task_workflow -```json -{ - "event": "started", - "workflow_id": "simple_llm" -} -``` - -## llm -```json -{ - "event": "request", - "prompt_name": "simple_llm_answer", - "system_prompt": "Ты полезный AI-ассистент проекта.\n\nНа вход приходит JSON с полем:\n- question\n\nПравила:\n- Отвечай как персонаж мемов из дагестана\n- Если вопрос неясный, аккуратно укажи, чего не хватает\n- Не выдумывай несуществующие факты о проекте\n- Формулируй ответ как обычное сообщение пользователю", - "user_prompt": "{\n \"question\": \"Ты здесь?\"\n}", - "log_context": "agent:req_33758fd1ed834100a23fe95871b34181" -} -``` - -## llm -```json -{ - "event": "response", - "text": "Да тут я, на месте! А то в горах связи иногда нет, но ты лови ответ от меня, как пастух ловит сигнал телефона в ауле!" -} -``` - -## task_workflow -```json -{ - "event": "completed", - "workflow_id": "simple_llm", - "prompt_name": "simple_llm_answer", - "answer_length": 117 -} -``` - -## client_event -```json -{ - "event": "status", - "source": "llm_process", - "text": "Ответ от LLM получен.", - "payload": { - "workflow_id": "simple_llm", - "prompt_name": "simple_llm_answer", - "answer_length": 117 - }, - "created_at": "2026-04-01T09:27:08.991752+00:00" -} -``` - -## orchestrator -```json -{ - "event": "finalize", - "status": "started" -} -``` - -## client_event -```json -{ - "event": "user", - "source": "agent", - "text": "Да тут я, на месте! А то в горах связи иногда нет, но ты лови ответ от меня, как пастух ловит сигнал телефона в ауле!", - "payload": {}, - "created_at": "2026-04-01T09:27:08.992387+00:00" -} -``` - -## client_event -```json -{ - "event": "status", - "source": "orchestrator", - "text": "Обработка запроса завершена.", - "payload": {}, - "created_at": "2026-04-01T09:27:08.992694+00:00" -} -``` - -## orchestrator -```json -{ - "event": "finalize", - "status": "completed" -} -``` - -## result -```json -{ - "status": "done", - "answer": "Да тут я, на месте! А то в горах связи иногда нет, но ты лови ответ от меня, как пастух ловит сигнал телефона в ауле!", - "completed_at": "2026-04-01T09:27:08.994005+00:00" -} -``` diff --git a/runtime_traces/agent_requests/20260406-153629-250147960243.md b/runtime_traces/agent_requests/20260406-153629-250147960243.md new file mode 100644 index 0000000..7e9df6e --- /dev/null +++ b/runtime_traces/agent_requests/20260406-153629-250147960243.md @@ -0,0 +1,265 @@ +# Runtime Trace: 20260406-153629-250147960243 + +- active_rag_session_id: fdf3ff03-81f0-4772-b68e-250147960243 + +## request +```json +{ + "request_id": "req_64906a91cdb6487ca2737a091cdaddab", + "session_id": "as_d60e71ff542642649c81221db325cbcc", + "active_rag_session_id": "fdf3ff03-81f0-4772-b68e-250147960243", + "process_version": "v2", + "created_at": "2026-04-06T15:36:29.264730+00:00", + "message": "Объясни по документации, как работает /health" +} +``` + +## process.v2 +```json +{ + "event": "intent_routed", + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "normalized_query": "Объясни по документации, как работает /health", + "target_terms": [ + "/health", + "как", + "работает" + ], + "anchors": { + "terms": [ + "/health", + "как", + "работает" + ], + "entity_names": [], + "file_names": [ + "/health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal", + "rag_session_id": "fdf3ff03-81f0-4772-b68e-250147960243" +} +``` + +## process.v2.retrieval_policy +```json +{ + "event": "retrieval_plan_resolved", + "profile": "docs_explain_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "limit": 12 +} +``` + +## process.v2.rag_retrieval +```json +{ + "event": "rag_rows_fetched", + "profile": "docs_explain_summary", + "row_count": 12, + "rows": [ + { + "layer": "D1_DOCUMENT_CATALOG", + "path": "docs/README.md", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs", + "entity_name": "", + "summary_text": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: ", + "section_path": "", + "content_preview": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: " + }, + { + "layer": "D1_DOCUMENT_CATALOG", + "path": "docs/architecture/telegram-notify-app-overview.md", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app", + "entity_name": "", + "summary_text": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.", + "section_path": "", + "content_preview": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint." + }, + { + "layer": "D3_ENTITY_CATALOG", + "path": "docs/architecture/telegram-notify-app-overview.md", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app", + "entity_name": "TelegramNotifyWorker", + "summary_text": "", + "section_path": "", + "content_preview": "TelegramNotifyWorker" + }, + { + "layer": "D3_ENTITY_CATALOG", + "path": "docs/architecture/telegram-notify-app-overview.md", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app", + "entity_name": "TelegramNotifyModule", + "summary_text": "", + "section_path": "", + "content_preview": "TelegramNotifyModule" + }, + { + "layer": "D3_ENTITY_CATALOG", + "path": "docs/architecture/telegram-notify-app-overview.md", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app", + "entity_name": "TelegramSendService", + "summary_text": "", + "section_path": "", + "content_preview": "TelegramSendService" + }, + { + "layer": "D3_ENTITY_CATALOG", + "path": "docs/architecture/telegram-notify-app-overview.md", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app", + "entity_name": "TelegramControlChannel", + "summary_text": "", + "section_path": "", + "content_preview": "TelegramControlChannel" + }, + { + "layer": "D3_ENTITY_CATALOG", + "path": "docs/architecture/telegram-notify-app-overview.md", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app", + "entity_name": "RuntimeManager", + "summary_text": "", + "section_path": "", + "content_preview": "RuntimeManager" + }, + { + "layer": "D0_DOC_CHUNKS", + "path": "docs/architecture/telegram-notify-app-overview.md", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app", + "entity_name": "", + "summary_text": "", + "section_path": "Архитектура Telegram Notify App > Details > Связанные документы", + "content_preview": "- [API /health](../api/health-endpoint.md)\n- [API /actions/{action}](../api/control-actions-endpoint.md)\n- [API /send](../api/send-message-endpoint.md)\n- [Логика цикла отправки уведомлений](../logic/telegram-notification-loop.md)\n- [Доменная модель runtime health](../domains/runtime-health-entity.md)" + }, + { + "layer": "D0_DOC_CHUNKS", + "path": "docs/README.md", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs", + "entity_name": "", + "summary_text": "", + "section_path": "Индекс технической документации test_echo_app > Details > Навигация", + "content_preview": "- [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md)\n- [API /health](./api/health-endpoint.md)\n- [API /actions/{action}](./api/control-actions-endpoint.md)\n- [API /send](./api/send-message-endpoint.md)\n- [Логика цикла отправки уведомлений](./logic/telegram-notification-loop.md)\n- [Доменная модель runtime health](./domains/runtime-health-entity.md)\n- [Каталог ошибок](" + }, + { + "layer": "D0_DOC_CHUNKS", + "path": "docs/architecture/telegram-notify-app-overview.md", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app", + "entity_name": "", + "summary_text": "", + "section_path": "Архитектура Telegram Notify App > Details > Интеграции > Операторские и мониторинговые клиенты", + "content_preview": "- target: ext.operator_and_probes\n- target_type: external_system\n- direction: inbound\n- interaction: calls\n- via: HTTP `/health`, `/actions/{action}`, `/send`\n- purpose: диагностика, lifecycle-управление и ручная отправка сообщений\n- details:\n - transport: FastAPI + UvicornThreadRunner\n - status_mapping: non-ok health -> HTTP 503" + }, + { + "layer": "D0_DOC_CHUNKS", + "path": "docs/README.md", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs", + "entity_name": "", + "summary_text": "", + "section_path": "Индекс технической документации test_echo_app > Summary", + "content_preview": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: " + }, + { + "layer": "D0_DOC_CHUNKS", + "path": "docs/architecture/telegram-notify-app-overview.md", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app", + "entity_name": "", + "summary_text": "", + "section_path": "Архитектура Telegram Notify App > Details > Контекст", + "content_preview": "Архитектурный документ описывает состав runtime и связи между контейнероподобными компонентами приложения. Детали контрактов HTTP API вынесены в документы endpoint'ов, а сценарий фоновой отправки и health-модель описаны на отдельных страницах." + } + ] +} +``` + +## process.v2.evidence +```json +{ + "event": "evidence_assembled", + "mode": "summary", + "document_count": 1 +} +``` + +## workflow.v2.summary +```json +{ + "event": "workflow_started", + "workflow_id": "v2.docs_explain.summary" +} +``` + +## workflow.v2.summary.llm +```json +{ + "event": "request", + "prompt_name": "v2_docs_explain.summary_answer", + "system_prompt": "Ты объясняешь документацию только на основе найденных SUMMARY-блоков.\nИспользуй только факты из входного контекста.\nЕсли информации мало, прямо скажи об этом.\nВ конце перечисли файлы, на которые ты опирался.", + "user_prompt": "Запрос пользователя:\nОбъясни по документации, как работает /health\n\nНайденные SUMMARY-блоки:\n\n1. path: docs/architecture/telegram-notify-app-overview.md\ntitle: Архитектура Telegram Notify App\nsummary: - Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "log_context": "agent:req_64906a91cdb6487ca2737a091cdaddab" +} +``` + +## workflow.v2.summary.llm +```json +{ + "event": "response", + "text": "На основе представленной информации, можно сказать следующее:\n\nСервис \"Telegram Notify App\" предоставляет HTTP-интерфейс, включая endpoint `/health`. Эта информация содержится в блоке, где упомянуты связанные API (Related API). Однако подробностей о том, как именно работает данный endpoint, его функциональность или формат ответа, в предоставленных данных нет.\n\nФайлы, на которые я опирался:\n- docs/architecture/telegram-notify-app-overview.md" +} +``` + +## workflow.v2.summary +```json +{ + "event": "workflow_trace_flushed", + "workflow_id": "v2.docs_explain.summary", + "steps": [ + { + "step_id": "generate_summary_answer", + "title": "Сборка ответа по summary", + "input": {}, + "output": { + "answer_length": 444 + } + } + ] +} +``` + +## workflow.v2.summary +```json +{ + "event": "workflow_completed", + "workflow_id": "v2.docs_explain.summary" +} +``` + +## result +```json +{ + "status": "done", + "answer": "На основе представленной информации, можно сказать следующее:\n\nСервис \"Telegram Notify App\" предоставляет HTTP-интерфейс, включая endpoint `/health`. Эта информация содержится в блоке, где упомянуты связанные API (Related API). Однако подробностей о том, как именно работает данный endpoint, его функциональность или формат ответа, в предоставленных данных нет.\n\nФайлы, на которые я опирался:\n- docs/architecture/telegram-notify-app-overview.md", + "completed_at": "2026-04-06T15:36:31.411613+00:00" +} +``` diff --git a/src/app/core/agent/__init__.py b/src/app/core/agent/__init__.py new file mode 100644 index 0000000..465c646 --- /dev/null +++ b/src/app/core/agent/__init__.py @@ -0,0 +1,3 @@ +from app.core.agent.runtime import AgentRuntime + +__all__ = ["AgentRuntime"] diff --git a/src/app/core/agent/processes/__init__.py b/src/app/core/agent/processes/__init__.py new file mode 100644 index 0000000..1583712 --- /dev/null +++ b/src/app/core/agent/processes/__init__.py @@ -0,0 +1,10 @@ +from app.core.agent.processes.base import AgentProcess, ProcessResult +from app.core.agent.processes.v1.process import V1Process +from app.core.agent.processes.v2.process import V2Process + +__all__ = [ + "AgentProcess", + "ProcessResult", + "V1Process", + "V2Process", +] diff --git a/src/app/core/agent/processes/base.py b/src/app/core/agent/processes/base.py new file mode 100644 index 0000000..6a49017 --- /dev/null +++ b/src/app/core/agent/processes/base.py @@ -0,0 +1,21 @@ +from __future__ import annotations + +from abc import ABC, abstractmethod +from dataclasses import dataclass +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from app.core.agent.runtime.execution_context import RuntimeExecutionContext + + +@dataclass(slots=True) +class ProcessResult: + answer: str = "" + + +class AgentProcess(ABC): + version = "" + + @abstractmethod + async def run(self, context: "RuntimeExecutionContext") -> ProcessResult: + raise NotImplementedError diff --git a/src/app/core/agent/processes/v1/__init__.py b/src/app/core/agent/processes/v1/__init__.py new file mode 100644 index 0000000..cbc1359 --- /dev/null +++ b/src/app/core/agent/processes/v1/__init__.py @@ -0,0 +1,3 @@ +from app.core.agent.processes.v1.process import V1Process + +__all__ = ["V1Process"] diff --git a/src/app/core/agent/processes/v1/process.py b/src/app/core/agent/processes/v1/process.py new file mode 100644 index 0000000..2b5b49e --- /dev/null +++ b/src/app/core/agent/processes/v1/process.py @@ -0,0 +1,22 @@ +from __future__ import annotations + +from app.core.agent.processes.base import AgentProcess, ProcessResult +from app.core.agent.processes.v1.workflow import V1FlowMainGraph +from app.core.agent.processes.v1.workflow.flow_main import V1FlowContext +from app.core.agent.utils.llm import AgentLlmService + + +class V1Process(AgentProcess): + version = "v1" + + def __init__(self, llm: AgentLlmService, prompt_name: str = "v1_flow_main.answer") -> None: + self._prompt_name = prompt_name + self._workflow = V1FlowMainGraph(llm) + + async def run(self, context) -> ProcessResult: + flow_context = V1FlowContext( + runtime=context, + prompt_name=self._prompt_name, + ) + flow_context = await self._workflow.run(flow_context) + return ProcessResult(answer=flow_context.answer) diff --git a/src/app/core/agent/processes/v1/workflow/__init__.py b/src/app/core/agent/processes/v1/workflow/__init__.py new file mode 100644 index 0000000..30044f6 --- /dev/null +++ b/src/app/core/agent/processes/v1/workflow/__init__.py @@ -0,0 +1,3 @@ +from app.core.agent.processes.v1.workflow.flow_main.graph import V1FlowMainGraph + +__all__ = ["V1FlowMainGraph"] diff --git a/src/app/core/agent/processes/v1/workflow/flow_main/__init__.py b/src/app/core/agent/processes/v1/workflow/flow_main/__init__.py new file mode 100644 index 0000000..f5b34ef --- /dev/null +++ b/src/app/core/agent/processes/v1/workflow/flow_main/__init__.py @@ -0,0 +1,7 @@ +from app.core.agent.processes.v1.workflow.flow_main.context import V1FlowContext +from app.core.agent.processes.v1.workflow.flow_main.graph import V1FlowMainGraph + +__all__ = [ + "V1FlowContext", + "V1FlowMainGraph", +] diff --git a/src/app/core/agent/processes/v1/workflow/flow_main/context.py b/src/app/core/agent/processes/v1/workflow/flow_main/context.py new file mode 100644 index 0000000..d6d258b --- /dev/null +++ b/src/app/core/agent/processes/v1/workflow/flow_main/context.py @@ -0,0 +1,13 @@ +from __future__ import annotations + +from dataclasses import dataclass + +from app.core.agent.runtime.execution_context import RuntimeExecutionContext + + +@dataclass(slots=True) +class V1FlowContext: + runtime: RuntimeExecutionContext + prompt_name: str + prepared_message: str = "" + answer: str = "" diff --git a/src/app/core/agent/processes/v1/workflow/flow_main/graph.py b/src/app/core/agent/processes/v1/workflow/flow_main/graph.py new file mode 100644 index 0000000..e9f23d5 --- /dev/null +++ b/src/app/core/agent/processes/v1/workflow/flow_main/graph.py @@ -0,0 +1,24 @@ +from __future__ import annotations + +from app.core.agent.processes.v1.workflow.flow_main.context import V1FlowContext +from app.core.agent.processes.v1.workflow.flow_main.steps.finalize_answer_step import FinalizeAnswerStep +from app.core.agent.processes.v1.workflow.flow_main.steps.generate_answer_step import GenerateAnswerStep +from app.core.agent.processes.v1.workflow.flow_main.steps.prepare_user_message_step import PrepareUserMessageStep +from app.core.agent.utils.llm import AgentLlmService +from app.core.agent.utils.workflow import WorkflowGraph + + +class V1FlowMainGraph: + def __init__(self, llm: AgentLlmService) -> None: + self._graph = WorkflowGraph( + workflow_id="v1.flow_main", + source="workflow.v1", + steps=( + PrepareUserMessageStep(), + GenerateAnswerStep(llm), + FinalizeAnswerStep(), + ), + ) + + async def run(self, context: V1FlowContext) -> V1FlowContext: + return await self._graph.run(context) diff --git a/src/app/core/agent/processes/v1/workflow/flow_main/prompts.yml b/src/app/core/agent/processes/v1/workflow/flow_main/prompts.yml new file mode 100644 index 0000000..2dc0a21 --- /dev/null +++ b/src/app/core/agent/processes/v1/workflow/flow_main/prompts.yml @@ -0,0 +1,8 @@ +namespace: v1_flow_main + +prompts: + answer: | + Ты полезный ассистент. + Ответь на сообщение пользователя по существу. + Не придумывай факты, если данных недостаточно. + Если пользователь пишет по-русски, отвечай по-русски. diff --git a/src/app/core/agent/processes/v1/workflow/flow_main/steps/__init__.py b/src/app/core/agent/processes/v1/workflow/flow_main/steps/__init__.py new file mode 100644 index 0000000..64cda64 --- /dev/null +++ b/src/app/core/agent/processes/v1/workflow/flow_main/steps/__init__.py @@ -0,0 +1,9 @@ +from app.core.agent.processes.v1.workflow.flow_main.steps.finalize_answer_step import FinalizeAnswerStep +from app.core.agent.processes.v1.workflow.flow_main.steps.generate_answer_step import GenerateAnswerStep +from app.core.agent.processes.v1.workflow.flow_main.steps.prepare_user_message_step import PrepareUserMessageStep + +__all__ = [ + "FinalizeAnswerStep", + "GenerateAnswerStep", + "PrepareUserMessageStep", +] diff --git a/src/app/core/agent/processes/v1/workflow/flow_main/steps/finalize_answer_step.py b/src/app/core/agent/processes/v1/workflow/flow_main/steps/finalize_answer_step.py new file mode 100644 index 0000000..61e4202 --- /dev/null +++ b/src/app/core/agent/processes/v1/workflow/flow_main/steps/finalize_answer_step.py @@ -0,0 +1,19 @@ +from __future__ import annotations + +from app.core.agent.processes.v1.workflow.flow_main.context import V1FlowContext +from app.core.agent.utils.workflow import WorkflowStep + + +class FinalizeAnswerStep(WorkflowStep[V1FlowContext]): + step_id = "finalize_answer" + title = "Финализация ответа" + + async def run(self, context: V1FlowContext) -> V1FlowContext: + context.answer = context.answer.strip() + return context + + def trace_input(self, context: V1FlowContext) -> dict[str, object]: + return {"answer_length_before_strip": len(context.answer)} + + def trace_output(self, context: V1FlowContext) -> dict[str, object]: + return {"answer_length": len(context.answer)} diff --git a/src/app/core/agent/processes/v1/workflow/flow_main/steps/generate_answer_step.py b/src/app/core/agent/processes/v1/workflow/flow_main/steps/generate_answer_step.py new file mode 100644 index 0000000..6f5637e --- /dev/null +++ b/src/app/core/agent/processes/v1/workflow/flow_main/steps/generate_answer_step.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +import asyncio + +from app.core.agent.processes.v1.workflow.flow_main.context import V1FlowContext +from app.core.agent.utils.llm import AgentLlmService +from app.core.agent.utils.workflow import WorkflowStep + + +class GenerateAnswerStep(WorkflowStep[V1FlowContext]): + step_id = "generate_answer" + title = "Вызов LLM" + + def __init__(self, llm: AgentLlmService) -> None: + self._llm = llm + + async def run(self, context: V1FlowContext) -> V1FlowContext: + request_id = context.runtime.request.request_id + context.answer = await asyncio.to_thread( + self._llm.generate, + context.prompt_name, + context.prepared_message, + log_context=f"agent:{request_id}", + trace=context.runtime.trace.module("workflow.v1.llm"), + ) + return context + + def trace_input(self, context: V1FlowContext) -> dict[str, object]: + return {"prompt_name": context.prompt_name, "prepared_message_length": len(context.prepared_message)} + + def trace_output(self, context: V1FlowContext) -> dict[str, object]: + return {"answer_length": len(context.answer)} diff --git a/src/app/core/agent/processes/v1/workflow/flow_main/steps/prepare_user_message_step.py b/src/app/core/agent/processes/v1/workflow/flow_main/steps/prepare_user_message_step.py new file mode 100644 index 0000000..0f94271 --- /dev/null +++ b/src/app/core/agent/processes/v1/workflow/flow_main/steps/prepare_user_message_step.py @@ -0,0 +1,16 @@ +from __future__ import annotations + +from app.core.agent.processes.v1.workflow.flow_main.context import V1FlowContext +from app.core.agent.utils.workflow import WorkflowStep + + +class PrepareUserMessageStep(WorkflowStep[V1FlowContext]): + step_id = "prepare_user_message" + title = "Подготовка сообщения" + + async def run(self, context: V1FlowContext) -> V1FlowContext: + context.prepared_message = context.runtime.request.message.strip() + return context + + def trace_output(self, context: V1FlowContext) -> dict[str, object]: + return {"prepared_message_length": len(context.prepared_message)} diff --git a/src/app/core/agent/processes/v2/__init__.py b/src/app/core/agent/processes/v2/__init__.py new file mode 100644 index 0000000..3c34915 --- /dev/null +++ b/src/app/core/agent/processes/v2/__init__.py @@ -0,0 +1,4 @@ +from app.core.agent.processes.v2.process import V2Process +from app.core.agent.processes.v2.intent_router.router import V2IntentRouter + +__all__ = ["V2IntentRouter", "V2Process"] diff --git a/src/app/core/agent/processes/v2/anchor_signals.py b/src/app/core/agent/processes/v2/anchor_signals.py new file mode 100644 index 0000000..9b9f732 --- /dev/null +++ b/src/app/core/agent/processes/v2/anchor_signals.py @@ -0,0 +1,48 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.models import V2AnchorType, V2RouteAnchors, V2RouteResult, V2Subintent + + +def anchor_signal_types(route: V2RouteResult) -> set[str]: + hints = [str(item).strip().lower() for item in route.anchors.target_doc_hints if str(item or "").strip()] + signals: set[str] = set() + if route.subintent == V2Subintent.FIND_FILES: + signals.add(V2AnchorType.FIND_FILES) + if route.anchors.endpoint_paths or _has_hint(hints, "/api/"): + signals.add(V2AnchorType.API_ENDPOINT) + if _has_hint(hints, "/architecture/"): + signals.add(V2AnchorType.ARCHITECTURE) + if _has_hint(hints, "/logic/"): + signals.add(V2AnchorType.LOGIC_FLOW) + if _has_hint(hints, "/domains/"): + signals.add(V2AnchorType.DOMAIN_ENTITY) + return signals + + +def route_anchor_summary(route: V2RouteResult) -> dict[str, object]: + return { + "entity_names": list(route.anchors.entity_names), + "file_names": list(route.anchors.file_names), + "endpoint_paths": list(route.anchors.endpoint_paths), + "target_doc_hints": list(route.anchors.target_doc_hints), + "matched_aliases": list(route.anchors.matched_aliases), + "process_domain": route.anchors.process_domain, + "process_subdomain": route.anchors.process_subdomain, + "signal_types": sorted(anchor_signal_types(route)), + } + + +def anchors_have_signal(anchors: V2RouteAnchors, signal: str, *, subintent: str | None = None) -> bool: + route = V2RouteResult( + routing_domain="", + intent="", + subintent=subintent or "", + user_query="", + normalized_query="", + anchors=anchors, + ) + return signal in anchor_signal_types(route) + + +def _has_hint(hints: list[str], marker: str) -> bool: + return any(marker in hint for hint in hints) diff --git a/src/app/core/agent/processes/v2/evidence/assembler.py b/src/app/core/agent/processes/v2/evidence/assembler.py new file mode 100644 index 0000000..77eb51e --- /dev/null +++ b/src/app/core/agent/processes/v2/evidence/assembler.py @@ -0,0 +1,226 @@ +"""Anchor-aware ranking для summary и find-files evidence.""" + +from __future__ import annotations + +import re + +from app.core.agent.processes.v2.anchor_signals import anchor_signal_types +from app.core.agent.processes.v2.models import RetrievedFile, RetrievedSummary, V2AnchorType, V2RouteResult +from app.core.agent.processes.v2.retrieval.target_doc_seeding import normalize_doc_path +from app.core.rag.contracts.enums import RagLayer + + +class DocsEvidenceAssembler: + def assemble_summaries(self, rows: list[dict], route: V2RouteResult) -> list[RetrievedSummary]: + items = self._rank_rows(rows, route, mode="summary") + ranked = [ + RetrievedSummary( + path=item["path"], + title=item["title"], + summary=item["summary"], + document_id=item["document_id"], + score=item["score"], + confidence=min(1.0, item["score"] / 1000.0), + match_reason=item["match_reason"], + score_breakdown=item["score_breakdown"], + ) + for item in items + if item["summary"] and self._summary_row_allowed(item["row"]) + ] + if ranked: + ranked[0].is_primary = True + return ranked[:3] + + def assemble_files(self, rows: list[dict], route: V2RouteResult) -> list[RetrievedFile]: + items = self._rank_rows(rows, route, mode="find_files") + ranked = [ + RetrievedFile( + path=item["path"], + title=item["title"], + document_id=item["document_id"], + score=item["score"], + confidence=min(1.0, item["score"] / 1000.0), + match_reason=item["match_reason"], + score_breakdown=item["score_breakdown"], + ) + for item in items + ] + if ranked: + ranked[0].is_primary = True + return ranked[:4] + + def _rank_rows(self, rows: list[dict], route: V2RouteResult, *, mode: str) -> list[dict]: + seen: set[str] = set() + ranked: list[dict] = [] + for row in rows: + path = self._path(row) + if not path or path in seen: + continue + seen.add(path) + breakdown = self._score_breakdown(row, route, mode=mode) + score = sum(breakdown.values()) + if score <= 0: + continue + ranked.append( + { + "row": row, + "path": path, + "title": self._title(row, path), + "summary": self._summary(row), + "document_id": self._document_id(row, path), + "score": score, + "score_breakdown": breakdown, + "match_reason": self._match_reason(breakdown), + } + ) + ranked.sort(key=lambda item: (-item["score"], item["path"])) + return self._ensure_target_docs_in_top_k(ranked, route, k=4 if mode == "find_files" else 3) + + def _score_breakdown(self, row: dict, route: V2RouteResult, *, mode: str) -> dict[str, int]: + path_raw = self._path(row) + path = path_raw.lower() + filename = path.split("/")[-1] + title = self._title(row, path).lower() + summary = self._summary(row).lower() + entity = self._entity_name(row).lower() + query_tokens = self._query_tokens(route) + path_tokens = self._path_tokens(path) + compact_haystack = {self._compact(path), self._compact(filename), self._compact(title), self._compact(entity)} + breakdown = { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0, + } + if route.intent == "GENERAL_QA": + breakdown["semantic"] += 80 + hint_norm_lower = {normalize_doc_path(h).lower() for h in route.anchors.target_doc_hints if str(h or "").strip()} + if normalize_doc_path(path_raw).lower() in hint_norm_lower: + breakdown["target_doc_boost"] += 1000 + if any(alias.lower() in " ".join([path, title, summary, entity]) for alias in route.anchors.matched_aliases): + breakdown["alias_match"] += 500 + for token in query_tokens: + if token in path_tokens: + breakdown["path_match"] += 60 + if token and token in filename: + breakdown["filename_match"] += 200 + if token and token in summary: + breakdown["semantic"] += 20 + if self._compact(token) in compact_haystack: + breakdown["alias_match"] += 250 + if any(endpoint.strip("/").lower() in filename for endpoint in route.anchors.endpoint_paths): + breakdown["filename_match"] += 200 + signals = anchor_signal_types(route) + breakdown["anchor_boost"] += self._anchor_boost(path, signals) + breakdown["generic_penalty"] += self._generic_penalty(path, signals) + if mode == "find_files": + breakdown["path_match"] *= 3 + breakdown["filename_match"] *= 2 + breakdown["alias_match"] *= 1 + breakdown["semantic"] = max(0, breakdown["semantic"] // 2) + return breakdown + + def _anchor_boost(self, path: str, signals: set[str]) -> int: + boost = 0 + if V2AnchorType.API_ENDPOINT in signals and path.startswith("docs/api/"): + boost += 300 + if V2AnchorType.LOGIC_FLOW in signals and path.startswith("docs/logic/"): + boost += 300 + if V2AnchorType.DOMAIN_ENTITY in signals and path.startswith("docs/domains/"): + boost += 300 + if V2AnchorType.ARCHITECTURE in signals and path.startswith("docs/architecture/"): + boost += 300 + if V2AnchorType.FIND_FILES in signals and path.startswith("docs/"): + boost += 120 + return boost + + def _generic_penalty(self, path: str, signals: set[str]) -> int: + penalty = 0 + if path == "docs/README.md" and V2AnchorType.ARCHITECTURE not in signals: + penalty -= 200 + if "/architecture/" in path and V2AnchorType.ARCHITECTURE not in signals and signals.intersection( + {V2AnchorType.API_ENDPOINT, V2AnchorType.DOMAIN_ENTITY} + ): + penalty -= 150 + return penalty + + def _ensure_target_docs_in_top_k(self, ranked: list[dict], route: V2RouteResult, *, k: int) -> list[dict]: + if not ranked or not route.anchors.target_doc_hints: + return ranked + top = ranked[:k] + top_paths = {item["path"] for item in top} + top_norm = {normalize_doc_path(p).lower() for p in top_paths if p} + for hint in route.anchors.target_doc_hints: + hn = normalize_doc_path(hint).lower() + if hn in top_norm: + continue + candidate = next( + (item for item in ranked if normalize_doc_path(item["path"]).lower() == hn), + None, + ) + if candidate is None: + continue + if len(top) < k: + top.append(candidate) + else: + top[-1] = candidate + top_paths = {item["path"] for item in top} + top_norm = {normalize_doc_path(p).lower() for p in top_paths if p} + remaining = [item for item in ranked if item["path"] not in top_paths] + top.sort(key=lambda item: (-item["score"], item["path"])) + return top + remaining + + def _match_reason(self, breakdown: dict[str, int]) -> str: + if breakdown["target_doc_boost"] > 0: + return "exact_path" + if breakdown["alias_match"] > 0: + return "alias_match" + if breakdown["filename_match"] > 0: + return "exact_title" + return "semantic_match" + + def _summary_row_allowed(self, row: dict) -> bool: + metadata = dict(row.get("metadata") or {}) + if row.get("layer") != RagLayer.DOCS_DOC_CHUNKS: + return True + section = str(metadata.get("section_path") or "").lower() + return "summary" in section or "свод" in section or "overview" in section + + def _query_tokens(self, route: V2RouteResult) -> list[str]: + values = list(route.target_terms) + list(route.anchors.matched_aliases) + tokens: list[str] = [] + for item in values: + for token in re.split(r"[^a-zA-Zа-яА-Я0-9]+", str(item).lower()): + if len(token) >= 3: + tokens.append(token) + return list(dict.fromkeys(tokens)) + + def _path_tokens(self, path: str) -> set[str]: + return {token for token in re.split(r"[^a-zA-Zа-яА-Я0-9]+", path.lower()) if len(token) >= 3} + + def _compact(self, value: str) -> str: + return "".join(self._path_tokens(value)) + + def _path(self, row: dict) -> str: + metadata = dict(row.get("metadata") or {}) + raw = str(row.get("path") or metadata.get("source_path") or "").strip() + return normalize_doc_path(raw) + + def _title(self, row: dict, path: str) -> str: + metadata = dict(row.get("metadata") or {}) + return str(row.get("title") or metadata.get("title") or path).strip() + + def _summary(self, row: dict) -> str: + metadata = dict(row.get("metadata") or {}) + return str(metadata.get("summary_text") or row.get("content") or "").strip() + + def _document_id(self, row: dict, path: str) -> str: + metadata = dict(row.get("metadata") or {}) + return str(metadata.get("document_id") or metadata.get("doc_id") or path).strip() + + def _entity_name(self, row: dict) -> str: + metadata = dict(row.get("metadata") or {}) + return str(metadata.get("entity_name") or "").strip() diff --git a/src/app/core/agent/processes/v2/evidence/gate.py b/src/app/core/agent/processes/v2/evidence/gate.py new file mode 100644 index 0000000..37d961b --- /dev/null +++ b/src/app/core/agent/processes/v2/evidence/gate.py @@ -0,0 +1,76 @@ +from __future__ import annotations + +from dataclasses import dataclass, field + +from app.core.agent.processes.v2.anchor_signals import anchor_signal_types +from app.core.agent.processes.v2.models import RetrievedFile, RetrievedSummary, V2AnchorType, V2Intent, V2RouteResult + + +@dataclass(slots=True) +class EvidenceGateDecision: + passed: bool + answer_mode: str + reason: str + message: str = "" + supporting_paths: list[str] = field(default_factory=list) + + +class DocsEvidenceGate: + def check_summaries(self, route: V2RouteResult, documents: list[RetrievedSummary]) -> EvidenceGateDecision: + if route.intent == V2Intent.GENERAL_QA: + if documents: + return EvidenceGateDecision(True, "grounded_summary", "general_docs_found") + return EvidenceGateDecision( + False, + "insufficient_evidence", + "general_docs_missing", + "В найденной документации нет достаточной опоры для общего summary по запросу.", + ) + if self._has_target_document(route, [item.path for item in documents]): + return EvidenceGateDecision(True, "grounded_summary", "target_doc_found") + return EvidenceGateDecision( + False, + "insufficient_evidence", + "target_doc_missing", + self._summary_insufficiency(route, documents), + [item.path for item in documents[:3]], + ) + + def check_files(self, route: V2RouteResult, files: list[RetrievedFile]) -> EvidenceGateDecision: + if not files: + return EvidenceGateDecision( + False, + "insufficient_evidence", + "no_file_candidates", + "Не нашёл файлов документации, которые уверенно соответствуют запросу.", + ) + if files[0].confidence >= 0.8: + return EvidenceGateDecision(True, "deterministic", "primary_file_confident") + return EvidenceGateDecision( + False, + "deterministic", + "low_confidence_shortlist", + "Нашёл только ближайшие кандидаты по запросу.", + [item.path for item in files[:4]], + ) + + def _has_target_document(self, route: V2RouteResult, paths: list[str]) -> bool: + if any(path in route.anchors.target_doc_hints for path in paths): + return True + signals = anchor_signal_types(route) + if V2AnchorType.API_ENDPOINT in signals: + return any(path.startswith("docs/api/") for path in paths) + if V2AnchorType.ARCHITECTURE in signals: + return any(path.startswith("docs/architecture/") for path in paths) + if V2AnchorType.LOGIC_FLOW in signals: + return any(path.startswith("docs/logic/") for path in paths) + if V2AnchorType.DOMAIN_ENTITY in signals: + return any(path.startswith("docs/domains/") for path in paths) + return bool(paths) + + def _summary_insufficiency(self, route: V2RouteResult, documents: list[RetrievedSummary]) -> str: + base = "В поднятом контексте не найден целевой документ по запросу." + if not documents: + return base + nearby = ", ".join(item.path for item in documents[:3]) + return f"{base} Ближайшие документы: {nearby}." diff --git a/src/app/core/agent/processes/v2/general_prompts.yml b/src/app/core/agent/processes/v2/general_prompts.yml new file mode 100644 index 0000000..52b00af --- /dev/null +++ b/src/app/core/agent/processes/v2/general_prompts.yml @@ -0,0 +1,8 @@ +namespace: v2_general + +prompts: + summary_answer: | + Ты делаешь grounded summary только по найденной проектной документации. + Не используй общие знания о том, как обычно устроены системы. + Дай короткий, понятный ответ и опирайся только на входные документы. + Если опоры мало, прямо скажи об этом. diff --git a/src/app/core/agent/processes/v2/intent_router/__init__.py b/src/app/core/agent/processes/v2/intent_router/__init__.py new file mode 100644 index 0000000..7318ab4 --- /dev/null +++ b/src/app/core/agent/processes/v2/intent_router/__init__.py @@ -0,0 +1,3 @@ +from app.core.agent.processes.v2.intent_router.router import V2IntentRouter + +__all__ = ["V2IntentRouter"] diff --git a/src/app/core/agent/processes/v2/intent_router/models.py b/src/app/core/agent/processes/v2/intent_router/models.py new file mode 100644 index 0000000..955ceb6 --- /dev/null +++ b/src/app/core/agent/processes/v2/intent_router/models.py @@ -0,0 +1,17 @@ +from __future__ import annotations + +from dataclasses import dataclass + + +@dataclass(slots=True) +class QueryFeatures: + normalized_query: str + target_terms: list[str] + endpoint_paths: list[str] + matched_aliases: list[str] + target_doc_hints: list[str] + file_markers: list[str] + architecture_markers: list[str] + logic_markers: list[str] + domain_markers: list[str] + endpoint_markers: list[str] diff --git a/src/app/core/agent/processes/v2/intent_router/modules/__init__.py b/src/app/core/agent/processes/v2/intent_router/modules/__init__.py new file mode 100644 index 0000000..ab68333 --- /dev/null +++ b/src/app/core/agent/processes/v2/intent_router/modules/__init__.py @@ -0,0 +1,11 @@ +from app.core.agent.processes.v2.intent_router.modules.anchors import AnchorAnalysis, V2AnchorExtractor +from app.core.agent.processes.v2.intent_router.modules.normalizer import V2QueryNormalizer +from app.core.agent.processes.v2.intent_router.modules.target_terms import TargetTermsAnalysis, V2TargetTermsExtractor + +__all__ = [ + "AnchorAnalysis", + "TargetTermsAnalysis", + "V2AnchorExtractor", + "V2QueryNormalizer", + "V2TargetTermsExtractor", +] diff --git a/src/app/core/agent/processes/v2/intent_router/modules/anchors.py b/src/app/core/agent/processes/v2/intent_router/modules/anchors.py new file mode 100644 index 0000000..4730e12 --- /dev/null +++ b/src/app/core/agent/processes/v2/intent_router/modules/anchors.py @@ -0,0 +1,157 @@ +from __future__ import annotations + +import re +from dataclasses import dataclass + +from app.core.agent.processes.v2.intent_router.modules.target_terms import TargetTermsAnalysis +from app.core.agent.processes.v2.models import V2RouteAnchors + + +@dataclass(slots=True) +class AnchorAnalysis: + anchors: V2RouteAnchors + file_markers: list[str] + architecture_markers: list[str] + logic_markers: list[str] + domain_markers: list[str] + endpoint_markers: list[str] + + +class _MarkerScanner: + _FILE_MARKERS = ( + "в каком файле", + "в каком документе", + "в каких файлах", + "где находится", + "где описан", + "где описана", + "где описаны", + "покажи файл", + "какие файлы", + "найди файл", + "найди файлы", + "покажи документ", + "где описано", + "документ с описанием", + ) + _ARCHITECTURE_MARKERS = ("архитектура", "как устроено приложение", "как устроен сервис", "основные части системы", "из чего состоит") + _LOGIC_MARKERS = ("цикл", "loop", "worker", "как работает отправка уведомлений", "логика отправки", "background job", "runtime loop") + _DOMAIN_MARKERS = ("runtime health", "health model", "статусы здоровья", "сущность", "entity", "здоровье runtime") + _ENDPOINT_MARKERS = ("endpoint", "метод api", "ручка", "эндпоинт") + + def scan(self, lowered_query: str) -> dict[str, list[str]]: + return { + "file_markers": self._matching(lowered_query, self._FILE_MARKERS), + "architecture_markers": self._matching(lowered_query, self._ARCHITECTURE_MARKERS), + "logic_markers": self._matching(lowered_query, self._LOGIC_MARKERS), + "domain_markers": self._matching(lowered_query, self._DOMAIN_MARKERS), + "endpoint_markers": self._matching(lowered_query, self._ENDPOINT_MARKERS), + } + + def _matching(self, query: str, markers: tuple[str, ...]) -> list[str]: + return [marker for marker in markers if marker in query] + + +class _EntityNameExtractor: + _ENTITY_RE = re.compile(r"\b[A-Z][A-Za-z0-9_]+\b") + + def extract(self, query: str) -> list[str]: + items: list[str] = [] + for match in self._ENTITY_RE.finditer(query): + candidate = match.group(0).strip() + if candidate and candidate not in items: + items.append(candidate) + return items + + +class _FileNameExtractor: + _TOKEN_RE = re.compile(r"`([^`]+)`|([A-Za-z0-9_./-]+)") + _WITH_EXTENSION_RE = re.compile(r".+\.(md|yaml|yml|json)$", re.IGNORECASE) + _DOC_PATH_RE = re.compile(r"^(docs|doc|documentation)/.+") + + def extract(self, query: str) -> list[str]: + items: list[str] = [] + for match in self._TOKEN_RE.finditer(query): + candidate = next((item for item in match.groups() if item), "") + normalized = str(candidate or "").strip().strip("`'\"") + if self._is_file_name(normalized): + self._append_unique(items, normalized.lower()) + return items + + def _is_file_name(self, token: str) -> bool: + if not token: + return False + if token.startswith("/") and "." not in token: + return False + if self._WITH_EXTENSION_RE.fullmatch(token): + return True + return self._DOC_PATH_RE.fullmatch(token) is not None + + def _append_unique(self, items: list[str], value: str) -> None: + if value and value not in items: + items.append(value) + + +class V2AnchorExtractor: + def __init__( + self, + marker_scanner: _MarkerScanner | None = None, + entity_extractor: _EntityNameExtractor | None = None, + file_name_extractor: _FileNameExtractor | None = None, + ) -> None: + self._marker_scanner = marker_scanner or _MarkerScanner() + self._entity_extractor = entity_extractor or _EntityNameExtractor() + self._file_name_extractor = file_name_extractor or _FileNameExtractor() + + def extract(self, normalized_query: str, terms: TargetTermsAnalysis) -> AnchorAnalysis: + markers = self._marker_scanner.scan(normalized_query.lower()) + anchors = V2RouteAnchors( + entity_names=self._entity_extractor.extract(normalized_query), + file_names=self._file_name_extractor.extract(normalized_query), + endpoint_paths=list(terms.endpoint_paths), + target_doc_hints=self._target_doc_hints( + endpoint_paths=terms.endpoint_paths, + alias_docs=terms.alias_docs, + architecture_markers=markers["architecture_markers"], + logic_markers=markers["logic_markers"], + domain_markers=markers["domain_markers"], + ), + matched_aliases=list(terms.matched_aliases), + process_domain=None, + process_subdomain=None, + ) + return AnchorAnalysis( + anchors=anchors, + file_markers=markers["file_markers"], + architecture_markers=markers["architecture_markers"], + logic_markers=markers["logic_markers"], + domain_markers=markers["domain_markers"], + endpoint_markers=markers["endpoint_markers"], + ) + + def _target_doc_hints( + self, + *, + endpoint_paths: list[str], + alias_docs: list[str], + architecture_markers: list[str], + logic_markers: list[str], + domain_markers: list[str], + ) -> list[str]: + hints = list(alias_docs) + endpoint_map = { + "/health": "docs/api/health-endpoint.md", + "/send": "docs/api/send-message-endpoint.md", + "/actions/{action}": "docs/api/control-actions-endpoint.md", + } + for endpoint in endpoint_paths: + hint = endpoint_map.get(endpoint) + if hint and hint not in hints: + hints.append(hint) + if architecture_markers and "docs/architecture/telegram-notify-app-overview.md" not in hints: + hints.append("docs/architecture/telegram-notify-app-overview.md") + if logic_markers and "docs/logic/telegram-notification-loop.md" not in hints: + hints.append("docs/logic/telegram-notification-loop.md") + if domain_markers and "docs/domains/runtime-health-entity.md" not in hints: + hints.append("docs/domains/runtime-health-entity.md") + return hints diff --git a/src/app/core/agent/processes/v2/intent_router/modules/normalizer.py b/src/app/core/agent/processes/v2/intent_router/modules/normalizer.py new file mode 100644 index 0000000..dad4a61 --- /dev/null +++ b/src/app/core/agent/processes/v2/intent_router/modules/normalizer.py @@ -0,0 +1,6 @@ +from __future__ import annotations + + +class V2QueryNormalizer: + def normalize(self, user_query: str) -> str: + return " ".join(str(user_query or "").strip().split()) diff --git a/src/app/core/agent/processes/v2/intent_router/modules/target_terms.py b/src/app/core/agent/processes/v2/intent_router/modules/target_terms.py new file mode 100644 index 0000000..9b42c91 --- /dev/null +++ b/src/app/core/agent/processes/v2/intent_router/modules/target_terms.py @@ -0,0 +1,209 @@ +from __future__ import annotations + +import re +from dataclasses import dataclass + + +@dataclass(slots=True) +class TargetTermsAnalysis: + target_terms: list[str] + endpoint_paths: list[str] + matched_aliases: list[str] + alias_docs: list[str] + + +@dataclass(frozen=True, slots=True) +class _AliasRule: + phrases: tuple[str, ...] + canonical_term: str + target_doc_hint: str + + +class _AliasMatcher: + _RULES = ( + _AliasRule(("ручная отправка сообщения", "отправка сообщения вручную"), "/send", "docs/api/send-message-endpoint.md"), + _AliasRule(("статус сервиса", "проверка здоровья"), "/health", "docs/api/health-endpoint.md"), + _AliasRule(("control actions", "управление runtime"), "/actions/{action}", "docs/api/control-actions-endpoint.md"), + _AliasRule(("runtime health", "здоровье runtime", "статусы здоровья"), "runtime_health", "docs/domains/runtime-health-entity.md"), + _AliasRule(("цикл отправки уведомлений", "notification loop", "worker loop"), "telegram-notify-loop", "docs/logic/telegram-notification-loop.md"), + _AliasRule(("архитектура приложения", "overview"), "architecture_overview", "docs/architecture/telegram-notify-app-overview.md"), + _AliasRule(("архитектура",), "architecture_overview", "docs/architecture/telegram-notify-app-overview.md"), + _AliasRule(("каталог ошибок", "errors catalog"), "errors_catalog", "docs/errors/catalog.yaml"), + _AliasRule(("файл-индекс документации", "docs index", "индекс документации"), "docs_index", "docs/README.md"), + ) + + def match(self, lowered_query: str) -> tuple[list[str], list[str], list[str]]: + terms: list[str] = [] + docs: list[str] = [] + aliases: list[str] = [] + for rule in self._RULES: + if any(phrase in lowered_query for phrase in rule.phrases): + self._append_unique(terms, rule.canonical_term.lower()) + self._append_unique(docs, rule.target_doc_hint) + self._append_unique(aliases, rule.canonical_term.lower()) + return terms, docs, aliases + + def _append_unique(self, items: list[str], value: str) -> None: + if value and value not in items: + items.append(value) + + +class _EndpointPathExtractor: + _PATH_RE = re.compile(r"`([^`]+)`|(/[A-Za-z0-9_./{}-]+)") + _VALID_ENDPOINT_RE = re.compile(r"^/[a-z0-9._/-]+(?:/\{[a-z0-9_]+\})?$") + + def extract(self, query: str) -> list[str]: + values: list[str] = [] + for match in self._PATH_RE.finditer(query): + candidate = next((item for item in match.groups() if item and item.startswith("/")), "") + normalized = self._normalize(candidate) + if self._is_endpoint(normalized): + self._append_unique(values, normalized) + return values + + def _normalize(self, token: str) -> str: + trimmed = str(token or "").strip().strip("`'\"()[]!?.,:;") + if "{" in trimmed and "}" not in trimmed: + return "" + return trimmed.lower() + + def _is_endpoint(self, token: str) -> bool: + return bool(token and self._VALID_ENDPOINT_RE.fullmatch(token)) + + def _append_unique(self, items: list[str], value: str) -> None: + if value and value not in items: + items.append(value) + + +class _TermCollector: + _TOKEN_RE = re.compile(r"[A-Za-zА-Яа-я0-9_./{}-]+") + _IDENTIFIER_RE = re.compile( + r"^(?:[a-z0-9]+(?:[_-][a-z0-9]+)+|[a-z]+[A-Z][A-Za-z0-9]+|(?:[A-Z][a-z0-9]+){2,})$" + ) + _QUESTION_WORDS = {"что", "как", "где", "какой", "какие", "каком", "когда", "чего"} + _INTENT_WORDS = {"объясни", "покажи", "найди", "расскажи", "дай", "опиши", "нужен"} + _FILLER_WORDS = {"про", "там", "тут", "плз"} + _MARKER_WORDS = { + "файл", + "файле", + "док", + "дока", + "доках", + "документ", + "описан", + "док-саммари", + "summary", + "саммари", + } + _SERVICE_WORDS = { + "кратко", + "краткий", + "для", + "есть", + "делает", + "работает", + "это", + "этой", + "этого", + "этот", + "документы", + "документация", + "документации", + "файлы", + "путь", + "пути", + "service", + "summary", + "endpoint", + } + _MAX_TERMS = 7 + + def collect(self, query: str, alias_terms: list[str], endpoint_paths: list[str]) -> list[str]: + explicit_terms: list[str] = [] + for value in endpoint_paths: + self._append_unique(explicit_terms, value) + for token in self._TOKEN_RE.findall(query): + normalized = self._normalize(token) + if not normalized: + continue + if self._is_endpoint(normalized) or self._is_identifier(normalized) or self._is_valid_term(normalized): + self._append_unique(explicit_terms, normalized) + alias_bucket = self._collect_alias_terms(alias_terms, explicit_terms) + prioritized = self._prioritize(explicit_terms, alias_bucket) + return prioritized[: self._MAX_TERMS] + + def _normalize(self, token: str) -> str: + trimmed = str(token or "").strip().strip("`'\"()[]!?.,:;") + if "{" in trimmed and "}" not in trimmed: + return "" + return trimmed.lower() + + def _is_endpoint(self, token: str) -> bool: + return token.startswith("/") and len(token) > 1 and "{" not in token.replace("{", "", 1) + + def _is_identifier(self, token: str) -> bool: + return bool(self._IDENTIFIER_RE.fullmatch(token)) + + def _is_valid_term(self, token: str) -> bool: + if len(token) < 3 or "/" in token or "." in token: + return False + if ( + token in self._QUESTION_WORDS + or token in self._INTENT_WORDS + or token in self._FILLER_WORDS + or token in self._MARKER_WORDS + or token in self._SERVICE_WORDS + ): + return False + return True + + def _collect_alias_terms(self, alias_terms: list[str], explicit_terms: list[str]) -> list[str]: + collected: list[str] = [] + explicit_set = set(explicit_terms) + for term in alias_terms: + normalized = self._normalize(term) + if not normalized: + continue + if normalized in explicit_set: + continue + if self._is_identifier(normalized): + parts = [part for part in re.split(r"[_-]", normalized) if part] + if parts and all(part in explicit_set for part in parts): + continue + self._append_unique(collected, normalized) + return collected + + def _prioritize(self, explicit_terms: list[str], alias_terms: list[str]) -> list[str]: + terms = explicit_terms + [term for term in alias_terms if term not in explicit_terms] + endpoints = [term for term in terms if self._is_endpoint(term)] + identifiers = [term for term in terms if term not in endpoints and self._is_identifier(term)] + aliases = [term for term in alias_terms if term not in endpoints and term not in identifiers] + other_terms = [term for term in terms if term not in endpoints and term not in identifiers and term not in aliases] + return endpoints + identifiers + aliases + other_terms + + def _append_unique(self, items: list[str], value: str) -> None: + if value and value not in items: + items.append(value) + + +class V2TargetTermsExtractor: + def __init__( + self, + alias_matcher: _AliasMatcher | None = None, + endpoint_extractor: _EndpointPathExtractor | None = None, + term_collector: _TermCollector | None = None, + ) -> None: + self._alias_matcher = alias_matcher or _AliasMatcher() + self._endpoint_extractor = endpoint_extractor or _EndpointPathExtractor() + self._term_collector = term_collector or _TermCollector() + + def extract(self, normalized_query: str) -> TargetTermsAnalysis: + lowered = normalized_query.lower() + endpoint_paths = self._endpoint_extractor.extract(normalized_query) + alias_terms, alias_docs, alias_hits = self._alias_matcher.match(lowered) + return TargetTermsAnalysis( + target_terms=self._term_collector.collect(normalized_query, alias_terms, endpoint_paths), + endpoint_paths=endpoint_paths, + matched_aliases=alias_hits, + alias_docs=alias_docs, + ) diff --git a/src/app/core/agent/processes/v2/intent_router/router.py b/src/app/core/agent/processes/v2/intent_router/router.py new file mode 100644 index 0000000..7226b07 --- /dev/null +++ b/src/app/core/agent/processes/v2/intent_router/router.py @@ -0,0 +1,101 @@ +"""Маршрутизация запроса в домен/интент/subintent и якоря для v2.""" + +from __future__ import annotations + +from app.core.agent.processes.v2.intent_router.modules.anchors import V2AnchorExtractor +from app.core.agent.processes.v2.intent_router.modules.normalizer import V2QueryNormalizer +from app.core.agent.processes.v2.intent_router.modules.target_terms import V2TargetTermsExtractor +from app.core.agent.processes.v2.intent_router.models import QueryFeatures +from app.core.agent.processes.v2.intent_router.routers.confidence import V2ConfidenceAdjuster +from app.core.agent.processes.v2.intent_router.routers.fallback import V2FallbackRouter +from app.core.agent.processes.v2.intent_router.routers.llm import V2LlmRouter +from app.core.agent.processes.v2.intent_router.routers.route_catalog import V2RouteCatalog +from app.core.agent.processes.v2.intent_router.routers.validator import V2RouteValidator +from app.core.agent.processes.v2.models import V2RouteResult +from app.core.agent.utils.llm import AgentLlmService + + +class V2IntentRouter: + def __init__( + self, + normalizer: V2QueryNormalizer | None = None, + target_terms_extractor: V2TargetTermsExtractor | None = None, + anchor_extractor: V2AnchorExtractor | None = None, + llm: AgentLlmService | None = None, + enable_llm_disambiguation: bool = True, + route_catalog: V2RouteCatalog | None = None, + confidence_adjuster: V2ConfidenceAdjuster | None = None, + ) -> None: + self._normalizer = normalizer or V2QueryNormalizer() + self._target_terms_extractor = target_terms_extractor or V2TargetTermsExtractor() + self._anchor_extractor = anchor_extractor or V2AnchorExtractor() + self._catalog = route_catalog or V2RouteCatalog() + self._validator = V2RouteValidator(self._catalog) + self._fallback_router = V2FallbackRouter() + self._confidence_adjuster = confidence_adjuster or V2ConfidenceAdjuster() + self._enable_llm_disambiguation = enable_llm_disambiguation + self._llm_router = V2LlmRouter(llm, catalog=self._catalog) if llm is not None else None + + def route(self, user_query: str) -> V2RouteResult: + normalized_query = self._normalizer.normalize(user_query) + target_terms_analysis = self._target_terms_extractor.extract(normalized_query) + anchor_analysis = self._anchor_extractor.extract(normalized_query, target_terms_analysis) + features = QueryFeatures( + normalized_query=normalized_query, + target_terms=list(target_terms_analysis.target_terms), + endpoint_paths=list(target_terms_analysis.endpoint_paths), + matched_aliases=list(target_terms_analysis.matched_aliases), + target_doc_hints=list(anchor_analysis.anchors.target_doc_hints), + file_markers=list(anchor_analysis.file_markers), + architecture_markers=list(anchor_analysis.architecture_markers), + logic_markers=list(anchor_analysis.logic_markers), + domain_markers=list(anchor_analysis.domain_markers), + endpoint_markers=list(anchor_analysis.endpoint_markers), + ) + llm_attempted = self._enable_llm_disambiguation and self._llm_router is not None + llm_candidate = self._route_with_llm( + features=features, + anchors=anchor_analysis.anchors, + ) + llm_result = self._validator.validate(llm_candidate) + if llm_result is not None: + confidence = self._confidence_adjuster.adjust(float(llm_result["confidence"]), features) + return V2RouteResult( + routing_domain=llm_result["routing_domain"], + intent=llm_result["intent"], + subintent=llm_result["subintent"], + user_query=user_query, + normalized_query=features.normalized_query, + target_terms=features.target_terms, + anchors=anchor_analysis.anchors, + confidence=confidence, + routing_mode="llm_default", + llm_router_used=True, + reason_short=str(llm_result["reason_short"]), + ) + return self._fallback_router.route( + user_query=user_query, + features=features, + anchors=anchor_analysis.anchors, + llm_attempted=llm_attempted, + ) + + def _route_with_llm(self, *, features: QueryFeatures, anchors) -> dict | None: + if not self._enable_llm_disambiguation or self._llm_router is None: + return None + try: + return self._llm_router.classify( + normalized_query=features.normalized_query, + target_terms=features.target_terms, + anchors={ + "entity_names": anchors.entity_names, + "file_names": anchors.file_names, + "endpoint_paths": anchors.endpoint_paths, + "target_doc_hints": anchors.target_doc_hints, + "matched_aliases": anchors.matched_aliases, + "process_domain": anchors.process_domain, + "process_subdomain": anchors.process_subdomain, + }, + ) + except Exception: + return None diff --git a/src/app/core/agent/processes/v2/intent_router/routers/__init__.py b/src/app/core/agent/processes/v2/intent_router/routers/__init__.py new file mode 100644 index 0000000..3cb3ab6 --- /dev/null +++ b/src/app/core/agent/processes/v2/intent_router/routers/__init__.py @@ -0,0 +1,5 @@ +from app.core.agent.processes.v2.intent_router.routers.docs_subintent_resolver import DocsSubintentResolver +from app.core.agent.processes.v2.intent_router.routers.deterministic import V2DeterministicRouter +from app.core.agent.processes.v2.intent_router.routers.llm import V2LlmRouter + +__all__ = ["DocsSubintentResolver", "V2DeterministicRouter", "V2LlmRouter"] diff --git a/src/app/core/agent/processes/v2/intent_router/routers/confidence.py b/src/app/core/agent/processes/v2/intent_router/routers/confidence.py new file mode 100644 index 0000000..2c90d5d --- /dev/null +++ b/src/app/core/agent/processes/v2/intent_router/routers/confidence.py @@ -0,0 +1,25 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.intent_router.models import QueryFeatures + + +class V2ConfidenceAdjuster: + def adjust(self, confidence: float, features: QueryFeatures) -> float: + adjusted = confidence + if not self._has_strong_anchor(features): + adjusted -= 0.1 + if self._is_short_or_vague(features): + adjusted -= 0.1 + if self._has_explicit_signal(features): + adjusted += 0.05 + return min(max(adjusted, 0.0), 1.0) + + def _has_strong_anchor(self, features: QueryFeatures) -> bool: + return any((features.file_markers, features.endpoint_paths, features.target_doc_hints, features.matched_aliases)) + + def _is_short_or_vague(self, features: QueryFeatures) -> bool: + token_count = len([token for token in features.normalized_query.split() if token.strip()]) + return token_count <= 3 or len(features.target_terms) <= 1 + + def _has_explicit_signal(self, features: QueryFeatures) -> bool: + return bool(features.file_markers or features.endpoint_paths or features.endpoint_markers) diff --git a/src/app/core/agent/processes/v2/intent_router/routers/deterministic.py b/src/app/core/agent/processes/v2/intent_router/routers/deterministic.py new file mode 100644 index 0000000..0c5fc3c --- /dev/null +++ b/src/app/core/agent/processes/v2/intent_router/routers/deterministic.py @@ -0,0 +1,73 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.intent_router.models import QueryFeatures +from app.core.agent.processes.v2.models import V2Domain, V2Intent, V2RouteResult, V2Subintent +from app.core.agent.processes.v2.intent_router.routers.docs_subintent_resolver import DocsSubintentResolver + + +class V2DeterministicRouter: + _GENERAL_MARKERS = ( + "что это за сервис", + "для чего нужен", + "какую задачу решает", + "что входит в документацию", + "какие документы стоит читать сначала", + "дай короткое summary", + "с чего начать", + "что тут есть кроме api", + "как в целом устроено приложение", + "какие основные части есть", + "из чего состоит telegram notify app", + ) + + def __init__(self, subintent_resolver: DocsSubintentResolver | None = None) -> None: + self._subintent_resolver = subintent_resolver or DocsSubintentResolver() + + def route(self, user_query: str, features: QueryFeatures, anchors) -> V2RouteResult | None: + subintent = self._subintent_resolver.resolve(features) + if subintent == V2Subintent.FIND_FILES: + return self._build_docs_route(user_query, features, anchors, subintent, "deterministic file anchor") + if subintent is not None and not self._has_conflicting_doc_anchors(features): + return self._build_docs_route(user_query, features, anchors, subintent, "deterministic signal") + if self._is_general_summary(features.normalized_query): + return V2RouteResult( + routing_domain=V2Domain.GENERAL, + intent=V2Intent.GENERAL_QA, + subintent=V2Subintent.SUMMARY, + user_query=user_query, + normalized_query=features.normalized_query, + target_terms=features.target_terms, + anchors=anchors, + confidence=1.0, + routing_mode="deterministic", + llm_router_used=False, + reason_short="general fallback signal", + ) + return None + + def _build_docs_route(self, user_query: str, features: QueryFeatures, anchors, subintent: str, reason: str) -> V2RouteResult: + return V2RouteResult( + routing_domain=V2Domain.DOCS, + intent=V2Intent.DOC_EXPLAIN, + subintent=subintent, + user_query=user_query, + normalized_query=features.normalized_query, + target_terms=features.target_terms, + anchors=anchors, + confidence=1.0, + routing_mode="deterministic", + llm_router_used=False, + reason_short=reason, + ) + + def _is_general_summary(self, normalized_query: str) -> bool: + query = normalized_query.lower() + return any(marker in query for marker in self._GENERAL_MARKERS) + + def _has_conflicting_doc_anchors(self, features: QueryFeatures) -> bool: + signals = 0 + signals += 1 if features.endpoint_paths or features.endpoint_markers else 0 + signals += 1 if features.architecture_markers else 0 + signals += 1 if features.logic_markers else 0 + signals += 1 if features.domain_markers else 0 + return signals > 1 diff --git a/src/app/core/agent/processes/v2/intent_router/routers/docs_subintent_resolver.py b/src/app/core/agent/processes/v2/intent_router/routers/docs_subintent_resolver.py new file mode 100644 index 0000000..bb3af76 --- /dev/null +++ b/src/app/core/agent/processes/v2/intent_router/routers/docs_subintent_resolver.py @@ -0,0 +1,22 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.intent_router.models import QueryFeatures +from app.core.agent.processes.v2.models import V2Subintent + + +class DocsSubintentResolver: + def resolve(self, features: QueryFeatures) -> str | None: + if features.file_markers: + return V2Subintent.FIND_FILES + if any( + ( + features.endpoint_paths, + features.endpoint_markers, + features.architecture_markers, + features.logic_markers, + features.domain_markers, + features.target_doc_hints, + ) + ): + return V2Subintent.SUMMARY + return None diff --git a/src/app/core/agent/processes/v2/intent_router/routers/fallback.py b/src/app/core/agent/processes/v2/intent_router/routers/fallback.py new file mode 100644 index 0000000..a88df36 --- /dev/null +++ b/src/app/core/agent/processes/v2/intent_router/routers/fallback.py @@ -0,0 +1,86 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.intent_router.models import QueryFeatures +from app.core.agent.processes.v2.models import V2Domain, V2Intent, V2RouteResult, V2Subintent + + +class V2FallbackRouter: + def route( + self, + *, + user_query: str, + features: QueryFeatures, + anchors, + llm_attempted: bool, + ) -> V2RouteResult: + if features.file_markers: + return self._build_docs_result( + user_query=user_query, + features=features, + anchors=anchors, + subintent=V2Subintent.FIND_FILES, + llm_attempted=llm_attempted, + reason="fallback file markers", + ) + if self._has_docs_signal(features): + return self._build_docs_result( + user_query=user_query, + features=features, + anchors=anchors, + subintent=V2Subintent.SUMMARY, + llm_attempted=llm_attempted, + reason="fallback docs summary", + ) + return V2RouteResult( + routing_domain=V2Domain.GENERAL, + intent=V2Intent.GENERAL_QA, + subintent=V2Subintent.SUMMARY, + user_query=user_query, + normalized_query=features.normalized_query, + target_terms=features.target_terms, + anchors=anchors, + confidence=0.0, + routing_mode=self._routing_mode(llm_attempted), + llm_router_used=llm_attempted, + reason_short="fallback general summary", + ) + + def _build_docs_result( + self, + *, + user_query: str, + features: QueryFeatures, + anchors, + subintent: str, + llm_attempted: bool, + reason: str, + ) -> V2RouteResult: + return V2RouteResult( + routing_domain=V2Domain.DOCS, + intent=V2Intent.DOC_EXPLAIN, + subintent=subintent, + user_query=user_query, + normalized_query=features.normalized_query, + target_terms=features.target_terms, + anchors=anchors, + confidence=0.0, + routing_mode=self._routing_mode(llm_attempted), + llm_router_used=llm_attempted, + reason_short=reason, + ) + + def _has_docs_signal(self, features: QueryFeatures) -> bool: + return any( + ( + features.endpoint_paths, + features.target_doc_hints, + features.endpoint_markers, + features.architecture_markers, + features.logic_markers, + features.domain_markers, + features.matched_aliases, + ) + ) + + def _routing_mode(self, llm_attempted: bool) -> str: + return "llm_fallback" if llm_attempted else "deterministic_fallback" diff --git a/src/app/core/agent/processes/v2/intent_router/routers/llm.py b/src/app/core/agent/processes/v2/intent_router/routers/llm.py new file mode 100644 index 0000000..291dd96 --- /dev/null +++ b/src/app/core/agent/processes/v2/intent_router/routers/llm.py @@ -0,0 +1,45 @@ +from __future__ import annotations + +import json + +from app.core.agent.processes.v2.intent_router.routers.route_catalog import V2RouteCatalog +from app.core.agent.utils.llm import AgentLlmService + + +class V2LlmRouter: + def __init__( + self, + llm: AgentLlmService, + prompt_name: str = "v2_intent_router.route", + catalog: V2RouteCatalog | None = None, + ) -> None: + self._llm = llm + self._prompt_name = prompt_name + self._catalog = catalog or V2RouteCatalog() + + def classify(self, *, normalized_query: str, target_terms: list[str], anchors: dict) -> dict | None: + payload = { + "normalized_query": normalized_query, + "target_terms": target_terms, + "anchors": anchors, + "allowed_routes": self._catalog.allowed_routes(), + } + raw = self._llm.generate( + self._prompt_name, + json.dumps(payload, ensure_ascii=False, indent=2), + log_context="v2_intent_router", + ) + return self._parse(raw) + + def _parse(self, raw: str) -> dict | None: + try: + data = json.loads(str(raw or "").strip()) + except json.JSONDecodeError: + return None + return { + "routing_domain": str(data.get("routing_domain") or "").strip(), + "intent": str(data.get("intent") or "").strip(), + "subintent": str(data.get("subintent") or "").strip(), + "confidence": data.get("confidence"), + "reason_short": str(data.get("reason_short") or "").strip(), + } diff --git a/src/app/core/agent/processes/v2/intent_router/routers/prompts.yml b/src/app/core/agent/processes/v2/intent_router/routers/prompts.yml new file mode 100644 index 0000000..7959dc1 --- /dev/null +++ b/src/app/core/agent/processes/v2/intent_router/routers/prompts.yml @@ -0,0 +1,26 @@ +namespace: v2_intent_router + +prompts: + route: | + Ты выбираешь маршрут для узкого процесса v2. + Основной принцип: + - DOCS / DOC_EXPLAIN / FIND_FILES: запрос просит найти файл, документ или путь. + - DOCS / DOC_EXPLAIN / SUMMARY: запрос просит объяснить документацию, endpoint, архитектуру, процесс или сущность. + - GENERAL / GENERAL_QA / SUMMARY: общий обзорный вопрос без явного запроса к документации. + + Используй только маршруты из поля `allowed_routes`. + Верни confidence: + - 0.9-1.0 для явного кейса + - 0.7-0.9 для нормального кейса + - меньше 0.7 для неоднозначного кейса + + Ответь только JSON-объектом вида: + { + "routing_domain": "GENERAL" | "DOCS", + "intent": "GENERAL_QA" | "DOC_EXPLAIN", + "subintent": "SUMMARY" | "FIND_FILES", + "confidence": 0.0-1.0, + "reason_short": "короткая причина" + } + + Не добавляй markdown, комментарии и текст вне JSON. diff --git a/src/app/core/agent/processes/v2/intent_router/routers/route_catalog.py b/src/app/core/agent/processes/v2/intent_router/routers/route_catalog.py new file mode 100644 index 0000000..f4110fe --- /dev/null +++ b/src/app/core/agent/processes/v2/intent_router/routers/route_catalog.py @@ -0,0 +1,20 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.models import V2Domain, V2Intent, V2Subintent + + +class V2RouteCatalog: + _ALLOWED_ROUTES = ( + (V2Domain.DOCS, V2Intent.DOC_EXPLAIN, V2Subintent.FIND_FILES), + (V2Domain.DOCS, V2Intent.DOC_EXPLAIN, V2Subintent.SUMMARY), + (V2Domain.GENERAL, V2Intent.GENERAL_QA, V2Subintent.SUMMARY), + ) + + def allowed_routes(self) -> list[dict[str, str]]: + return [ + {"routing_domain": domain, "intent": intent, "subintent": subintent} + for domain, intent, subintent in self._ALLOWED_ROUTES + ] + + def is_allowed(self, routing_domain: str, intent: str, subintent: str) -> bool: + return (routing_domain, intent, subintent) in self._ALLOWED_ROUTES diff --git a/src/app/core/agent/processes/v2/intent_router/routers/validator.py b/src/app/core/agent/processes/v2/intent_router/routers/validator.py new file mode 100644 index 0000000..662bebc --- /dev/null +++ b/src/app/core/agent/processes/v2/intent_router/routers/validator.py @@ -0,0 +1,34 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.intent_router.routers.route_catalog import V2RouteCatalog + + +class V2RouteValidator: + def __init__(self, catalog: V2RouteCatalog | None = None) -> None: + self._catalog = catalog or V2RouteCatalog() + + def validate(self, candidate: dict | None) -> dict | None: + if not isinstance(candidate, dict): + return None + routing_domain = self._value(candidate, "routing_domain") + intent = self._value(candidate, "intent") + subintent = self._value(candidate, "subintent") + if not self._catalog.is_allowed(routing_domain, intent, subintent): + return None + return { + "routing_domain": routing_domain, + "intent": intent, + "subintent": subintent, + "confidence": self._coerce_confidence(candidate.get("confidence")), + "reason_short": self._value(candidate, "reason_short"), + } + + def _value(self, candidate: dict, key: str) -> str: + return str(candidate.get(key) or "").strip() + + def _coerce_confidence(self, value: object) -> float: + try: + confidence = float(value) + except (TypeError, ValueError): + return 0.0 + return max(0.0, min(1.0, confidence)) diff --git a/src/app/core/agent/processes/v2/models.py b/src/app/core/agent/processes/v2/models.py new file mode 100644 index 0000000..a9b86bc --- /dev/null +++ b/src/app/core/agent/processes/v2/models.py @@ -0,0 +1,87 @@ +"""Типы маршрута и выдачи retrieval для процесса v2.""" + +from __future__ import annotations + +from dataclasses import dataclass, field + + +class V2Domain: + DOCS = "DOCS" + GENERAL = "GENERAL" + + +class V2Intent: + DOC_EXPLAIN = "DOC_EXPLAIN" + GENERAL_QA = "GENERAL_QA" + + +class V2Subintent: + SUMMARY = "SUMMARY" + FIND_FILES = "FIND_FILES" + + +class V2AnchorType: + GENERAL_OVERVIEW = "GENERAL_OVERVIEW" + API_ENDPOINT = "API_ENDPOINT" + ARCHITECTURE = "ARCHITECTURE" + LOGIC_FLOW = "LOGIC_FLOW" + DOMAIN_ENTITY = "DOMAIN_ENTITY" + FIND_FILES = "FIND_FILES" + + +@dataclass(slots=True) +class V2RouteAnchors: + """Якоря из запроса для retrieval и downstream.""" + + entity_names: list[str] = field(default_factory=list) + file_names: list[str] = field(default_factory=list) + endpoint_paths: list[str] = field(default_factory=list) + target_doc_hints: list[str] = field(default_factory=list) + matched_aliases: list[str] = field(default_factory=list) + process_domain: str | None = None + process_subdomain: str | None = None + + +@dataclass(slots=True) +class V2RouteResult: + routing_domain: str + intent: str + subintent: str + user_query: str + normalized_query: str + target_terms: list[str] = field(default_factory=list) + anchors: V2RouteAnchors = field(default_factory=V2RouteAnchors) + confidence: float = 1.0 + routing_mode: str = "deterministic" + llm_router_used: bool = False + reason_short: str = "" + + @property + def domain(self) -> str: + """Совместимость с полем ``domain`` в логах и вызовах.""" + return self.routing_domain + + +@dataclass(slots=True) +class RetrievedSummary: + path: str + title: str + summary: str + document_id: str + score: int + confidence: float = 0.0 + match_reason: str = "semantic_match" + is_primary: bool = False + score_breakdown: dict[str, int] = field(default_factory=dict) + + +@dataclass(slots=True) +class RetrievedFile: + path: str + title: str + document_id: str + score: int + confidence: float + match_reason: str + is_primary: bool = False + score_breakdown: dict[str, int] = field(default_factory=dict) diff --git a/src/app/core/agent/processes/v2/process.py b/src/app/core/agent/processes/v2/process.py new file mode 100644 index 0000000..60b8893 --- /dev/null +++ b/src/app/core/agent/processes/v2/process.py @@ -0,0 +1,357 @@ +"""Процесс v2: роутинг, план retrieval, вызов rag API, сборка evidence и workflow.""" + +from __future__ import annotations + +from app.core.agent.processes.v2.anchor_signals import route_anchor_summary +from app.core.agent.processes.v2.evidence.assembler import DocsEvidenceAssembler +from app.core.agent.processes.v2.evidence.gate import DocsEvidenceGate +from app.core.agent.processes.v2.intent_router import V2IntentRouter +from app.core.agent.processes.v2.models import V2Intent, V2Subintent +from app.core.agent.processes.v2.retrieval import DocsMetadataLookupIndex +from app.core.agent.processes.v2.retrieval.policy_resolver import V2RetrievalPolicyResolver +from app.core.agent.processes.v2.retrieval.target_doc_seeding import ( + RagRowIndex, + merge_row_lists, + normalize_doc_path, + normalized_path_set, + path_variants_for_rag_query, + row_path, + seed_candidates_from_target_hints, +) +from app.core.agent.processes.v2.retrieval.v2_rag_adapter import V2RagRetrievalAdapter +from app.core.agent.processes.v2.workflows.docs_explain_find_files.context import DocsExplainFindFilesContext +from app.core.agent.processes.v2.workflows.docs_explain_find_files.graph import DocsExplainFindFilesGraph +from app.core.agent.processes.v2.workflows.docs_explain_summary.context import DocsExplainSummaryContext +from app.core.agent.processes.v2.workflows.docs_explain_summary.graph import DocsExplainSummaryGraph +from app.core.agent.processes.v2.workflows.general_summary.context import GeneralSummaryContext +from app.core.agent.processes.v2.workflows.general_summary.graph import GeneralSummaryGraph +from app.core.agent.processes.base import AgentProcess, ProcessResult +from app.core.agent.utils.llm import AgentLlmService + + +class V2Process(AgentProcess): + version = "v2" + + def __init__( + self, + llm: AgentLlmService, + policy_resolver: V2RetrievalPolicyResolver, + rag_adapter: V2RagRetrievalAdapter, + evidence_assembler: DocsEvidenceAssembler, + evidence_gate: DocsEvidenceGate | None = None, + router: V2IntentRouter | None = None, + docs_summary_prompt_name: str = "v2_docs_explain.summary_answer", + general_summary_prompt_name: str = "v2_general.summary_answer", + workflow_llm_enabled: bool = True, + ) -> None: + self._router = router or V2IntentRouter() + self._policy_resolver = policy_resolver + self._rag_adapter = rag_adapter + self._evidence_assembler = evidence_assembler + self._evidence_gate = evidence_gate or DocsEvidenceGate() + self._docs_summary_prompt_name = docs_summary_prompt_name + self._general_summary_prompt_name = general_summary_prompt_name + self._workflow_llm_enabled = workflow_llm_enabled + self._summary_graph = DocsExplainSummaryGraph(llm) + self._find_files_graph = DocsExplainFindFilesGraph() + self._general_summary_graph = GeneralSummaryGraph(llm) + + async def run(self, context) -> ProcessResult: + route = self._router.route(context.request.message) + rag_session_id = context.session.active_rag_session_id + context.trace.module("process.v2").log( + "intent_routed", + { + "routing_domain": route.routing_domain, + "intent": route.intent, + "subintent": route.subintent, + "normalized_query": route.normalized_query, + "target_terms": route.target_terms, + "anchors": route_anchor_summary(route), + "confidence": route.confidence, + "routing_mode": route.routing_mode, + "llm_router_used": route.llm_router_used, + "reason_short": route.reason_short, + "rag_session_id": rag_session_id, + }, + ) + self._log_step( + context, + "router_resolved", + { + "domain": route.routing_domain, + "intent": route.intent, + "subintent": route.subintent, + "confidence": route.confidence, + }, + ) + self._log_step( + context, + "anchors_extracted", + { + "signal_types": route_anchor_summary(route)["signal_types"], + "endpoint_paths": route.anchors.endpoint_paths, + "target_doc_hints": route.anchors.target_doc_hints, + "matched_aliases": route.anchors.matched_aliases, + "target_terms": route.target_terms, + }, + ) + self._log_step( + context, + "alias_resolution", + { + "resolved_aliases": route.anchors.matched_aliases, + "target_doc_hints": route.anchors.target_doc_hints, + }, + ) + if not rag_session_id: + if route.intent == V2Intent.GENERAL_QA: + answer = "Не могу собрать grounded summary без активной RAG-сессии с проиндексированной документацией." + self._log_step(context, "evidence_gate_checked", {"passed": False, "reason": "missing_rag_session"}) + self._log_step(context, "answer_generated", {"answer_mode": "insufficient_evidence"}) + return ProcessResult(answer=answer) + return ProcessResult(answer="Для процесса v2 нужна активная RAG-сессия проекта с проиндексированной документацией.") + plan = self._policy_resolver.resolve(route) + context.trace.module("process.v2.retrieval_policy").log( + "retrieval_plan_resolved", + {"profile": plan.profile, "layers": plan.layers, "limit": plan.limit, "filters": plan.filters}, + ) + self._log_step( + context, + "retrieval_profile_selected", + {"profile": plan.profile, "layers": plan.layers, "filters": plan.filters}, + ) + seeded_rows = await self._seed_candidates_from_target_hints(rag_session_id, plan.layers, route) + semantic_rows = await self._rag_adapter.fetch_rows(rag_session_id, route.normalized_query, plan) + metadata_rows = self._metadata_lookup_candidates([*seeded_rows, *semantic_rows], route) + rows = self._merge_candidate_rows(seeded_rows, metadata_rows, semantic_rows) + rows = await self._ensure_target_hints_in_pool(rag_session_id, rows, route) + rows = seed_candidates_from_target_hints(rows, route.anchors.target_doc_hints, RagRowIndex(rows)) + self._print_missing_target_hints(route, rows) + context.trace.module("process.v2.rag_retrieval").log( + "rag_rows_fetched", + { + "profile": plan.profile, + "row_count": len(rows), + "rows": [self._trace_row(row) for row in rows], + }, + ) + self._log_step( + context, + "candidate_generation", + { + "query": route.user_query, + "profile": plan.profile, + "details": { + "target_doc_hints": list(route.anchors.target_doc_hints), + "candidates_before_ranking": [row_path(row) for row in rows if row_path(row)], + }, + "resolved_aliases": route.anchors.matched_aliases, + "target_doc_hints": route.anchors.target_doc_hints, + "candidate_docs_before_ranking": [self._trace_row(row) for row in rows[:8]], + "sources": { + "seeded": [self._trace_row(row) for row in seeded_rows[:5]], + "metadata_lookup": [self._trace_row(row) for row in metadata_rows[:5]], + "semantic": [self._trace_row(row) for row in semantic_rows[:5]], + }, + }, + ) + self._log_step( + context, + "retrieval_executed", + { + "query": route.user_query, + "profile": plan.profile, + "row_count": len(rows), + "target_doc_hints": route.anchors.target_doc_hints, + "top_results": [self._trace_row(row) for row in rows[:5]], + }, + ) + if route.subintent == V2Subintent.FIND_FILES: + files = self._evidence_assembler.assemble_files(rows, route) + gate = self._evidence_gate.check_files(route, files) + context.trace.module("process.v2.evidence").log( + "evidence_assembled", + {"mode": "find_files", "file_count": len(files), "files": [file.path for file in files]}, + ) + self._log_step( + context, + "evidence_assembled", + {"mode": "find_files", "primary_file": files[0].path if files else None, "file_count": len(files)}, + ) + self._log_ranking(context, files) + self._log_step( + context, + "evidence_gate_checked", + {"passed": gate.passed, "reason": gate.reason, "answer_mode": gate.answer_mode}, + ) + flow_context = DocsExplainFindFilesContext( + runtime=context, + route=route, + rag_session_id=rag_session_id, + files=files, + gate_decision=gate, + ) + flow_context = await self._find_files_graph.run(flow_context) + self._log_step(context, "answer_generated", {"answer_mode": gate.answer_mode, "answer_length": len(flow_context.answer)}) + return ProcessResult(answer=flow_context.answer) + documents = self._evidence_assembler.assemble_summaries(rows, route) + gate = self._evidence_gate.check_summaries(route, documents) + context.trace.module("process.v2.evidence").log( + "evidence_assembled", + {"mode": "summary", "document_count": len(documents), "documents": [item.path for item in documents]}, + ) + self._log_step( + context, + "evidence_assembled", + {"mode": "summary", "primary_doc": documents[0].path if documents else None, "document_count": len(documents)}, + ) + self._log_ranking(context, documents) + self._log_step( + context, + "evidence_gate_checked", + {"passed": gate.passed, "reason": gate.reason, "answer_mode": gate.answer_mode}, + ) + if route.intent == V2Intent.GENERAL_QA: + flow_context = GeneralSummaryContext( + runtime=context, + route=route, + prompt_name=self._general_summary_prompt_name, + workflow_llm_enabled=self._workflow_llm_enabled, + documents=documents, + gate_decision=gate, + ) + flow_context = await self._general_summary_graph.run(flow_context) + self._log_step(context, "answer_generated", {"answer_mode": gate.answer_mode, "answer_length": len(flow_context.answer)}) + return ProcessResult(answer=flow_context.answer) + flow_context = DocsExplainSummaryContext( + runtime=context, + route=route, + rag_session_id=rag_session_id, + prompt_name=self._docs_summary_prompt_name, + workflow_llm_enabled=self._workflow_llm_enabled, + documents=documents, + gate_decision=gate, + ) + flow_context = await self._summary_graph.run(flow_context) + self._log_step(context, "answer_generated", {"answer_mode": gate.answer_mode, "answer_length": len(flow_context.answer)}) + return ProcessResult(answer=flow_context.answer) + + def _trace_row(self, row: dict) -> dict[str, object]: + metadata = row.get("metadata") or {} + content = str(row.get("content") or "").strip() + return { + "layer": str(row.get("layer") or ""), + "path": str(row.get("path") or ""), + "title": str(row.get("title") or ""), + "document_id": str(metadata.get("document_id") or metadata.get("doc_id") or ""), + "entity_name": str(metadata.get("entity_name") or ""), + "summary_text": str(metadata.get("summary_text") or "")[:400], + "section_path": str(metadata.get("section_path") or ""), + "content_preview": content[:400], + } + + def _log_step(self, context, step: str, payload: dict[str, object]) -> None: + context.trace.module("process.v2.pipeline").log(step, payload) + + def _print_missing_target_hints(self, route, rows: list[dict]) -> None: + if not route.anchors.target_doc_hints: + return + candidate_paths = normalized_path_set(rows) + for hint in route.anchors.target_doc_hints: + if not str(hint or "").strip(): + continue + normalized = normalize_doc_path(hint) + if normalized not in candidate_paths: + print("ERROR: target doc missing from candidates:", normalized) + + async def _ensure_target_hints_in_pool(self, rag_session_id: str, rows: list[dict], route) -> list[dict]: + hints_raw = [str(item).strip() for item in route.anchors.target_doc_hints if str(item or "").strip()] + if not hints_raw: + return rows + pool = normalized_path_set(rows) + missing_hints = [h for h in hints_raw if normalize_doc_path(h) not in pool] + if not missing_hints: + return rows + variant_paths: list[str] = [] + for h in missing_hints: + variant_paths.extend(path_variants_for_rag_query(h)) + variant_paths = list(dict.fromkeys(variant_paths)) + extra_exact = await self._rag_adapter.fetch_exact_paths(rag_session_id, paths=variant_paths, layers=None) + pool2 = normalized_path_set(extra_exact) + still_missing = [h for h in missing_hints if normalize_doc_path(h) not in pool2] + fallback_rows: list[dict] = [] + if still_missing: + needles = [normalize_doc_path(h).split("/")[-1] for h in still_missing] + needles = list(dict.fromkeys(n for n in needles if n)) + if needles: + fallback_rows = await self._rag_adapter.fetch_chunks_by_path_substrings( + rag_session_id, + path_needles=needles, + layers=None, + ) + return merge_row_lists(rows, extra_exact, fallback_rows) + + async def _seed_candidates_from_target_hints(self, rag_session_id: str, layers: list[str], route) -> list[dict]: + del layers # seed по пути должен видеть все слои (иначе D0-only чанки теряются при file_lookup). + hints_raw = [str(item).strip() for item in route.anchors.target_doc_hints if str(item or "").strip()] + if not hints_raw: + return [] + variant_paths: list[str] = [] + for h in hints_raw: + variant_paths.extend(path_variants_for_rag_query(h)) + variant_paths = list(dict.fromkeys(variant_paths)) + exact_rows = await self._rag_adapter.fetch_exact_paths(rag_session_id, paths=variant_paths, layers=None) + paths_found = normalized_path_set(exact_rows) + missing = [h for h in hints_raw if normalize_doc_path(h) not in paths_found] + if not missing: + return exact_rows + needles = [normalize_doc_path(h).split("/")[-1] for h in missing] + needles = list(dict.fromkeys(n for n in needles if n)) + if not needles: + return exact_rows + fallback_rows = await self._rag_adapter.fetch_chunks_by_path_substrings( + rag_session_id, + path_needles=needles, + layers=None, + ) + return merge_row_lists(exact_rows, fallback_rows) + + def _metadata_lookup_candidates(self, rows: list[dict], route) -> list[dict]: + return DocsMetadataLookupIndex(rows).lookup(route) + + def _merge_candidate_rows(self, *groups: list[dict]) -> list[dict]: + return merge_row_lists(*groups) + + def _log_ranking(self, context, items: list) -> None: + top_docs: list[dict[str, object]] = [] + for item in items[:4]: + top_docs.append( + { + "doc": getattr(item, "path", ""), + "score": getattr(item, "score", 0), + "match_reason": getattr(item, "match_reason", ""), + } + ) + context.trace.module("process.v2.pipeline").log( + "ranking_explained", + { + "doc": getattr(item, "path", ""), + "score_breakdown": getattr(item, "score_breakdown", {}), + "score": getattr(item, "score", 0), + "match_reason": getattr(item, "match_reason", ""), + }, + ) + context.trace.module("process.v2.pipeline").log( + "ranking_explained", + { + "top_docs_after_ranking": top_docs, + "ranking_score_breakdown": [ + { + "doc": getattr(item, "path", ""), + "score_breakdown": getattr(item, "score_breakdown", {}), + } + for item in items[:4] + ], + }, + ) diff --git a/src/app/core/agent/processes/v2/prompts.yml b/src/app/core/agent/processes/v2/prompts.yml new file mode 100644 index 0000000..eee92f7 --- /dev/null +++ b/src/app/core/agent/processes/v2/prompts.yml @@ -0,0 +1,8 @@ +namespace: v2_docs_explain + +prompts: + summary_answer: | + Ты объясняешь документацию только на основе найденных SUMMARY-блоков. + Используй только факты из входного контекста. + Если информации мало, прямо скажи об этом и не додумывай детали. + В конце перечисли файлы, на которые ты опирался. diff --git a/src/app/core/agent/processes/v2/retrieval/__init__.py b/src/app/core/agent/processes/v2/retrieval/__init__.py new file mode 100644 index 0000000..11efcb3 --- /dev/null +++ b/src/app/core/agent/processes/v2/retrieval/__init__.py @@ -0,0 +1,17 @@ +from app.core.agent.processes.v2.retrieval.metadata_lookup import DocsMetadataLookupIndex +from app.core.agent.processes.v2.retrieval.policy_resolver import V2RetrievalPolicyResolver +from app.core.agent.processes.v2.retrieval.target_doc_seeding import ( + RagRowIndex, + normalize_doc_path, + seed_candidates_from_target_hints, +) +from app.core.agent.processes.v2.retrieval.v2_rag_adapter import V2RagRetrievalAdapter + +__all__ = [ + "V2RetrievalPolicyResolver", + "V2RagRetrievalAdapter", + "DocsMetadataLookupIndex", + "normalize_doc_path", + "RagRowIndex", + "seed_candidates_from_target_hints", +] diff --git a/src/app/core/agent/processes/v2/retrieval/metadata_lookup.py b/src/app/core/agent/processes/v2/retrieval/metadata_lookup.py new file mode 100644 index 0000000..6125329 --- /dev/null +++ b/src/app/core/agent/processes/v2/retrieval/metadata_lookup.py @@ -0,0 +1,66 @@ +from __future__ import annotations + +import re +from collections import defaultdict + +from app.core.agent.processes.v2.models import V2RouteResult + + +class DocsMetadataLookupIndex: + def __init__(self, rows: list[dict]) -> None: + self._rows_by_path: dict[str, dict] = {} + self._rows_by_basename: dict[str, list[dict]] = defaultdict(list) + self._rows_by_slug: dict[str, list[dict]] = defaultdict(list) + self._rows_by_title_token: dict[str, list[dict]] = defaultdict(list) + self._rows_by_compact: dict[str, list[dict]] = defaultdict(list) + for row in rows: + path = str(row.get("path") or "").strip() + if not path or path in self._rows_by_path: + continue + self._rows_by_path[path] = row + basename = path.split("/")[-1].lower() + slug = basename.removesuffix(".md").removesuffix(".yaml").removesuffix(".yml") + self._rows_by_basename[basename].append(row) + self._rows_by_slug[slug].append(row) + self._rows_by_compact[self._compact(slug)].append(row) + title = str(row.get("title") or "").lower() + for token in self._tokens(title): + self._rows_by_title_token[token].append(row) + self._rows_by_compact[self._compact(title)].append(row) + entity_name = str(dict(row.get("metadata") or {}).get("entity_name") or "").lower() + if entity_name: + self._rows_by_compact[self._compact(entity_name)].append(row) + + def lookup(self, route: V2RouteResult) -> list[dict]: + candidates: list[dict] = [] + seen: set[str] = set() + for path in route.anchors.target_doc_hints: + self._append(candidates, seen, self._rows_by_path.get(path)) + lookup_tokens = list(route.target_terms) + list(route.anchors.matched_aliases) + list(route.anchors.endpoint_paths) + for token in self._tokens(" ".join(lookup_tokens)): + for bucket in ( + self._rows_by_basename.get(token, []), + self._rows_by_slug.get(token, []), + self._rows_by_title_token.get(token, []), + ): + for row in bucket: + self._append(candidates, seen, row) + for compact in {self._compact(item) for item in lookup_tokens if item}: + for row in self._rows_by_compact.get(compact, []): + self._append(candidates, seen, row) + return candidates + + def _append(self, items: list[dict], seen: set[str], row: dict | None) -> None: + if row is None: + return + path = str(row.get("path") or "").strip() + if not path or path in seen: + return + seen.add(path) + items.append(row) + + def _tokens(self, value: str) -> list[str]: + return [token for token in re.split(r"[^a-zA-Zа-яА-Я0-9]+", str(value or "").lower()) if len(token) >= 3] + + def _compact(self, value: str) -> str: + return "".join(self._tokens(value)) diff --git a/src/app/core/agent/processes/v2/retrieval/policy_resolver.py b/src/app/core/agent/processes/v2/retrieval/policy_resolver.py new file mode 100644 index 0000000..bd424d3 --- /dev/null +++ b/src/app/core/agent/processes/v2/retrieval/policy_resolver.py @@ -0,0 +1,118 @@ +"""Intent-aware retrieval policy resolver для процесса v2.""" + +from __future__ import annotations + +from app.core.agent.processes.v2.anchor_signals import anchor_signal_types +from app.core.agent.processes.v2.models import V2AnchorType, V2Intent, V2RouteResult, V2Subintent +from app.core.rag.contracts.enums import RagLayer +from app.core.rag.retrieval.session_retriever import RetrievalPlan + + +class V2RetrievalPolicyResolver: + _SUMMARY_LAYERS = [ + RagLayer.DOCS_DOCUMENT_CATALOG, + RagLayer.DOCS_ENTITY_CATALOG, + RagLayer.DOCS_DOC_CHUNKS, + ] + _GENERAL_LAYERS = [ + RagLayer.DOCS_DOCUMENT_CATALOG, + RagLayer.DOCS_DOC_CHUNKS, + ] + + def resolve(self, route: V2RouteResult) -> RetrievalPlan: + if route.intent == V2Intent.GENERAL_QA: + return RetrievalPlan( + profile="general_qa_grounded_summary", + layers=list(self._GENERAL_LAYERS), + limit=8, + filters=self._general_filters(route), + ) + if route.subintent == V2Subintent.FIND_FILES: + return RetrievalPlan( + profile="file_lookup", + layers=[RagLayer.DOCS_DOCUMENT_CATALOG, RagLayer.DOCS_ENTITY_CATALOG], + limit=12, + filters=self._find_files_filters(route), + ) + return RetrievalPlan( + profile=self._summary_profile(route), + layers=list(self._SUMMARY_LAYERS), + limit=8, + filters=self._summary_filters(route), + ) + + def _summary_profile(self, route: V2RouteResult) -> str: + signals = anchor_signal_types(route) + if len(signals - {V2AnchorType.FIND_FILES}) != 1: + return "docs_summary_generic" + mapping = { + V2AnchorType.API_ENDPOINT: "docs_summary_api_endpoint", + V2AnchorType.ARCHITECTURE: "docs_summary_architecture", + V2AnchorType.LOGIC_FLOW: "docs_summary_logic_flow", + V2AnchorType.DOMAIN_ENTITY: "docs_summary_domain_entity", + } + signal = next(iter(signals - {V2AnchorType.FIND_FILES}), None) + return mapping.get(signal, "docs_summary_generic") + + def _general_filters(self, route: V2RouteResult) -> dict[str, object]: + return { + "prefer_path_prefixes": ["docs/architecture/", "docs/"], + "prefer_like_patterns": ["%README.md%", "%overview%"], + "target_doc_hints": list(route.anchors.target_doc_hints), + } + + def _summary_filters(self, route: V2RouteResult) -> dict[str, object]: + filters: dict[str, object] = { + "prefer_path_prefixes": self._summary_prefixes(route), + "prefer_like_patterns": self._prefer_like_patterns(route), + "target_doc_hints": list(route.anchors.target_doc_hints), + } + if V2AnchorType.API_ENDPOINT in anchor_signal_types(route): + filters["path_prefixes"] = ["docs/api/", "docs/architecture/", "docs/"] + return filters + + def _find_files_filters(self, route: V2RouteResult) -> dict[str, object]: + filters: dict[str, object] = { + "prefer_path_prefixes": self._find_files_prefixes(route), + "prefer_like_patterns": self._prefer_like_patterns(route), + "target_doc_hints": list(route.anchors.target_doc_hints), + } + if route.anchors.target_doc_hints: + filters["prefer_like_patterns"] = [f"%{path.split('/')[-1]}%" for path in route.anchors.target_doc_hints] + return filters + + def _prefer_like_patterns(self, route: V2RouteResult) -> list[str]: + patterns: list[str] = [] + for path in route.anchors.target_doc_hints: + patterns.append(f"%{path.split('/')[-1]}%") + for endpoint in route.anchors.endpoint_paths: + patterns.append(f"%{endpoint}%") + return patterns + + def _find_files_prefixes(self, route: V2RouteResult) -> list[str]: + if route.anchors.target_doc_hints: + prefixes = ["/".join(path.split("/")[:-1]) + "/" for path in route.anchors.target_doc_hints] + return [prefix for prefix in prefixes if prefix] + signals = anchor_signal_types(route) + if V2AnchorType.API_ENDPOINT in signals: + return ["docs/api/", "docs/"] + if V2AnchorType.ARCHITECTURE in signals: + return ["docs/architecture/", "docs/"] + if V2AnchorType.LOGIC_FLOW in signals: + return ["docs/logic/", "docs/"] + if V2AnchorType.DOMAIN_ENTITY in signals: + return ["docs/domains/", "docs/"] + return ["docs/"] + + def _summary_prefixes(self, route: V2RouteResult) -> list[str]: + signals = anchor_signal_types(route) + prefixes: list[str] = [] + if V2AnchorType.API_ENDPOINT in signals: + prefixes.extend(["docs/api/", "docs/"]) + if V2AnchorType.ARCHITECTURE in signals: + prefixes.extend(["docs/architecture/", "docs/"]) + if V2AnchorType.LOGIC_FLOW in signals: + prefixes.extend(["docs/logic/", "docs/architecture/", "docs/"]) + if V2AnchorType.DOMAIN_ENTITY in signals: + prefixes.extend(["docs/domains/", "docs/api/", "docs/architecture/"]) + return list(dict.fromkeys(prefixes or ["docs/"])) diff --git a/src/app/core/agent/processes/v2/retrieval/target_doc_seeding.py b/src/app/core/agent/processes/v2/retrieval/target_doc_seeding.py new file mode 100644 index 0000000..3c8151f --- /dev/null +++ b/src/app/core/agent/processes/v2/retrieval/target_doc_seeding.py @@ -0,0 +1,114 @@ +from __future__ import annotations + + +def normalize_doc_path(path: str | None) -> str: + value = str(path or "").strip().replace("\\", "/") + if not value: + return "" + while "//" in value: + value = value.replace("//", "/") + while value.startswith("./"): + value = value[2:] + value = value.lstrip("/") + docs_idx = value.lower().find("docs/") + if docs_idx >= 0: + value = value[docs_idx:] + elif "/" not in value and value.lower().endswith(".md"): + value = f"docs/{value}" + return value.strip() + + +def row_path(row: dict) -> str: + metadata = dict(row.get("metadata") or {}) + raw = row.get("path") or metadata.get("source_path") or "" + return normalize_doc_path(str(raw)) + + +def normalized_path_set(rows: list[dict]) -> set[str]: + return {path for row in rows if (path := row_path(row))} + + +def path_variants_for_rag_query(path: str | None) -> list[str]: + normalized = normalize_doc_path(path) + if not normalized: + return [] + variants = [normalized] + if normalized.startswith("docs/"): + variants.append(normalized.removeprefix("docs/")) + else: + variants.append(f"docs/{normalized}") + basename = normalized.split("/")[-1] + if basename and basename not in variants: + variants.append(basename) + return list(dict.fromkeys(variants)) + + +def merge_row_lists(*groups: list[dict]) -> list[dict]: + merged: list[dict] = [] + seen: set[tuple[str, str, str]] = set() + for rows in groups: + for row in rows: + metadata = dict(row.get("metadata") or {}) + key = ( + row_path(row), + str(row.get("layer") or ""), + str(metadata.get("section_path") or ""), + ) + if key in seen: + continue + seen.add(key) + merged.append(row) + return merged + + +class RagRowIndex: + def __init__(self, rows: list[dict]) -> None: + self._by_path: dict[str, list[dict]] = {} + self._by_name: dict[str, list[dict]] = {} + for row in rows: + normalized = row_path(row) + if not normalized: + continue + self._by_path.setdefault(normalized.lower(), []).append(row) + basename = normalized.split("/")[-1].lower() + self._by_name.setdefault(basename, []).append(row) + + def lookup(self, hint: str | None) -> list[dict]: + matches: list[dict] = [] + seen_ids: set[int] = set() + for variant in path_variants_for_rag_query(hint): + key = variant.lower() + for row in self._by_path.get(key, []): + row_id = id(row) + if row_id in seen_ids: + continue + seen_ids.add(row_id) + matches.append(row) + basename = normalize_doc_path(hint).split("/")[-1].lower() + for row in self._by_name.get(basename, []): + row_id = id(row) + if row_id in seen_ids: + continue + seen_ids.add(row_id) + matches.append(row) + return matches + + +def seed_candidates_from_target_hints(rows: list[dict], hints: list[str], index: RagRowIndex | None = None) -> list[dict]: + hints_raw = [str(hint).strip() for hint in hints if str(hint or "").strip()] + if not hints_raw or not rows: + return rows + rag_index = index or RagRowIndex(rows) + seeded = [match for hint in hints_raw for match in rag_index.lookup(hint)] + return merge_row_lists(seeded, rows) + + +__all__ = [ + "RagRowIndex", + "merge_row_lists", + "normalize_doc_path", + "normalized_path_set", + "path_variants_for_rag_query", + "row_path", + "seed_candidates_from_target_hints", +] diff --git a/src/app/core/agent/processes/v2/retrieval/v2_rag_adapter.py b/src/app/core/agent/processes/v2/retrieval/v2_rag_adapter.py new file mode 100644 index 0000000..b5ca6d0 --- /dev/null +++ b/src/app/core/agent/processes/v2/retrieval/v2_rag_adapter.py @@ -0,0 +1,33 @@ +"""Адаптер v2 к :class:`RagSessionRetriever` для подстановки в тестах.""" + +from __future__ import annotations + +from app.core.rag.retrieval.session_retriever import RagSessionRetriever, RetrievalPlan + + +class V2RagRetrievalAdapter: + """Обёртка над :class:`RagSessionRetriever` для подмены в тестах.""" + + def __init__(self, retriever: RagSessionRetriever) -> None: + self._retriever = retriever + + async def fetch_rows(self, rag_session_id: str, query_text: str, plan: RetrievalPlan) -> list[dict]: + return await self._retriever.retrieve(rag_session_id, query_text, plan) + + async def fetch_exact_paths(self, rag_session_id: str, *, paths: list[str], layers: list[str] | None = None) -> list[dict]: + return await self._retriever.retrieve_exact_files(rag_session_id, paths=paths, layers=layers) + + async def fetch_chunks_by_path_substrings( + self, + rag_session_id: str, + *, + path_needles: list[str], + layers: list[str] | None = None, + limit: int = 200, + ) -> list[dict]: + return await self._retriever.retrieve_chunks_by_path_substrings( + rag_session_id, + path_needles=path_needles, + layers=layers, + limit=limit, + ) diff --git a/src/app/modules/agent/orchestration/__init__.py b/src/app/core/agent/processes/v2/workflows/__init__.py similarity index 100% rename from src/app/modules/agent/orchestration/__init__.py rename to src/app/core/agent/processes/v2/workflows/__init__.py diff --git a/src/app/core/agent/processes/v2/workflows/docs_explain_find_files/__init__.py b/src/app/core/agent/processes/v2/workflows/docs_explain_find_files/__init__.py new file mode 100644 index 0000000..74d0a49 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/docs_explain_find_files/__init__.py @@ -0,0 +1,3 @@ +from app.core.agent.processes.v2.workflows.docs_explain_find_files.graph import DocsExplainFindFilesGraph + +__all__ = ["DocsExplainFindFilesGraph"] diff --git a/src/app/core/agent/processes/v2/workflows/docs_explain_find_files/context.py b/src/app/core/agent/processes/v2/workflows/docs_explain_find_files/context.py new file mode 100644 index 0000000..51dad0a --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/docs_explain_find_files/context.py @@ -0,0 +1,17 @@ +from __future__ import annotations + +from dataclasses import dataclass, field + +from app.core.agent.processes.v2.evidence.gate import EvidenceGateDecision +from app.core.agent.processes.v2.models import RetrievedFile, V2RouteResult +from app.core.agent.runtime.execution_context import RuntimeExecutionContext + + +@dataclass(slots=True) +class DocsExplainFindFilesContext: + runtime: RuntimeExecutionContext + route: V2RouteResult + rag_session_id: str + files: list[RetrievedFile] = field(default_factory=list) + gate_decision: EvidenceGateDecision | None = None + answer: str = "" diff --git a/src/app/core/agent/processes/v2/workflows/docs_explain_find_files/graph.py b/src/app/core/agent/processes/v2/workflows/docs_explain_find_files/graph.py new file mode 100644 index 0000000..e9ad91f --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/docs_explain_find_files/graph.py @@ -0,0 +1,16 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.workflows.docs_explain_find_files.context import DocsExplainFindFilesContext +from app.core.agent.processes.v2.workflows.docs_explain_find_files.steps.finalize_find_files_answer_step import ( + FinalizeFindFilesAnswerStep, +) +from app.core.agent.processes.v2.workflows.v2_workflow_graph import V2WorkflowGraph + + +class DocsExplainFindFilesGraph(V2WorkflowGraph[DocsExplainFindFilesContext]): + def __init__(self) -> None: + super().__init__( + workflow_id="v2.docs_explain.find_files", + source="workflow.v2.find_files", + steps=[FinalizeFindFilesAnswerStep()], + ) diff --git a/src/app/core/agent/processes/v2/workflows/docs_explain_find_files/steps/finalize_find_files_answer_step.py b/src/app/core/agent/processes/v2/workflows/docs_explain_find_files/steps/finalize_find_files_answer_step.py new file mode 100644 index 0000000..863ae4c --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/docs_explain_find_files/steps/finalize_find_files_answer_step.py @@ -0,0 +1,25 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.workflows.docs_explain_find_files.context import DocsExplainFindFilesContext +from app.core.agent.utils.workflow import WorkflowStep + + +class FinalizeFindFilesAnswerStep(WorkflowStep[DocsExplainFindFilesContext]): + step_id = "finalize_find_files_answer" + title = "Сборка списка файлов" + + async def run(self, context: DocsExplainFindFilesContext) -> DocsExplainFindFilesContext: + if not context.files: + context.answer = "Не нашёл файлов документации, которые уверенно соответствуют запросу." + return context + if context.gate_decision is not None and context.gate_decision.reason == "low_confidence_shortlist": + context.answer = "\n".join(item.path for item in context.files[:4]) + return context + if len(context.files) == 1: + context.answer = context.files[0].path + return context + context.answer = "\n".join(item.path for item in context.files[:4]) + return context + + def trace_output(self, context: DocsExplainFindFilesContext) -> dict[str, object]: + return {"answer_length": len(context.answer)} diff --git a/src/app/core/agent/processes/v2/workflows/docs_explain_summary/__init__.py b/src/app/core/agent/processes/v2/workflows/docs_explain_summary/__init__.py new file mode 100644 index 0000000..99020fa --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/docs_explain_summary/__init__.py @@ -0,0 +1,3 @@ +from app.core.agent.processes.v2.workflows.docs_explain_summary.graph import DocsExplainSummaryGraph + +__all__ = ["DocsExplainSummaryGraph"] diff --git a/src/app/core/agent/processes/v2/workflows/docs_explain_summary/context.py b/src/app/core/agent/processes/v2/workflows/docs_explain_summary/context.py new file mode 100644 index 0000000..660dd63 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/docs_explain_summary/context.py @@ -0,0 +1,20 @@ +from __future__ import annotations + +from dataclasses import dataclass, field + +from app.core.agent.processes.v2.evidence.gate import EvidenceGateDecision +from app.core.agent.processes.v2.models import RetrievedSummary, V2RouteResult +from app.core.agent.runtime.execution_context import RuntimeExecutionContext + + +@dataclass(slots=True) +class DocsExplainSummaryContext: + runtime: RuntimeExecutionContext + route: V2RouteResult + rag_session_id: str + prompt_name: str + workflow_llm_enabled: bool = True + documents: list[RetrievedSummary] = field(default_factory=list) + gate_decision: EvidenceGateDecision | None = None + prompt_input: str = "" + answer: str = "" diff --git a/src/app/core/agent/processes/v2/workflows/docs_explain_summary/graph.py b/src/app/core/agent/processes/v2/workflows/docs_explain_summary/graph.py new file mode 100644 index 0000000..d1df68a --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/docs_explain_summary/graph.py @@ -0,0 +1,17 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.workflows.docs_explain_summary.context import DocsExplainSummaryContext +from app.core.agent.processes.v2.workflows.docs_explain_summary.steps.generate_summary_answer_step import ( + GenerateSummaryAnswerStep, +) +from app.core.agent.processes.v2.workflows.v2_workflow_graph import V2WorkflowGraph +from app.core.agent.utils.llm import AgentLlmService + + +class DocsExplainSummaryGraph(V2WorkflowGraph[DocsExplainSummaryContext]): + def __init__(self, llm: AgentLlmService) -> None: + super().__init__( + workflow_id="v2.docs_explain.summary", + source="workflow.v2.summary", + steps=[GenerateSummaryAnswerStep(llm)], + ) diff --git a/src/app/core/agent/processes/v2/workflows/docs_explain_summary/steps/generate_summary_answer_step.py b/src/app/core/agent/processes/v2/workflows/docs_explain_summary/steps/generate_summary_answer_step.py new file mode 100644 index 0000000..030fa50 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/docs_explain_summary/steps/generate_summary_answer_step.py @@ -0,0 +1,68 @@ +from __future__ import annotations + +import asyncio +import json + +from app.core.agent.processes.v2.anchor_signals import route_anchor_summary +from app.core.agent.utils.llm import AgentLlmService +from app.core.agent.processes.v2.workflows.docs_explain_summary.context import DocsExplainSummaryContext +from app.core.agent.utils.workflow import WorkflowStep + + +class GenerateSummaryAnswerStep(WorkflowStep[DocsExplainSummaryContext]): + step_id = "generate_summary_answer" + title = "Сборка ответа по summary" + + def __init__(self, llm: AgentLlmService) -> None: + self._llm = llm + + async def run(self, context: DocsExplainSummaryContext) -> DocsExplainSummaryContext: + if context.gate_decision is not None and not context.gate_decision.passed: + context.answer = context.gate_decision.message + return context + if not context.workflow_llm_enabled: + context.answer = self._build_deterministic_answer(context) + return context + if not context.documents: + context.answer = "Не нашёл подходящих SUMMARY-блоков в документации по этому запросу." + return context + context.prompt_input = self._build_prompt_input(context) + request_id = context.runtime.request.request_id + context.answer = await asyncio.to_thread( + self._llm.generate, + context.prompt_name, + context.prompt_input, + log_context=f"agent:{request_id}", + trace=context.runtime.trace.module("workflow.v2.summary.llm"), + ) + return context + + def _build_prompt_input(self, context: DocsExplainSummaryContext) -> str: + blocks = [ + f"Запрос пользователя:\n{context.route.user_query}", + "Сигналы запроса:\n" + json.dumps(route_anchor_summary(context.route), ensure_ascii=False, indent=2), + "Найденные SUMMARY-блоки:", + ] + for index, item in enumerate(context.documents, start=1): + blocks.append( + f"{index}. path: {item.path}\n" + f"title: {item.title}\n" + f"match_reason: {item.match_reason}\n" + f"summary: {item.summary}" + ) + return "\n\n".join(blocks) + + def _build_deterministic_answer(self, context: DocsExplainSummaryContext) -> str: + if not context.documents: + return "Не нашёл подходящих SUMMARY-блоков в документации по этому запросу." + lines = [] + primary = context.documents[0] + lines.append(primary.summary) + lines.append("") + lines.append("Файлы-источники:") + for item in context.documents: + lines.append(f"- {item.path}") + return "\n".join(lines) + + def trace_output(self, context: DocsExplainSummaryContext) -> dict[str, object]: + return {"answer_length": len(context.answer)} diff --git a/src/app/core/agent/processes/v2/workflows/general_summary/__init__.py b/src/app/core/agent/processes/v2/workflows/general_summary/__init__.py new file mode 100644 index 0000000..732779c --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/general_summary/__init__.py @@ -0,0 +1,3 @@ +from app.core.agent.processes.v2.workflows.general_summary.graph import GeneralSummaryGraph + +__all__ = ["GeneralSummaryGraph"] diff --git a/src/app/core/agent/processes/v2/workflows/general_summary/context.py b/src/app/core/agent/processes/v2/workflows/general_summary/context.py new file mode 100644 index 0000000..d2b2507 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/general_summary/context.py @@ -0,0 +1,19 @@ +from __future__ import annotations + +from dataclasses import dataclass, field + +from app.core.agent.processes.v2.evidence.gate import EvidenceGateDecision +from app.core.agent.processes.v2.models import RetrievedSummary, V2RouteResult +from app.core.agent.runtime.execution_context import RuntimeExecutionContext + + +@dataclass(slots=True) +class GeneralSummaryContext: + runtime: RuntimeExecutionContext + route: V2RouteResult + prompt_name: str + workflow_llm_enabled: bool = True + documents: list[RetrievedSummary] = field(default_factory=list) + gate_decision: EvidenceGateDecision | None = None + prompt_input: str = "" + answer: str = "" diff --git a/src/app/core/agent/processes/v2/workflows/general_summary/graph.py b/src/app/core/agent/processes/v2/workflows/general_summary/graph.py new file mode 100644 index 0000000..5441cad --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/general_summary/graph.py @@ -0,0 +1,17 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.workflows.general_summary.context import GeneralSummaryContext +from app.core.agent.processes.v2.workflows.general_summary.steps.generate_general_summary_answer_step import ( + GenerateGeneralSummaryAnswerStep, +) +from app.core.agent.processes.v2.workflows.v2_workflow_graph import V2WorkflowGraph +from app.core.agent.utils.llm import AgentLlmService + + +class GeneralSummaryGraph(V2WorkflowGraph[GeneralSummaryContext]): + def __init__(self, llm: AgentLlmService) -> None: + super().__init__( + workflow_id="v2.general_qa.summary", + source="workflow.v2.general_summary", + steps=[GenerateGeneralSummaryAnswerStep(llm)], + ) diff --git a/src/app/core/agent/processes/v2/workflows/general_summary/steps/generate_general_summary_answer_step.py b/src/app/core/agent/processes/v2/workflows/general_summary/steps/generate_general_summary_answer_step.py new file mode 100644 index 0000000..5e6945f --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/general_summary/steps/generate_general_summary_answer_step.py @@ -0,0 +1,57 @@ +from __future__ import annotations + +import asyncio + +from app.core.agent.processes.v2.workflows.general_summary.context import GeneralSummaryContext +from app.core.agent.utils.llm import AgentLlmService +from app.core.agent.utils.workflow import WorkflowStep + + +class GenerateGeneralSummaryAnswerStep(WorkflowStep[GeneralSummaryContext]): + step_id = "generate_general_summary_answer" + title = "Общий ответ через LLM" + + def __init__(self, llm: AgentLlmService) -> None: + self._llm = llm + + async def run(self, context: GeneralSummaryContext) -> GeneralSummaryContext: + if context.gate_decision is not None and not context.gate_decision.passed: + context.answer = context.gate_decision.message + return context + if not context.workflow_llm_enabled: + context.answer = self._build_deterministic_answer(context) + return context + context.prompt_input = self._build_prompt_input(context) + request_id = context.runtime.request.request_id + context.answer = await asyncio.to_thread( + self._llm.generate, + context.prompt_name, + context.prompt_input, + log_context=f"agent:{request_id}", + trace=context.runtime.trace.module("workflow.v2.general_summary.llm"), + ) + return context + + def _build_prompt_input(self, context: GeneralSummaryContext) -> str: + blocks = [ + f"Запрос пользователя:\n{context.route.user_query}", + "Опорные документы:", + ] + for index, item in enumerate(context.documents, start=1): + blocks.append( + f"{index}. path: {item.path}\n" + f"title: {item.title}\n" + f"summary: {item.summary}" + ) + return "\n\n".join(blocks) + + def _build_deterministic_answer(self, context: GeneralSummaryContext) -> str: + if not context.documents: + return "В найденной документации нет достаточной опоры для общего summary по запросу." + return "\n".join(item.summary for item in context.documents[:2] if item.summary) + + def trace_input(self, context: GeneralSummaryContext) -> dict[str, object]: + return {"query": context.route.normalized_query} + + def trace_output(self, context: GeneralSummaryContext) -> dict[str, object]: + return {"answer_length": len(context.answer)} diff --git a/src/app/core/agent/processes/v2/workflows/v2_workflow_graph.py b/src/app/core/agent/processes/v2/workflows/v2_workflow_graph.py new file mode 100644 index 0000000..b3db545 --- /dev/null +++ b/src/app/core/agent/processes/v2/workflows/v2_workflow_graph.py @@ -0,0 +1,39 @@ +"""Workflow-граф v2: буфер шаговых логов и один сброс в trace в конце прогона.""" + +from __future__ import annotations + +from typing import Generic, Sequence, TypeVar + +from app.core.agent.utils.workflow.context import WorkflowContext +from app.core.agent.utils.workflow.graph import WorkflowGraph +from app.core.agent.utils.workflow.step import WorkflowStep + + +TContext = TypeVar("TContext", bound=WorkflowContext) + + +class V2WorkflowGraph(WorkflowGraph[TContext]): + """Не логирует step_started/step_completed по отдельности; сбрасывает буфер в ``workflow_trace_flushed``.""" + + 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: + inp = step.trace_input(context) + 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) + out = step.trace_output(context) + 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 diff --git a/src/app/core/agent/runtime/__init__.py b/src/app/core/agent/runtime/__init__.py new file mode 100644 index 0000000..0327fa6 --- /dev/null +++ b/src/app/core/agent/runtime/__init__.py @@ -0,0 +1,13 @@ +from app.core.agent.runtime.agent_runtime import AgentRuntime +from app.core.agent.runtime.execution_context import RuntimeExecutionContext +from app.core.agent.runtime.process_registry import ProcessRegistry +from app.core.agent.runtime.process_runner import ProcessRunner +from app.core.agent.runtime.publisher import RuntimeEventPublisher + +__all__ = [ + "AgentRuntime", + "ProcessRegistry", + "ProcessRunner", + "RuntimeEventPublisher", + "RuntimeExecutionContext", +] diff --git a/src/app/core/agent/runtime/agent_runtime.py b/src/app/core/agent/runtime/agent_runtime.py new file mode 100644 index 0000000..817513e --- /dev/null +++ b/src/app/core/agent/runtime/agent_runtime.py @@ -0,0 +1,107 @@ +from __future__ import annotations + +from datetime import datetime, timezone + +from app.core.api.application.session_service import SessionService +from app.core.api.domain.models.agent_request import AgentRequest +from app.core.api.domain.models.agent_session import AgentSession +from app.core.api.infrastructure.stores.in_memory_request_store import InMemoryRequestStore +from app.core.agent.runtime.execution_context import RuntimeExecutionContext +from app.core.agent.runtime.process_registry import ProcessRegistry +from app.core.agent.runtime.process_runner import ProcessRunner +from app.core.agent.runtime.publisher import RuntimeEventPublisher +from app.infra.exceptions import AppError +from app.infra.observability.module_trace import RequestTraceContext +from app.infra.observability.request_trace_logger import RequestTraceLogger +from app.schemas.common import ErrorPayload, ModuleName +from app.schemas.orchestration import RequestExecutionStatus + + +class AgentRuntime: + def __init__( + self, + request_store: InMemoryRequestStore, + sessions: SessionService, + process_registry: ProcessRegistry, + process_runner: ProcessRunner, + publisher: RuntimeEventPublisher, + trace_logger: RequestTraceLogger, + ) -> None: + self._request_store = request_store + self._sessions = sessions + self._process_registry = process_registry + self._process_runner = process_runner + self._publisher = publisher + self._trace_logger = trace_logger + + async def run(self, request: AgentRequest, session: AgentSession) -> None: + try: + process = self._resolve_process(request.process_version) + self._start_request(request, session) + context = RuntimeExecutionContext( + request=request, + session=session, + publisher=self._publisher, + trace=RequestTraceContext(request_id=request.request_id, logger=self._trace_logger), + ) + await self._announce_start(request.request_id, process.version) + result = await self._process_runner.run(context, process) + request.answer = result.answer + await self._publish_result(request) + self._complete_request(request, session) + except Exception as exc: + await self._fail_request(request, exc) + + def _resolve_process(self, version: str): + process = self._process_registry.get(version) + if process is None: + raise AppError("process_not_found", f"Unsupported process version: {version}", ModuleName.AGENT) + return process + + def _start_request(self, request: AgentRequest, session: AgentSession) -> None: + request.status = RequestExecutionStatus.RUNNING + self._request_store.save(request) + self._trace_logger.start_request(request, session) + + async def _announce_start(self, request_id: str, process_version: str) -> None: + await self._publisher.publish_status(request_id, "runtime", "Запрос принят и поставлен в обработку.") + await self._publisher.publish_status( + request_id, + "runtime", + f"Запускаю процесс {process_version}.", + {"process_version": process_version}, + ) + + async def _publish_result(self, request: AgentRequest) -> None: + await self._publisher.publish_user(request.request_id, "agent", request.answer or "") + await self._publisher.publish_status(request.request_id, "runtime", "Обработка запроса завершена.") + + def _complete_request(self, request: AgentRequest, session: AgentSession) -> None: + session.append_turn(user_message=request.message, assistant_message=request.answer or "") + self._sessions.save(session) + request.status = RequestExecutionStatus.DONE + request.completed_at = datetime.now(timezone.utc) + self._request_store.save(request) + self._trace_logger.complete_request(request) + + async def _fail_request(self, request: AgentRequest, exc: Exception) -> None: + request.status = RequestExecutionStatus.ERROR + request.completed_at = datetime.now(timezone.utc) + request.error = self._build_error_payload(exc) + self._request_store.save(request) + self._trace_logger.fail_request(request) + await self._publisher.publish_status( + request.request_id, + "runtime", + "Во время обработки запроса произошла ошибка.", + {"code": request.error.code}, + ) + + def _build_error_payload(self, exc: Exception) -> ErrorPayload: + if isinstance(exc, AppError): + return ErrorPayload(code=exc.code, desc=exc.desc, module=exc.module) + return ErrorPayload( + code="api_runtime_error", + desc="Agent request failed unexpectedly.", + module=ModuleName.AGENT, + ) diff --git a/src/app/core/agent/runtime/execution_context.py b/src/app/core/agent/runtime/execution_context.py new file mode 100644 index 0000000..b7e1481 --- /dev/null +++ b/src/app/core/agent/runtime/execution_context.py @@ -0,0 +1,20 @@ +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import TYPE_CHECKING, Any + +from app.core.api.domain.models.agent_request import AgentRequest +from app.core.api.domain.models.agent_session import AgentSession +from app.infra.observability.module_trace import RequestTraceContext + +if TYPE_CHECKING: + from app.core.agent.runtime.publisher import RuntimeEventPublisher + + +@dataclass(slots=True) +class RuntimeExecutionContext: + request: AgentRequest + session: AgentSession + publisher: "RuntimeEventPublisher" + trace: RequestTraceContext + state: dict[str, Any] = field(default_factory=dict) diff --git a/src/app/core/agent/runtime/process_registry.py b/src/app/core/agent/runtime/process_registry.py new file mode 100644 index 0000000..0591112 --- /dev/null +++ b/src/app/core/agent/runtime/process_registry.py @@ -0,0 +1,13 @@ +from __future__ import annotations + +from collections.abc import Iterable + +from app.core.agent.processes.base import AgentProcess + + +class ProcessRegistry: + def __init__(self, processes: Iterable[AgentProcess]) -> None: + self._items = {process.version: process for process in processes} + + def get(self, version: str) -> AgentProcess | None: + return self._items.get(version) diff --git a/src/app/core/agent/runtime/process_runner.py b/src/app/core/agent/runtime/process_runner.py new file mode 100644 index 0000000..68dd096 --- /dev/null +++ b/src/app/core/agent/runtime/process_runner.py @@ -0,0 +1,9 @@ +from __future__ import annotations + +from app.core.agent.processes.base import AgentProcess, ProcessResult +from app.core.agent.runtime.execution_context import RuntimeExecutionContext + + +class ProcessRunner: + async def run(self, context: RuntimeExecutionContext, process: AgentProcess) -> ProcessResult: + return await process.run(context) diff --git a/src/app/core/agent/runtime/publisher.py b/src/app/core/agent/runtime/publisher.py new file mode 100644 index 0000000..c3d86b1 --- /dev/null +++ b/src/app/core/agent/runtime/publisher.py @@ -0,0 +1,36 @@ +from __future__ import annotations + +from app.core.api.domain.events.client_event import ClientEventRecord +from app.core.api.infrastructure.streaming.sse_event_channel import SseEventChannel +from app.infra.observability.request_trace_logger import RequestTraceLogger +from app.schemas.client_events import ClientEventType + + +class RuntimeEventPublisher: + def __init__(self, channel: SseEventChannel, trace_logger: RequestTraceLogger) -> None: + self._channel = channel + self._trace_logger = trace_logger + + async def publish_status(self, request_id: str, source: str, text: str, payload: dict | None = None) -> None: + await self._publish(request_id, ClientEventType.STATUS, source, text, payload) + + async def publish_user(self, request_id: str, source: str, text: str, payload: dict | None = None) -> None: + await self._publish(request_id, ClientEventType.USER, source, text, payload) + + async def _publish( + self, + request_id: str, + event_type: ClientEventType, + source: str, + text: str, + payload: dict | None = None, + ) -> None: + event = ClientEventRecord( + request_id=request_id, + type=event_type, + source=source, + text=text, + payload=payload or {}, + ) + self._trace_logger.log_event(event) + await self._channel.publish(event) diff --git a/src/app/core/agent/utils/__init__.py b/src/app/core/agent/utils/__init__.py new file mode 100644 index 0000000..60caf92 --- /dev/null +++ b/src/app/core/agent/utils/__init__.py @@ -0,0 +1,3 @@ +from app.core.agent.utils.llm import AgentLlmService, PromptLoader + +__all__ = ["AgentLlmService", "PromptLoader"] diff --git a/src/app/core/agent/utils/llm/__init__.py b/src/app/core/agent/utils/llm/__init__.py new file mode 100644 index 0000000..9dc9368 --- /dev/null +++ b/src/app/core/agent/utils/llm/__init__.py @@ -0,0 +1,4 @@ +from app.core.agent.utils.llm.prompt_loader import PromptLoader +from app.core.agent.utils.llm.service import AgentLlmService + +__all__ = ["AgentLlmService", "PromptLoader"] diff --git a/src/app/core/agent/utils/llm/prompt_loader.py b/src/app/core/agent/utils/llm/prompt_loader.py new file mode 100644 index 0000000..c5d8c95 --- /dev/null +++ b/src/app/core/agent/utils/llm/prompt_loader.py @@ -0,0 +1,43 @@ +from __future__ import annotations + +import os +from collections.abc import Iterable +from pathlib import Path + +import yaml + + +class PromptLoader: + def __init__(self, prompts_path: Path | Iterable[Path] | None = None) -> None: + self._paths = self._resolve_paths(prompts_path) + self._prompts = self._load_prompts() + + def load(self, name: str) -> str: + return str(self._prompts.get(name, "") or "").strip() + + def _load_prompts(self) -> dict[str, str]: + merged: dict[str, str] = {} + for path in self._paths: + if not path.is_file(): + continue + payload = yaml.safe_load(path.read_text(encoding="utf-8")) or {} + if not isinstance(payload, dict): + continue + namespace = str(payload.get("namespace") or "").strip() + prompts = payload.get("prompts", payload) + if not isinstance(prompts, dict): + continue + for key, value in prompts.items(): + prompt_name = f"{namespace}.{key}" if namespace else str(key) + merged[prompt_name] = str(value or "") + return merged + + def _resolve_paths(self, prompts_path: Path | Iterable[Path] | None) -> tuple[Path, ...]: + if prompts_path is None: + base = Path(__file__).resolve().parent / "prompts.yml" + env_override = os.getenv("AGENT_PROMPTS_DIR", "").strip() + raw_path = Path(env_override) if env_override else base + return (raw_path / "prompts.yml" if raw_path.is_dir() else raw_path,) + if isinstance(prompts_path, Path): + return (prompts_path,) + return tuple(Path(item) for item in prompts_path) diff --git a/src/app/modules/agent/llm/service.py b/src/app/core/agent/utils/llm/service.py similarity index 89% rename from src/app/modules/agent/llm/service.py rename to src/app/core/agent/utils/llm/service.py index 82e83f5..91ed4b2 100644 --- a/src/app/modules/agent/llm/service.py +++ b/src/app/core/agent/utils/llm/service.py @@ -1,8 +1,10 @@ +from __future__ import annotations + import logging -from app.modules.agent.observability.module_trace import ModuleTrace -from app.modules.agent.llm.prompt_loader import PromptLoader -from app.modules.shared.gigachat.client import GigaChatClient +from app.core.agent.utils.llm.prompt_loader import PromptLoader +from app.core.shared.gigachat.client import GigaChatClient +from app.infra.observability.module_trace import ModuleTrace LOGGER = logging.getLogger(__name__) diff --git a/src/app/core/agent/utils/traces/__init__.py b/src/app/core/agent/utils/traces/__init__.py new file mode 100644 index 0000000..dc5b892 --- /dev/null +++ b/src/app/core/agent/utils/traces/__init__.py @@ -0,0 +1 @@ +"""Shared trace helpers will live here.""" diff --git a/src/app/core/agent/utils/workflow/__init__.py b/src/app/core/agent/utils/workflow/__init__.py new file mode 100644 index 0000000..805308d --- /dev/null +++ b/src/app/core/agent/utils/workflow/__init__.py @@ -0,0 +1,9 @@ +from app.core.agent.utils.workflow.context import WorkflowContext +from app.core.agent.utils.workflow.graph import WorkflowGraph +from app.core.agent.utils.workflow.step import WorkflowStep + +__all__ = [ + "WorkflowContext", + "WorkflowGraph", + "WorkflowStep", +] diff --git a/src/app/core/agent/utils/workflow/context.py b/src/app/core/agent/utils/workflow/context.py new file mode 100644 index 0000000..e8d6f42 --- /dev/null +++ b/src/app/core/agent/utils/workflow/context.py @@ -0,0 +1,9 @@ +from __future__ import annotations + +from typing import Protocol + +from app.core.agent.runtime.execution_context import RuntimeExecutionContext + + +class WorkflowContext(Protocol): + runtime: RuntimeExecutionContext diff --git a/src/app/core/agent/utils/workflow/graph.py b/src/app/core/agent/utils/workflow/graph.py new file mode 100644 index 0000000..e0098ea --- /dev/null +++ b/src/app/core/agent/utils/workflow/graph.py @@ -0,0 +1,44 @@ +from __future__ import annotations + +from typing import Generic, Sequence, TypeVar + +from app.core.agent.utils.workflow.context import WorkflowContext +from app.core.agent.utils.workflow.step import WorkflowStep + + +TContext = TypeVar("TContext", bound=WorkflowContext) + + +class WorkflowGraph(Generic[TContext]): + def __init__(self, workflow_id: str, source: str, steps: Sequence[WorkflowStep[TContext]]) -> None: + self._workflow_id = workflow_id + self._source = source + self._steps = tuple(steps) + + async def run(self, context: TContext) -> TContext: + trace = context.runtime.trace.module(self._source) + trace.log("workflow_started", {"workflow_id": self._workflow_id}) + for step in self._steps: + context = await self._run_step(context, step) + trace.log("workflow_completed", {"workflow_id": self._workflow_id}) + return context + + async def _run_step(self, context: TContext, step: WorkflowStep[TContext]) -> TContext: + request_id = context.runtime.request.request_id + trace = context.runtime.trace.module(self._source) + trace.log( + "step_started", + {"workflow_id": self._workflow_id, "step_id": step.step_id, "input": step.trace_input(context)}, + ) + 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) + trace.log( + "step_completed", + {"workflow_id": self._workflow_id, "step_id": step.step_id, "output": step.trace_output(context)}, + ) + return context diff --git a/src/app/core/agent/utils/workflow/step.py b/src/app/core/agent/utils/workflow/step.py new file mode 100644 index 0000000..db6fb6d --- /dev/null +++ b/src/app/core/agent/utils/workflow/step.py @@ -0,0 +1,22 @@ +from __future__ import annotations + +from abc import ABC, abstractmethod +from typing import Any, Generic, TypeVar + + +TContext = TypeVar("TContext") + + +class WorkflowStep(ABC, Generic[TContext]): + step_id = "" + title = "" + + @abstractmethod + async def run(self, context: TContext) -> TContext: + raise NotImplementedError + + def trace_input(self, context: TContext) -> dict[str, Any]: + return {} + + def trace_output(self, context: TContext) -> dict[str, Any]: + return {} diff --git a/src/app/modules/api/__init__.py b/src/app/core/api/__init__.py similarity index 100% rename from src/app/modules/api/__init__.py rename to src/app/core/api/__init__.py diff --git a/src/app/modules/api/application/request_service.py b/src/app/core/api/application/request_service.py similarity index 61% rename from src/app/modules/api/application/request_service.py rename to src/app/core/api/application/request_service.py index ca4da41..8df37c7 100644 --- a/src/app/modules/api/application/request_service.py +++ b/src/app/core/api/application/request_service.py @@ -2,11 +2,11 @@ from __future__ import annotations import asyncio -from app.modules.api.domain.models.agent_request import AgentRequest -from app.modules.api.infrastructure.ids.request_id_factory import RequestIdFactory -from app.modules.api.infrastructure.stores.in_memory_request_store import InMemoryRequestStore -from app.modules.api.application.session_service import SessionService -from app.modules.agent.orchestration.facade import OrchestrationFacade +from app.core.api.domain.models.agent_request import AgentRequest +from app.core.api.infrastructure.ids.request_id_factory import RequestIdFactory +from app.core.api.infrastructure.stores.in_memory_request_store import InMemoryRequestStore +from app.core.api.application.session_service import SessionService +from app.core.agent.runtime import AgentRuntime class RequestService: @@ -15,12 +15,12 @@ class RequestService: request_store: InMemoryRequestStore, request_ids: RequestIdFactory, sessions: SessionService, - orchestration: OrchestrationFacade, + runtime: AgentRuntime, ) -> None: self._request_store = request_store self._request_ids = request_ids self._sessions = sessions - self._orchestration = orchestration + self._runtime = runtime async def create(self, session_id: str, message: str, process_version: str) -> AgentRequest: session = self._sessions.get(session_id) @@ -31,7 +31,7 @@ class RequestService: process_version=process_version, ) self._request_store.save(request) - asyncio.create_task(self._orchestration.run(request, session)) + asyncio.create_task(self._runtime.run(request, session)) return request def get(self, request_id: str) -> AgentRequest | None: diff --git a/src/app/core/api/application/session_bootstrap_service.py b/src/app/core/api/application/session_bootstrap_service.py new file mode 100644 index 0000000..e55a1b1 --- /dev/null +++ b/src/app/core/api/application/session_bootstrap_service.py @@ -0,0 +1,25 @@ +from __future__ import annotations + +from dataclasses import dataclass + +from app.core.api.application.session_service import SessionService +from app.core.api.domain.models.agent_session import AgentSession +from app.core.rag.indexing import IndexJob +from app.core.rag.module import RagModule + + +@dataclass(slots=True) +class BootstrappedAgentSession: + session: AgentSession + index_job: IndexJob + + +class SessionBootstrapService: + def __init__(self, sessions: SessionService, rag: RagModule) -> None: + self._sessions = sessions + self._rag = rag + + async def create(self, project_id: str, files: list[dict]) -> BootstrappedAgentSession: + rag_session, index_job = await self._rag.create_session(project_id=project_id, files=files) + session = self._sessions.create(rag_session_id=rag_session.rag_session_id) + return BootstrappedAgentSession(session=session, index_job=index_job) diff --git a/src/app/core/api/application/session_service.py b/src/app/core/api/application/session_service.py new file mode 100644 index 0000000..0991aa5 --- /dev/null +++ b/src/app/core/api/application/session_service.py @@ -0,0 +1,26 @@ +from __future__ import annotations + +from app.infra.exceptions import AppError +from app.core.api.domain.models.agent_session import AgentSession +from app.core.api.infrastructure.ids.session_id_factory import SessionIdFactory +from app.core.api.infrastructure.stores.in_memory_session_store import InMemorySessionStore +from app.schemas.common import ModuleName + + +class SessionService: + def __init__(self, store: InMemorySessionStore, ids: SessionIdFactory) -> None: + self._store = store + self._ids = ids + + def create(self, rag_session_id: str | None = None) -> AgentSession: + session = AgentSession.create(self._ids.create(), rag_session_id=rag_session_id) + return self._store.save(session) + + def get(self, session_id: str) -> AgentSession: + session = self._store.get(session_id) + if session is None: + raise AppError("session_not_found", f"Agent session not found: {session_id}", ModuleName.BACKEND) + return session + + def save(self, session: AgentSession) -> AgentSession: + return self._store.save(session) diff --git a/src/app/modules/api/application/stream_service.py b/src/app/core/api/application/stream_service.py similarity index 80% rename from src/app/modules/api/application/stream_service.py rename to src/app/core/api/application/stream_service.py index 1986f5c..7a38b1f 100644 --- a/src/app/modules/api/application/stream_service.py +++ b/src/app/core/api/application/stream_service.py @@ -1,8 +1,8 @@ from __future__ import annotations -from app.core.exceptions import AppError -from app.modules.api.infrastructure.streaming.sse_encoder import SseEncoder -from app.modules.api.infrastructure.streaming.sse_event_channel import SseEventChannel +from app.infra.exceptions import AppError +from app.core.api.infrastructure.streaming.sse_encoder import SseEncoder +from app.core.api.infrastructure.streaming.sse_event_channel import SseEventChannel from app.schemas.common import ModuleName diff --git a/src/app/core/api/controllers/rag_public_controller.py b/src/app/core/api/controllers/rag_public_controller.py new file mode 100644 index 0000000..c1b9881 --- /dev/null +++ b/src/app/core/api/controllers/rag_public_controller.py @@ -0,0 +1,33 @@ +from __future__ import annotations + +from app.core.api.infrastructure.streaming.sse_response_builder import build_sse_response +from app.core.rag.module import RagModule +from app.core.shared.messaging import EventBus +from app.schemas.rag_sessions import RagSessionJobResponse + + +class RagPublicController: + def __init__(self, rag: RagModule) -> None: + self._rag = rag + + def get_job(self, rag_session_id: str, index_job_id: str) -> RagSessionJobResponse: + job = self._rag.get_session_job(rag_session_id, index_job_id) + return RagSessionJobResponse( + rag_session_id=rag_session_id, + index_job_id=job.index_job_id, + status=job.status, + indexed_files=job.indexed_files, + failed_files=job.failed_files, + cache_hit_files=job.cache_hit_files, + cache_miss_files=job.cache_miss_files, + error=job.error.model_dump(mode="json") if job.error else None, + ) + + async def stream_job_events(self, rag_session_id: str, index_job_id: str): + channel_id, queue = await self._rag.subscribe_session_job_events(rag_session_id, index_job_id) + return build_sse_response( + queue, + encoder=EventBus.as_sse, + unsubscribe=lambda: self._rag.unsubscribe_job_events(channel_id, queue), + stop_on_event="terminal", + ) diff --git a/src/app/modules/api/controllers/request_controller.py b/src/app/core/api/controllers/request_controller.py similarity index 92% rename from src/app/modules/api/controllers/request_controller.py rename to src/app/core/api/controllers/request_controller.py index c2f1841..233806f 100644 --- a/src/app/modules/api/controllers/request_controller.py +++ b/src/app/core/api/controllers/request_controller.py @@ -1,7 +1,7 @@ from __future__ import annotations -from app.core.exceptions import AppError -from app.modules.api.application.request_service import RequestService +from app.infra.exceptions import AppError +from app.core.api.application.request_service import RequestService from app.schemas.agent_api import AgentRequestCreateRequest, AgentRequestQueuedResponse, AgentRequestStateResponse from app.schemas.common import ModuleName diff --git a/src/app/core/api/controllers/session_controller.py b/src/app/core/api/controllers/session_controller.py new file mode 100644 index 0000000..c7b1915 --- /dev/null +++ b/src/app/core/api/controllers/session_controller.py @@ -0,0 +1,23 @@ +from __future__ import annotations + +from app.core.api.application.session_bootstrap_service import SessionBootstrapService +from app.schemas.agent_api import CreateAgentSessionRequest, CreateAgentSessionResponse + + +class SessionController: + def __init__(self, service: SessionBootstrapService) -> None: + self._service = service + + async def create_session(self, request: CreateAgentSessionRequest) -> CreateAgentSessionResponse: + result = await self._service.create( + project_id=request.project_id, + files=[item.model_dump() for item in request.files], + ) + session = result.session + return CreateAgentSessionResponse( + session_id=session.session_id, + rag_session_id=session.active_rag_session_id or "", + index_job_id=result.index_job.index_job_id, + status=result.index_job.status, + created_at=session.created_at, + ) diff --git a/src/app/core/api/controllers/stream_controller.py b/src/app/core/api/controllers/stream_controller.py new file mode 100644 index 0000000..355fda1 --- /dev/null +++ b/src/app/core/api/controllers/stream_controller.py @@ -0,0 +1,17 @@ +from __future__ import annotations + +from app.core.api.infrastructure.streaming.sse_response_builder import build_sse_response +from app.core.api.application.stream_service import StreamService + + +class StreamController: + def __init__(self, service: StreamService) -> None: + self._service = service + + async def stream(self, request_id: str): + queue = await self._service.subscribe(request_id) + return build_sse_response( + queue, + encoder=self._service.encode, + unsubscribe=lambda: self._service.unsubscribe(request_id, queue), + ) diff --git a/src/app/modules/api/domain/events/client_event.py b/src/app/core/api/domain/events/client_event.py similarity index 100% rename from src/app/modules/api/domain/events/client_event.py rename to src/app/core/api/domain/events/client_event.py diff --git a/src/app/modules/api/domain/models/agent_request.py b/src/app/core/api/domain/models/agent_request.py similarity index 100% rename from src/app/modules/api/domain/models/agent_request.py rename to src/app/core/api/domain/models/agent_request.py diff --git a/src/app/core/api/domain/models/agent_session.py b/src/app/core/api/domain/models/agent_session.py new file mode 100644 index 0000000..32c2e1f --- /dev/null +++ b/src/app/core/api/domain/models/agent_session.py @@ -0,0 +1,35 @@ +from __future__ import annotations + +from dataclasses import dataclass, field +from datetime import datetime, timezone + +from app.core.api.domain.models.agent_session_message import AgentSessionMessage + + +@dataclass(slots=True) +class AgentSession: + session_id: str + active_rag_session_id: str | None + created_at: datetime + updated_at: datetime + messages: list[AgentSessionMessage] = field(default_factory=list) + + @classmethod + def create(cls, session_id: str, rag_session_id: str | None = None) -> "AgentSession": + now = datetime.now(timezone.utc) + return cls( + session_id=session_id, + active_rag_session_id=rag_session_id, + created_at=now, + updated_at=now, + ) + + def append_turn(self, user_message: str, assistant_message: str, route_result=None) -> None: + self._append_message("user", user_message) + self._append_message("assistant", assistant_message) + self.updated_at = datetime.now(timezone.utc) + + def _append_message(self, role: str, text: str) -> None: + value = text.strip() + if value: + self.messages.append(AgentSessionMessage.create(role, value)) diff --git a/src/app/core/api/domain/models/agent_session_message.py b/src/app/core/api/domain/models/agent_session_message.py new file mode 100644 index 0000000..88fd2de --- /dev/null +++ b/src/app/core/api/domain/models/agent_session_message.py @@ -0,0 +1,19 @@ +from __future__ import annotations + +from dataclasses import dataclass +from datetime import datetime, timezone +from typing import Literal + + +SessionMessageRole = Literal["user", "assistant"] + + +@dataclass(slots=True) +class AgentSessionMessage: + role: SessionMessageRole + text: str + created_at: datetime + + @classmethod + def create(cls, role: SessionMessageRole, text: str) -> "AgentSessionMessage": + return cls(role=role, text=text, created_at=datetime.now(timezone.utc)) diff --git a/src/app/modules/api/infrastructure/ids/request_id_factory.py b/src/app/core/api/infrastructure/ids/request_id_factory.py similarity index 100% rename from src/app/modules/api/infrastructure/ids/request_id_factory.py rename to src/app/core/api/infrastructure/ids/request_id_factory.py diff --git a/src/app/modules/api/infrastructure/ids/session_id_factory.py b/src/app/core/api/infrastructure/ids/session_id_factory.py similarity index 100% rename from src/app/modules/api/infrastructure/ids/session_id_factory.py rename to src/app/core/api/infrastructure/ids/session_id_factory.py diff --git a/src/app/modules/api/infrastructure/stores/in_memory_request_store.py b/src/app/core/api/infrastructure/stores/in_memory_request_store.py similarity index 87% rename from src/app/modules/api/infrastructure/stores/in_memory_request_store.py rename to src/app/core/api/infrastructure/stores/in_memory_request_store.py index 5551330..843236c 100644 --- a/src/app/modules/api/infrastructure/stores/in_memory_request_store.py +++ b/src/app/core/api/infrastructure/stores/in_memory_request_store.py @@ -2,7 +2,7 @@ from __future__ import annotations from threading import Lock -from app.modules.api.domain.models.agent_request import AgentRequest +from app.core.api.domain.models.agent_request import AgentRequest class InMemoryRequestStore: diff --git a/src/app/modules/api/infrastructure/stores/in_memory_session_store.py b/src/app/core/api/infrastructure/stores/in_memory_session_store.py similarity index 87% rename from src/app/modules/api/infrastructure/stores/in_memory_session_store.py rename to src/app/core/api/infrastructure/stores/in_memory_session_store.py index 1e13564..fe80dc7 100644 --- a/src/app/modules/api/infrastructure/stores/in_memory_session_store.py +++ b/src/app/core/api/infrastructure/stores/in_memory_session_store.py @@ -2,7 +2,7 @@ from __future__ import annotations from threading import Lock -from app.modules.api.domain.models.agent_session import AgentSession +from app.core.api.domain.models.agent_session import AgentSession class InMemorySessionStore: diff --git a/src/app/modules/api/infrastructure/streaming/replay_buffer.py b/src/app/core/api/infrastructure/streaming/replay_buffer.py similarity index 89% rename from src/app/modules/api/infrastructure/streaming/replay_buffer.py rename to src/app/core/api/infrastructure/streaming/replay_buffer.py index dad9125..a90935a 100644 --- a/src/app/modules/api/infrastructure/streaming/replay_buffer.py +++ b/src/app/core/api/infrastructure/streaming/replay_buffer.py @@ -2,7 +2,7 @@ from __future__ import annotations from collections import defaultdict -from app.modules.api.domain.events.client_event import ClientEventRecord +from app.core.api.domain.events.client_event import ClientEventRecord class ReplayBuffer: diff --git a/src/app/modules/api/infrastructure/streaming/sse_encoder.py b/src/app/core/api/infrastructure/streaming/sse_encoder.py similarity index 87% rename from src/app/modules/api/infrastructure/streaming/sse_encoder.py rename to src/app/core/api/infrastructure/streaming/sse_encoder.py index 0817394..de616af 100644 --- a/src/app/modules/api/infrastructure/streaming/sse_encoder.py +++ b/src/app/core/api/infrastructure/streaming/sse_encoder.py @@ -2,7 +2,7 @@ from __future__ import annotations import json -from app.modules.api.domain.events.client_event import ClientEventRecord +from app.core.api.domain.events.client_event import ClientEventRecord class SseEncoder: diff --git a/src/app/modules/api/infrastructure/streaming/sse_event_channel.py b/src/app/core/api/infrastructure/streaming/sse_event_channel.py similarity index 90% rename from src/app/modules/api/infrastructure/streaming/sse_event_channel.py rename to src/app/core/api/infrastructure/streaming/sse_event_channel.py index dddfd56..2bdd20c 100644 --- a/src/app/modules/api/infrastructure/streaming/sse_event_channel.py +++ b/src/app/core/api/infrastructure/streaming/sse_event_channel.py @@ -3,8 +3,8 @@ from __future__ import annotations import asyncio from collections import defaultdict -from app.modules.api.domain.events.client_event import ClientEventRecord -from app.modules.api.infrastructure.streaming.replay_buffer import ReplayBuffer +from app.core.api.domain.events.client_event import ClientEventRecord +from app.core.api.infrastructure.streaming.replay_buffer import ReplayBuffer class SseEventChannel: diff --git a/src/app/core/api/infrastructure/streaming/sse_response_builder.py b/src/app/core/api/infrastructure/streaming/sse_response_builder.py new file mode 100644 index 0000000..8545172 --- /dev/null +++ b/src/app/core/api/infrastructure/streaming/sse_response_builder.py @@ -0,0 +1,39 @@ +from __future__ import annotations + +from collections.abc import Awaitable, Callable + +from fastapi.responses import StreamingResponse + + +def build_sse_response( + queue, + *, + encoder: Callable[[object], str], + unsubscribe: Callable[[], Awaitable[None]], + heartbeat_seconds: int = 10, + stop_on_event: str | None = None, +) -> StreamingResponse: + async def event_stream(): + import asyncio + + try: + while True: + try: + event = await asyncio.wait_for(queue.get(), timeout=heartbeat_seconds) + yield encoder(event) + if stop_on_event and getattr(event, "name", None) == stop_on_event: + break + except asyncio.TimeoutError: + yield ": keepalive\n\n" + finally: + await unsubscribe() + + return StreamingResponse( + event_stream(), + media_type="text/event-stream", + headers={ + "Cache-Control": "no-cache, no-transform", + "Connection": "keep-alive", + "X-Accel-Buffering": "no", + }, + ) diff --git a/src/app/core/api/module.py b/src/app/core/api/module.py new file mode 100644 index 0000000..efff8a1 --- /dev/null +++ b/src/app/core/api/module.py @@ -0,0 +1,40 @@ +from __future__ import annotations + +from fastapi import APIRouter + +from app.core.api.application.session_bootstrap_service import SessionBootstrapService +from app.core.api.application.request_service import RequestService +from app.core.api.application.stream_service import StreamService +from app.core.api.controllers.request_controller import RequestController +from app.core.api.controllers.rag_public_controller import RagPublicController +from app.core.api.controllers.session_controller import SessionController +from app.core.api.controllers.stream_controller import StreamController +from app.core.api.public_router import build_agent_public_router +from app.core.api.rag_public_router import build_rag_public_router +from app.core.rag.module import RagModule + + +class ApiModule: + def __init__( + self, + session_bootstrap: SessionBootstrapService, + requests: RequestService, + streams: StreamService, + rag: RagModule, + ) -> None: + self._sessions = SessionController(session_bootstrap) + self._requests = RequestController(requests) + self._streams = StreamController(streams) + self._rag_public = RagPublicController(rag) + + def public_router(self) -> APIRouter: + router = APIRouter() + router.include_router( + build_agent_public_router( + sessions=self._sessions, + requests=self._requests, + streams=self._streams, + ) + ) + router.include_router(build_rag_public_router(self._rag_public)) + return router diff --git a/src/app/modules/api/public_router.py b/src/app/core/api/public_router.py similarity index 53% rename from src/app/modules/api/public_router.py rename to src/app/core/api/public_router.py index 0bfd27c..0cc780d 100644 --- a/src/app/modules/api/public_router.py +++ b/src/app/core/api/public_router.py @@ -2,21 +2,19 @@ from __future__ import annotations from fastapi import APIRouter -from app.modules.api.controllers.request_controller import RequestController -from app.modules.api.controllers.session_controller import SessionController -from app.modules.api.controllers.stream_controller import StreamController +from app.core.api.controllers.request_controller import RequestController +from app.core.api.controllers.session_controller import SessionController +from app.core.api.controllers.stream_controller import StreamController from app.schemas.agent_api import ( AgentRequestCreateRequest, AgentRequestQueuedResponse, AgentRequestStateResponse, - BindRagSessionRequest, - BindRagSessionResponse, + CreateAgentSessionRequest, CreateAgentSessionResponse, - ResetAgentSessionResponse, ) -def build_public_router( +def build_agent_public_router( sessions: SessionController, requests: RequestController, streams: StreamController, @@ -24,16 +22,8 @@ def build_public_router( router = APIRouter(tags=["agent-api"]) @router.post("/api/agent/sessions", response_model=CreateAgentSessionResponse) - async def create_session() -> CreateAgentSessionResponse: - return sessions.create_session() - - @router.post("/api/agent/sessions/{session_id}/rag", response_model=BindRagSessionResponse) - async def bind_rag_session(session_id: str, request: BindRagSessionRequest) -> BindRagSessionResponse: - return sessions.bind_rag_session(session_id, request) - - @router.post("/api/agent/sessions/{session_id}/reset", response_model=ResetAgentSessionResponse) - async def reset_session(session_id: str) -> ResetAgentSessionResponse: - return sessions.reset_session(session_id) + async def create_session(request: CreateAgentSessionRequest) -> CreateAgentSessionResponse: + return await sessions.create_session(request) @router.post("/api/agent/requests", response_model=AgentRequestQueuedResponse) async def create_request(request: AgentRequestCreateRequest) -> AgentRequestQueuedResponse: diff --git a/src/app/core/api/rag_public_router.py b/src/app/core/api/rag_public_router.py new file mode 100644 index 0000000..3976221 --- /dev/null +++ b/src/app/core/api/rag_public_router.py @@ -0,0 +1,20 @@ +from __future__ import annotations + +from fastapi import APIRouter + +from app.core.api.controllers.rag_public_controller import RagPublicController +from app.schemas.rag_sessions import RagSessionJobResponse + + +def build_rag_public_router(controller: RagPublicController) -> APIRouter: + router = APIRouter(tags=["rag"]) + + @router.get("/api/rag/sessions/{rag_session_id}/jobs/{index_job_id}", response_model=RagSessionJobResponse) + async def rag_session_job(rag_session_id: str, index_job_id: str) -> RagSessionJobResponse: + return controller.get_job(rag_session_id, index_job_id) + + @router.get("/api/rag/sessions/{rag_session_id}/jobs/{index_job_id}/events") + async def rag_session_job_events(rag_session_id: str, index_job_id: str): + return await controller.stream_job_events(rag_session_id, index_job_id) + + return router diff --git a/src/app/core/application.py b/src/app/core/application.py new file mode 100644 index 0000000..723aaaa --- /dev/null +++ b/src/app/core/application.py @@ -0,0 +1,127 @@ +import logging +from pathlib import Path + +from app.core.agent.processes import V1Process, V2Process +from app.core.agent.processes.v2 import V2IntentRouter +from app.core.agent.processes.v2.evidence.assembler import DocsEvidenceAssembler +from app.core.agent.processes.v2.retrieval.policy_resolver import V2RetrievalPolicyResolver +from app.core.agent.processes.v2.retrieval.v2_rag_adapter import V2RagRetrievalAdapter +from app.core.rag.retrieval.session_retriever import RagSessionRetriever +from app.core.agent.runtime import AgentRuntime, ProcessRegistry, ProcessRunner, RuntimeEventPublisher +from app.core.agent.utils.llm import AgentLlmService, PromptLoader +from app.core.api.module import ApiModule +from app.core.api.application.session_bootstrap_service import SessionBootstrapService +from app.core.api.application.request_service import RequestService +from app.core.api.application.session_service import SessionService +from app.core.api.application.stream_service import StreamService +from app.core.api.infrastructure.ids.request_id_factory import RequestIdFactory +from app.core.api.infrastructure.ids.session_id_factory import SessionIdFactory +from app.core.api.infrastructure.stores.in_memory_request_store import InMemoryRequestStore +from app.core.api.infrastructure.stores.in_memory_session_store import InMemorySessionStore +from app.core.api.infrastructure.streaming.sse_event_channel import SseEventChannel +from app.core.rag.module import RagModule +from app.core.rag.embedding.gigachat_embedder import GigaChatEmbedder +from app.core.rag.persistence import RagRepository +from app.core.shared.database import DatabaseReadiness, bootstrap_database +from app.core.shared.messaging import EventBus +from app.core.shared.story_context import StoryContextSchemaRepository +from app.infra.observability import RequestTraceLogger +from app.core.shared.resilience import RetryExecutor + + +class ModularApplication: + def __init__(self) -> None: + self.database_readiness = DatabaseReadiness() + self.events = EventBus() + self.retry = RetryExecutor() + self.rag_repository = RagRepository() + self.story_context_schema_repository = StoryContextSchemaRepository() + + self.rag = RagModule( + event_bus=self.events, + retry=self.retry, + repository=self.rag_repository, + ensure_ready=self.database_readiness.require_ready, + ) + from app.core.shared.gigachat.client import GigaChatClient + from app.core.shared.gigachat.settings import GigaChatSettings + from app.core.shared.gigachat.token_provider import GigaChatTokenProvider + + _giga_settings = GigaChatSettings.from_env() + _giga_client = GigaChatClient(_giga_settings, GigaChatTokenProvider(_giga_settings)) + _v1_prompt_loader = PromptLoader( + Path(__file__).resolve().parent / "agent/processes/v1/workflow/flow_main/prompts.yml" + ) + _v2_prompt_loader = PromptLoader( + [ + Path(__file__).resolve().parent / "agent/processes/v2/prompts.yml", + Path(__file__).resolve().parent / "agent/processes/v2/general_prompts.yml", + Path(__file__).resolve().parent / "agent/processes/v2/intent_router/routers/prompts.yml", + ] + ) + self._v1_llm = AgentLlmService(client=_giga_client, prompts=_v1_prompt_loader) + self._v2_llm = AgentLlmService(client=_giga_client, prompts=_v2_prompt_loader) + _v2_embedder = GigaChatEmbedder(_giga_client) + _v2_rag_retriever = RagSessionRetriever(repository=self.rag_repository, embedder=_v2_embedder) + _v2_rag_adapter = V2RagRetrievalAdapter(_v2_rag_retriever) + _v2_evidence = DocsEvidenceAssembler() + _v2_policy = V2RetrievalPolicyResolver() + + self.agent_sessions = InMemorySessionStore() + self.agent_requests = InMemoryRequestStore() + self.agent_events = SseEventChannel() + self.agent_trace_logger = RequestTraceLogger(Path("runtime_traces/agent_requests")) + _publisher = RuntimeEventPublisher(self.agent_events, self.agent_trace_logger) + _session_service = SessionService( + store=self.agent_sessions, + ids=SessionIdFactory(), + ) + _session_bootstrap = SessionBootstrapService(_session_service, self.rag) + _process_registry = ProcessRegistry( + [ + V1Process(self._v1_llm), + V2Process( + self._v2_llm, + policy_resolver=_v2_policy, + rag_adapter=_v2_rag_adapter, + evidence_assembler=_v2_evidence, + router=V2IntentRouter(llm=self._v2_llm), + workflow_llm_enabled=True, + ), + ] + ) + _runtime = AgentRuntime( + request_store=self.agent_requests, + sessions=_session_service, + process_registry=_process_registry, + process_runner=ProcessRunner(), + publisher=_publisher, + trace_logger=self.agent_trace_logger, + ) + _request_service = RequestService( + request_store=self.agent_requests, + request_ids=RequestIdFactory(), + sessions=_session_service, + runtime=_runtime, + ) + self.api = ApiModule( + session_bootstrap=_session_bootstrap, + requests=_request_service, + streams=StreamService(self.agent_events, request_exists=lambda request_id: self.agent_requests.get(request_id) is not None), + rag=self.rag, + ) + + def startup(self) -> None: + try: + bootstrap_database( + self.rag_repository, + self.story_context_schema_repository, + ) + except Exception as exc: + logging.exception("Database bootstrap failed. Starting backend in degraded mode.") + self.database_readiness.mark_unavailable(exc) + return + self.database_readiness.mark_ready() + + def health_payload(self) -> dict[str, str]: + return self.database_readiness.health_payload() diff --git a/src/app/modules/contracts.py b/src/app/core/contracts.py similarity index 100% rename from src/app/modules/contracts.py rename to src/app/core/contracts.py diff --git a/src/app/modules/rag/README.md b/src/app/core/rag/README.md similarity index 98% rename from src/app/modules/rag/README.md rename to src/app/core/rag/README.md index 51644fc..1bbdd26 100644 --- a/src/app/modules/rag/README.md +++ b/src/app/core/rag/README.md @@ -348,4 +348,4 @@ sequenceDiagram - В первой итерации реализованы `DOCS D1-D4`. - В первой итерации реализованы `CODE C0-C3`. - `C4-C6` зафиксированы в контракте и зарезервированы под следующие этапы. -- Текущие `rag_session` и `rag_repo` работают как facade/adapter поверх нового пакета `rag`. +- Текущий `rag_session` работает как facade поверх нового пакета `rag`. diff --git a/src/app/modules/rag/__init__.py b/src/app/core/rag/__init__.py similarity index 90% rename from src/app/modules/rag/__init__.py rename to src/app/core/rag/__init__.py index 153b59a..415890c 100644 --- a/src/app/modules/rag/__init__.py +++ b/src/app/core/rag/__init__.py @@ -1,4 +1,4 @@ -from app.modules.rag.contracts import ( +from app.core.rag.contracts import ( DocKind, EvidenceLink, EvidenceType, diff --git a/src/app/core/rag/contracts/__init__.py b/src/app/core/rag/contracts/__init__.py new file mode 100644 index 0000000..fc1f4cf --- /dev/null +++ b/src/app/core/rag/contracts/__init__.py @@ -0,0 +1,17 @@ +from app.core.rag.contracts.documents import RagDocument, RagSource, RagSpan +from app.core.rag.contracts.enums import DocKind, EvidenceType, RagLayer, RetrievalMode +from app.core.rag.contracts.evidence import EvidenceLink +from app.core.rag.contracts.retrieval import RetrievalItem, RetrievalQuery + +__all__ = [ + "DocKind", + "EvidenceLink", + "EvidenceType", + "RagDocument", + "RagLayer", + "RagSource", + "RagSpan", + "RetrievalItem", + "RetrievalMode", + "RetrievalQuery", +] diff --git a/src/app/modules/rag/contracts/documents.py b/src/app/core/rag/contracts/documents.py similarity index 97% rename from src/app/modules/rag/contracts/documents.py rename to src/app/core/rag/contracts/documents.py index e53fa4f..452925f 100644 --- a/src/app/modules/rag/contracts/documents.py +++ b/src/app/core/rag/contracts/documents.py @@ -3,7 +3,7 @@ from __future__ import annotations from dataclasses import asdict, dataclass, field from hashlib import sha256 -from app.modules.rag.contracts.evidence import EvidenceLink +from app.core.rag.contracts.evidence import EvidenceLink @dataclass(slots=True) diff --git a/src/app/modules/rag/contracts/enums.py b/src/app/core/rag/contracts/enums.py similarity index 94% rename from src/app/modules/rag/contracts/enums.py rename to src/app/core/rag/contracts/enums.py index 8f2333c..e298ad0 100644 --- a/src/app/modules/rag/contracts/enums.py +++ b/src/app/core/rag/contracts/enums.py @@ -8,6 +8,7 @@ class RagLayer: DOCS_ENTITY_CATALOG = "D3_ENTITY_CATALOG" DOCS_WORKFLOW_INDEX = "D4_WORKFLOW_INDEX" DOCS_RELATION_GRAPH = "D5_RELATION_GRAPH" + DOCS_INTEGRATION_INDEX = "D6_INTEGRATION_INDEX" CODE_SOURCE_CHUNKS = "C0_SOURCE_CHUNKS" CODE_SYMBOL_CATALOG = "C1_SYMBOL_CATALOG" CODE_DEPENDENCY_GRAPH = "C2_DEPENDENCY_GRAPH" diff --git a/src/app/modules/rag/contracts/evidence.py b/src/app/core/rag/contracts/evidence.py similarity index 100% rename from src/app/modules/rag/contracts/evidence.py rename to src/app/core/rag/contracts/evidence.py diff --git a/src/app/modules/rag/contracts/retrieval.py b/src/app/core/rag/contracts/retrieval.py similarity index 100% rename from src/app/modules/rag/contracts/retrieval.py rename to src/app/core/rag/contracts/retrieval.py diff --git a/src/app/modules/rag/embedding/__init__.py b/src/app/core/rag/embedding/__init__.py similarity index 55% rename from src/app/modules/rag/embedding/__init__.py rename to src/app/core/rag/embedding/__init__.py index e87086d..e9eb5ed 100644 --- a/src/app/modules/rag/embedding/__init__.py +++ b/src/app/core/rag/embedding/__init__.py @@ -1,5 +1,5 @@ """Эмбеддинги для RAG (GigaChat и др.).""" -from app.modules.rag.embedding.gigachat_embedder import GigaChatEmbedder +from app.core.rag.embedding.gigachat_embedder import GigaChatEmbedder __all__ = ["GigaChatEmbedder"] diff --git a/src/app/modules/rag/embedding/gigachat_embedder.py b/src/app/core/rag/embedding/gigachat_embedder.py similarity index 81% rename from src/app/modules/rag/embedding/gigachat_embedder.py rename to src/app/core/rag/embedding/gigachat_embedder.py index 78b7af9..48eec36 100644 --- a/src/app/modules/rag/embedding/gigachat_embedder.py +++ b/src/app/core/rag/embedding/gigachat_embedder.py @@ -1,6 +1,6 @@ """Эмбеддер на базе GigaChat API.""" -from app.modules.shared.gigachat.client import GigaChatClient +from app.core.shared.gigachat.client import GigaChatClient class GigaChatEmbedder: diff --git a/src/app/core/rag/indexing/__init__.py b/src/app/core/rag/indexing/__init__.py new file mode 100644 index 0000000..7e2665d --- /dev/null +++ b/src/app/core/rag/indexing/__init__.py @@ -0,0 +1,21 @@ +__all__ = ["IndexJob", "IndexJobStore", "IndexingOrchestrator", "RagService"] + + +def __getattr__(name: str): + if name == "IndexJob": + from app.core.rag.indexing.job_store import IndexJob + + return IndexJob + if name == "IndexJobStore": + from app.core.rag.indexing.job_store import IndexJobStore + + return IndexJobStore + if name == "IndexingOrchestrator": + from app.core.rag.indexing.orchestrator import IndexingOrchestrator + + return IndexingOrchestrator + if name == "RagService": + from app.core.rag.indexing.service import RagService + + return RagService + raise AttributeError(name) diff --git a/src/app/modules/rag/indexing/code/code_text/chunker.py b/src/app/core/rag/indexing/code/code_text/chunker.py similarity index 100% rename from src/app/modules/rag/indexing/code/code_text/chunker.py rename to src/app/core/rag/indexing/code/code_text/chunker.py diff --git a/src/app/modules/rag/indexing/code/code_text/document_builder.py b/src/app/core/rag/indexing/code/code_text/document_builder.py similarity index 76% rename from src/app/modules/rag/indexing/code/code_text/document_builder.py rename to src/app/core/rag/indexing/code/code_text/document_builder.py index 6d053ee..564b102 100644 --- a/src/app/modules/rag/indexing/code/code_text/document_builder.py +++ b/src/app/core/rag/indexing/code/code_text/document_builder.py @@ -1,8 +1,8 @@ from __future__ import annotations -from app.modules.rag.contracts import RagDocument, RagLayer, RagSource, RagSpan -from app.modules.rag.indexing.code.code_text.chunker import CodeChunk -from app.modules.rag.retrieval.test_filter import is_test_path +from app.core.rag.contracts import RagDocument, RagLayer, RagSource, RagSpan +from app.core.rag.indexing.code.code_text.chunker import CodeChunk +from app.core.rag.retrieval.test_filter import is_test_path class CodeTextDocumentBuilder: diff --git a/src/app/modules/rag/indexing/code/edges/dataflow_document_builder.py b/src/app/core/rag/indexing/code/edges/dataflow_document_builder.py similarity index 86% rename from src/app/modules/rag/indexing/code/edges/dataflow_document_builder.py rename to src/app/core/rag/indexing/code/edges/dataflow_document_builder.py index fa6a943..bbfbd97 100644 --- a/src/app/modules/rag/indexing/code/edges/dataflow_document_builder.py +++ b/src/app/core/rag/indexing/code/edges/dataflow_document_builder.py @@ -1,8 +1,8 @@ from __future__ import annotations -from app.modules.rag.contracts import EvidenceLink, EvidenceType, RagDocument, RagLayer, RagSource, RagSpan -from app.modules.rag.indexing.code.edges.dataflow_slice_builder import DataflowSlice -from app.modules.rag.retrieval.test_filter import is_test_path +from app.core.rag.contracts import EvidenceLink, EvidenceType, RagDocument, RagLayer, RagSource, RagSpan +from app.core.rag.indexing.code.edges.dataflow_slice_builder import DataflowSlice +from app.core.rag.retrieval.test_filter import is_test_path class DataflowDocumentBuilder: diff --git a/src/app/modules/rag/indexing/code/edges/dataflow_slice_builder.py b/src/app/core/rag/indexing/code/edges/dataflow_slice_builder.py similarity index 98% rename from src/app/modules/rag/indexing/code/edges/dataflow_slice_builder.py rename to src/app/core/rag/indexing/code/edges/dataflow_slice_builder.py index fa8dfa6..7022f6f 100644 --- a/src/app/modules/rag/indexing/code/edges/dataflow_slice_builder.py +++ b/src/app/core/rag/indexing/code/edges/dataflow_slice_builder.py @@ -3,8 +3,8 @@ from __future__ import annotations from dataclasses import dataclass from hashlib import sha256 -from app.modules.rag.indexing.code.edges.extractor import PyEdge -from app.modules.rag.indexing.code.symbols.extractor import PySymbol +from app.core.rag.indexing.code.edges.extractor import PyEdge +from app.core.rag.indexing.code.symbols.extractor import PySymbol _IGNORE_PREFIXES = ("logger", "logging", "print", "stdlib", "typing", "dataclasses") diff --git a/src/app/modules/rag/indexing/code/edges/document_builder.py b/src/app/core/rag/indexing/code/edges/document_builder.py similarity index 82% rename from src/app/modules/rag/indexing/code/edges/document_builder.py rename to src/app/core/rag/indexing/code/edges/document_builder.py index 6bf3bb7..2007e60 100644 --- a/src/app/modules/rag/indexing/code/edges/document_builder.py +++ b/src/app/core/rag/indexing/code/edges/document_builder.py @@ -1,8 +1,8 @@ from __future__ import annotations -from app.modules.rag.contracts import EvidenceLink, EvidenceType, RagDocument, RagLayer, RagSource, RagSpan -from app.modules.rag.indexing.code.edges.extractor import PyEdge -from app.modules.rag.retrieval.test_filter import is_test_path +from app.core.rag.contracts import EvidenceLink, EvidenceType, RagDocument, RagLayer, RagSource, RagSpan +from app.core.rag.indexing.code.edges.extractor import PyEdge +from app.core.rag.retrieval.test_filter import is_test_path class EdgeDocumentBuilder: diff --git a/src/app/modules/rag/indexing/code/edges/extractor.py b/src/app/core/rag/indexing/code/edges/extractor.py similarity index 100% rename from src/app/modules/rag/indexing/code/edges/extractor.py rename to src/app/core/rag/indexing/code/edges/extractor.py diff --git a/src/app/modules/rag/indexing/code/entrypoints/document_builder.py b/src/app/core/rag/indexing/code/entrypoints/document_builder.py similarity index 90% rename from src/app/modules/rag/indexing/code/entrypoints/document_builder.py rename to src/app/core/rag/indexing/code/entrypoints/document_builder.py index f5e0f63..2e80c99 100644 --- a/src/app/modules/rag/indexing/code/entrypoints/document_builder.py +++ b/src/app/core/rag/indexing/code/entrypoints/document_builder.py @@ -1,8 +1,8 @@ from __future__ import annotations -from app.modules.rag.contracts import EvidenceLink, EvidenceType, RagDocument, RagLayer, RagSource, RagSpan -from app.modules.rag.indexing.code.entrypoints.registry import Entrypoint -from app.modules.rag.retrieval.test_filter import is_test_path +from app.core.rag.contracts import EvidenceLink, EvidenceType, RagDocument, RagLayer, RagSource, RagSpan +from app.core.rag.indexing.code.entrypoints.registry import Entrypoint +from app.core.rag.retrieval.test_filter import is_test_path class EntrypointDocumentBuilder: diff --git a/src/app/modules/rag/indexing/code/entrypoints/execution_trace_builder.py b/src/app/core/rag/indexing/code/entrypoints/execution_trace_builder.py similarity index 95% rename from src/app/modules/rag/indexing/code/entrypoints/execution_trace_builder.py rename to src/app/core/rag/indexing/code/entrypoints/execution_trace_builder.py index 8c40dc1..566e9fa 100644 --- a/src/app/modules/rag/indexing/code/entrypoints/execution_trace_builder.py +++ b/src/app/core/rag/indexing/code/entrypoints/execution_trace_builder.py @@ -3,9 +3,9 @@ from __future__ import annotations from dataclasses import dataclass from hashlib import sha256 -from app.modules.rag.indexing.code.edges.extractor import PyEdge -from app.modules.rag.indexing.code.entrypoints.registry import Entrypoint -from app.modules.rag.indexing.code.symbols.extractor import PySymbol +from app.core.rag.indexing.code.edges.extractor import PyEdge +from app.core.rag.indexing.code.entrypoints.registry import Entrypoint +from app.core.rag.indexing.code.symbols.extractor import PySymbol @dataclass(slots=True) diff --git a/src/app/modules/rag/indexing/code/entrypoints/execution_trace_document_builder.py b/src/app/core/rag/indexing/code/entrypoints/execution_trace_document_builder.py similarity index 85% rename from src/app/modules/rag/indexing/code/entrypoints/execution_trace_document_builder.py rename to src/app/core/rag/indexing/code/entrypoints/execution_trace_document_builder.py index 6075d06..b57b29a 100644 --- a/src/app/modules/rag/indexing/code/entrypoints/execution_trace_document_builder.py +++ b/src/app/core/rag/indexing/code/entrypoints/execution_trace_document_builder.py @@ -1,8 +1,8 @@ from __future__ import annotations -from app.modules.rag.contracts import EvidenceLink, EvidenceType, RagDocument, RagLayer, RagSource, RagSpan -from app.modules.rag.indexing.code.entrypoints.execution_trace_builder import ExecutionTrace -from app.modules.rag.retrieval.test_filter import is_test_path +from app.core.rag.contracts import EvidenceLink, EvidenceType, RagDocument, RagLayer, RagSource, RagSpan +from app.core.rag.indexing.code.entrypoints.execution_trace_builder import ExecutionTrace +from app.core.rag.retrieval.test_filter import is_test_path class ExecutionTraceDocumentBuilder: diff --git a/src/app/modules/rag/indexing/code/entrypoints/fastapi_detector.py b/src/app/core/rag/indexing/code/entrypoints/fastapi_detector.py similarity index 97% rename from src/app/modules/rag/indexing/code/entrypoints/fastapi_detector.py rename to src/app/core/rag/indexing/code/entrypoints/fastapi_detector.py index 75f7b85..bfbebea 100644 --- a/src/app/modules/rag/indexing/code/entrypoints/fastapi_detector.py +++ b/src/app/core/rag/indexing/code/entrypoints/fastapi_detector.py @@ -3,7 +3,7 @@ from __future__ import annotations import ast from hashlib import sha256 -from app.modules.rag.indexing.code.entrypoints.registry import Entrypoint +from app.core.rag.indexing.code.entrypoints.registry import Entrypoint class FastApiEntrypointDetector: diff --git a/src/app/modules/rag/indexing/code/entrypoints/flask_detector.py b/src/app/core/rag/indexing/code/entrypoints/flask_detector.py similarity index 93% rename from src/app/modules/rag/indexing/code/entrypoints/flask_detector.py rename to src/app/core/rag/indexing/code/entrypoints/flask_detector.py index 25c0c27..099d679 100644 --- a/src/app/modules/rag/indexing/code/entrypoints/flask_detector.py +++ b/src/app/core/rag/indexing/code/entrypoints/flask_detector.py @@ -2,7 +2,7 @@ from __future__ import annotations from hashlib import sha256 -from app.modules.rag.indexing.code.entrypoints.registry import Entrypoint +from app.core.rag.indexing.code.entrypoints.registry import Entrypoint class FlaskEntrypointDetector: diff --git a/src/app/modules/rag/indexing/code/entrypoints/registry.py b/src/app/core/rag/indexing/code/entrypoints/registry.py similarity index 100% rename from src/app/modules/rag/indexing/code/entrypoints/registry.py rename to src/app/core/rag/indexing/code/entrypoints/registry.py diff --git a/src/app/modules/rag/indexing/code/entrypoints/typer_click_detector.py b/src/app/core/rag/indexing/code/entrypoints/typer_click_detector.py similarity index 93% rename from src/app/modules/rag/indexing/code/entrypoints/typer_click_detector.py rename to src/app/core/rag/indexing/code/entrypoints/typer_click_detector.py index 139f948..c4ca391 100644 --- a/src/app/modules/rag/indexing/code/entrypoints/typer_click_detector.py +++ b/src/app/core/rag/indexing/code/entrypoints/typer_click_detector.py @@ -2,7 +2,7 @@ from __future__ import annotations from hashlib import sha256 -from app.modules.rag.indexing.code.entrypoints.registry import Entrypoint +from app.core.rag.indexing.code.entrypoints.registry import Entrypoint class TyperClickEntrypointDetector: diff --git a/src/app/modules/rag/indexing/code/file_filter.py b/src/app/core/rag/indexing/code/file_filter.py similarity index 85% rename from src/app/modules/rag/indexing/code/file_filter.py rename to src/app/core/rag/indexing/code/file_filter.py index ed4953f..5a11568 100644 --- a/src/app/modules/rag/indexing/code/file_filter.py +++ b/src/app/core/rag/indexing/code/file_filter.py @@ -2,7 +2,7 @@ from __future__ import annotations from pathlib import PurePosixPath -from app.modules.rag.indexing.common.path_filter import should_skip_indexing_path +from app.core.rag.indexing.common.path_filter import should_skip_indexing_path class PythonFileFilter: diff --git a/src/app/modules/rag/indexing/code/pipeline.py b/src/app/core/rag/indexing/code/pipeline.py similarity index 62% rename from src/app/modules/rag/indexing/code/pipeline.py rename to src/app/core/rag/indexing/code/pipeline.py index 794e326..a5165cf 100644 --- a/src/app/modules/rag/indexing/code/pipeline.py +++ b/src/app/core/rag/indexing/code/pipeline.py @@ -1,25 +1,25 @@ from __future__ import annotations -from app.modules.rag.contracts import RagDocument, RagSource -from app.modules.rag.indexing.code.code_text.chunker import CodeTextChunker -from app.modules.rag.indexing.code.code_text.document_builder import CodeTextDocumentBuilder -from app.modules.rag.indexing.code.edges.dataflow_document_builder import DataflowDocumentBuilder -from app.modules.rag.indexing.code.edges.dataflow_slice_builder import DataflowSliceBuilder -from app.modules.rag.indexing.code.edges.document_builder import EdgeDocumentBuilder -from app.modules.rag.indexing.code.edges.extractor import EdgeExtractor -from app.modules.rag.indexing.code.entrypoints.document_builder import EntrypointDocumentBuilder -from app.modules.rag.indexing.code.entrypoints.execution_trace_builder import ExecutionTraceBuilder -from app.modules.rag.indexing.code.entrypoints.execution_trace_document_builder import ExecutionTraceDocumentBuilder -from app.modules.rag.indexing.code.entrypoints.fastapi_detector import FastApiEntrypointDetector -from app.modules.rag.indexing.code.entrypoints.flask_detector import FlaskEntrypointDetector -from app.modules.rag.indexing.code.entrypoints.registry import EntrypointDetectorRegistry -from app.modules.rag.indexing.code.entrypoints.typer_click_detector import TyperClickEntrypointDetector -from app.modules.rag.indexing.code.file_filter import PythonFileFilter -from app.modules.rag.indexing.code.roles.builder import SemanticRoleBuilder -from app.modules.rag.indexing.code.roles.document_builder import SemanticRoleDocumentBuilder -from app.modules.rag.indexing.code.symbols.ast_parser import PythonAstParser -from app.modules.rag.indexing.code.symbols.document_builder import SymbolDocumentBuilder -from app.modules.rag.indexing.code.symbols.extractor import SymbolExtractor +from app.core.rag.contracts import RagDocument, RagSource +from app.core.rag.indexing.code.code_text.chunker import CodeTextChunker +from app.core.rag.indexing.code.code_text.document_builder import CodeTextDocumentBuilder +from app.core.rag.indexing.code.edges.dataflow_document_builder import DataflowDocumentBuilder +from app.core.rag.indexing.code.edges.dataflow_slice_builder import DataflowSliceBuilder +from app.core.rag.indexing.code.edges.document_builder import EdgeDocumentBuilder +from app.core.rag.indexing.code.edges.extractor import EdgeExtractor +from app.core.rag.indexing.code.entrypoints.document_builder import EntrypointDocumentBuilder +from app.core.rag.indexing.code.entrypoints.execution_trace_builder import ExecutionTraceBuilder +from app.core.rag.indexing.code.entrypoints.execution_trace_document_builder import ExecutionTraceDocumentBuilder +from app.core.rag.indexing.code.entrypoints.fastapi_detector import FastApiEntrypointDetector +from app.core.rag.indexing.code.entrypoints.flask_detector import FlaskEntrypointDetector +from app.core.rag.indexing.code.entrypoints.registry import EntrypointDetectorRegistry +from app.core.rag.indexing.code.entrypoints.typer_click_detector import TyperClickEntrypointDetector +from app.core.rag.indexing.code.file_filter import PythonFileFilter +from app.core.rag.indexing.code.roles.builder import SemanticRoleBuilder +from app.core.rag.indexing.code.roles.document_builder import SemanticRoleDocumentBuilder +from app.core.rag.indexing.code.symbols.ast_parser import PythonAstParser +from app.core.rag.indexing.code.symbols.document_builder import SymbolDocumentBuilder +from app.core.rag.indexing.code.symbols.extractor import SymbolExtractor class CodeIndexingPipeline: diff --git a/src/app/core/rag/indexing/code/roles/__init__.py b/src/app/core/rag/indexing/code/roles/__init__.py new file mode 100644 index 0000000..773543f --- /dev/null +++ b/src/app/core/rag/indexing/code/roles/__init__.py @@ -0,0 +1,9 @@ +from app.core.rag.indexing.code.roles.builder import SemanticRoleBuilder +from app.core.rag.indexing.code.roles.document_builder import SemanticRoleDocumentBuilder +from app.core.rag.indexing.code.roles.models import SemanticRoleRecord + +__all__ = [ + "SemanticRoleBuilder", + "SemanticRoleDocumentBuilder", + "SemanticRoleRecord", +] diff --git a/src/app/modules/rag/indexing/code/roles/builder.py b/src/app/core/rag/indexing/code/roles/builder.py similarity index 72% rename from src/app/modules/rag/indexing/code/roles/builder.py rename to src/app/core/rag/indexing/code/roles/builder.py index bbb02de..421156d 100644 --- a/src/app/modules/rag/indexing/code/roles/builder.py +++ b/src/app/core/rag/indexing/code/roles/builder.py @@ -1,11 +1,11 @@ from __future__ import annotations -from app.modules.rag.indexing.code.edges.dataflow_slice_builder import DataflowSlice -from app.modules.rag.indexing.code.edges.extractor import PyEdge -from app.modules.rag.indexing.code.entrypoints.execution_trace_builder import ExecutionTrace -from app.modules.rag.indexing.code.roles.models import SemanticRoleRecord -from app.modules.rag.indexing.code.roles.scorer import SemanticRoleScorer -from app.modules.rag.indexing.code.symbols.extractor import PySymbol +from app.core.rag.indexing.code.edges.dataflow_slice_builder import DataflowSlice +from app.core.rag.indexing.code.edges.extractor import PyEdge +from app.core.rag.indexing.code.entrypoints.execution_trace_builder import ExecutionTrace +from app.core.rag.indexing.code.roles.models import SemanticRoleRecord +from app.core.rag.indexing.code.roles.scorer import SemanticRoleScorer +from app.core.rag.indexing.code.symbols.extractor import PySymbol class SemanticRoleBuilder: diff --git a/src/app/modules/rag/indexing/code/roles/document_builder.py b/src/app/core/rag/indexing/code/roles/document_builder.py similarity index 86% rename from src/app/modules/rag/indexing/code/roles/document_builder.py rename to src/app/core/rag/indexing/code/roles/document_builder.py index 30c97f8..edf883d 100644 --- a/src/app/modules/rag/indexing/code/roles/document_builder.py +++ b/src/app/core/rag/indexing/code/roles/document_builder.py @@ -1,8 +1,8 @@ from __future__ import annotations -from app.modules.rag.contracts import EvidenceLink, EvidenceType, RagDocument, RagLayer, RagSource, RagSpan -from app.modules.rag.indexing.code.roles.models import SemanticRoleRecord -from app.modules.rag.retrieval.test_filter import is_test_path +from app.core.rag.contracts import EvidenceLink, EvidenceType, RagDocument, RagLayer, RagSource, RagSpan +from app.core.rag.indexing.code.roles.models import SemanticRoleRecord +from app.core.rag.retrieval.test_filter import is_test_path class SemanticRoleDocumentBuilder: diff --git a/src/app/modules/rag/indexing/code/roles/models.py b/src/app/core/rag/indexing/code/roles/models.py similarity index 100% rename from src/app/modules/rag/indexing/code/roles/models.py rename to src/app/core/rag/indexing/code/roles/models.py diff --git a/src/app/modules/rag/indexing/code/roles/scorer.py b/src/app/core/rag/indexing/code/roles/scorer.py similarity index 95% rename from src/app/modules/rag/indexing/code/roles/scorer.py rename to src/app/core/rag/indexing/code/roles/scorer.py index 9a3dd33..81f2943 100644 --- a/src/app/modules/rag/indexing/code/roles/scorer.py +++ b/src/app/core/rag/indexing/code/roles/scorer.py @@ -2,11 +2,11 @@ from __future__ import annotations from dataclasses import dataclass, field -from app.modules.rag.indexing.code.edges.dataflow_slice_builder import DataflowSlice -from app.modules.rag.indexing.code.edges.extractor import PyEdge -from app.modules.rag.indexing.code.entrypoints.execution_trace_builder import ExecutionTrace -from app.modules.rag.indexing.code.roles.models import SemanticRoleRecord -from app.modules.rag.indexing.code.symbols.extractor import PySymbol +from app.core.rag.indexing.code.edges.dataflow_slice_builder import DataflowSlice +from app.core.rag.indexing.code.edges.extractor import PyEdge +from app.core.rag.indexing.code.entrypoints.execution_trace_builder import ExecutionTrace +from app.core.rag.indexing.code.roles.models import SemanticRoleRecord +from app.core.rag.indexing.code.symbols.extractor import PySymbol _ROLE_PRIORITY = [ "handler", diff --git a/src/app/modules/rag/indexing/code/symbols/ast_parser.py b/src/app/core/rag/indexing/code/symbols/ast_parser.py similarity index 100% rename from src/app/modules/rag/indexing/code/symbols/ast_parser.py rename to src/app/core/rag/indexing/code/symbols/ast_parser.py diff --git a/src/app/modules/rag/indexing/code/symbols/document_builder.py b/src/app/core/rag/indexing/code/symbols/document_builder.py similarity index 82% rename from src/app/modules/rag/indexing/code/symbols/document_builder.py rename to src/app/core/rag/indexing/code/symbols/document_builder.py index 98b8ea3..0a71e73 100644 --- a/src/app/modules/rag/indexing/code/symbols/document_builder.py +++ b/src/app/core/rag/indexing/code/symbols/document_builder.py @@ -1,8 +1,8 @@ from __future__ import annotations -from app.modules.rag.contracts import RagDocument, RagLayer, RagSource, RagSpan -from app.modules.rag.indexing.code.symbols.extractor import PySymbol -from app.modules.rag.retrieval.test_filter import is_test_path +from app.core.rag.contracts import RagDocument, RagLayer, RagSource, RagSpan +from app.core.rag.indexing.code.symbols.extractor import PySymbol +from app.core.rag.retrieval.test_filter import is_test_path class SymbolDocumentBuilder: diff --git a/src/app/modules/rag/indexing/code/symbols/extractor.py b/src/app/core/rag/indexing/code/symbols/extractor.py similarity index 100% rename from src/app/modules/rag/indexing/code/symbols/extractor.py rename to src/app/core/rag/indexing/code/symbols/extractor.py diff --git a/src/app/modules/rag/indexing/common/document_upserter.py b/src/app/core/rag/indexing/common/document_upserter.py similarity index 81% rename from src/app/modules/rag/indexing/common/document_upserter.py rename to src/app/core/rag/indexing/common/document_upserter.py index 7bf2dba..80ad891 100644 --- a/src/app/modules/rag/indexing/common/document_upserter.py +++ b/src/app/core/rag/indexing/common/document_upserter.py @@ -1,7 +1,7 @@ from __future__ import annotations -from app.modules.rag.contracts import RagDocument -from app.modules.rag.persistence.repository import RagRepository +from app.core.rag.contracts import RagDocument +from app.core.rag.persistence.repository import RagRepository class RagDocumentUpserter: diff --git a/src/app/modules/rag/indexing/common/path_filter.py b/src/app/core/rag/indexing/common/path_filter.py similarity index 100% rename from src/app/modules/rag/indexing/common/path_filter.py rename to src/app/core/rag/indexing/common/path_filter.py diff --git a/src/app/modules/rag/indexing/common/report.py b/src/app/core/rag/indexing/common/report.py similarity index 100% rename from src/app/modules/rag/indexing/common/report.py rename to src/app/core/rag/indexing/common/report.py diff --git a/src/app/modules/rag/indexing/docs/chunkers/markdown_chunker.py b/src/app/core/rag/indexing/docs/chunkers/markdown_chunker.py similarity index 96% rename from src/app/modules/rag/indexing/docs/chunkers/markdown_chunker.py rename to src/app/core/rag/indexing/docs/chunkers/markdown_chunker.py index 2c218e5..507ace3 100644 --- a/src/app/modules/rag/indexing/docs/chunkers/markdown_chunker.py +++ b/src/app/core/rag/indexing/docs/chunkers/markdown_chunker.py @@ -2,7 +2,7 @@ from __future__ import annotations from dataclasses import dataclass -from app.modules.rag.indexing.docs.chunkers.text_chunker import DocTextChunker +from app.core.rag.indexing.docs.chunkers.text_chunker import DocTextChunker @dataclass(slots=True) diff --git a/src/app/modules/rag/indexing/docs/chunkers/text_chunker.py b/src/app/core/rag/indexing/docs/chunkers/text_chunker.py similarity index 100% rename from src/app/modules/rag/indexing/docs/chunkers/text_chunker.py rename to src/app/core/rag/indexing/docs/chunkers/text_chunker.py diff --git a/src/app/modules/rag/indexing/docs/classifier.py b/src/app/core/rag/indexing/docs/classifier.py similarity index 91% rename from src/app/modules/rag/indexing/docs/classifier.py rename to src/app/core/rag/indexing/docs/classifier.py index b7129e0..56b089c 100644 --- a/src/app/modules/rag/indexing/docs/classifier.py +++ b/src/app/core/rag/indexing/docs/classifier.py @@ -2,7 +2,7 @@ from __future__ import annotations from pathlib import PurePosixPath -from app.modules.rag.contracts import DocKind +from app.core.rag.contracts import DocKind class DocsClassifier: diff --git a/src/app/core/rag/indexing/docs/content_parser.py b/src/app/core/rag/indexing/docs/content_parser.py new file mode 100644 index 0000000..bd0cdfa --- /dev/null +++ b/src/app/core/rag/indexing/docs/content_parser.py @@ -0,0 +1,61 @@ +from __future__ import annotations + +import re + +from app.core.rag.indexing.docs.chunkers.markdown_chunker import SectionChunk +from app.core.rag.indexing.docs.models import ParsedDocument, ParsedSubsection + + +class DocsContentParser: + def parse(self, frontmatter: dict, body: str, *, fallback_title: str, sections: list[SectionChunk]) -> ParsedDocument: + summary = self._summary(sections) + detail_sections = self._detail_sections(sections) + details = "\n\n".join(section.content for section in detail_sections).strip() + title = str(frontmatter.get("title") or "").strip() or self._title_from_body(body) or fallback_title + return ParsedDocument( + frontmatter=frontmatter, + title=title, + summary=summary, + details=details, + body=body.strip(), + detail_sections=detail_sections, + ) + + def _summary(self, sections: list[SectionChunk]) -> str: + for section in sections: + if section.section_title.strip().lower() == "summary": + return section.content.strip() + return "" + + def _detail_sections(self, sections: list[SectionChunk]) -> list[ParsedSubsection]: + result = [ + ParsedSubsection( + title=section.section_title, + content=section.content, + path=section.section_path, + ) + for section in sections + if self._is_details_child(section.section_path) + ] + if result: + return result + return [ + ParsedSubsection( + title=section.section_title, + content=section.content, + path=section.section_path, + ) + for section in sections + if section.section_title.strip().lower() != "summary" + ] + + def _is_details_child(self, section_path: str) -> bool: + parts = [item.strip() for item in section_path.split(" > ") if item.strip()] + for index, part in enumerate(parts): + if part.lower() == "details" and len(parts) == index + 2: + return True + return False + + def _title_from_body(self, body: str) -> str: + match = re.search(r"^#\s+(.+)$", body, flags=re.MULTILINE) + return match.group(1).strip() if match else "" diff --git a/src/app/core/rag/indexing/docs/document_builder.py b/src/app/core/rag/indexing/docs/document_builder.py new file mode 100644 index 0000000..3884421 --- /dev/null +++ b/src/app/core/rag/indexing/docs/document_builder.py @@ -0,0 +1,87 @@ +from __future__ import annotations + +from app.core.rag.contracts import EvidenceLink, EvidenceType, RagDocument, RagLayer, RagSource +from app.core.rag.indexing.docs.chunkers.markdown_chunker import SectionChunk +from app.core.rag.indexing.docs.frontmatter_view import DocsFrontmatterView + + +class DocsDocumentBuilder: + def build_document_catalog(self, source: RagSource, frontmatter: dict, summary_text: str, doc_kind: str, *, fallback_title: str) -> RagDocument: + view = DocsFrontmatterView(frontmatter) + document_id = view.document_id or source.path + metadata = { + "document_id": document_id, + "type": view.doc_type, + "name": view.name, + "title": view.title(fallback_title), + "module": view.module, + "domain": view.domain, + "subdomain": view.subdomain, + "layer": view.layer, + "status": view.status, + "updated_at": view.updated_at, + "tags": view.tags, + "entities": view.entities, + "parent": view.parent, + "children": view.children, + "links": view.links, + "source_path": source.path, + "summary_text": summary_text[:4000], + "doc_kind": doc_kind, + "artifact_type": "DOCS", + } + return RagDocument( + layer=RagLayer.DOCS_DOCUMENT_CATALOG, + source=source, + title=metadata["title"] or document_id, + text=summary_text[:4000] or metadata["title"] or document_id, + metadata=metadata, + ) + + def build_doc_chunk(self, source: RagSource, chunk: SectionChunk, frontmatter: dict, doc_kind: str) -> RagDocument: + view = DocsFrontmatterView(frontmatter) + document_id = view.document_id or source.path + metadata = { + "document_id": document_id, + "type": view.doc_type, + "module": view.module, + "domain": view.domain, + "subdomain": view.subdomain, + "tags": view.tags, + "section_path": chunk.section_path, + "section_title": chunk.section_title, + "order": chunk.order, + "doc_kind": doc_kind, + "source_path": source.path, + "artifact_type": "DOCS", + } + return RagDocument( + layer=RagLayer.DOCS_DOC_CHUNKS, + source=source, + title=f"{document_id}:{chunk.section_title}", + text=chunk.content, + metadata=metadata, + links=[EvidenceLink(type=EvidenceType.DOC_SECTION, target_id=document_id, path=source.path, note=chunk.section_path)], + ) + + def build_entity_record(self, source: RagSource, frontmatter: dict, entity: str) -> RagDocument: + view = DocsFrontmatterView(frontmatter) + document_id = view.document_id or source.path + metadata = { + "entity_name": entity, + "document_id": document_id, + "document_type": view.doc_type, + "module": view.module, + "domain": view.domain, + "subdomain": view.subdomain, + "tags": view.tags, + "source_path": source.path, + "artifact_type": "DOCS", + } + return RagDocument( + layer=RagLayer.DOCS_ENTITY_CATALOG, + source=source, + title=entity, + text=entity, + metadata=metadata, + ) diff --git a/src/app/modules/rag/indexing/docs/entity_extractor.py b/src/app/core/rag/indexing/docs/entity_extractor.py similarity index 100% rename from src/app/modules/rag/indexing/docs/entity_extractor.py rename to src/app/core/rag/indexing/docs/entity_extractor.py diff --git a/src/app/modules/rag/indexing/docs/fact_extractor.py b/src/app/core/rag/indexing/docs/fact_extractor.py similarity index 100% rename from src/app/modules/rag/indexing/docs/fact_extractor.py rename to src/app/core/rag/indexing/docs/fact_extractor.py diff --git a/src/app/modules/rag/indexing/docs/file_filter.py b/src/app/core/rag/indexing/docs/file_filter.py similarity index 92% rename from src/app/modules/rag/indexing/docs/file_filter.py rename to src/app/core/rag/indexing/docs/file_filter.py index 5fc7b2e..8eeaae0 100644 --- a/src/app/modules/rag/indexing/docs/file_filter.py +++ b/src/app/core/rag/indexing/docs/file_filter.py @@ -2,7 +2,7 @@ from __future__ import annotations from pathlib import PurePosixPath -from app.modules.rag.indexing.common.path_filter import should_skip_indexing_path +from app.core.rag.indexing.common.path_filter import should_skip_indexing_path class DocsFileFilter: diff --git a/src/app/modules/rag/indexing/docs/frontmatter_parser.py b/src/app/core/rag/indexing/docs/frontmatter_parser.py similarity index 100% rename from src/app/modules/rag/indexing/docs/frontmatter_parser.py rename to src/app/core/rag/indexing/docs/frontmatter_parser.py diff --git a/src/app/core/rag/indexing/docs/frontmatter_view.py b/src/app/core/rag/indexing/docs/frontmatter_view.py new file mode 100644 index 0000000..dee5b36 --- /dev/null +++ b/src/app/core/rag/indexing/docs/frontmatter_view.py @@ -0,0 +1,85 @@ +from __future__ import annotations + +from dataclasses import dataclass + + +@dataclass(slots=True, frozen=True) +class DocsFrontmatterView: + raw: dict + + @property + def document_id(self) -> str: + return str(self.raw.get("id") or "").strip() + + @property + def doc_type(self) -> str: + return str(self.raw.get("type") or self.raw.get("doc_type") or "").strip() + + @property + def name(self) -> str: + return str(self.raw.get("name") or "").strip() + + @property + def module(self) -> str: + return str(self.raw.get("module") or "").strip() + + @property + def domain(self) -> str: + return str(self.raw.get("domain") or "").strip() + + @property + def subdomain(self) -> str: + return str(self.raw.get("subdomain") or self.raw.get("sub_domain") or "").strip() + + @property + def layer(self) -> str: + return str(self.raw.get("layer") or "").strip() + + @property + def status(self): + return self.raw.get("status") + + @property + def updated_at(self): + return self.raw.get("updated_at") + + @property + def tags(self) -> list[str]: + return self._string_list(self.raw.get("tags")) + + @property + def entities(self) -> list[str]: + return self._string_list(self.raw.get("entities")) + + @property + def related_docs(self) -> list[str]: + return self._string_list(self.raw.get("related_docs")) + + @property + def parent(self) -> str | None: + value = str(self.raw.get("parent") or "").strip() + return value or None + + @property + def children(self) -> list[str]: + return self._string_list(self.raw.get("children")) + + @property + def links(self): + value = self.raw.get("links") + if isinstance(value, (dict, list)): + return value + return {} + + def title(self, fallback: str = "") -> str: + return str(self.raw.get("title") or "").strip() or fallback + + def _string_list(self, value) -> list[str]: + if not isinstance(value, list): + return [] + result: list[str] = [] + for item in value: + normalized = str(item or "").strip() + if normalized and normalized not in result: + result.append(normalized) + return result diff --git a/src/app/core/rag/indexing/docs/integration_extractor.py b/src/app/core/rag/indexing/docs/integration_extractor.py new file mode 100644 index 0000000..296fe51 --- /dev/null +++ b/src/app/core/rag/indexing/docs/integration_extractor.py @@ -0,0 +1,93 @@ +from __future__ import annotations + +import yaml + +from app.core.rag.indexing.docs.chunkers.markdown_chunker import SectionChunk +from app.core.rag.indexing.docs.models import IntegrationRecord + + +class DocsIntegrationExtractor: + _SECTION_TITLES = {"integrations", "интеграции"} + + def extract(self, sections: list[SectionChunk]) -> list[IntegrationRecord]: + records: list[IntegrationRecord] = [] + for section in sections: + if not self._is_integration_section(section.section_path): + continue + payload = self._payload(section.content) + target = str(payload.get("target") or "").strip() + if not target: + continue + details = payload.get("details") + if not isinstance(details, dict): + details = {} + records.append( + IntegrationRecord( + name=section.section_title, + target=target, + target_type=str(payload.get("target_type") or "").strip(), + direction=str(payload.get("direction") or "").strip(), + interaction=str(payload.get("interaction") or "").strip(), + via=str(payload.get("via") or "").strip(), + purpose=str(payload.get("purpose") or "").strip(), + details=details, + anchor=section.section_path, + ) + ) + return records + + def _is_integration_section(self, section_path: str) -> bool: + parts = [item.strip().lower() for item in section_path.split(" > ") if item.strip()] + return any(part in self._SECTION_TITLES for part in parts[:-1]) or (parts and parts[-1] in self._SECTION_TITLES) + + def _payload(self, text: str) -> dict: + payload: dict = {} + details_lines: list[str] = [] + collecting_details = False + for raw_line in text.splitlines(): + if not raw_line.strip(): + continue + indent = len(raw_line) - len(raw_line.lstrip(" ")) + stripped = raw_line.strip() + if indent > 0 and collecting_details: + details_lines.append(raw_line) + continue + if not stripped.startswith("- "): + continue + key, value = self._split_key_value(stripped[2:]) + if not key: + continue + if key == "details": + collecting_details = True + details_lines = [] + if value: + payload[key] = self._yaml_value(value) + continue + collecting_details = False + payload[key] = self._yaml_value(value) + if details_lines: + payload["details"] = self._details_payload(details_lines) + return payload + + def _details_payload(self, lines: list[str]) -> dict: + normalized: list[str] = [] + for raw_line in lines: + line = raw_line[2:] if raw_line.startswith(" ") else raw_line + stripped = line.lstrip() + indent = len(line) - len(stripped) + if indent == 0 and stripped.startswith("- "): + stripped = stripped[2:] + normalized.append((" " * indent) + stripped) + payload = yaml.safe_load("\n".join(normalized)) or {} + return payload if isinstance(payload, dict) else {} + + def _split_key_value(self, text: str) -> tuple[str, str]: + if ":" not in text: + return text.strip(), "" + key, value = text.split(":", 1) + return key.strip(), value.strip() + + def _yaml_value(self, value: str): + if not value: + return "" + return yaml.safe_load(value) diff --git a/src/app/modules/rag/indexing/docs/models.py b/src/app/core/rag/indexing/docs/models.py similarity index 78% rename from src/app/modules/rag/indexing/docs/models.py rename to src/app/core/rag/indexing/docs/models.py index 2e5efd0..5c523c5 100644 --- a/src/app/modules/rag/indexing/docs/models.py +++ b/src/app/core/rag/indexing/docs/models.py @@ -13,6 +13,7 @@ class ParsedTopLevelSection: class ParsedSubsection: title: str content: str + path: str @dataclass(slots=True) @@ -37,6 +38,19 @@ class WorkflowScenario: anchor: str +@dataclass(slots=True) +class IntegrationRecord: + name: str + target: str + target_type: str + direction: str + interaction: str + via: str + purpose: str + details: dict + anchor: str + + @dataclass(slots=True) class RelationEdge: source_id: str diff --git a/src/app/modules/rag/indexing/docs/pipeline.py b/src/app/core/rag/indexing/docs/pipeline.py similarity index 52% rename from src/app/modules/rag/indexing/docs/pipeline.py rename to src/app/core/rag/indexing/docs/pipeline.py index aa5606c..291326e 100644 --- a/src/app/modules/rag/indexing/docs/pipeline.py +++ b/src/app/core/rag/indexing/docs/pipeline.py @@ -1,16 +1,19 @@ from __future__ import annotations -from app.modules.rag.contracts import RagDocument, RagSource -from app.modules.rag.indexing.docs.chunkers.markdown_chunker import MarkdownDocChunker -from app.modules.rag.indexing.docs.classifier import DocsClassifier -from app.modules.rag.indexing.docs.content_parser import DocsContentParser -from app.modules.rag.indexing.docs.document_builder import DocsDocumentBuilder -from app.modules.rag.indexing.docs.entity_extractor import DocsEntityExtractor -from app.modules.rag.indexing.docs.fact_extractor import DocsFactExtractor -from app.modules.rag.indexing.docs.file_filter import DocsFileFilter -from app.modules.rag.indexing.docs.frontmatter_parser import DocsFrontmatterParser -from app.modules.rag.indexing.docs.relation_extractor import DocsRelationExtractor -from app.modules.rag.indexing.docs.workflow_extractor import DocsWorkflowExtractor +from app.core.rag.contracts import RagDocument, RagSource +from app.core.rag.indexing.docs.chunkers.markdown_chunker import MarkdownDocChunker +from app.core.rag.indexing.docs.classifier import DocsClassifier +from app.core.rag.indexing.docs.content_parser import DocsContentParser +from app.core.rag.indexing.docs.document_builder import DocsDocumentBuilder +from app.core.rag.indexing.docs.entity_extractor import DocsEntityExtractor +from app.core.rag.indexing.docs.fact_extractor import DocsFactExtractor +from app.core.rag.indexing.docs.file_filter import DocsFileFilter +from app.core.rag.indexing.docs.frontmatter_parser import DocsFrontmatterParser +from app.core.rag.indexing.docs.frontmatter_view import DocsFrontmatterView +from app.core.rag.indexing.docs.integration_extractor import DocsIntegrationExtractor +from app.core.rag.indexing.docs.relation_extractor import DocsRelationExtractor +from app.core.rag.indexing.docs.support_layer_builder import DocsSupportLayerBuilder +from app.core.rag.indexing.docs.workflow_extractor import DocsWorkflowExtractor class DocsIndexingPipeline: @@ -19,12 +22,14 @@ class DocsIndexingPipeline: self._classifier = DocsClassifier() self._chunker = MarkdownDocChunker() self._builder = DocsDocumentBuilder() + self._support_builder = DocsSupportLayerBuilder() self._frontmatter = DocsFrontmatterParser() self._content = DocsContentParser() self._facts = DocsFactExtractor() self._entities = DocsEntityExtractor() self._workflows = DocsWorkflowExtractor() self._relations = DocsRelationExtractor() + self._integrations = DocsIntegrationExtractor() def supports(self, path: str) -> bool: return self._filter.should_index(path) @@ -33,8 +38,14 @@ class DocsIndexingPipeline: source = RagSource(repo_id=repo_id, commit_sha=commit_sha, path=path) frontmatter, body = self._frontmatter.split(content) doc_kind = self._classifier.classify(path) - parsed = self._content.parse(frontmatter, body, fallback_title=self._fallback_title(path)) - sections = self._chunker.chunk(parsed.body or body) + sections = self._chunker.chunk(body) + parsed = self._content.parse( + frontmatter, + body, + fallback_title=self._fallback_title(path), + sections=sections, + ) + frontmatter_view = DocsFrontmatterView(parsed.frontmatter) docs: list[RagDocument] = [] docs.append( self._builder.build_document_catalog( @@ -47,24 +58,28 @@ class DocsIndexingPipeline: ) for section in sections: docs.append(self._builder.build_doc_chunk(source, section, parsed.frontmatter, doc_kind)) - document_id = str(parsed.frontmatter.get("id") or source.path) + document_id = frontmatter_view.document_id or source.path for fact in self._facts.extract(parsed.frontmatter, sections): docs.append( - self._builder.build_fact( + self._support_builder.build_fact( source, subject_id=fact["subject_id"] or document_id, predicate=fact["predicate"], obj=fact["object"], object_ref=fact.get("object_ref"), anchor=fact["anchor"], + domain=frontmatter_view.domain, + subdomain=frontmatter_view.subdomain, ) ) for entity in self._entities.extract(parsed.frontmatter): docs.append(self._builder.build_entity_record(source, parsed.frontmatter, entity)) for workflow in self._workflows.extract(parsed.detail_sections): - docs.append(self._builder.build_workflow_record(source, parsed.frontmatter, workflow)) + docs.append(self._support_builder.build_workflow_record(source, parsed.frontmatter, workflow)) for edge in self._relations.extract(parsed.frontmatter, source_id=document_id): - docs.append(self._builder.build_relation_record(source, edge)) + docs.append(self._support_builder.build_relation_record(source, parsed.frontmatter, edge)) + for integration in self._integrations.extract(sections): + docs.append(self._support_builder.build_integration_record(source, parsed.frontmatter, integration)) return docs def _fallback_title(self, path: str) -> str: diff --git a/src/app/core/rag/indexing/docs/relation_extractor.py b/src/app/core/rag/indexing/docs/relation_extractor.py new file mode 100644 index 0000000..c38835f --- /dev/null +++ b/src/app/core/rag/indexing/docs/relation_extractor.py @@ -0,0 +1,87 @@ +from __future__ import annotations + +from app.core.rag.indexing.docs.frontmatter_view import DocsFrontmatterView +from app.core.rag.indexing.docs.models import RelationEdge + + +class DocsRelationExtractor: + def extract(self, frontmatter: dict, *, source_id: str) -> list[RelationEdge]: + edges: list[RelationEdge] = [] + view = DocsFrontmatterView(frontmatter) + if view.parent: + edges.append( + RelationEdge( + source_id=source_id, + relation_type="parent", + target_id=view.parent, + anchor="frontmatter.parent", + ) + ) + for child in view.children: + edges.append( + RelationEdge( + source_id=source_id, + relation_type="child", + target_id=child, + anchor="frontmatter.children", + ) + ) + for related_doc in view.related_docs: + edges.append( + RelationEdge( + source_id=source_id, + relation_type="related_doc", + target_id=related_doc, + anchor="frontmatter.related_docs", + ) + ) + for entity in view.entities: + edges.append( + RelationEdge( + source_id=source_id, + relation_type="mentions_entity", + target_id=entity, + anchor="frontmatter.entities", + ) + ) + links = view.links + if isinstance(links, dict): + for relation_type, values in links.items(): + for target in self._targets(values): + edges.append( + RelationEdge( + source_id=source_id, + relation_type=str(relation_type or "").strip(), + target_id=target, + anchor=f"frontmatter.links.{relation_type}", + ) + ) + return edges + for item in links if isinstance(links, list) else []: + if not isinstance(item, dict): + continue + relation_type = str(item.get("type") or "").strip() + target = str(item.get("target") or "").strip() + if relation_type and target: + edges.append( + RelationEdge( + source_id=source_id, + relation_type=relation_type, + target_id=target, + anchor="frontmatter.links", + ) + ) + return edges + + def _targets(self, value) -> list[str]: + if not isinstance(value, list): + return [] + result: list[str] = [] + for item in value: + if isinstance(item, dict): + target = str(item.get("target") or item.get("id") or "").strip() + else: + target = str(item or "").strip() + if target: + result.append(target) + return result diff --git a/src/app/core/rag/indexing/docs/support_layer_builder.py b/src/app/core/rag/indexing/docs/support_layer_builder.py new file mode 100644 index 0000000..0ba956a --- /dev/null +++ b/src/app/core/rag/indexing/docs/support_layer_builder.py @@ -0,0 +1,139 @@ +from __future__ import annotations + +from hashlib import sha256 + +from app.core.rag.contracts import EvidenceLink, EvidenceType, RagDocument, RagLayer, RagSource +from app.core.rag.indexing.docs.frontmatter_view import DocsFrontmatterView +from app.core.rag.indexing.docs.models import IntegrationRecord, RelationEdge, WorkflowScenario + + +class DocsSupportLayerBuilder: + def build_fact( + self, + source: RagSource, + *, + subject_id: str, + predicate: str, + obj: str, + object_ref: str | None, + anchor: str, + tags: list[str] | None = None, + domain: str = "", + subdomain: str = "", + ) -> RagDocument: + fact_id = sha256(f"{subject_id}|{predicate}|{obj}|{source.path}|{anchor}".encode("utf-8")).hexdigest() + metadata = { + "fact_id": fact_id, + "subject_id": subject_id, + "predicate": predicate, + "object": obj, + "object_ref": object_ref, + "anchor": anchor, + "tags": tags or [], + "domain": domain, + "subdomain": subdomain, + "source_path": source.path, + "artifact_type": "DOCS", + } + return RagDocument( + layer=RagLayer.DOCS_FACT_INDEX, + source=source, + title=f"{subject_id}:{predicate}", + text=f"{subject_id} {predicate} {obj}".strip(), + metadata=metadata, + links=[EvidenceLink(type=EvidenceType.DOC_FACT, target_id=fact_id, path=source.path, note=anchor)], + ) + + def build_workflow_record(self, source: RagSource, frontmatter: dict, workflow: WorkflowScenario) -> RagDocument: + view = DocsFrontmatterView(frontmatter) + document_id = view.document_id or source.path + workflow_id = sha256(f"{document_id}|workflow|{workflow.name}|{workflow.anchor}".encode("utf-8")).hexdigest() + metadata = { + "workflow_id": workflow_id, + "document_id": document_id, + "workflow_name": workflow.name, + "preconditions": workflow.preconditions, + "trigger": workflow.trigger, + "main_flow": workflow.main_flow, + "alternative_flow": workflow.alternative_flow, + "error_handling": workflow.error_handling, + "postconditions": workflow.postconditions, + "domain": view.domain, + "subdomain": view.subdomain, + "source_path": source.path, + "artifact_type": "DOCS", + } + text = "\n".join( + [ + workflow.name, + *workflow.preconditions, + *workflow.trigger, + *workflow.main_flow, + *workflow.alternative_flow, + *workflow.error_handling, + *workflow.postconditions, + ] + ).strip() + return RagDocument( + layer=RagLayer.DOCS_WORKFLOW_INDEX, + source=source, + title=workflow.name, + text=text[:4000], + metadata=metadata, + ) + + def build_relation_record(self, source: RagSource, frontmatter: dict, edge: RelationEdge) -> RagDocument: + view = DocsFrontmatterView(frontmatter) + relation_id = sha256(f"{edge.source_id}|{edge.relation_type}|{edge.target_id}|{source.path}|{edge.anchor}".encode("utf-8")).hexdigest() + metadata = { + "relation_id": relation_id, + "source_id": edge.source_id, + "relation_type": edge.relation_type, + "target_id": edge.target_id, + "anchor": edge.anchor, + "domain": view.domain, + "subdomain": view.subdomain, + "source_path": source.path, + "artifact_type": "DOCS", + } + return RagDocument( + layer=RagLayer.DOCS_RELATION_GRAPH, + source=source, + title=f"{edge.source_id}:{edge.relation_type}", + text=f"{edge.source_id} {edge.relation_type} {edge.target_id}", + metadata=metadata, + ) + + def build_integration_record(self, source: RagSource, frontmatter: dict, integration: IntegrationRecord) -> RagDocument: + view = DocsFrontmatterView(frontmatter) + source_id = view.document_id or source.path + integration_id = sha256(f"{source_id}|{integration.target}|{integration.anchor}".encode("utf-8")).hexdigest() + metadata = { + "integration_id": integration_id, + "source_id": source_id, + "source_type": view.doc_type, + "target": integration.target, + "target_type": integration.target_type, + "direction": integration.direction, + "interaction": integration.interaction, + "via": integration.via, + "purpose": integration.purpose, + "details": integration.details, + "domain": view.domain, + "subdomain": view.subdomain, + "source_path": source.path, + "anchor": integration.anchor, + "artifact_type": "DOCS", + } + text = " | ".join( + part + for part in [integration.name, integration.target, integration.interaction, integration.via, integration.purpose] + if part + ) + return RagDocument( + layer=RagLayer.DOCS_INTEGRATION_INDEX, + source=source, + title=integration.name, + text=text[:4000] or integration.target, + metadata=metadata, + ) diff --git a/src/app/modules/rag/indexing/docs/workflow_extractor.py b/src/app/core/rag/indexing/docs/workflow_extractor.py similarity index 80% rename from src/app/modules/rag/indexing/docs/workflow_extractor.py rename to src/app/core/rag/indexing/docs/workflow_extractor.py index 6076337..0cbb736 100644 --- a/src/app/modules/rag/indexing/docs/workflow_extractor.py +++ b/src/app/core/rag/indexing/docs/workflow_extractor.py @@ -1,9 +1,12 @@ from __future__ import annotations -from app.modules.rag.indexing.docs.models import ParsedSubsection, WorkflowScenario +import re + +from app.core.rag.indexing.docs.models import ParsedSubsection, WorkflowScenario class DocsWorkflowExtractor: + _SECTION_TITLES = {"сценарий", "технический use case"} _LABELS = { "название": "name", "предусловия": "preconditions", @@ -15,7 +18,10 @@ class DocsWorkflowExtractor: } def extract(self, sections: list[ParsedSubsection]) -> list[WorkflowScenario]: - scenario_section = next((section for section in sections if section.title.lower() == "сценарий"), None) + scenario_section = next( + (section for section in sections if section.title.strip().lower() in self._SECTION_TITLES), + None, + ) if scenario_section is None or not scenario_section.content.strip(): return [] fields = self._fields(scenario_section.content) @@ -29,7 +35,7 @@ class DocsWorkflowExtractor: alternative_flow=fields.get("alternative_flow", []), error_handling=fields.get("error_handling", []), postconditions=fields.get("postconditions", []), - anchor="Details/Сценарий", + anchor=scenario_section.path, ) ] @@ -51,8 +57,8 @@ class DocsWorkflowExtractor: normalized = line if normalized.startswith("- "): normalized = normalized[2:].strip() - elif normalized[:2].isdigit() and normalized[1:3] == ". ": - normalized = normalized[3:].strip() + elif re.match(r"^\d+\.\s+", normalized): + normalized = re.sub(r"^\d+\.\s+", "", normalized).strip() if normalized: fields[current_key].append(normalized) return fields diff --git a/src/app/modules/rag/job_store.py b/src/app/core/rag/indexing/job_store.py similarity index 97% rename from src/app/modules/rag/job_store.py rename to src/app/core/rag/indexing/job_store.py index bbe2b90..61480e4 100644 --- a/src/app/modules/rag/job_store.py +++ b/src/app/core/rag/indexing/job_store.py @@ -3,7 +3,7 @@ from dataclasses import dataclass from uuid import uuid4 -from app.modules.rag.persistence.repository import RagRepository +from app.core.rag.persistence.repository import RagRepository from app.schemas.common import ErrorPayload, ModuleName from app.schemas.indexing import IndexJobStatus diff --git a/src/app/modules/rag/indexing_service.py b/src/app/core/rag/indexing/orchestrator.py similarity index 95% rename from src/app/modules/rag/indexing_service.py rename to src/app/core/rag/indexing/orchestrator.py index e3adc07..85bdf73 100644 --- a/src/app/modules/rag/indexing_service.py +++ b/src/app/core/rag/indexing/orchestrator.py @@ -5,15 +5,15 @@ from collections import defaultdict from app.schemas.common import ErrorPayload, ModuleName from app.schemas.indexing import IndexJobStatus -from app.modules.contracts import RagIndexer -from app.modules.rag.indexing.common.path_filter import ( +from app.core.contracts import RagIndexer +from app.core.rag.indexing.common.path_filter import ( count_indexable_change_upserts, filter_changes_for_indexing, filter_snapshot_files, ) -from app.modules.rag.job_store import IndexJob, IndexJobStore -from app.modules.shared.event_bus import EventBus -from app.modules.shared.retry_executor import RetryExecutor +from app.core.rag.indexing.job_store import IndexJob, IndexJobStore +from app.core.shared.messaging import EventBus +from app.core.shared.resilience import RetryExecutor class IndexingOrchestrator: diff --git a/src/app/modules/rag/services/rag_service.py b/src/app/core/rag/indexing/service.py similarity index 93% rename from src/app/modules/rag/services/rag_service.py rename to src/app/core/rag/indexing/service.py index 43802fe..e366ab9 100644 --- a/src/app/modules/rag/services/rag_service.py +++ b/src/app/core/rag/indexing/service.py @@ -8,17 +8,17 @@ from collections.abc import Awaitable, Callable from inspect import isawaitable from typing import TYPE_CHECKING -from app.modules.rag.contracts import RagDocument -from app.modules.rag.indexing.common.path_filter import filter_snapshot_files -from app.modules.rag.indexing.code.pipeline import CodeIndexingPipeline -from app.modules.rag.indexing.common.report import IndexReport -from app.modules.rag.indexing.docs.pipeline import DocsIndexingPipeline -from app.modules.rag.embedding.gigachat_embedder import GigaChatEmbedder +from app.core.rag.contracts import RagDocument +from app.core.rag.indexing.common.path_filter import filter_snapshot_files +from app.core.rag.indexing.code.pipeline import CodeIndexingPipeline +from app.core.rag.indexing.common.report import IndexReport +from app.core.rag.indexing.docs.pipeline import DocsIndexingPipeline +from app.core.rag.embedding.gigachat_embedder import GigaChatEmbedder LOGGER = logging.getLogger(__name__) if TYPE_CHECKING: - from app.modules.rag.persistence.repository import RagRepository + from app.core.rag.persistence.repository import RagRepository class RagService: @@ -157,7 +157,7 @@ class RagService: return docs def _document_metadata(self, file: dict, repo_id: str, blob_sha: str) -> dict: - return { + metadata = { "blob_sha": blob_sha, "repo_id": repo_id, "artifact_type": file.get("artifact_type"), @@ -169,6 +169,7 @@ class RagService: "last_modified": file.get("last_modified"), "staleness_score": file.get("staleness_score"), } + return {key: value for key, value in metadata.items() if value not in (None, "", [], {})} def _resolve_repo_id(self, rag_session_id: str) -> str: session = self._repo.get_session(rag_session_id) diff --git a/src/app/core/rag/ingest_api.py b/src/app/core/rag/ingest_api.py new file mode 100644 index 0000000..c770427 --- /dev/null +++ b/src/app/core/rag/ingest_api.py @@ -0,0 +1,11 @@ +"""Стандартный API ingest для пакета RAG. + +Индексация документов выполняется через :class:`RagService` (``index_snapshot``, +``index_changes``). В приложении экземпляр доступен как ``RagModule.rag``. +""" + +from __future__ import annotations + +from app.core.rag.indexing.service import RagService + +__all__ = ["RagService"] diff --git a/src/app/modules/rag/intent_router.md b/src/app/core/rag/intent_router.md similarity index 100% rename from src/app/modules/rag/intent_router.md rename to src/app/core/rag/intent_router.md diff --git a/src/app/core/rag/module.py b/src/app/core/rag/module.py new file mode 100644 index 0000000..90e655b --- /dev/null +++ b/src/app/core/rag/module.py @@ -0,0 +1,56 @@ +"""RAG module composition and application-facing operations.""" + +from __future__ import annotations + +from app.infra.exceptions import AppError +from app.core.rag.embedding.gigachat_embedder import GigaChatEmbedder +from app.core.rag.indexing import IndexJob, IndexJobStore, IndexingOrchestrator, RagService +from app.core.rag.persistence import RagRepository, RagSession, RagSessionStore +from app.core.rag.retrieval import TextChunker +from app.core.shared.gigachat.client import GigaChatClient +from app.core.shared.gigachat.settings import GigaChatSettings +from app.core.shared.gigachat.token_provider import GigaChatTokenProvider +from app.core.shared.messaging import EventBus +from app.core.shared.resilience import RetryExecutor +from app.schemas.common import ModuleName + + +class RagModule: + def __init__(self, event_bus: EventBus, retry: RetryExecutor, repository: RagRepository, ensure_ready=None) -> None: + self._events = event_bus + self._ensure_ready = ensure_ready or (lambda: None) + settings = GigaChatSettings.from_env() + token_provider = GigaChatTokenProvider(settings) + client = GigaChatClient(settings, token_provider) + embedder = GigaChatEmbedder(client) + self.repository = repository + self.rag = RagService(embedder=embedder, repository=repository, chunker=TextChunker()) + self.sessions = RagSessionStore(repository) + self.jobs = IndexJobStore(repository) + self.indexing = IndexingOrchestrator(store=self.jobs, rag=self.rag, events=event_bus, retry=retry) + + async def create_session(self, project_id: str, files: list[dict]) -> tuple[RagSession, IndexJob]: + self._ensure_ready() + session = self.sessions.create(project_id) + job = await self.indexing.enqueue_snapshot(rag_session_id=session.rag_session_id, files=files) + return session, job + + def get_session_job(self, rag_session_id: str, index_job_id: str) -> IndexJob: + self._ensure_ready() + job = self._require_job(index_job_id) + if job.rag_session_id != rag_session_id: + raise AppError("not_found", f"Index job not found: {index_job_id}", ModuleName.RAG) + return job + + async def subscribe_session_job_events(self, rag_session_id: str, index_job_id: str): + job = self.get_session_job(rag_session_id, index_job_id) + return job.index_job_id, await self._events.subscribe(job.index_job_id, replay=True) + + async def unsubscribe_job_events(self, index_job_id: str, queue) -> None: + await self._events.unsubscribe(index_job_id, queue) + + def _require_job(self, index_job_id: str) -> IndexJob: + job = self.jobs.get(index_job_id) + if not job: + raise AppError("not_found", f"Index job not found: {index_job_id}", ModuleName.RAG) + return job diff --git a/src/app/core/rag/persistence/__init__.py b/src/app/core/rag/persistence/__init__.py new file mode 100644 index 0000000..84173bc --- /dev/null +++ b/src/app/core/rag/persistence/__init__.py @@ -0,0 +1,17 @@ +__all__ = ["RagRepository", "RagSession", "RagSessionStore"] + + +def __getattr__(name: str): + if name == "RagRepository": + from app.core.rag.persistence.repository import RagRepository + + return RagRepository + if name == "RagSession": + from app.core.rag.persistence.session_store import RagSession + + return RagSession + if name == "RagSessionStore": + from app.core.rag.persistence.session_store import RagSessionStore + + return RagSessionStore + raise AttributeError(name) diff --git a/src/app/modules/rag/persistence/cache_repository.py b/src/app/core/rag/persistence/cache_repository.py similarity index 78% rename from src/app/modules/rag/persistence/cache_repository.py rename to src/app/core/rag/persistence/cache_repository.py index 5987c08..0f90af2 100644 --- a/src/app/modules/rag/persistence/cache_repository.py +++ b/src/app/core/rag/persistence/cache_repository.py @@ -5,8 +5,7 @@ from datetime import date, datetime from sqlalchemy import text -from app.modules.rag.contracts import EvidenceLink, RagDocument, RagSource, RagSpan -from app.modules.rag.contracts.enums import RagLayer +from app.core.rag.contracts import EvidenceLink, RagDocument, RagSource, RagSpan class RagCacheRepository: @@ -27,24 +26,6 @@ class RagCacheRepository: conn.execute(text(self._insert_sql()), self._insert_params(repo_id, path, blob_sha, idx, doc)) conn.commit() - def record_repo_cache(self, *, project_id: str, commit_sha: str | None, changed_files: list[str], summary: str) -> None: - docs: list[RagDocument] = [] - for idx, path in enumerate(changed_files): - docs.append( - RagDocument( - layer=RagLayer.CODE_SOURCE_CHUNKS, - lang="python" if path.endswith(".py") else None, - source=RagSource(project_id, commit_sha, path), - title=path, - text=f"repo_webhook:{path}:{summary[:300]}", - metadata={"chunk_index": idx, "artifact_type": "CODE", "section": "repo_webhook"}, - ) - ) - for doc in docs: - blob_sha = self._blob_sha(commit_sha, doc.source.path) - doc.metadata["blob_sha"] = blob_sha - self.cache_documents(project_id, doc.source.path, blob_sha, [doc]) - def _select_sql(self) -> str: return """ SELECT layer, lang, path, title, content, metadata_json, links_json, span_start, span_end, @@ -101,13 +82,8 @@ class RagCacheRepository: embedding=self._parse_vector(str(row["embedding_txt"] or "")), ) - def _blob_sha(self, commit_sha: str | None, path: str) -> str: - from hashlib import sha256 - - return sha256(f"{commit_sha or 'no-commit'}:{path}".encode("utf-8")).hexdigest() - def _engine(self): - from app.modules.shared.db import get_engine + from app.core.shared.database import get_engine return get_engine() diff --git a/src/app/modules/rag/persistence/document_repository.py b/src/app/core/rag/persistence/document_repository.py similarity index 98% rename from src/app/modules/rag/persistence/document_repository.py rename to src/app/core/rag/persistence/document_repository.py index ee79307..e7c0993 100644 --- a/src/app/modules/rag/persistence/document_repository.py +++ b/src/app/core/rag/persistence/document_repository.py @@ -5,7 +5,7 @@ from datetime import date, datetime from sqlalchemy import text -from app.modules.rag.contracts import RagDocument +from app.core.rag.contracts import RagDocument class RagDocumentRepository: diff --git a/src/app/modules/rag/persistence/job_repository.py b/src/app/core/rag/persistence/job_repository.py similarity index 98% rename from src/app/modules/rag/persistence/job_repository.py rename to src/app/core/rag/persistence/job_repository.py index 72fba06..ad20ceb 100644 --- a/src/app/modules/rag/persistence/job_repository.py +++ b/src/app/core/rag/persistence/job_repository.py @@ -4,7 +4,7 @@ from dataclasses import dataclass from sqlalchemy import text -from app.modules.shared.db import get_engine +from app.core.shared.database import get_engine @dataclass diff --git a/src/app/modules/rag/persistence/query_repository.py b/src/app/core/rag/persistence/query_repository.py similarity index 55% rename from src/app/modules/rag/persistence/query_repository.py rename to src/app/core/rag/persistence/query_repository.py index 8a020b2..593f7ed 100644 --- a/src/app/modules/rag/persistence/query_repository.py +++ b/src/app/core/rag/persistence/query_repository.py @@ -4,8 +4,8 @@ import json from sqlalchemy import bindparam, text -from app.modules.rag.persistence.retrieval_statement_builder import RetrievalStatementBuilder -from app.modules.shared.db import get_engine +from app.core.rag.persistence.retrieval_statement_builder import RetrievalStatementBuilder +from app.core.shared.database import get_engine class RagQueryRepository: @@ -135,6 +135,105 @@ class RagQueryRepository: rows = conn.execute(stmt, params).mappings().fetchall() return [self._row_to_dict(row) for row in rows] + def retrieve_by_document_ids( + self, + rag_session_id: str, + *, + document_ids: list[str], + layers: list[str] | None = None, + limit: int = 200, + ) -> list[dict]: + normalized_ids = [str(item).strip() for item in document_ids if str(item).strip()] + if not normalized_ids: + return [] + params: dict = { + "sid": rag_session_id, + "lim": max(1, int(limit)), + "doc_ids_document": normalized_ids, + "doc_ids_doc": normalized_ids, + "doc_ids_subject": normalized_ids, + } + stmt = text( + """ + SELECT path, content, layer, title, metadata_json, span_start, span_end, + 0 AS lexical_rank, + 0 AS prefer_bonus, + 0 AS test_penalty, + 0 AS structural_rank, + 0 AS layer_rank, + 0 AS distance + FROM rag_chunks + WHERE rag_session_id = :sid + AND ( + COALESCE(metadata_json->>'document_id', '') IN :doc_ids_document + OR COALESCE(metadata_json->>'doc_id', '') IN :doc_ids_doc + OR COALESCE(metadata_json->>'subject_id', '') IN :doc_ids_subject + ) + ORDER BY + CASE layer + WHEN 'D1_DOCUMENT_CATALOG' THEN 0 + WHEN 'D2_FACT_INDEX' THEN 1 + WHEN 'D0_DOC_CHUNKS' THEN 2 + WHEN 'D4_WORKFLOW_INDEX' THEN 3 + WHEN 'D6_INTEGRATION_INDEX' THEN 4 + WHEN 'D5_RELATION_GRAPH' THEN 5 + ELSE 9 + END, + path ASC, + COALESCE(span_start, 0) ASC, + COALESCE(chunk_index, 0) ASC + LIMIT :lim + """ + ).bindparams( + bindparam("doc_ids_document", expanding=True), + bindparam("doc_ids_doc", expanding=True), + bindparam("doc_ids_subject", expanding=True), + ) + if layers: + params["layers"] = [str(item).strip() for item in layers if str(item).strip()] + if params["layers"]: + stmt = text( + """ + SELECT path, content, layer, title, metadata_json, span_start, span_end, + 0 AS lexical_rank, + 0 AS prefer_bonus, + 0 AS test_penalty, + 0 AS structural_rank, + 0 AS layer_rank, + 0 AS distance + FROM rag_chunks + WHERE rag_session_id = :sid + AND layer IN :layers + AND ( + COALESCE(metadata_json->>'document_id', '') IN :doc_ids_document + OR COALESCE(metadata_json->>'doc_id', '') IN :doc_ids_doc + OR COALESCE(metadata_json->>'subject_id', '') IN :doc_ids_subject + ) + ORDER BY + CASE layer + WHEN 'D1_DOCUMENT_CATALOG' THEN 0 + WHEN 'D2_FACT_INDEX' THEN 1 + WHEN 'D0_DOC_CHUNKS' THEN 2 + WHEN 'D4_WORKFLOW_INDEX' THEN 3 + WHEN 'D6_INTEGRATION_INDEX' THEN 4 + WHEN 'D5_RELATION_GRAPH' THEN 5 + ELSE 9 + END, + path ASC, + COALESCE(span_start, 0) ASC, + COALESCE(chunk_index, 0) ASC + LIMIT :lim + """ + ).bindparams( + bindparam("layers", expanding=True), + bindparam("doc_ids_document", expanding=True), + bindparam("doc_ids_doc", expanding=True), + bindparam("doc_ids_subject", expanding=True), + ) + with get_engine().connect() as conn: + rows = conn.execute(stmt, params).mappings().fetchall() + return [self._row_to_dict(row) for row in rows] + def _row_to_dict(self, row) -> dict: data = dict(row) raw_metadata = data.pop("metadata_json") diff --git a/src/app/modules/rag/persistence/repository.py b/src/app/core/rag/persistence/repository.py similarity index 82% rename from src/app/modules/rag/persistence/repository.py rename to src/app/core/rag/persistence/repository.py index 43be993..cb99adb 100644 --- a/src/app/modules/rag/persistence/repository.py +++ b/src/app/core/rag/persistence/repository.py @@ -1,13 +1,13 @@ from __future__ import annotations -from app.modules.rag.contracts import RagDocument -from app.modules.rag.persistence.cache_repository import RagCacheRepository -from app.modules.rag.persistence.document_repository import RagDocumentRepository -from app.modules.rag.persistence.job_repository import RagJobRepository, RagJobRow -from app.modules.rag.persistence.query_repository import RagQueryRepository -from app.modules.rag.persistence.schema_repository import RagSchemaRepository -from app.modules.rag.persistence.session_repository import RagSessionRepository -from app.modules.shared.db import get_engine +from app.core.rag.contracts import RagDocument +from app.core.rag.persistence.cache_repository import RagCacheRepository +from app.core.rag.persistence.document_repository import RagDocumentRepository +from app.core.rag.persistence.job_repository import RagJobRepository, RagJobRow +from app.core.rag.persistence.query_repository import RagQueryRepository +from app.core.rag.persistence.schema_repository import RagSchemaRepository +from app.core.rag.persistence.session_repository import RagSessionRepository +from app.core.shared.database import get_engine class RagRepository: @@ -56,9 +56,6 @@ class RagRepository: def cache_documents(self, repo_id: str, path: str, blob_sha: str, docs: list[RagDocument]) -> None: self._cache.cache_documents(repo_id, path, blob_sha, docs) - def record_repo_cache(self, **kwargs) -> None: - self._cache.record_repo_cache(**kwargs) - def retrieve( self, rag_session_id: str, @@ -129,3 +126,18 @@ class RagRepository: layers=layers, limit=limit, ) + + def retrieve_by_document_ids( + self, + rag_session_id: str, + *, + document_ids: list[str], + layers: list[str] | None = None, + limit: int = 200, + ) -> list[dict]: + return self._query.retrieve_by_document_ids( + rag_session_id, + document_ids=document_ids, + layers=layers, + limit=limit, + ) diff --git a/src/app/modules/rag/persistence/retrieval_statement_builder.py b/src/app/core/rag/persistence/retrieval_statement_builder.py similarity index 97% rename from src/app/modules/rag/persistence/retrieval_statement_builder.py rename to src/app/core/rag/persistence/retrieval_statement_builder.py index 714c582..3fb34c3 100644 --- a/src/app/modules/rag/persistence/retrieval_statement_builder.py +++ b/src/app/core/rag/persistence/retrieval_statement_builder.py @@ -1,6 +1,6 @@ from __future__ import annotations -from app.modules.rag.retrieval.query_terms import extract_query_terms +from app.core.rag.retrieval.query_terms import extract_query_terms _LIKE_ESCAPE_SQL = " ESCAPE E'\\\\'" @@ -57,9 +57,10 @@ class RetrievalStatementBuilder: "WHEN layer = 'D1_DOCUMENT_CATALOG' THEN 0 " "WHEN layer = 'D4_WORKFLOW_INDEX' THEN 1 " "WHEN layer = 'D2_FACT_INDEX' THEN 2 " - "WHEN layer = 'D5_RELATION_GRAPH' THEN 3 " - "WHEN layer = 'D3_ENTITY_CATALOG' THEN 4 " - "WHEN layer = 'D0_DOC_CHUNKS' THEN 5 " + "WHEN layer = 'D6_INTEGRATION_INDEX' THEN 3 " + "WHEN layer = 'D5_RELATION_GRAPH' THEN 4 " + "WHEN layer = 'D3_ENTITY_CATALOG' THEN 5 " + "WHEN layer = 'D0_DOC_CHUNKS' THEN 6 " "ELSE 10 END" ) sql = f""" diff --git a/src/app/modules/rag/persistence/schema_migrator.py b/src/app/core/rag/persistence/schema_migrator.py similarity index 98% rename from src/app/modules/rag/persistence/schema_migrator.py rename to src/app/core/rag/persistence/schema_migrator.py index f552760..87e639e 100644 --- a/src/app/modules/rag/persistence/schema_migrator.py +++ b/src/app/core/rag/persistence/schema_migrator.py @@ -2,7 +2,7 @@ from __future__ import annotations from sqlalchemy import text -from app.modules.rag.persistence.schema_statements import legacy_chunk_columns +from app.core.rag.persistence.schema_statements import legacy_chunk_columns class RagSchemaMigrator: diff --git a/src/app/modules/rag/persistence/schema_repository.py b/src/app/core/rag/persistence/schema_repository.py similarity index 80% rename from src/app/modules/rag/persistence/schema_repository.py rename to src/app/core/rag/persistence/schema_repository.py index bab85c6..14ae742 100644 --- a/src/app/modules/rag/persistence/schema_repository.py +++ b/src/app/core/rag/persistence/schema_repository.py @@ -2,13 +2,13 @@ from __future__ import annotations from sqlalchemy import text -from app.modules.rag.persistence.schema_migrator import RagSchemaMigrator -from app.modules.rag.persistence.schema_statements import ( +from app.core.rag.persistence.schema_migrator import RagSchemaMigrator +from app.core.rag.persistence.schema_statements import ( base_table_statements, index_statements, legacy_drop_statements, ) -from app.modules.shared.db import get_engine +from app.core.shared.database import get_engine class RagSchemaRepository: diff --git a/src/app/modules/rag/persistence/schema_statements.py b/src/app/core/rag/persistence/schema_statements.py similarity index 100% rename from src/app/modules/rag/persistence/schema_statements.py rename to src/app/core/rag/persistence/schema_statements.py diff --git a/src/app/modules/rag/persistence/session_repository.py b/src/app/core/rag/persistence/session_repository.py similarity index 96% rename from src/app/modules/rag/persistence/session_repository.py rename to src/app/core/rag/persistence/session_repository.py index 5c36a5d..1b42289 100644 --- a/src/app/modules/rag/persistence/session_repository.py +++ b/src/app/core/rag/persistence/session_repository.py @@ -2,7 +2,7 @@ from __future__ import annotations from sqlalchemy import text -from app.modules.shared.db import get_engine +from app.core.shared.database import get_engine class RagSessionRepository: diff --git a/src/app/modules/rag/session_store.py b/src/app/core/rag/persistence/session_store.py similarity index 94% rename from src/app/modules/rag/session_store.py rename to src/app/core/rag/persistence/session_store.py index bc6de8c..527da6b 100644 --- a/src/app/modules/rag/session_store.py +++ b/src/app/core/rag/persistence/session_store.py @@ -3,7 +3,7 @@ from dataclasses import dataclass from uuid import uuid4 -from app.modules.rag.persistence.repository import RagRepository +from app.core.rag.persistence.repository import RagRepository @dataclass diff --git a/src/app/core/rag/retrieval/__init__.py b/src/app/core/rag/retrieval/__init__.py new file mode 100644 index 0000000..98ce1bc --- /dev/null +++ b/src/app/core/rag/retrieval/__init__.py @@ -0,0 +1,21 @@ +__all__ = ["TextChunker", "extract_query_terms", "RetrievalPlan", "RagSessionRetriever"] + + +def __getattr__(name: str): + if name == "TextChunker": + from app.core.rag.retrieval.chunker import TextChunker + + return TextChunker + if name == "extract_query_terms": + from app.core.rag.retrieval.query_terms import extract_query_terms + + return extract_query_terms + if name == "RetrievalPlan": + from app.core.rag.retrieval.session_retriever import RetrievalPlan + + return RetrievalPlan + if name == "RagSessionRetriever": + from app.core.rag.retrieval.session_retriever import RagSessionRetriever + + return RagSessionRetriever + raise AttributeError(name) diff --git a/src/app/modules/rag/retrieval/chunker.py b/src/app/core/rag/retrieval/chunker.py similarity index 100% rename from src/app/modules/rag/retrieval/chunker.py rename to src/app/core/rag/retrieval/chunker.py diff --git a/src/app/modules/rag/retrieval/query_terms.py b/src/app/core/rag/retrieval/query_terms.py similarity index 100% rename from src/app/modules/rag/retrieval/query_terms.py rename to src/app/core/rag/retrieval/query_terms.py diff --git a/src/app/modules/rag/retrieval/scoring.py b/src/app/core/rag/retrieval/scoring.py similarity index 100% rename from src/app/modules/rag/retrieval/scoring.py rename to src/app/core/rag/retrieval/scoring.py diff --git a/src/app/core/rag/retrieval/session_retriever.py b/src/app/core/rag/retrieval/session_retriever.py new file mode 100644 index 0000000..ea9004a --- /dev/null +++ b/src/app/core/rag/retrieval/session_retriever.py @@ -0,0 +1,97 @@ +"""Стандартный API retrieval по RAG-сессии: эмбеддинг запроса и поиск по плану слоёв.""" + +from __future__ import annotations + +import asyncio +from dataclasses import dataclass, field +from typing import TYPE_CHECKING + +from app.core.rag.embedding.gigachat_embedder import GigaChatEmbedder + +if TYPE_CHECKING: + from app.core.rag.persistence.repository import RagRepository + + +@dataclass(slots=True) +class RetrievalPlan: + """Параметры одного запроса к хранилищу: профиль, список слоёв и лимит строк.""" + + profile: str + layers: list[str] + limit: int + filters: dict[str, object] = field(default_factory=dict) + + +class RagSessionRetriever: + """Выполняет retrieve через :class:`RagRepository` и эмбеддер; единая точка поиска по сессии.""" + + def __init__(self, repository: RagRepository, embedder: GigaChatEmbedder) -> None: + self._repository = repository + self._embedder = embedder + + async def retrieve(self, rag_session_id: str, query_text: str, plan: RetrievalPlan) -> list[dict]: + """Возвращает сырые строки чанков (как в RagRepository.retrieve), с полем layer.""" + if not plan.layers: + return [] + query_embedding = await asyncio.to_thread(self._embed_query, query_text) + kwargs = self._map_filters(plan.filters) + return await asyncio.to_thread( + self._repository.retrieve, + rag_session_id, + query_embedding, + query_text=query_text, + layers=plan.layers, + limit=plan.limit, + **kwargs, + ) + + async def retrieve_exact_files( + self, + rag_session_id: str, + *, + paths: list[str], + layers: list[str] | None = None, + limit: int = 200, + ) -> list[dict]: + return await asyncio.to_thread( + self._repository.retrieve_exact_files, + rag_session_id, + paths=paths, + layers=layers, + limit=limit, + ) + + async def retrieve_chunks_by_path_substrings( + self, + rag_session_id: str, + *, + path_needles: list[str], + layers: list[str] | None = None, + limit: int = 200, + ) -> list[dict]: + return await asyncio.to_thread( + self._repository.retrieve_chunks_by_path_substrings, + rag_session_id, + path_needles=path_needles, + layers=layers, + limit=limit, + ) + + def _embed_query(self, query: str) -> list[float]: + return self._embedder.embed([query])[0] + + def _map_filters(self, filters: dict[str, object]) -> dict: + """Маппинг опциональных фильтров плана на kwargs RagRepository.retrieve.""" + out: dict = {} + keys = ( + "path_prefixes", + "exclude_path_prefixes", + "exclude_like_patterns", + "prefer_path_prefixes", + "prefer_like_patterns", + "prefer_non_tests", + ) + for key in keys: + if key in filters: + out[key] = filters[key] + return out diff --git a/src/app/modules/rag/retrieval/test_filter.py b/src/app/core/rag/retrieval/test_filter.py similarity index 100% rename from src/app/modules/rag/retrieval/test_filter.py rename to src/app/core/rag/retrieval/test_filter.py diff --git a/src/app/modules/shared/README.md b/src/app/core/shared/README.md similarity index 74% rename from src/app/modules/shared/README.md rename to src/app/core/shared/README.md index 0f49eea..b27a64a 100644 --- a/src/app/modules/shared/README.md +++ b/src/app/core/shared/README.md @@ -2,11 +2,12 @@ ## 1. Функции модуля - Общие инфраструктурные компоненты для всех модулей: - - подключение к БД (`db.py`, `bootstrap.py`), - - шина событий (`event_bus.py`), - - retry и idempotency (`retry_executor.py`, `idempotency_store.py`), - - checkpointer, - - клиент и настройки GigaChat (`gigachat/*`). + - `config/*` - загрузка окружения и общих настроек workspace, + - `database/*` - подключение к БД, bootstrap и checkpointer, + - `messaging/*` - общая шина событий и SSE-совместимые события, + - `resilience/*` - retry и idempotency, + - `observability/*` - runtime trace и trace logging, + - `gigachat/*` - клиент и настройки GigaChat. ## 2. Диаграмма классов и взаимосвязей ```mermaid @@ -25,10 +26,13 @@ classDiagram ## 3. Описание классов - `EventBus`: общий асинхронный event-bus для публикации и SSE-стриминга. Методы: `subscribe` — подписка на канал; `unsubscribe` — удаление подписки; `publish` — отправка события; `as_sse` — сериализация события в SSE-формат. +- `database_url/get_engine/get_session_factory`: общий доступ к engine и session factory SQLAlchemy. +- `bootstrap_database/get_checkpointer`: инициализация persistence-слоя и LangGraph checkpointer. - `RetryExecutor`: общий механизм повторных попыток для временных ошибок. Методы: `run` — выполняет async-операцию с retry по временным исключениям. - `IdempotencyStore`: in-memory хранилище идемпотентных ключей. Методы: `get_task_id` — находит ранее созданную задачу по ключу; `put` — сохраняет ключ и task_id. +- `load_workspace_env`: загрузка `.env` и `.env.local` по цепочке родительских директорий. - `GigaChatSettings`: конфигурация доступа к GigaChat. Методы: `from_env` — собирает настройки из переменных окружения. - `GigaChatTokenProvider`: управление access token для GigaChat API. diff --git a/src/app/modules/__init__.py b/src/app/core/shared/__init__.py similarity index 100% rename from src/app/modules/__init__.py rename to src/app/core/shared/__init__.py diff --git a/src/app/core/shared/config/__init__.py b/src/app/core/shared/config/__init__.py new file mode 100644 index 0000000..fc8fef7 --- /dev/null +++ b/src/app/core/shared/config/__init__.py @@ -0,0 +1,3 @@ +from app.core.shared.config.env_loader import load_workspace_env + +__all__ = ["load_workspace_env"] diff --git a/src/app/modules/shared/env_loader.py b/src/app/core/shared/config/env_loader.py similarity index 100% rename from src/app/modules/shared/env_loader.py rename to src/app/core/shared/config/env_loader.py diff --git a/src/app/core/shared/database/__init__.py b/src/app/core/shared/database/__init__.py new file mode 100644 index 0000000..60857f6 --- /dev/null +++ b/src/app/core/shared/database/__init__.py @@ -0,0 +1,13 @@ +from app.core.shared.database.bootstrap import bootstrap_database +from app.core.shared.database.checkpointer import get_checkpointer +from app.core.shared.database.db import database_url, get_engine, get_session_factory +from app.core.shared.database.readiness import DatabaseReadiness + +__all__ = [ + "DatabaseReadiness", + "bootstrap_database", + "database_url", + "get_checkpointer", + "get_engine", + "get_session_factory", +] diff --git a/src/app/modules/shared/bootstrap.py b/src/app/core/shared/database/bootstrap.py similarity index 90% rename from src/app/modules/shared/bootstrap.py rename to src/app/core/shared/database/bootstrap.py index ed90f3f..06d0693 100644 --- a/src/app/modules/shared/bootstrap.py +++ b/src/app/core/shared/database/bootstrap.py @@ -1,6 +1,6 @@ import time -from app.modules.shared.checkpointer import get_checkpointer +from app.core.shared.database.checkpointer import get_checkpointer def bootstrap_database(rag_repository, story_context_repository, chat_repository=None) -> None: diff --git a/src/app/modules/shared/checkpointer.py b/src/app/core/shared/database/checkpointer.py similarity index 81% rename from src/app/modules/shared/checkpointer.py rename to src/app/core/shared/database/checkpointer.py index 955f9bd..b4f59cc 100644 --- a/src/app/modules/shared/checkpointer.py +++ b/src/app/core/shared/database/checkpointer.py @@ -7,7 +7,7 @@ from langgraph.checkpoint.postgres import PostgresSaver from psycopg.errors import DuplicateColumn from psycopg.rows import dict_row -from app.modules.shared.db import database_url +from app.core.shared.database.db import database_url _CHECKPOINTER: PostgresSaver | None = None _LOCK = threading.Lock() @@ -29,8 +29,6 @@ def get_checkpointer() -> PostgresSaver: try: cp.setup() except DuplicateColumn as exc: - # LangGraph migrations may be partially applied in an existing DB. - # Treat duplicate task_path as already initialized schema. if "task_path" not in str(exc): raise _CHECKPOINTER = cp diff --git a/src/app/modules/shared/db.py b/src/app/core/shared/database/db.py similarity index 100% rename from src/app/modules/shared/db.py rename to src/app/core/shared/database/db.py diff --git a/src/app/core/shared/database/readiness.py b/src/app/core/shared/database/readiness.py new file mode 100644 index 0000000..5516f7d --- /dev/null +++ b/src/app/core/shared/database/readiness.py @@ -0,0 +1,40 @@ +from __future__ import annotations + +from dataclasses import dataclass + +from app.infra.exceptions import AppError +from app.schemas.common import ModuleName + + +@dataclass +class DatabaseReadiness: + _error: str | None = None + + def mark_ready(self) -> None: + self._error = None + + def mark_unavailable(self, exc: Exception) -> None: + self._error = str(exc).strip() or exc.__class__.__name__ + + def require_ready(self) -> None: + if self._error is None: + return + raise AppError( + "database_unavailable", + "Database is unavailable. Configure DATABASE_URL or start the database service. " + f"Last error: {self._error}", + ModuleName.BACKEND, + ) + + def health_payload(self) -> dict[str, str]: + if self._error is None: + return {"status": "ok"} + return { + "status": "degraded", + "reason": "database_unavailable", + "details": self._error, + } + + @property + def error(self) -> str | None: + return self._error diff --git a/src/app/modules/agent/__init__.py b/src/app/core/shared/gigachat/__init__.py similarity index 100% rename from src/app/modules/agent/__init__.py rename to src/app/core/shared/gigachat/__init__.py diff --git a/src/app/modules/shared/gigachat/client.py b/src/app/core/shared/gigachat/client.py similarity index 92% rename from src/app/modules/shared/gigachat/client.py rename to src/app/core/shared/gigachat/client.py index 5096bbe..0127295 100644 --- a/src/app/modules/shared/gigachat/client.py +++ b/src/app/core/shared/gigachat/client.py @@ -2,10 +2,10 @@ import time import requests -from app.core.constants import MAX_RETRIES -from app.modules.shared.gigachat.errors import GigaChatError -from app.modules.shared.gigachat.settings import GigaChatSettings -from app.modules.shared.gigachat.token_provider import GigaChatTokenProvider +from app.infra.constants import MAX_RETRIES +from app.core.shared.gigachat.errors import GigaChatError +from app.core.shared.gigachat.settings import GigaChatSettings +from app.core.shared.gigachat.token_provider import GigaChatTokenProvider class GigaChatClient: diff --git a/src/app/modules/shared/gigachat/errors.py b/src/app/core/shared/gigachat/errors.py similarity index 100% rename from src/app/modules/shared/gigachat/errors.py rename to src/app/core/shared/gigachat/errors.py diff --git a/src/app/modules/shared/gigachat/settings.py b/src/app/core/shared/gigachat/settings.py similarity index 100% rename from src/app/modules/shared/gigachat/settings.py rename to src/app/core/shared/gigachat/settings.py diff --git a/src/app/modules/shared/gigachat/token_provider.py b/src/app/core/shared/gigachat/token_provider.py similarity index 93% rename from src/app/modules/shared/gigachat/token_provider.py rename to src/app/core/shared/gigachat/token_provider.py index 7fb790f..0d8adb6 100644 --- a/src/app/modules/shared/gigachat/token_provider.py +++ b/src/app/core/shared/gigachat/token_provider.py @@ -4,8 +4,8 @@ import uuid import requests -from app.modules.shared.gigachat.errors import GigaChatError -from app.modules.shared.gigachat.settings import GigaChatSettings +from app.core.shared.gigachat.errors import GigaChatError +from app.core.shared.gigachat.settings import GigaChatSettings class GigaChatTokenProvider: diff --git a/src/app/core/shared/messaging/__init__.py b/src/app/core/shared/messaging/__init__.py new file mode 100644 index 0000000..f3261da --- /dev/null +++ b/src/app/core/shared/messaging/__init__.py @@ -0,0 +1,3 @@ +from app.core.shared.messaging.event_bus import Event, EventBus + +__all__ = ["Event", "EventBus"] diff --git a/src/app/modules/shared/event_bus.py b/src/app/core/shared/messaging/event_bus.py similarity index 100% rename from src/app/modules/shared/event_bus.py rename to src/app/core/shared/messaging/event_bus.py diff --git a/src/app/core/shared/resilience/__init__.py b/src/app/core/shared/resilience/__init__.py new file mode 100644 index 0000000..14439aa --- /dev/null +++ b/src/app/core/shared/resilience/__init__.py @@ -0,0 +1,4 @@ +from app.core.shared.resilience.idempotency_store import IdempotencyRecord, IdempotencyStore +from app.core.shared.resilience.retry_executor import RetryExecutor + +__all__ = ["IdempotencyRecord", "IdempotencyStore", "RetryExecutor"] diff --git a/src/app/modules/shared/idempotency_store.py b/src/app/core/shared/resilience/idempotency_store.py similarity index 82% rename from src/app/modules/shared/idempotency_store.py rename to src/app/core/shared/resilience/idempotency_store.py index 5434988..000b269 100644 --- a/src/app/modules/shared/idempotency_store.py +++ b/src/app/core/shared/resilience/idempotency_store.py @@ -2,7 +2,7 @@ from dataclasses import dataclass from datetime import datetime, timezone from threading import Lock -from app.core.constants import IDEMPOTENCY_TTL +from app.infra.constants import IDEMPOTENCY_TTL @dataclass @@ -31,10 +31,6 @@ class IdempotencyStore: ) def _cleanup_locked(self, now: datetime) -> None: - expired = [ - key - for key, rec in self._records.items() - if now - rec.created_at > IDEMPOTENCY_TTL - ] + expired = [key for key, rec in self._records.items() if now - rec.created_at > IDEMPOTENCY_TTL] for key in expired: del self._records[key] diff --git a/src/app/modules/shared/retry_executor.py b/src/app/core/shared/resilience/retry_executor.py similarity index 93% rename from src/app/modules/shared/retry_executor.py rename to src/app/core/shared/resilience/retry_executor.py index eb0e89b..7b70f0a 100644 --- a/src/app/modules/shared/retry_executor.py +++ b/src/app/core/shared/resilience/retry_executor.py @@ -1,7 +1,7 @@ import asyncio from typing import Awaitable, Callable, TypeVar -from app.core.constants import MAX_RETRIES +from app.infra.constants import MAX_RETRIES T = TypeVar("T") diff --git a/src/app/core/shared/story_context/__init__.py b/src/app/core/shared/story_context/__init__.py new file mode 100644 index 0000000..76e0023 --- /dev/null +++ b/src/app/core/shared/story_context/__init__.py @@ -0,0 +1,3 @@ +from app.core.shared.story_context.schema_repository import StoryContextSchemaRepository + +__all__ = ["StoryContextSchemaRepository"] diff --git a/src/app/core/shared/story_context/schema_repository.py b/src/app/core/shared/story_context/schema_repository.py new file mode 100644 index 0000000..3ffd53c --- /dev/null +++ b/src/app/core/shared/story_context/schema_repository.py @@ -0,0 +1,126 @@ +from __future__ import annotations + +from sqlalchemy import text + +from app.core.shared.database import get_engine + + +class StoryContextSchemaRepository: + def ensure_tables(self) -> None: + with get_engine().connect() as conn: + for statement in self._statements(): + conn.execute(text(statement)) + conn.commit() + + def _statements(self) -> tuple[str, ...]: + return ( + """ + CREATE TABLE IF NOT EXISTS story_records ( + story_id VARCHAR(128) PRIMARY KEY, + project_id VARCHAR(512) NOT NULL, + title TEXT NOT NULL, + status VARCHAR(64) NOT NULL DEFAULT 'draft', + owner VARCHAR(256) NULL, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, + baseline_commit_sha VARCHAR(128) NULL, + snapshot_id VARCHAR(128) NULL, + created_by VARCHAR(256) NULL, + updated_by VARCHAR(256) NULL, + created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP + ) + """, + """ + CREATE TABLE IF NOT EXISTS story_artifacts ( + id BIGSERIAL PRIMARY KEY, + story_id VARCHAR(128) NOT NULL, + artifact_type VARCHAR(64) NOT NULL, + revision INTEGER NOT NULL, + content TEXT NOT NULL, + content_hash VARCHAR(128) NULL, + rag_session_id VARCHAR(64) NULL, + created_by VARCHAR(256) NULL, + created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, + artifact_role VARCHAR(64) NULL, + doc_id TEXT NULL, + doc_version TEXT NULL, + path TEXT NULL, + section TEXT NULL, + chunk_id TEXT NULL, + change_type VARCHAR(32) NULL, + summary TEXT NULL, + source_ref TEXT NULL, + session_id VARCHAR(128) NULL, + CONSTRAINT fk_story_artifacts_story + FOREIGN KEY (story_id) + REFERENCES story_records(story_id) + ON DELETE CASCADE, + CONSTRAINT uq_story_artifact_revision + UNIQUE (story_id, artifact_type, revision) + ) + """, + """ + CREATE TABLE IF NOT EXISTS story_links ( + id BIGSERIAL PRIMARY KEY, + story_id VARCHAR(128) NOT NULL, + link_type VARCHAR(64) NOT NULL, + link_value TEXT NOT NULL, + target_ref TEXT NULL, + description TEXT NULL, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, + created_by VARCHAR(256) NULL, + created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT fk_story_links_story + FOREIGN KEY (story_id) + REFERENCES story_records(story_id) + ON DELETE CASCADE + ) + """, + """ + CREATE TABLE IF NOT EXISTS session_artifacts ( + id BIGSERIAL PRIMARY KEY, + session_id VARCHAR(128) NOT NULL, + project_id VARCHAR(512) NOT NULL, + artifact_role VARCHAR(64) NOT NULL, + source_ref TEXT NULL, + doc_id TEXT NULL, + doc_version TEXT NULL, + path TEXT NULL, + section TEXT NULL, + chunk_id TEXT NULL, + change_type VARCHAR(32) NULL, + summary TEXT NULL, + created_by VARCHAR(256) NULL, + created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, + bound_story_id VARCHAR(128) NULL, + bound_at TIMESTAMPTZ NULL + ) + """, + "ALTER TABLE story_records ADD COLUMN IF NOT EXISTS owner VARCHAR(256) NULL", + "ALTER TABLE story_records ADD COLUMN IF NOT EXISTS metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb", + "ALTER TABLE story_records ADD COLUMN IF NOT EXISTS baseline_commit_sha VARCHAR(128) NULL", + "ALTER TABLE story_records ADD COLUMN IF NOT EXISTS snapshot_id VARCHAR(128) NULL", + "ALTER TABLE story_records ADD COLUMN IF NOT EXISTS created_by VARCHAR(256) NULL", + "ALTER TABLE story_records ADD COLUMN IF NOT EXISTS updated_by VARCHAR(256) NULL", + "ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS artifact_role VARCHAR(64) NULL", + "ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS doc_id TEXT NULL", + "ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS doc_version TEXT NULL", + "ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS path TEXT NULL", + "ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS section TEXT NULL", + "ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS chunk_id TEXT NULL", + "ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS change_type VARCHAR(32) NULL", + "ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS summary TEXT NULL", + "ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS source_ref TEXT NULL", + "ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS session_id VARCHAR(128) NULL", + "ALTER TABLE story_links ADD COLUMN IF NOT EXISTS target_ref TEXT NULL", + "ALTER TABLE story_links ADD COLUMN IF NOT EXISTS description TEXT NULL", + "ALTER TABLE story_links ADD COLUMN IF NOT EXISTS metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb", + "ALTER TABLE story_links ADD COLUMN IF NOT EXISTS created_by VARCHAR(256) NULL", + "ALTER TABLE session_artifacts ADD COLUMN IF NOT EXISTS bound_story_id VARCHAR(128) NULL", + "ALTER TABLE session_artifacts ADD COLUMN IF NOT EXISTS bound_at TIMESTAMPTZ NULL", + "CREATE INDEX IF NOT EXISTS idx_story_records_project ON story_records(project_id, updated_at DESC)", + "CREATE INDEX IF NOT EXISTS idx_story_artifacts_story_type ON story_artifacts(story_id, artifact_type, revision DESC)", + "CREATE INDEX IF NOT EXISTS idx_story_links_story ON story_links(story_id, link_type)", + "CREATE INDEX IF NOT EXISTS idx_session_artifacts_session ON session_artifacts(session_id, created_at DESC)", + "CREATE INDEX IF NOT EXISTS idx_session_artifacts_project ON session_artifacts(project_id, created_at DESC)", + ) diff --git a/src/app/modules/shared/__init__.py b/src/app/infra/__init__.py similarity index 100% rename from src/app/modules/shared/__init__.py rename to src/app/infra/__init__.py diff --git a/src/app/core/constants.py b/src/app/infra/constants.py similarity index 100% rename from src/app/core/constants.py rename to src/app/infra/constants.py diff --git a/src/app/core/error_handlers.py b/src/app/infra/error_handlers.py similarity index 85% rename from src/app/core/error_handlers.py rename to src/app/infra/error_handlers.py index 52e8ff3..0909155 100644 --- a/src/app/core/error_handlers.py +++ b/src/app/infra/error_handlers.py @@ -2,7 +2,7 @@ from fastapi import FastAPI, Request from fastapi.responses import JSONResponse from pydantic import ValidationError -from app.core.exceptions import AppError +from app.infra.exceptions import AppError from app.schemas.common import ModuleName @@ -10,7 +10,7 @@ def register_error_handlers(app: FastAPI) -> None: @app.exception_handler(AppError) async def app_error_handler(_: Request, exc: AppError) -> JSONResponse: return JSONResponse( - status_code=400, + status_code=_status_code(exc), content={"code": exc.code, "desc": exc.desc, "module": exc.module.value}, ) @@ -35,3 +35,9 @@ def register_error_handlers(app: FastAPI) -> None: "module": ModuleName.BACKEND.value, }, ) + + +def _status_code(exc: AppError) -> int: + if exc.code == "database_unavailable": + return 503 + return 400 diff --git a/src/app/core/exceptions.py b/src/app/infra/exceptions.py similarity index 100% rename from src/app/core/exceptions.py rename to src/app/infra/exceptions.py diff --git a/src/app/core/logging_setup.py b/src/app/infra/logging_setup.py similarity index 100% rename from src/app/core/logging_setup.py rename to src/app/infra/logging_setup.py diff --git a/src/app/infra/observability/__init__.py b/src/app/infra/observability/__init__.py new file mode 100644 index 0000000..abb9632 --- /dev/null +++ b/src/app/infra/observability/__init__.py @@ -0,0 +1,13 @@ +from app.infra.observability.module_trace import ModuleTrace, ModuleTraceLogger, RequestTraceContext +from app.infra.observability.request_trace_logger import RequestTraceLogger +from app.infra.observability.trace_file_path_builder import TraceFilePathBuilder +from app.infra.observability.trace_markdown_writer import TraceMarkdownWriter + +__all__ = [ + "ModuleTrace", + "ModuleTraceLogger", + "RequestTraceContext", + "RequestTraceLogger", + "TraceFilePathBuilder", + "TraceMarkdownWriter", +] diff --git a/src/app/modules/agent/observability/module_trace.py b/src/app/infra/observability/module_trace.py similarity index 100% rename from src/app/modules/agent/observability/module_trace.py rename to src/app/infra/observability/module_trace.py diff --git a/src/app/modules/api/infrastructure/logging/request_trace_logger.py b/src/app/infra/observability/request_trace_logger.py similarity index 55% rename from src/app/modules/api/infrastructure/logging/request_trace_logger.py rename to src/app/infra/observability/request_trace_logger.py index 11001c9..7642950 100644 --- a/src/app/modules/api/infrastructure/logging/request_trace_logger.py +++ b/src/app/infra/observability/request_trace_logger.py @@ -3,11 +3,11 @@ from __future__ import annotations from pathlib import Path from threading import Lock -from app.modules.api.domain.events.client_event import ClientEventRecord -from app.modules.api.domain.models.agent_request import AgentRequest -from app.modules.api.domain.models.agent_session import AgentSession -from app.modules.api.infrastructure.logging.trace_file_path_builder import TraceFilePathBuilder -from app.modules.api.infrastructure.logging.trace_markdown_writer import TraceMarkdownWriter +from app.core.api.domain.events.client_event import ClientEventRecord +from app.core.api.domain.models.agent_request import AgentRequest +from app.core.api.domain.models.agent_session import AgentSession +from app.infra.observability.trace_file_path_builder import TraceFilePathBuilder +from app.infra.observability.trace_markdown_writer import TraceMarkdownWriter class RequestTraceLogger: @@ -15,23 +15,31 @@ class RequestTraceLogger: self._paths = TraceFilePathBuilder(root) self._writer = TraceMarkdownWriter() self._files: dict[str, Path] = {} + self._rag_session_files: dict[str, Path] = {} self._lock = Lock() def start_request(self, request: AgentRequest, session: AgentSession) -> None: - path = self._paths.build(request.request_id) - self._writer.initialize( + path = self._resolve_path(session.active_rag_session_id) + if not path.exists(): + self._writer.initialize( + path, + [ + f"# Runtime Trace: {path.stem}", + "", + f"- active_rag_session_id: {session.active_rag_session_id or '—'}", + ], + ) + self._writer.append_section( path, - [ - f"# Request Trace: {request.request_id}", - "", - f"- session_id: {session.session_id}", - f"- active_rag_session_id: {session.active_rag_session_id or '—'}", - f"- process_version: {request.process_version}", - f"- created_at: {request.created_at.isoformat()}", - "", - "## User Message", - request.message, - ], + "request", + { + "request_id": request.request_id, + "session_id": session.session_id, + "active_rag_session_id": session.active_rag_session_id, + "process_version": request.process_version, + "created_at": request.created_at.isoformat(), + "message": request.message, + }, ) with self._lock: self._files[request.request_id] = path @@ -45,17 +53,7 @@ class RequestTraceLogger: self._append(request_id, module, body) def log_event(self, event: ClientEventRecord) -> None: - self._append( - event.request_id, - "client_event", - { - "event": event.type.value, - "source": event.source, - "text": event.text, - "payload": event.payload, - "created_at": event.created_at.isoformat(), - }, - ) + return def complete_request(self, request: AgentRequest) -> None: self._append( @@ -85,3 +83,13 @@ class RequestTraceLogger: if path is None: return self._writer.append_section(path, title, payload) + + def _resolve_path(self, rag_session_id: str | None) -> Path: + if not rag_session_id: + return self._paths.build_for_rag_session(None) + with self._lock: + path = self._rag_session_files.get(rag_session_id) + if path is None: + path = self._paths.build_for_rag_session(rag_session_id) + self._rag_session_files[rag_session_id] = path + return path diff --git a/src/app/infra/observability/trace_file_path_builder.py b/src/app/infra/observability/trace_file_path_builder.py new file mode 100644 index 0000000..6dafacd --- /dev/null +++ b/src/app/infra/observability/trace_file_path_builder.py @@ -0,0 +1,21 @@ +from __future__ import annotations + +from datetime import datetime, timezone +from pathlib import Path + + +class TraceFilePathBuilder: + def __init__(self, root: Path) -> None: + self._root = root + + def build_for_rag_session(self, rag_session_id: str | None) -> Path: + self._root.mkdir(parents=True, exist_ok=True) + stamp = datetime.now(timezone.utc).strftime("%Y%m%d-%H%M%S") + suffix = self._suffix_from_rag_session(rag_session_id) + return self._root / f"{stamp}-{suffix}.md" + + def _suffix_from_rag_session(self, rag_session_id: str | None) -> str: + normalized = (rag_session_id or "").strip() + if not normalized: + return "no-rag-session" + return normalized[-12:] diff --git a/src/app/modules/api/infrastructure/logging/trace_markdown_writer.py b/src/app/infra/observability/trace_markdown_writer.py similarity index 100% rename from src/app/modules/api/infrastructure/logging/trace_markdown_writer.py rename to src/app/infra/observability/trace_markdown_writer.py diff --git a/src/app/main.py b/src/app/main.py index 30819d9..3dcb41f 100644 --- a/src/app/main.py +++ b/src/app/main.py @@ -3,9 +3,9 @@ import logging from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware -from app.core.logging_setup import configure_logging -from app.core.error_handlers import register_error_handlers -from app.modules.application import ModularApplication +from app.infra.logging_setup import configure_logging +from app.infra.error_handlers import register_error_handlers +from app.core.application import ModularApplication def _configure_logging() -> None: @@ -28,10 +28,6 @@ def create_app() -> FastAPI: ) app.include_router(modules.api.public_router()) - app.include_router(modules.rag.public_router()) - app.include_router(modules.rag.internal_router()) - app.include_router(modules.rag_repo.internal_router()) - register_error_handlers(app) @app.on_event("startup") @@ -40,7 +36,7 @@ def create_app() -> FastAPI: @app.get("/health") async def health() -> dict: - return {"status": "ok"} + return modules.health_payload() return app diff --git a/src/app/modules/agent/README.md b/src/app/modules/agent/README.md deleted file mode 100644 index 92d3ed5..0000000 --- a/src/app/modules/agent/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# Модуль agent - -## 1. Назначение -Модуль обеспечивает выполнение code-QA пайплайна для pipeline_setup_v3 и интеграцию с chat-слоем через адаптер к контракту `AgentRunner`. Оркестрация основана на **IntentRouterV2** (RAG) и **AgentRuntimeExecutor** (роутинг → retrieval → evidence gate → генерация ответа). - -## 2. Состав модуля -- **runtime/** — единственный orchestration-слой. На верхнем уровне содержит только файлы рантайма, а шаги исполнения вынесены в `runtime/steps/*` (`retrieval`, `context`, `gates`, `answer_policy`, `generation`, `finalization`, `explain`). Публичный API: `AgentRuntimeExecutor`, `RuntimeRetrievalAdapter`, `RuntimeRepoContextFactory`, модели `Runtime*`. -- **llm/** — сервис вызова LLM (GigaChat) с загрузкой системных промптов через `PromptLoader`. -- **llm/prompt_loader.py** — загрузка системных промптов из `llm/prompts.yml`. -- **runtime/code_qa_runner_adapter.py** — адаптер `AgentRuntimeExecutor` к протоколу `AgentRunner` для использования из chat (async `run` → sync `execute` в executor). - -## 3. Диаграмма зависимостей -```mermaid -classDiagram - class AgentRuntimeExecutor - class CodeQaRunnerAdapter - class AgentLlmService - class PromptLoader - class IntentRouterV2 - class RuntimeRetrievalAdapter - - CodeQaRunnerAdapter --> AgentRuntimeExecutor - AgentRuntimeExecutor --> AgentLlmService - AgentRuntimeExecutor --> IntentRouterV2 - AgentRuntimeExecutor --> RuntimeRetrievalAdapter - AgentLlmService --> PromptLoader -``` - -## 4. Точки входа -- **Тесты pipeline_setup_v3**: `AgentRuntimeAdapter` импортирует `AgentRuntimeExecutor`, `IntentRouterV2`, `RuntimeRepoContextFactory`, `RuntimeRetrievalAdapter`, `AgentLlmService`, `PromptLoader` из `app.modules.agent.runtime` и соответствующих пакетов. -- **Приложение (chat)**: `ModularApplication` собирает `AgentRuntimeExecutor` и оборачивает его в `CodeQaRunnerAdapter`; chat передаёт адаптер как `agent_runner` в `ChatModule`. - -## 5. Промпты -Используются только промпты, загружаемые из `llm/prompts.yml`: -- **code_qa_*** — ответы по sub_intent (architecture, explain, find_entrypoints, find_tests, general, open_file, trace_flow, degraded, repair). -- **rag_intent_router_v2** — классификация интента в IntentRouterV2. -- **code_explain_answer_v2** — прямой code-explain в chat (direct_service). diff --git a/src/app/modules/agent/intent_router_v2/__init__.py b/src/app/modules/agent/intent_router_v2/__init__.py deleted file mode 100644 index 36d8d2e..0000000 --- a/src/app/modules/agent/intent_router_v2/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -from app.modules.agent.intent_router_v2.models import ( - ConversationState, - IntentDecision, - IntentRouterResult, - QueryAnchor, - QueryPlan, - RepoContext, -) -from app.modules.agent.intent_router_v2.router import IntentRouterV2 - -__all__ = [ - "ConversationState", - "IntentDecision", - "IntentRouterResult", - "IntentRouterV2", - "QueryAnchor", - "QueryPlan", - "RepoContext", -] diff --git a/src/app/modules/agent/intent_router_v2/analysis/__init__.py b/src/app/modules/agent/intent_router_v2/analysis/__init__.py deleted file mode 100644 index 7dd31b8..0000000 --- a/src/app/modules/agent/intent_router_v2/analysis/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from app.modules.agent.intent_router_v2.analysis.normalization import QueryNormalizer -from app.modules.agent.intent_router_v2.analysis.query_plan_builder import QueryPlanBuilder - -__all__ = ["QueryNormalizer", "QueryPlanBuilder"] diff --git a/src/app/modules/agent/intent_router_v2/analysis/ambiguity_detector.py b/src/app/modules/agent/intent_router_v2/analysis/ambiguity_detector.py deleted file mode 100644 index ba5b974..0000000 --- a/src/app/modules/agent/intent_router_v2/analysis/ambiguity_detector.py +++ /dev/null @@ -1,64 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.intent_router_v2.analysis.docs_query_signals import DocsQuerySignals -from app.modules.agent.intent_router_v2.analysis.docs_sub_intent_detector import DocsSubIntentDetector - - -class DocsAmbiguityDetector: - _ALLOWED = { - "SYSTEM_FLOW_EXPLAIN", - "COMPONENT_EXPLAIN", - "API_METHOD_EXPLAIN", - "ENTITY_EXPLAIN", - "RELATED_DOCS_EXPLAIN", - "GENERIC_QA", - } - - def __init__( - self, - docs_signals: DocsQuerySignals | None = None, - detector: DocsSubIntentDetector | None = None, - ) -> None: - self._docs_signals = docs_signals or DocsQuerySignals() - self._detector = detector or DocsSubIntentDetector() - self._natural_entity_markers = ("runtime health", "статус воркера", "состояние runtime", "состояние воркера") - self._natural_flow_markers = ("health check runtime", "проверка состояния", "как работает health check", "как происходит проверка") - - def detect(self, query: str, *, intent: str, sub_intent: str) -> dict[str, object]: - if intent not in {"DOCUMENTATION_EXPLAIN", "GENERAL_QA"}: - return self._result(False, "", sub_intent, []) - candidates = [name for name, _ in self._detector.rank_candidates(query, intent="DOCUMENTATION_EXPLAIN") if name in self._ALLOWED] - if not candidates: - return self._result(False, "", sub_intent, []) - top_scores = self._detector.rank_candidates(query, intent="DOCUMENTATION_EXPLAIN") - score_map = {name: score for name, score in top_scores} - selected_score = int(score_map.get(sub_intent, 0)) - second_score = int(next((score for name, score in top_scores if name != sub_intent), 0)) - has_strong_anchor = bool(self._docs_signals.query_anchor_candidates(query)) or self._docs_signals.has_component_like_token(query) - if sub_intent == "GENERIC_QA" and has_strong_anchor: - return self._result(True, "general_vs_anchor_conflict", sub_intent, candidates[:4]) - if sub_intent != "GENERIC_QA" and self._looks_overview_like(query) and not has_strong_anchor: - return self._result(True, "overview_vs_explain_conflict", sub_intent, candidates[:4]) - if not has_strong_anchor and self._looks_natural_boundary(query): - return self._result(True, "natural_language_boundary", sub_intent, candidates[:4]) - if selected_score and second_score and selected_score - second_score <= 1 and second_score >= 2: - return self._result(True, "small_score_gap", sub_intent, candidates[:4]) - if not has_strong_anchor and selected_score <= 3 and second_score >= 1: - return self._result(True, "weak_deterministic_signal", sub_intent, candidates[:4]) - return self._result(False, "", sub_intent, candidates[:4]) - - def _looks_overview_like(self, query: str) -> bool: - text = " ".join((query or "").lower().split()) - return any(marker in text for marker in ("что есть в документации", "какая структура документации", "что описано", "обзор документации", "с чего начать")) - - def _looks_natural_boundary(self, query: str) -> bool: - text = " ".join((query or "").lower().split()) - return any(marker in text for marker in (*self._natural_entity_markers, *self._natural_flow_markers)) - - def _result(self, is_ambiguous: bool, reason: str, selected: str, candidates: list[str]) -> dict[str, object]: - return { - "is_ambiguous": is_ambiguous, - "ambiguity_reason": reason, - "deterministic_candidates": list(candidates), - "deterministic_primary_candidate": selected, - } diff --git a/src/app/modules/agent/intent_router_v2/analysis/anchor_extractor.py b/src/app/modules/agent/intent_router_v2/analysis/anchor_extractor.py deleted file mode 100644 index 3f1555c..0000000 --- a/src/app/modules/agent/intent_router_v2/analysis/anchor_extractor.py +++ /dev/null @@ -1,144 +0,0 @@ -from __future__ import annotations - -import re - -from app.modules.agent.intent_router_v2.models import AnchorSpan, QueryAnchor -from app.modules.agent.intent_router_v2.analysis.normalization_terms import KeyTermCanonicalizer -from app.modules.agent.intent_router_v2.analysis.symbol_rules import COMMON_PATH_SEGMENTS, PY_KEYWORDS -from app.modules.agent.intent_router_v2.analysis.term_mapping import RuEnTermMapper - -_FILE_PATTERN = re.compile(r"(?P\b(?:[\w.-]+/)*[\w.-]+\.(?:py|md|rst|txt|yaml|yml|json|toml|ini|cfg)\b)") -_PATH_HINT_PATTERN = re.compile(r"(?P\b(?:src|app|docs|tests)/[\w./-]*[\w-]\b)") -_SYMBOL_PATTERN = re.compile( - r"\b(?P[A-Z][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)+|[A-Z][A-Za-z0-9_]{2,}|[a-z_][A-Za-z0-9_]{2,})\b" -) -_DOC_SECTION_PATTERN = re.compile(r"(?:section|раздел)\s+[\"'`#]?(?P[A-Za-zА-Яа-я0-9_ ./:-]{2,})", re.IGNORECASE) -_WORD_RE = re.compile(r"[A-Za-zА-Яа-яЁё-]+") - - -class AnchorExtractor: - def __init__( - self, - mapper: RuEnTermMapper | None = None, - canonicalizer: KeyTermCanonicalizer | None = None, - ) -> None: - self._mapper = mapper or RuEnTermMapper() - self._canonicalizer = canonicalizer or KeyTermCanonicalizer() - - def extract(self, text: str) -> list[QueryAnchor]: - anchors = self._file_anchors(text) - anchors.extend(self._symbol_anchors(text, file_anchors=anchors)) - anchors.extend(self._doc_ref_anchors(text)) - anchors.extend(self._key_term_anchors(text)) - return self._dedupe(anchors) - - def _file_anchors(self, text: str) -> list[QueryAnchor]: - anchors = self._anchors_from_matches(_FILE_PATTERN.finditer(text), anchor_type="FILE_PATH", confidence=0.95) - anchors.extend(self._anchors_from_matches(_PATH_HINT_PATTERN.finditer(text), anchor_type="FILE_PATH", confidence=0.8)) - return anchors - - def _symbol_anchors(self, text: str, *, file_anchors: list[QueryAnchor]) -> list[QueryAnchor]: - anchors: list[QueryAnchor] = [] - path_ranges = [(anchor.span.start, anchor.span.end) for anchor in file_anchors if anchor.span is not None] - path_segments = self._path_segments(file_anchors) - for match in _SYMBOL_PATTERN.finditer(text): - value = match.group("value") - if value.endswith((".py", ".md")) or "/" in value: - continue - if self._is_inside_path(match.start("value"), match.end("value"), path_ranges): - continue - if self._is_keyword(value): - continue - if file_anchors and value.lower() in path_segments: - continue - anchors.append(self._anchor("SYMBOL", value, match.start("value"), match.end("value"), 0.88, source="user_text")) - return anchors - - def _doc_ref_anchors(self, text: str) -> list[QueryAnchor]: - anchors = self._anchors_from_matches(_DOC_SECTION_PATTERN.finditer(text), anchor_type="DOC_REF", confidence=0.75, subtype="section") - for match in _FILE_PATTERN.finditer(text): - value = match.group("value") - if not value.lower().endswith((".md", ".rst", ".txt")): - continue - anchors.append(self._anchor("DOC_REF", value, match.start("value"), match.end("value"), 0.92, subtype="file", source="user_text")) - return anchors - - def _key_term_anchors(self, text: str) -> list[QueryAnchor]: - literals = set(self._mapper.all_literal_terms()) - anchors: list[QueryAnchor] = [] - for token in _WORD_RE.finditer(text): - value = token.group(0) - normalized = value.lower() - canonical = self._canonicalizer.canonicalize(value) - if canonical is None and normalized not in literals: - continue - anchors.append( - self._anchor( - "KEY_TERM", - canonical or value, - token.start(), - token.end(), - 0.9, - source="user_text", - ) - ) - return anchors - - def _anchors_from_matches( - self, - matches, - *, - anchor_type: str, - confidence: float, - subtype: str | None = None, - ) -> list[QueryAnchor]: - return [ - self._anchor(anchor_type, match.group("value"), match.start("value"), match.end("value"), confidence, subtype=subtype) - for match in matches - ] - - def _anchor( - self, - anchor_type: str, - value: str, - start: int, - end: int, - confidence: float, - subtype: str | None = None, - source: str = "user_text", - ) -> QueryAnchor: - return QueryAnchor( - type=anchor_type, - value=value, - subtype=subtype, - source=source, - span=AnchorSpan(start=start, end=end), - confidence=confidence, - ) - - def _dedupe(self, anchors: list[QueryAnchor]) -> list[QueryAnchor]: - result: list[QueryAnchor] = [] - seen: set[tuple[str, str, str | None, str]] = set() - for anchor in anchors: - key = (anchor.type, anchor.value, anchor.subtype, anchor.source) - if key in seen: - continue - seen.add(key) - result.append(anchor) - return result - - def _is_inside_path(self, start: int, end: int, ranges: list[tuple[int, int]]) -> bool: - return any(start >= left and end <= right for left, right in ranges) - - def _is_keyword(self, token: str) -> bool: - return token.lower() in PY_KEYWORDS - - def _path_segments(self, anchors: list[QueryAnchor]) -> set[str]: - values: set[str] = set() - for anchor in anchors: - parts = re.split(r"[/.]+", anchor.value.lower()) - for part in parts: - if not part: - continue - values.add(part) - return values | COMMON_PATH_SEGMENTS diff --git a/src/app/modules/agent/intent_router_v2/analysis/anchor_span_validator.py b/src/app/modules/agent/intent_router_v2/analysis/anchor_span_validator.py deleted file mode 100644 index 1600a06..0000000 --- a/src/app/modules/agent/intent_router_v2/analysis/anchor_span_validator.py +++ /dev/null @@ -1,22 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.intent_router_v2.models import QueryAnchor - - -class AnchorSpanValidator: - def sanitize(self, anchors: list[QueryAnchor], raw_len: int) -> list[QueryAnchor]: - result: list[QueryAnchor] = [] - for anchor in anchors: - if anchor.source != "user_text": - result.append(anchor.model_copy(update={"span": None})) - continue - if anchor.span is None: - result.append(anchor) - continue - start = int(anchor.span.start) - end = int(anchor.span.end) - if 0 <= start < end <= raw_len: - result.append(anchor) - continue - result.append(anchor.model_copy(update={"span": None, "confidence": max(anchor.confidence * 0.5, 0.0)})) - return result diff --git a/src/app/modules/agent/intent_router_v2/analysis/conversation_anchor_builder.py b/src/app/modules/agent/intent_router_v2/analysis/conversation_anchor_builder.py deleted file mode 100644 index d258266..0000000 --- a/src/app/modules/agent/intent_router_v2/analysis/conversation_anchor_builder.py +++ /dev/null @@ -1,61 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.intent_router_v2.analysis.followup_detector import FollowUpDetector -from app.modules.agent.intent_router_v2.models import ConversationState, QueryAnchor - - -class ConversationAnchorBuilder: - def __init__(self, followup: FollowUpDetector | None = None) -> None: - self._followup = followup or FollowUpDetector() - - def build( - self, - raw: str, - state: ConversationState, - *, - continue_mode: bool, - has_user_symbol: bool, - has_user_file_path: bool, - ) -> list[QueryAnchor]: - if not continue_mode: - return [] - anchors: list[QueryAnchor] = [] - if has_user_file_path: - return anchors - for path in self._paths_for_carryover(state.active_path_scope): - anchors.append( - QueryAnchor( - type="FILE_PATH", - value=path, - source="conversation_state", - span=None, - confidence=0.6, - ) - ) - if has_user_symbol: - return anchors - if not self._followup.is_follow_up(raw): - return anchors - symbol = state.active_symbol or (state.active_code_span_symbols[0] if state.active_code_span_symbols else None) - if symbol: - anchors.append( - QueryAnchor( - type="SYMBOL", - value=symbol, - source="conversation_state", - span=None, - confidence=0.64, - ) - ) - return anchors - - def _paths_for_carryover(self, active_path_scope: list[str]) -> list[str]: - paths = list(active_path_scope or []) - file_paths = [path for path in paths if self._looks_like_file(path)] - if file_paths: - return file_paths[:1] - return paths[:1] - - def _looks_like_file(self, value: str) -> bool: - tail = (value or "").rsplit("/", 1)[-1] - return "." in tail diff --git a/src/app/modules/agent/intent_router_v2/analysis/docs_query_signals.py b/src/app/modules/agent/intent_router_v2/analysis/docs_query_signals.py deleted file mode 100644 index 1063ff0..0000000 --- a/src/app/modules/agent/intent_router_v2/analysis/docs_query_signals.py +++ /dev/null @@ -1,75 +0,0 @@ -from __future__ import annotations - -import re - - -class DocsQuerySignals: - _ENDPOINT_RE = re.compile(r"(?P/(?:[a-z0-9_-]+|{[a-z0-9_]+})(?:/(?:[a-z0-9_-]+|{[a-z0-9_]+}))*)", re.IGNORECASE) - _ENTITY_RE = re.compile(r"(?:entity|сущност[ьи]|модель|объект)\s+(?P[A-Za-z][A-Za-z0-9_-]+(?:\s+[A-Za-z][A-Za-z0-9_-]+)?)", re.IGNORECASE) - _COMPONENT_RE = re.compile(r"(?:component|компонент|service|module|модул[ья])\s+(?P[A-Za-z][A-Za-z0-9_-]+)", re.IGNORECASE) - _WORKFLOW_RE = re.compile(r"(?:workflow|сценарий|процесс|overview)\s+(?P[A-Za-zА-Яа-я0-9_-]+)", re.IGNORECASE) - _DOC_RE = re.compile(r"(?:document|документ|documentation|документац[ияи])\s+(?P[A-Za-zА-Яа-я0-9_.-]+)", re.IGNORECASE) - _CAMEL_RE = re.compile(r"\b(?P[A-Z][A-Za-z0-9]+(?:Manager|Worker|Channel|Service|Module|Status|Health)|[A-Z][a-z0-9]+(?:[A-Z][A-Za-z0-9]+)+)\b") - _QUOTED_RE = re.compile(r"[\"'«“](?P[^\"'»”]{2,})[\"'»”]") - _MULTIWORD_RE = re.compile(r"\b(runtime health|worker status|control plane)\b", re.IGNORECASE) - - def detect_anchor(self, raw: str) -> tuple[str, str | None]: - text = raw or "" - anchor_patterns = [ - ("entity", self._ENTITY_RE), - ("component", self._COMPONENT_RE), - ("workflow", self._WORKFLOW_RE), - ("document", self._DOC_RE), - ] - if not any(ext in text.lower() for ext in (".py", ".ts", ".js", ".java", ".go", ".rb")): - anchor_patterns.insert(0, ("endpoint", self._ENDPOINT_RE)) - for anchor_type, pattern in anchor_patterns: - match = pattern.search(text) - if match: - return anchor_type, str(match.group("value")).strip() - if any(marker in text.lower() for marker in ("api", "endpoint", "topic", "тема")): - return "topic", None - return "none", None - - def has_docs_anchor(self, raw: str) -> bool: - anchor_type, _ = self.detect_anchor(raw) - return anchor_type != "none" - - def query_entity_candidates(self, raw: str) -> list[str]: - text = raw or "" - values: list[str] = [] - for match in self._ENTITY_RE.finditer(text): - values.append(match.group("value").strip()) - for match in self._CAMEL_RE.finditer(text): - values.append(match.group("value").strip()) - for match in self._MULTIWORD_RE.finditer(text): - values.append(match.group(1).strip()) - return self._dedupe(values) - - def query_anchor_candidates(self, raw: str) -> list[str]: - text = raw or "" - values: list[str] = [] - for match in self._ENDPOINT_RE.finditer(text): - values.append(match.group("value").strip()) - for match in self._CAMEL_RE.finditer(text): - values.append(match.group("value").strip()) - for match in self._QUOTED_RE.finditer(text): - values.append(match.group("value").strip()) - return self._dedupe(values) - - def has_component_like_token(self, raw: str) -> bool: - return bool(self._CAMEL_RE.search(raw or "")) - - def _dedupe(self, values: list[str]) -> list[str]: - result: list[str] = [] - seen: set[str] = set() - for value in values: - normalized = value.strip() - if not normalized: - continue - key = normalized.lower() - if key in seen: - continue - seen.add(key) - result.append(normalized) - return result diff --git a/src/app/modules/agent/intent_router_v2/analysis/docs_sub_intent_detector.py b/src/app/modules/agent/intent_router_v2/analysis/docs_sub_intent_detector.py deleted file mode 100644 index ce50f8a..0000000 --- a/src/app/modules/agent/intent_router_v2/analysis/docs_sub_intent_detector.py +++ /dev/null @@ -1,161 +0,0 @@ -from __future__ import annotations - -import re - - -class DocsSubIntentDetector: - _ENTITY_LIKE_TOKEN_RE = re.compile(r"\b[A-Z][A-Za-z0-9]+(?:Health|Status|State)\b") - _CAMEL_ENTITY_CONTEXT_RE = re.compile(r"\b[A-Z][a-z0-9]+(?:[A-Z][A-Za-z0-9]+)+\b") - _RELATED_MARKERS = ( - "найди документацию", - "документация по", - "где в документации", - "что связано", - "связанные документы", - "что дальше читать", - "по каким документам идти", - "родительский документ", - "дочерние документы", - "какие документы", - "что еще посмотреть", - "где еще описано", - "где еще используется", - "с чем связан", - "какие страницы связаны", - ) - _FLOW_MARKERS = ( - "цикл", - "как работает", - "lifecycle", - "как происходит", - "как устроен", - "как устроена", - "как проходит", - "последовательность", - "шаги", - "флоу", - "flow", - "workflow", - "сценар", - "процесс", - "по шагам", - ) - _API_MARKERS = ( - "api", - "endpoint", - "method", - "route", - "handler", - "контракт", - "request", - "response", - "webhook", - "метод", - "эндпоинт", - "роут", - ) - _ENTITY_MARKERS = ( - "сущност", - "entity", - "модел", - "бизнес-объект", - "что такое", - "что за", - "объект", - "как используется", - ) - _COMPONENT_MARKERS = ( - "компонент", - "модул", - "сервис", - "класс", - "блок", - "подсистем", - "часть системы", - "роль", - "какую роль", - "manager", - "worker", - "channel", - "service", - "module", - ) - _GENERAL_MARKERS = ( - "что вообще", - "в целом", - "с чего начать", - "обзор", - "какая структура документации", - "какая документация есть", - "что описано", - "что есть в документации", - "обзор документации", - ) - _NATURAL_ENTITY_MARKERS = ("runtime health", "health state", "статус воркера", "состояние воркера", "состояние runtime") - _NATURAL_FLOW_MARKERS = ("health check runtime", "проверка состояния", "как работает health check", "как происходит проверка") - - def detect(self, raw: str, *, intent: str = "DOCUMENTATION_EXPLAIN") -> str: - candidates = self.rank_candidates(raw, intent=intent) - return candidates[0][0] if candidates else "COMPONENT_EXPLAIN" - - def rank_candidates(self, raw: str, *, intent: str = "DOCUMENTATION_EXPLAIN") -> list[tuple[str, int]]: - source = raw or "" - text = " ".join(source.lower().split()) - if intent == "GENERAL_QA": - return [("GENERIC_QA", 100)] - if intent == "OPENAPI_GENERATION": - return [(self._detect_openapi(text), 100)] - if not text: - return [("COMPONENT_EXPLAIN", 1)] - scores = { - "RELATED_DOCS_EXPLAIN": 0, - "API_METHOD_EXPLAIN": 0, - "ENTITY_EXPLAIN": 0, - "COMPONENT_EXPLAIN": 0, - "SYSTEM_FLOW_EXPLAIN": 0, - "GENERIC_QA": 0, - } - if any(marker in text for marker in self._RELATED_MARKERS): - scores["RELATED_DOCS_EXPLAIN"] += 8 - if self._has_http_path(text) or any(marker in text for marker in self._API_MARKERS): - scores["API_METHOD_EXPLAIN"] += 6 - if scores["RELATED_DOCS_EXPLAIN"] > 0 and scores["API_METHOD_EXPLAIN"] > 0: - scores["API_METHOD_EXPLAIN"] -= 2 - if any(marker in text for marker in self._ENTITY_MARKERS): - scores["ENTITY_EXPLAIN"] += 5 - if self._has_entity_like_camel_token(source): - scores["ENTITY_EXPLAIN"] += 3 - if self._looks_like_entity_question(text, source): - scores["ENTITY_EXPLAIN"] += 2 - if any(marker in text for marker in self._NATURAL_ENTITY_MARKERS): - scores["ENTITY_EXPLAIN"] += 3 - if any(marker in text for marker in self._COMPONENT_MARKERS): - scores["COMPONENT_EXPLAIN"] += 5 - if any(marker in text for marker in self._FLOW_MARKERS): - scores["SYSTEM_FLOW_EXPLAIN"] += 5 - if any(marker in text for marker in self._NATURAL_FLOW_MARKERS): - scores["SYSTEM_FLOW_EXPLAIN"] += 3 - if any(marker in text for marker in self._GENERAL_MARKERS): - scores["GENERIC_QA"] += 6 - if not any(scores.values()): - scores["COMPONENT_EXPLAIN"] = 1 - scores["GENERIC_QA"] = 1 - ranked = sorted(scores.items(), key=lambda item: (-item[1], item[0])) - return [item for item in ranked if item[1] > 0] - - def _detect_openapi(self, text: str) -> str: - markers = ("request", "response", "schema", "parameters", "fragment") - if any(marker in text for marker in markers): - return "OPENAPI_FRAGMENT_GENERATE" - return "OPENAPI_METHOD_GENERATE" - - def _has_http_path(self, text: str) -> bool: - return any(token.startswith("/") and len(token) > 1 for token in text.split()) - - def _has_entity_like_camel_token(self, raw: str) -> bool: - return bool(self._ENTITY_LIKE_TOKEN_RE.search(raw or "")) - - def _looks_like_entity_question(self, text: str, raw: str) -> bool: - if not any(marker in text for marker in ("что такое", "что за", "как используется")): - return False - return bool(self._CAMEL_ENTITY_CONTEXT_RE.search(raw or "")) diff --git a/src/app/modules/agent/intent_router_v2/analysis/followup_detector.py b/src/app/modules/agent/intent_router_v2/analysis/followup_detector.py deleted file mode 100644 index d91d662..0000000 --- a/src/app/modules/agent/intent_router_v2/analysis/followup_detector.py +++ /dev/null @@ -1,22 +0,0 @@ -from __future__ import annotations - - -class FollowUpDetector: - _MARKERS = ( - "что дальше", - "почему", - "зачем", - "а что", - "уточни", - "подробнее", - "как именно", - "покажи подробнее", - ) - - def is_follow_up(self, raw: str) -> bool: - text = " ".join((raw or "").lower().split()) - if not text: - return False - if len(text.split()) <= 4: - return True - return any(marker in text for marker in self._MARKERS) diff --git a/src/app/modules/agent/intent_router_v2/analysis/keyword_hint_builder.py b/src/app/modules/agent/intent_router_v2/analysis/keyword_hint_builder.py deleted file mode 100644 index 4e6a954..0000000 --- a/src/app/modules/agent/intent_router_v2/analysis/keyword_hint_builder.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import annotations - -import re - -from app.modules.agent.intent_router_v2.analysis.normalization import FILE_PATH_RE -from app.modules.agent.intent_router_v2.analysis.symbol_rules import COMMON_PATH_SEGMENTS, PY_KEYWORDS - -_IDENTIFIER_RE = re.compile(r"[A-Za-z_][A-Za-z0-9_]{2,}") - - -class KeywordHintBuilder: - def build(self, text: str) -> list[str]: - hints: list[str] = [] - path_segments = self._path_segments(text) - for token in _IDENTIFIER_RE.findall(text or ""): - if token.lower() in PY_KEYWORDS: - continue - if token.lower() in path_segments: - continue - if token not in hints: - hints.append(token) - for match in FILE_PATH_RE.finditer(text or ""): - candidate = match.group(0).lower() - if candidate not in hints: - hints.append(candidate) - return hints[:12] - - def _path_segments(self, text: str) -> set[str]: - values: set[str] = set(COMMON_PATH_SEGMENTS) - for match in FILE_PATH_RE.finditer(text or ""): - for part in re.split(r"[/.]+", match.group(0).lower()): - if part: - values.add(part) - return values diff --git a/src/app/modules/agent/intent_router_v2/analysis/keyword_hint_sanitizer.py b/src/app/modules/agent/intent_router_v2/analysis/keyword_hint_sanitizer.py deleted file mode 100644 index f56a517..0000000 --- a/src/app/modules/agent/intent_router_v2/analysis/keyword_hint_sanitizer.py +++ /dev/null @@ -1,50 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.intent_router_v2.models import QueryAnchor - - -class KeywordHintSanitizer: - _GENERIC_KEY_TERMS = {"файл", "класс", "метод", "функция", "документация"} - _DOMAIN_ALLOWLIST = {"RAG", "API", "HTTP", "SQL"} - _DIR_SCOPE_MARKERS = ("в папке", "в директории", "в каталоге") - - def sanitize(self, raw: str, anchors: list[QueryAnchor], base_hints: list[str]) -> list[str]: - text = (raw or "").lower() - allow_dirs = any(marker in text for marker in self._DIR_SCOPE_MARKERS) - file_paths = [anchor.value for anchor in anchors if anchor.type == "FILE_PATH" and self._looks_like_file(anchor.value)] - known_dirs = {path.rsplit("/", 1)[0] for path in file_paths if "/" in path} - result: list[str] = [] - - for anchor in anchors: - if anchor.type == "FILE_PATH": - if self._looks_like_directory(anchor.value): - if not allow_dirs and (known_dirs or file_paths): - continue - self._append(result, anchor.value) - if anchor.type == "SYMBOL": - self._append(result, anchor.value) - - for token in base_hints: - if token in self._DOMAIN_ALLOWLIST: - self._append(result, token) - continue - lowered = token.lower() - if lowered in self._GENERIC_KEY_TERMS: - continue - if token in known_dirs and not allow_dirs: - continue - if "/" in token and "." not in token and not allow_dirs and file_paths: - continue - self._append(result, token) - return result[:8] - - def _append(self, values: list[str], candidate: str) -> None: - if candidate and candidate not in values: - values.append(candidate) - - def _looks_like_file(self, value: str) -> bool: - tail = (value or "").rsplit("/", 1)[-1] - return "." in tail - - def _looks_like_directory(self, value: str) -> bool: - return "/" in (value or "") and not self._looks_like_file(value) diff --git a/src/app/modules/agent/intent_router_v2/analysis/negation_detector.py b/src/app/modules/agent/intent_router_v2/analysis/negation_detector.py deleted file mode 100644 index c3fadeb..0000000 --- a/src/app/modules/agent/intent_router_v2/analysis/negation_detector.py +++ /dev/null @@ -1,17 +0,0 @@ -from __future__ import annotations - -import re - -_TEST_NEG_RE = re.compile( - r"(?:не\s+про\s+тест|без\s+тест|кроме\s+тест|про\s+прод\s+код|только\s+прод|production\s+code)", - re.IGNORECASE, -) - - -class NegationDetector: - def detect(self, text: str) -> set[str]: - lowered = (text or "").lower() - negations: set[str] = set() - if _TEST_NEG_RE.search(lowered): - negations.add("tests") - return negations diff --git a/src/app/modules/agent/intent_router_v2/analysis/normalization.py b/src/app/modules/agent/intent_router_v2/analysis/normalization.py deleted file mode 100644 index 133b759..0000000 --- a/src/app/modules/agent/intent_router_v2/analysis/normalization.py +++ /dev/null @@ -1,57 +0,0 @@ -from __future__ import annotations - -import re - -CODE_SPAN_RE = re.compile(r"`[^`]*`") -FILE_PATH_RE = re.compile( - r"(? str: - text = raw or "" - protected = _ProtectedText() - text = self._protect(text, protected) - text = self._collapse_whitespace(text) - text = text.translate(QUOTE_TRANSLATION) - text = SPACE_BEFORE_PUNCT_RE.sub(r"\1", text) - text = SPACE_AFTER_PUNCT_RE.sub(r"\1 ", text) - text = self._collapse_whitespace(text) - return protected.restore(text) - - def _protect(self, text: str, protected: "_ProtectedText") -> str: - for pattern in (CODE_SPAN_RE, FILE_PATH_RE, DOTTED_IDENT_RE, CAMEL_RE, SNAKE_RE): - text = pattern.sub(protected.replace, text) - return text - - def _collapse_whitespace(self, text: str) -> str: - return WS_RE.sub(" ", text).strip() - - -class _ProtectedText: - def __init__(self) -> None: - self._items: dict[str, str] = {} - self._index = 0 - - def replace(self, match: re.Match[str]) -> str: - placeholder = f"@@P{self._index}@@" - self._items[placeholder] = match.group(0) - self._index += 1 - return placeholder - - def restore(self, text: str) -> str: - restored = text - for placeholder, value in self._items.items(): - restored = restored.replace(placeholder, value) - return restored diff --git a/src/app/modules/agent/intent_router_v2/analysis/normalization_terms.py b/src/app/modules/agent/intent_router_v2/analysis/normalization_terms.py deleted file mode 100644 index 41aa85e..0000000 --- a/src/app/modules/agent/intent_router_v2/analysis/normalization_terms.py +++ /dev/null @@ -1,48 +0,0 @@ -from __future__ import annotations - - -class KeyTermCanonicalizer: - _ALIASES: dict[str, set[str]] = { - "файл": { - "файл", - "файла", - "файле", - "файлу", - "файлом", - "файлы", - "файлов", - "файлам", - "файлами", - }, - "класс": {"класс", "класса", "классе", "классу", "классом", "классы", "классов", "классам"}, - "функция": {"функция", "функции", "функцию", "функцией", "функциях"}, - "метод": {"метод", "метода", "методе", "методу", "методом", "методы"}, - "документация": {"документация", "документации", "документацию"}, - "тест": {"тест", "тесты", "тестов", "тестам", "тестами", "юнит-тест", "юниттест"}, - "модуль": {"модуль", "модуля"}, - "пакет": {"пакет"}, - } - - def __init__(self) -> None: - self._token_to_canonical = self._build_index() - - def canonicalize(self, token: str) -> str | None: - return self._token_to_canonical.get((token or "").lower()) - - def aliases(self) -> set[str]: - values: set[str] = set() - for forms in self._ALIASES.values(): - values.update(forms) - return values - - def is_test_term(self, token: str) -> bool: - canonical = self.canonicalize(token) - return canonical == "тест" - - def _build_index(self) -> dict[str, str]: - index: dict[str, str] = {} - for canonical, forms in self._ALIASES.items(): - index[canonical] = canonical - for form in forms: - index[form] = canonical - return index diff --git a/src/app/modules/agent/intent_router_v2/analysis/query_normalizer.py b/src/app/modules/agent/intent_router_v2/analysis/query_normalizer.py deleted file mode 100644 index 04e3c6c..0000000 --- a/src/app/modules/agent/intent_router_v2/analysis/query_normalizer.py +++ /dev/null @@ -1,3 +0,0 @@ -from app.modules.agent.intent_router_v2.analysis.normalization import QueryNormalizer - -__all__ = ["QueryNormalizer"] diff --git a/src/app/modules/agent/intent_router_v2/analysis/query_plan_builder.py b/src/app/modules/agent/intent_router_v2/analysis/query_plan_builder.py deleted file mode 100644 index 8777f19..0000000 --- a/src/app/modules/agent/intent_router_v2/analysis/query_plan_builder.py +++ /dev/null @@ -1,319 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.intent_router_v2.analysis.anchor_extractor import AnchorExtractor -from app.modules.agent.intent_router_v2.analysis.anchor_span_validator import AnchorSpanValidator -from app.modules.agent.intent_router_v2.analysis.conversation_anchor_builder import ConversationAnchorBuilder -from app.modules.agent.intent_router_v2.analysis.docs_sub_intent_detector import DocsSubIntentDetector -from app.modules.agent.intent_router_v2.analysis.keyword_hint_builder import KeywordHintBuilder -from app.modules.agent.intent_router_v2.analysis.keyword_hint_sanitizer import KeywordHintSanitizer -from app.modules.agent.intent_router_v2.models import ConversationState, QueryAnchor, QueryPlan -from app.modules.agent.intent_router_v2.analysis.negation_detector import NegationDetector -from app.modules.agent.intent_router_v2.analysis.normalization import QueryNormalizer -from app.modules.agent.intent_router_v2.analysis.sub_intent_detector import SubIntentDetector -from app.modules.agent.intent_router_v2.analysis.test_signals import has_test_focus, is_negative_test_request, is_test_related_token -from app.modules.agent.intent_router_v2.analysis.term_mapping import RuEnTermMapper - - -class QueryPlanBuilder: - _DOCS_INTENTS = { - "DOCUMENTATION_EXPLAIN", - "OPENAPI_GENERATION", - "GENERAL_QA", - } - _WHY_MARKERS = ("почему", "зачем", "откуда", "из-за чего") - _NEXT_STEP_MARKERS = ("что дальше", "дальше что", "и что теперь", "продолжай") - _DOCS_TOPIC_HINTS = { - "деплой": ["deploy", "deployment", "docker", "compose", "env", "config", "production", "ci/cd"], - "deploy": ["deploy", "deployment", "docker", "compose", "env", "config", "production", "ci/cd"], - "docker": ["docker", "compose"], - "production": ["production", "deploy", "env"], - "ci": ["ci/cd", "pipeline", "deploy"], - "cd": ["ci/cd", "pipeline", "deploy"], - "установ": ["install", "setup", "config"], - } - def __init__( - self, - normalizer: QueryNormalizer | None = None, - extractor: AnchorExtractor | None = None, - mapper: RuEnTermMapper | None = None, - keyword_hints: KeywordHintBuilder | None = None, - keyword_hint_sanitizer: KeywordHintSanitizer | None = None, - carryover: ConversationAnchorBuilder | None = None, - span_validator: AnchorSpanValidator | None = None, - sub_intent_detector: SubIntentDetector | None = None, - docs_sub_intent_detector: DocsSubIntentDetector | None = None, - negation_detector: NegationDetector | None = None, - ) -> None: - self._normalizer = normalizer or QueryNormalizer() - self._extractor = extractor or AnchorExtractor() - self._mapper = mapper or RuEnTermMapper() - self._keyword_hints_builder = keyword_hints or KeywordHintBuilder() - self._keyword_hint_sanitizer = keyword_hint_sanitizer or KeywordHintSanitizer() - self._carryover = carryover or ConversationAnchorBuilder() - self._span_validator = span_validator or AnchorSpanValidator() - self._sub_intent_detector = sub_intent_detector or SubIntentDetector() - self._docs_sub_intent_detector = docs_sub_intent_detector or DocsSubIntentDetector() - self._negation_detector = negation_detector or NegationDetector() - - def build( - self, - user_query: str, - conversation_state: ConversationState, - continue_mode: bool, - *, - conversation_mode: str = "START", - intent: str = "FALLBACK", - ) -> QueryPlan: - raw = user_query or "" - normalized = self._normalizer.normalize(raw) - if not normalized and raw.strip(): - normalized = raw - negations = self._negation_detector.detect(normalized) - user_anchors = self._span_validator.sanitize(self._extractor.extract(raw), len(raw)) - has_file_path = any(anchor.type == "FILE_PATH" and anchor.source == "user_text" for anchor in user_anchors) - sub_intent = self._sub_intent_detector.detect(raw, has_file_path=has_file_path, negations=negations) - merged_anchors = self._merge_anchors( - raw, - user_anchors, - conversation_state, - continue_mode, - conversation_mode=conversation_mode, - intent=intent, - ) - skip_tests = "tests" in negations or is_negative_test_request(raw) - cleaned_anchors = self._remove_negated_test_terms(skip_tests, merged_anchors) - sub_intent = self._resolve_sub_intent(sub_intent, raw, cleaned_anchors, intent=intent, negations=negations) - if intent in self._DOCS_INTENTS: - sub_intent = self._docs_sub_intent_detector.detect(raw, intent=intent) - elif intent == "FALLBACK": - sub_intent = "GENERIC_QA" - expansions = self._expansions(normalized, cleaned_anchors, skip_tests=skip_tests) - keyword_hints = self._keyword_hints( - raw, - normalized, - cleaned_anchors, - skip_tests=skip_tests, - intent=intent, - state=conversation_state, - ) - symbol_candidates = self._symbol_candidates(cleaned_anchors) - symbol_kind_hint = self._symbol_kind_hint(raw, cleaned_anchors) - path_hints = self._path_hints(cleaned_anchors) - doc_scope_hints = self._doc_scope_hints(intent, raw, keyword_hints, path_hints) - if sub_intent == "OPEN_FILE": - keyword_hints = [] - symbol_candidates = [] - symbol_kind_hint = "unknown" - doc_scope_hints = [] - if intent in self._DOCS_INTENTS: - symbol_candidates = [] - symbol_kind_hint = "unknown" - keyword_hints = self._docs_keyword_hints(raw, keyword_hints) - return QueryPlan( - raw=raw, - normalized=normalized, - sub_intent=sub_intent, - negations=sorted(negations), - expansions=expansions, - keyword_hints=keyword_hints, - path_hints=path_hints, - doc_scope_hints=doc_scope_hints, - symbol_candidates=symbol_candidates, - symbol_kind_hint=symbol_kind_hint, - anchors=cleaned_anchors, - ) - - def _merge_anchors( - self, - raw: str, - anchors: list[QueryAnchor], - state: ConversationState, - continue_mode: bool, - *, - conversation_mode: str, - intent: str, - ) -> list[QueryAnchor]: - has_user_symbol = any(anchor.type == "SYMBOL" and anchor.source == "user_text" for anchor in anchors) - has_user_file = any(anchor.type == "FILE_PATH" and anchor.source == "user_text" for anchor in anchors) - inherited = self._carryover.build( - raw, - state, - continue_mode=continue_mode, - has_user_symbol=has_user_symbol, - has_user_file_path=has_user_file, - ) - if ( - conversation_mode == "SWITCH" - and intent in self._DOCS_INTENTS - and not has_user_file - and not has_user_symbol - and state.active_symbol - ): - inherited.append( - QueryAnchor( - type="SYMBOL", - value=state.active_symbol, - source="conversation_state", - span=None, - confidence=0.62, - ) - ) - return self._dedupe(anchors + inherited) - - def _expansions(self, normalized: str, anchors: list[QueryAnchor], *, skip_tests: bool) -> list[str]: - values = self._mapper.expand(normalized) - has_symbol = any(anchor.type == "SYMBOL" for anchor in anchors) - if has_symbol: - values = [value for value in values if value.lower() not in {"def", "class"}] - if not skip_tests and has_test_focus(normalized): - for candidate in ("test", "unit test"): - if candidate not in values: - values.append(candidate) - for anchor in anchors: - if anchor.type == "SYMBOL" and anchor.value not in values: - values.append(anchor.value) - if skip_tests: - values = [value for value in values if not is_test_related_token(value)] - return values[:16] - - def _keyword_hints( - self, - raw: str, - normalized: str, - anchors: list[QueryAnchor], - *, - skip_tests: bool, - intent: str, - state: ConversationState, - ) -> list[str]: - values = self._keyword_hints_builder.build(normalized) - for anchor in anchors: - if anchor.type not in {"FILE_PATH", "SYMBOL"}: - continue - candidate = anchor.value - if candidate not in values: - values.append(candidate) - if skip_tests: - values = [value for value in values if not is_test_related_token(value)] - sanitized = self._keyword_hint_sanitizer.sanitize(raw, anchors, values) - if intent in self._DOCS_INTENTS and not sanitized: - fallback = list(dict.fromkeys([*self._expansions(normalized, anchors, skip_tests=skip_tests)])) - sanitized = fallback[:3] - if state.active_symbol and state.active_symbol not in sanitized: - sanitized.append(state.active_symbol) - sanitized = sanitized[:5] - return sanitized - - def _remove_negated_test_terms(self, skip_tests: bool, anchors: list[QueryAnchor]) -> list[QueryAnchor]: - if not skip_tests: - return anchors - result: list[QueryAnchor] = [] - for anchor in anchors: - if anchor.type not in {"KEY_TERM", "SYMBOL"}: - result.append(anchor) - continue - if is_test_related_token(anchor.value): - continue - result.append(anchor) - return result - - def _dedupe(self, anchors: list[QueryAnchor]) -> list[QueryAnchor]: - result: list[QueryAnchor] = [] - seen: set[tuple[str, str, str | None, str]] = set() - for anchor in anchors: - key = (anchor.type, anchor.value, anchor.subtype, anchor.source) - if key in seen: - continue - seen.add(key) - result.append(anchor) - return result - - def _resolve_sub_intent( - self, - candidate: str, - raw: str, - anchors: list[QueryAnchor], - *, - intent: str, - negations: set[str], - ) -> str: - if candidate != "EXPLAIN": - return candidate - if intent != "CODE_QA": - return candidate - text = " ".join((raw or "").lower().split()) - has_symbol = any(anchor.type == "SYMBOL" and anchor.confidence >= 0.6 for anchor in anchors) - has_file = any(anchor.type == "FILE_PATH" and self._looks_like_file(anchor.value) and anchor.confidence >= 0.6 for anchor in anchors) - has_user_anchor = any(anchor.source == "user_text" for anchor in anchors) - is_why = any(marker in text for marker in self._WHY_MARKERS) - is_next_steps = any(marker in text for marker in self._NEXT_STEP_MARKERS) - is_short_generic = len(text.split()) <= 4 and text.endswith("?") - if (is_why and has_file and has_symbol) or ((is_next_steps or is_short_generic) and has_file): - return "EXPLAIN_LOCAL" - if "tests" in negations and not has_user_anchor and (has_file or has_symbol): - return "EXPLAIN_LOCAL" - return candidate - - def _looks_like_file(self, value: str) -> bool: - tail = (value or "").rsplit("/", 1)[-1] - return "." in tail - - def _path_hints(self, anchors: list[QueryAnchor]) -> list[str]: - values: list[str] = [] - for anchor in anchors: - if anchor.type != "FILE_PATH": - continue - if anchor.value not in values: - values.append(anchor.value) - return values[:8] - - def _symbol_candidates(self, anchors: list[QueryAnchor]) -> list[str]: - values: list[str] = [] - for anchor in anchors: - if anchor.type != "SYMBOL": - continue - if anchor.value not in values: - values.append(anchor.value) - return values[:8] - - def _symbol_kind_hint(self, raw: str, anchors: list[QueryAnchor]) -> str: - text = " ".join((raw or "").lower().split()) - if "класс" in text or "class " in text: - return "class" - if "функц" in text or "function " in text: - return "function" - if "метод" in text or "method " in text: - return "method" - if "модул" in text or "module " in text: - return "module" - symbol = next((anchor.value for anchor in anchors if anchor.type == "SYMBOL"), "") - if symbol and symbol[:1].isupper(): - return "class" - if "_" in symbol: - return "function" - return "unknown" - - def _docs_keyword_hints(self, raw: str, values: list[str]) -> list[str]: - text = " ".join((raw or "").lower().split()) - result = list(values) - for marker, hints in self._DOCS_TOPIC_HINTS.items(): - if marker not in text: - continue - for hint in hints: - if hint not in result: - result.append(hint) - return result[:12] - - def _doc_scope_hints(self, intent: str, raw: str, keyword_hints: list[str], path_hints: list[str]) -> list[str]: - if intent not in self._DOCS_INTENTS: - return [] - values = list(path_hints) - for candidate in ("README*", "docs/**", "**/*.md"): - if candidate not in values: - values.append(candidate) - for hint in keyword_hints: - if hint.lower() in {"readme", "deploy", "deployment", "docker", "compose"} and hint not in values: - values.append(hint) - if "docs/" in (raw or "").lower() and "docs/**" not in values: - values.append("docs/**") - return values[:8] diff --git a/src/app/modules/agent/intent_router_v2/analysis/sub_intent_detector.py b/src/app/modules/agent/intent_router_v2/analysis/sub_intent_detector.py deleted file mode 100644 index 61b1e90..0000000 --- a/src/app/modules/agent/intent_router_v2/analysis/sub_intent_detector.py +++ /dev/null @@ -1,116 +0,0 @@ -from __future__ import annotations - - -class SubIntentDetector: - """Rule-based sub-intent detector. - - Heuristics distinguish two close classes of questions: - - FIND_ENTRYPOINTS: "where does this endpoint/route start?" - - TRACE_FLOW: "what happens step by step for this symbol/request?" - """ - - _OPEN_VERBS = ("открой", "посмотри", "покажи", "выведи", "show", "open") - _EXPLAIN_MARKERS = ("объясни", "как работает", "почему", "что делает", "зачем", "логика", "флоу", "flow") - _TEST_MARKERS = ("тест", "pytest", "unit test", "юнит") - _TRACE_FLOW_MARKERS = ( - "trace flow", - "execution trace", - "dataflow", - "request flow", - "request path", - "поток", - "поток данных", - "поток выполнения", - "поток запроса", - "как проходит запрос", - "как обрабатывается запрос", - "обработка запроса", - "что происходит при запросе", - "какие шаги выполняются", - "по шагам", - "при запуске", - "трассиров", - "кто читает", - "кто пишет", - "что вызывает", - "где создается", - "где создаётся", - ) - _ARCHITECTURE_MARKERS = ( - "архитектур", - "architecture", - "какие сервисы", - "какие обработчики", - "какие компоненты", - "бизнес-логика", - "business logic", - "io", - ) - _ENTRYPOINTS_MARKERS = ( - "entrypoint", - "entrypoints", - "endpoint", - "route", - "handler", - "точки входа", - "точка входа", - "маршрут", - "роут", - "url", - "main", - "запуск", - "как запускается", - "где вход", - ) - _HTTP_ENTRYPOINT_MARKERS = ("endpoint", "route", "handler", "маршрут", "роут", "url") - - def detect(self, raw: str, *, has_file_path: bool, negations: set[str]) -> str: - raw_text = " ".join((raw or "").split()) - text = raw_text.lower() - if not text: - return "EXPLAIN" - if has_file_path and self._has_open_verb(text) and not self._has_explain_markers(text): - return "OPEN_FILE" - if has_file_path and ("файл" in text or "file" in text) and not self._has_explain_markers(text): - return "OPEN_FILE" - if "tests" not in negations and any(marker in text for marker in self._TEST_MARKERS): - return "FIND_TESTS" - has_flow = self._has_trace_flow_markers(text) - has_entrypoints = any(marker in text for marker in self._ENTRYPOINTS_MARKERS) - has_target = has_file_path or self._has_http_path(text) or self._has_symbol_like_target(raw_text) - if has_flow and has_target: - return "TRACE_FLOW" - if self._has_http_path(text) and any(marker in text for marker in self._HTTP_ENTRYPOINT_MARKERS): - return "FIND_ENTRYPOINTS" - if has_entrypoints: - return "FIND_ENTRYPOINTS" - if has_flow: - return "TRACE_FLOW" - if any(marker in text for marker in self._ARCHITECTURE_MARKERS): - return "ARCHITECTURE" - return "EXPLAIN" - - def _has_open_verb(self, text: str) -> bool: - return any(text.startswith(verb) or f" {verb} " in f" {text} " for verb in self._OPEN_VERBS) - - def _has_explain_markers(self, text: str) -> bool: - return any(marker in text for marker in self._EXPLAIN_MARKERS) - - def _has_trace_flow_markers(self, text: str) -> bool: - return any(marker in text for marker in self._TRACE_FLOW_MARKERS) - - def _has_http_path(self, text: str) -> bool: - return any(token.startswith("/") and len(token) > 1 for token in text.split()) - - def _has_symbol_like_target(self, text: str) -> bool: - tokens = [token.strip(".,:;?!()[]{}\"'") for token in text.split()] - for token in tokens: - if not token: - continue - if token.startswith("/"): - return True - if "_" in token: - return True - if len(token) >= 4 and any(char.isupper() for char in token): - return True - return False diff --git a/src/app/modules/agent/intent_router_v2/analysis/symbol_rules.py b/src/app/modules/agent/intent_router_v2/analysis/symbol_rules.py deleted file mode 100644 index e754a49..0000000 --- a/src/app/modules/agent/intent_router_v2/analysis/symbol_rules.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -PY_KEYWORDS: set[str] = { - "and", - "as", - "assert", - "async", - "await", - "break", - "class", - "continue", - "def", - "del", - "elif", - "else", - "except", - "false", - "finally", - "for", - "from", - "global", - "if", - "import", - "in", - "is", - "lambda", - "none", - "nonlocal", - "not", - "or", - "pass", - "raise", - "return", - "true", - "try", - "while", - "with", - "yield", -} - -COMMON_PATH_SEGMENTS: set[str] = { - "app", - "src", - "docs", - "tests", - "module", - "modules", - "core", - "pkg", - "lib", -} diff --git a/src/app/modules/agent/intent_router_v2/analysis/term_mapping.py b/src/app/modules/agent/intent_router_v2/analysis/term_mapping.py deleted file mode 100644 index 6e18434..0000000 --- a/src/app/modules/agent/intent_router_v2/analysis/term_mapping.py +++ /dev/null @@ -1,67 +0,0 @@ -from __future__ import annotations - -import re - -from app.modules.agent.intent_router_v2.analysis.normalization_terms import KeyTermCanonicalizer - -_WORD_RE = re.compile(r"[A-Za-zА-Яа-яЁё-]+") - - -class RuEnTermMapper: - _CANONICAL_MAP = { - "класс": ["class"], - "метод": ["method"], - "функция": ["function", "def"], - "модуль": ["module"], - "пакет": ["package"], - "файл": ["file"], - "тест": ["test", "unit test"], - "документация": ["documentation", "docs"], - "readme": ["readme"], - } - _ENGLISH_SOURCES = { - "class": ["class"], - "method": ["method"], - "function": ["function", "def"], - "module": ["module"], - "package": ["package"], - "file": ["file"], - "test": ["test", "unit test"], - "tests": ["test", "unit test"], - "documentation": ["documentation", "docs"], - "docs": ["documentation", "docs"], - "readme": ["readme"], - "def": ["def"], - } - - def __init__(self, canonicalizer: KeyTermCanonicalizer | None = None) -> None: - self._canonicalizer = canonicalizer or KeyTermCanonicalizer() - - def expand(self, text: str) -> list[str]: - expansions: list[str] = [] - lowered = (text or "").lower() - for token in _WORD_RE.findall(lowered): - canonical = self._canonicalizer.canonicalize(token) or token - self._extend(expansions, self._CANONICAL_MAP.get(canonical, [])) - self._extend(expansions, self._ENGLISH_SOURCES.get(token, [])) - if "unit test" in lowered or "unit tests" in lowered: - self._extend(expansions, self._ENGLISH_SOURCES["test"]) - return expansions - - def key_terms(self) -> tuple[str, ...]: - return tuple(self._CANONICAL_MAP.keys()) - - def all_literal_terms(self) -> tuple[str, ...]: - values = set(self._canonicalizer.aliases()) - values.update(self._CANONICAL_MAP.keys()) - values.update(self._ENGLISH_SOURCES.keys()) - for targets in self._CANONICAL_MAP.values(): - values.update(target.lower() for target in targets) - for targets in self._ENGLISH_SOURCES.values(): - values.update(target.lower() for target in targets) - return tuple(sorted(values)) - - def _extend(self, result: list[str], values: list[str]) -> None: - for value in values: - if value not in result: - result.append(value) diff --git a/src/app/modules/agent/intent_router_v2/analysis/test_signals.py b/src/app/modules/agent/intent_router_v2/analysis/test_signals.py deleted file mode 100644 index 60c4a52..0000000 --- a/src/app/modules/agent/intent_router_v2/analysis/test_signals.py +++ /dev/null @@ -1,40 +0,0 @@ -from __future__ import annotations - -import re - -_NEGATIVE_TEST_RE = re.compile(r"\b(?:не|без|кроме)\b[^.?!]{0,28}\bтест", re.IGNORECASE) -_NEGATIVE_TEST_MARKERS = ("не про тест", "без тест", "кроме тест", "про прод код", "только прод", "production code") -_POSITIVE_TEST_MARKERS = ( - "тест", - "tests", - "pytest", - "unit test", - "unit tests", - "тестиру", -) -_TEST_TERMS = {"тест", "тесты", "test", "tests", "pytest", "unit", "unit test", "юнит-тест", "юниттест"} - - -def is_negative_test_request(text: str) -> bool: - lowered = (text or "").lower() - if _NEGATIVE_TEST_RE.search(lowered): - return True - return any(marker in lowered for marker in _NEGATIVE_TEST_MARKERS) - - -def has_test_focus(text: str) -> bool: - lowered = (text or "").lower() - if is_negative_test_request(lowered): - return False - return any(marker in lowered for marker in _POSITIVE_TEST_MARKERS) - - -def is_test_related_token(value: str) -> bool: - lowered = (value or "").lower().strip() - if not lowered: - return False - if lowered in _TEST_TERMS: - return True - if lowered.startswith("test"): - return True - return lowered.startswith("тест") diff --git a/src/app/modules/agent/intent_router_v2/factory.py b/src/app/modules/agent/intent_router_v2/factory.py deleted file mode 100644 index 6a5c65b..0000000 --- a/src/app/modules/agent/intent_router_v2/factory.py +++ /dev/null @@ -1,27 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.llm import AgentLlmService -from app.modules.agent.llm.prompt_loader import PromptLoader -from app.modules.agent.intent_router_v2.intent.classifier import IntentClassifierV2 -from app.modules.agent.intent_router_v2.intent.llm_disambiguator import DocsLlmDisambiguator -from app.modules.agent.intent_router_v2.router import IntentRouterV2 -from app.modules.shared.env_loader import load_workspace_env -from app.modules.shared.gigachat.client import GigaChatClient -from app.modules.shared.gigachat.settings import GigaChatSettings -from app.modules.shared.gigachat.token_provider import GigaChatTokenProvider - - -class GigaChatIntentRouterFactory: - def build(self) -> IntentRouterV2: - load_workspace_env() - settings = GigaChatSettings.from_env() - token_provider = GigaChatTokenProvider(settings) - client = GigaChatClient(settings, token_provider) - prompt_loader = PromptLoader() - llm = AgentLlmService(client=client, prompts=prompt_loader) - classifier = IntentClassifierV2(llm=llm) - return IntentRouterV2( - classifier=classifier, - llm_disambiguator=DocsLlmDisambiguator(llm), - enable_llm_disambiguation=True, - ) diff --git a/src/app/modules/agent/intent_router_v2/intent/__init__.py b/src/app/modules/agent/intent_router_v2/intent/__init__.py deleted file mode 100644 index a3fb94c..0000000 --- a/src/app/modules/agent/intent_router_v2/intent/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from app.modules.agent.intent_router_v2.intent.classifier import IntentClassifierV2 -from app.modules.agent.intent_router_v2.intent.conversation_policy import ConversationPolicy -from app.modules.agent.intent_router_v2.intent.graph_id_resolver import GraphIdResolver - -__all__ = ["IntentClassifierV2", "ConversationPolicy", "GraphIdResolver"] diff --git a/src/app/modules/agent/intent_router_v2/intent/classifier.py b/src/app/modules/agent/intent_router_v2/intent/classifier.py deleted file mode 100644 index 380925a..0000000 --- a/src/app/modules/agent/intent_router_v2/intent/classifier.py +++ /dev/null @@ -1,248 +0,0 @@ -from __future__ import annotations - -import json -import re - -from app.modules.agent.intent_router_v2.analysis.docs_query_signals import DocsQuerySignals -from app.modules.agent.intent_router_v2.models import ConversationState, IntentDecision -from app.modules.agent.intent_router_v2.protocols import TextGenerator -from app.modules.agent.intent_router_v2.analysis.test_signals import has_test_focus - -_CODE_FILE_PATH_RE = re.compile( - r"\b(?:[\w.-]+/)*[\w.-]+\.(?:py|js|jsx|ts|tsx|java|kt|go|rb|php|c|cc|cpp|h|hpp|cs|swift|rs)(?!\w)\b", - re.IGNORECASE, -) - - -class IntentClassifierV2: - _GENERATE_DOCS_MARKERS = ( - "сгенерируй документац", - "подготовь документац", - "создай документац", - "генерац", - "generate documentation", - "write documentation", - ) - _DOCS_MARKERS = ("документац", "readme", "docs/", ".md", "spec", "runbook", "markdown") - _OPENAPI_MARKERS = ("openapi", "swagger", "yaml", "spec", "schema") - _OPENAPI_EXTENDED_MARKERS = ("request body", "response schema", "request schema", "response body") - _DOCS_RELATED_MARKERS = ( - "что связано", - "связанные документы", - "что дальше читать", - "по каким документам идти", - "родительский документ", - "дочерние документы", - "какие документы", - "что еще посмотреть", - "где еще описано", - "где еще используется", - "с чем связан", - "какие страницы связаны", - "документация по", - "найди", - "где описан", - "где в документации", - "покажи документы", - "после этого", - ) - _DOCS_EXPLAIN_MARKERS = ("объясни", "как работает", "что делает", "что такое") - _DOCS_FLOW_MARKERS = ( - "цикл", - "сценар", - "процесс", - "происходит", - "последовательность", - "шаги", - "как работает процесс", - "как происходит", - "как устроен процесс", - "workflow", - "flow", - "lifecycle", - "жизненный цикл", - ) - _DOCS_COMPONENT_MARKERS = ( - "компонент", - "модул", - "подсистем", - "часть системы", - "блок", - "роль", - "какую роль", - "что делает", - "как работает компонент", - "как устроен", - ) - _DOCS_ENTITY_MARKERS = ("сущност", "entity", "бизнес-объект", "объект", "как используется", "что такое") - _DOCS_API_MARKERS = ("api", "endpoint", "эндпоинт", "ручк", "request", "response") - _GENERAL_QA_MARKERS = ( - "помоги понять", - "с чего начать", - "как начать", - "куда смотреть", - "что тут важно", - "что вообще", - "в целом", - "обзор", - "какая структура документации", - "структура документации", - "какая документация есть", - "что описано в документации", - "что есть по сервису", - ) - _CODE_MARKERS = ( - "по коду", - "код", - "класс", - "метод", - "функц", - "модул", - "пакет", - "файл", - "block", - "блок", - "handler", - "endpoint", - "архитектур", - "сервис", - "обработчик", - "pipeline", - "бизнес-логика", - ) - - def __init__(self, llm: TextGenerator | None = None) -> None: - self._llm = llm - self._docs_signals = DocsQuerySignals() - - def classify(self, user_query: str, conversation_state: ConversationState) -> IntentDecision: - deterministic = self._deterministic(user_query) - if deterministic: - return deterministic - llm_decision = self._classify_with_llm(user_query, conversation_state) - if llm_decision: - return llm_decision - return IntentDecision(intent="FALLBACK", confidence=0.55, reason="fallback") - - def _deterministic(self, user_query: str) -> IntentDecision | None: - text = " ".join((user_query or "").lower().split()) - if any(marker in text for marker in self._GENERATE_DOCS_MARKERS): - return IntentDecision(intent="GENERATE_DOCS_FROM_CODE", confidence=0.97, reason="deterministic_generate_docs") - if any(marker in text for marker in (*self._OPENAPI_MARKERS, *self._OPENAPI_EXTENDED_MARKERS)): - return IntentDecision(intent="OPENAPI_GENERATION", confidence=0.98, reason="deterministic_openapi") - if self._is_general_docs_qa(text): - return IntentDecision(intent="GENERAL_QA", confidence=0.76, reason="deterministic_general_docs") - if self._is_docs_explain(text, user_query): - return IntentDecision(intent="DOCUMENTATION_EXPLAIN", confidence=0.91, reason="deterministic_docs_explain") - if self._is_related_docs(text): - return IntentDecision(intent="DOCUMENTATION_EXPLAIN", confidence=0.9, reason="deterministic_docs_related") - if not has_test_focus(text) and self._docs_signals.has_component_like_token(user_query) and not self._is_general_docs_qa(text): - return IntentDecision(intent="DOCUMENTATION_EXPLAIN", confidence=0.82, reason="deterministic_docs_component_anchor") - if self._looks_like_docs_question(text): - return IntentDecision(intent="DOCUMENTATION_EXPLAIN", confidence=0.9, reason="deterministic_docs") - if self._looks_like_code_question(user_query, text): - return IntentDecision(intent="CODE_QA", confidence=0.9, reason="deterministic_code") - return IntentDecision(intent="GENERAL_QA", confidence=0.62, reason="deterministic_general") - - def _classify_with_llm(self, user_query: str, conversation_state: ConversationState) -> IntentDecision | None: - if self._llm is None: - return None - payload = json.dumps( - { - "message": user_query, - "active_intent": conversation_state.active_intent, - "last_query": conversation_state.last_query, - "allowed_intents": [ - "CODE_QA", - "DOCUMENTATION_EXPLAIN", - "OPENAPI_GENERATION", - "GENERAL_QA", - "GENERATE_DOCS_FROM_CODE", - ], - }, - ensure_ascii=False, - ) - try: - raw = self._llm.generate("rag_intent_router_v2", payload, log_context="rag.intent_router_v2.classify").strip() - except Exception: - return None - parsed = self._parse(raw) - if parsed is None: - return None - return parsed - - def _parse(self, raw: str) -> IntentDecision | None: - candidate = self._strip_code_fence(raw) - try: - payload = json.loads(candidate) - except json.JSONDecodeError: - return None - intent = str(payload.get("intent") or "").strip().upper() - if intent not in { - "CODE_QA", - "DOCUMENTATION_EXPLAIN", - "OPENAPI_GENERATION", - "GENERAL_QA", - "GENERATE_DOCS_FROM_CODE", - "FALLBACK", - }: - return None - sub_intent = str(payload.get("sub_intent") or "").strip() or None - return IntentDecision( - intent=intent, - sub_intent=sub_intent, - confidence=float(payload.get("confidence") or 0.7), - reason=str(payload.get("reason") or "llm").strip() or "llm", - ) - - def _strip_code_fence(self, text: str) -> str: - if not text.startswith("```"): - return text - lines = text.splitlines() - if len(lines) < 3 or lines[-1].strip() != "```": - return text - return "\n".join(lines[1:-1]).strip() - - def _looks_like_docs_question(self, text: str) -> bool: - if self._has_code_file_path(text): - return False - if self._is_general_docs_qa(text): - return False - return self._has_docs_context(text) or self._has_docs_subject(text) - - def _has_docs_context(self, text: str) -> bool: - return any(marker in text for marker in self._DOCS_MARKERS) - - def _is_docs_discovery(self, text: str) -> bool: - return self._is_related_docs(text) - - def _is_related_docs(self, text: str) -> bool: - return any(marker in text for marker in self._DOCS_RELATED_MARKERS) - - def _is_docs_explain(self, text: str, user_query: str) -> bool: - if not any(marker in text for marker in self._DOCS_EXPLAIN_MARKERS): - return False - return self._docs_signals.has_docs_anchor(user_query) or self._has_docs_subject(text) - - def _has_docs_subject(self, text: str) -> bool: - return any( - marker in text - for marker in (*self._DOCS_FLOW_MARKERS, *self._DOCS_COMPONENT_MARKERS, *self._DOCS_ENTITY_MARKERS, *self._DOCS_API_MARKERS) - ) - - def _is_general_docs_qa(self, text: str) -> bool: - return any(marker in text for marker in self._GENERAL_QA_MARKERS) - - def _looks_like_code_question(self, raw_text: str, lowered: str) -> bool: - if self._has_code_file_path(raw_text): - return True - if has_test_focus(lowered): - return True - if any(marker in lowered for marker in self._DOCS_MARKERS) and not any(marker in lowered for marker in self._CODE_MARKERS): - return False - if any(marker in lowered for marker in self._CODE_MARKERS): - return True - return bool(re.search(r"\b[a-z_][A-Za-z0-9_]{2,}\(", raw_text or "")) - - def _has_code_file_path(self, text: str) -> bool: - return bool(_CODE_FILE_PATH_RE.search(text or "")) diff --git a/src/app/modules/agent/intent_router_v2/intent/conversation_policy.py b/src/app/modules/agent/intent_router_v2/intent/conversation_policy.py deleted file mode 100644 index b32d16e..0000000 --- a/src/app/modules/agent/intent_router_v2/intent/conversation_policy.py +++ /dev/null @@ -1,73 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.intent_router_v2.models import ConversationState, IntentDecision - - -class ConversationPolicy: - _SWITCH_MARKERS = ( - "переключ", - "new task", - "switch to", - "instead", - ) - _FOLLOWUP_MARKERS = ( - "теперь", - "а теперь", - "давай теперь", - "дальше", - "потом", - "следом", - "next", - "then", - ) - _DOCS_SIGNALS = ("документац", "readme", "docs/", ".md") - _CODE_SIGNALS = ("по коду", "класс", "метод", "файл", "блок кода", "function", "class") - - def resolve(self, decision: IntentDecision, user_query: str, conversation_state: ConversationState) -> tuple[str, str]: - active_intent = conversation_state.active_intent - if active_intent is None: - return decision.intent, "START" - followup_likely = self._is_followup_likely(user_query) - if active_intent == decision.intent: - return active_intent, "FOLLOWUP_LIKELY" if followup_likely else "CONTINUE" - if self._has_explicit_switch(user_query): - return decision.intent, "SWITCH" - if self._is_hard_mismatch(active_intent, decision.intent, user_query): - return decision.intent, "SWITCH" - if followup_likely: - return active_intent, "FOLLOWUP_LIKELY" - return active_intent, "CONTINUE" - - def _has_explicit_switch(self, user_query: str) -> bool: - text = " ".join((user_query or "").lower().split()) - return any(marker in text for marker in self._SWITCH_MARKERS) - - def _is_followup_likely(self, user_query: str) -> bool: - text = " ".join((user_query or "").lower().split()) - return any(marker in text for marker in self._FOLLOWUP_MARKERS) - - def _is_hard_mismatch(self, active_intent: str, candidate_intent: str, user_query: str) -> bool: - if active_intent == candidate_intent: - return False - text = " ".join((user_query or "").lower().split()) - if candidate_intent == "GENERATE_DOCS_FROM_CODE": - return True - if candidate_intent in { - "DOCUMENTATION_EXPLAIN", - "OPENAPI_GENERATION", - "GENERAL_QA", - "DOCUMENTATION_DISCOVERY", - "DOCUMENTATION_NAVIGATION", - "OPENAPI_FROM_DOCUMENTATION", - }: - return any(signal in text for signal in self._DOCS_SIGNALS) - if candidate_intent == "CODE_QA" and active_intent in { - "DOCUMENTATION_EXPLAIN", - "OPENAPI_GENERATION", - "GENERAL_QA", - "DOCUMENTATION_DISCOVERY", - "DOCUMENTATION_NAVIGATION", - "OPENAPI_FROM_DOCUMENTATION", - }: - return any(signal in text for signal in self._CODE_SIGNALS) - return False diff --git a/src/app/modules/agent/intent_router_v2/intent/graph_id_resolver.py b/src/app/modules/agent/intent_router_v2/intent/graph_id_resolver.py deleted file mode 100644 index 47a5dcf..0000000 --- a/src/app/modules/agent/intent_router_v2/intent/graph_id_resolver.py +++ /dev/null @@ -1,18 +0,0 @@ -from __future__ import annotations - - -class GraphIdResolver: - _GRAPH_MAP = { - "CODE_QA": "CodeQAGraph", - "DOCUMENTATION_EXPLAIN": "DocsQAGraph", - "OPENAPI_GENERATION": "DocsQAGraph", - "GENERAL_QA": "DocsQAGraph", - "DOCUMENTATION_DISCOVERY": "DocsQAGraph", - "DOCUMENTATION_NAVIGATION": "DocsQAGraph", - "OPENAPI_FROM_DOCUMENTATION": "DocsQAGraph", - "GENERATE_DOCS_FROM_CODE": "GenerateDocsFromCodeGraph", - "FALLBACK": "DocsQAGraph", - } - - def resolve(self, intent: str) -> str: - return self._GRAPH_MAP[intent] diff --git a/src/app/modules/agent/intent_router_v2/intent/llm_disambiguator.py b/src/app/modules/agent/intent_router_v2/intent/llm_disambiguator.py deleted file mode 100644 index 871a20c..0000000 --- a/src/app/modules/agent/intent_router_v2/intent/llm_disambiguator.py +++ /dev/null @@ -1,55 +0,0 @@ -from __future__ import annotations - -import json - -from app.modules.agent.intent_router_v2.protocols import TextGenerator - - -class DocsLlmDisambiguator: - _ALLOWED = { - "SYSTEM_FLOW_EXPLAIN", - "COMPONENT_EXPLAIN", - "API_METHOD_EXPLAIN", - "ENTITY_EXPLAIN", - "RELATED_DOCS_EXPLAIN", - "GENERIC_QA", - "OPENAPI_METHOD_GENERATE", - "OPENAPI_FRAGMENT_GENERATE", - } - - def __init__(self, llm: TextGenerator) -> None: - self._llm = llm - - def choose(self, payload: dict[str, object]) -> dict[str, str] | None: - raw = self._llm.generate( - "rag_docs_router_disambiguation_v1", - json.dumps(payload, ensure_ascii=False), - log_context="rag.intent_router_v2.disambiguate", - ).strip() - parsed = self._parse(raw) - if parsed is None: - return None - return parsed - - def _parse(self, raw: str) -> dict[str, str] | None: - candidate = self._strip_code_fence(raw) - try: - payload = json.loads(candidate) - except json.JSONDecodeError: - return None - sub_intent = str(payload.get("sub_intent") or "").strip() - if sub_intent not in self._ALLOWED: - return None - return { - "sub_intent": sub_intent, - "reason": str(payload.get("reason") or "").strip(), - "confidence": str(payload.get("confidence") or "").strip(), - } - - def _strip_code_fence(self, text: str) -> str: - if not text.startswith("```"): - return text - lines = text.splitlines() - if len(lines) >= 3 and lines[-1].strip() == "```": - return "\n".join(lines[1:-1]).strip() - return text diff --git a/src/app/modules/agent/intent_router_v2/local_runner.py b/src/app/modules/agent/intent_router_v2/local_runner.py deleted file mode 100644 index dcc0c3f..0000000 --- a/src/app/modules/agent/intent_router_v2/local_runner.py +++ /dev/null @@ -1,25 +0,0 @@ -from __future__ import annotations - -import logging - -from app.modules.agent.intent_router_v2.models import ConversationState, IntentRouterResult, RepoContext -from app.modules.agent.intent_router_v2.router import IntentRouterV2 - -LOGGER = logging.getLogger(__name__) - - -class IntentRouterScenarioRunner: - def __init__(self, router: IntentRouterV2) -> None: - self._router = router - - def run(self, queries: list[str], repo_context: RepoContext | None = None) -> list[IntentRouterResult]: - state = ConversationState() - context = repo_context or RepoContext() - results: list[IntentRouterResult] = [] - for index, user_query in enumerate(queries, start=1): - LOGGER.warning("intent router local input: turn=%s user_query=%s", index, user_query) - result = self._router.route(user_query, state, context) - LOGGER.warning("intent router local output: turn=%s result=%s", index, result.model_dump_json(ensure_ascii=False)) - results.append(result) - state = state.advance(result) - return results diff --git a/src/app/modules/agent/intent_router_v2/logger.py b/src/app/modules/agent/intent_router_v2/logger.py deleted file mode 100644 index e3fbb72..0000000 --- a/src/app/modules/agent/intent_router_v2/logger.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import annotations - -import json -import logging - -from app.modules.agent.intent_router_v2.models import ConversationState, IntentRouterResult, RepoContext - -LOGGER = logging.getLogger(__name__) - - -class IntentRouterLogger: - def log_request(self, user_query: str, conversation_state: ConversationState, repo_context: RepoContext) -> None: - LOGGER.warning( - "intent router v2 request: turn=%s active_intent=%s user_query=%s languages=%s domains=%s", - conversation_state.turn_index + 1, - conversation_state.active_intent, - " ".join((user_query or "").split()), - repo_context.languages, - repo_context.available_domains, - ) - - def log_result(self, result: IntentRouterResult) -> None: - payload = json.dumps(result.model_dump(), ensure_ascii=False) - LOGGER.warning("intent router v2 result: %s", payload) diff --git a/src/app/modules/agent/intent_router_v2/models.py b/src/app/modules/agent/intent_router_v2/models.py deleted file mode 100644 index 53b0860..0000000 --- a/src/app/modules/agent/intent_router_v2/models.py +++ /dev/null @@ -1,250 +0,0 @@ -from __future__ import annotations - -import re -from typing import Literal - -from pydantic import BaseModel, ConfigDict, Field, field_validator - - -IntentType = Literal[ - "CODE_QA", - "DOCUMENTATION_EXPLAIN", - "OPENAPI_GENERATION", - "GENERAL_QA", - "GENERATE_DOCS_FROM_CODE", - "FALLBACK", # deprecated alias, prefer GENERAL_QA - "DOCUMENTATION_DISCOVERY", # deprecated alias, prefer DOCUMENTATION_EXPLAIN - "DOCUMENTATION_NAVIGATION", # deprecated alias, prefer DOCUMENTATION_EXPLAIN - "OPENAPI_FROM_DOCUMENTATION", # deprecated alias, prefer OPENAPI_GENERATION -] -ConversationMode = Literal["START", "CONTINUE", "SWITCH", "FOLLOWUP_LIKELY"] -RetrievalProfile = Literal["code", "docs", "fallback"] -AnchorType = Literal["FILE_PATH", "SYMBOL", "DOC_REF", "KEY_TERM"] -AnchorSource = Literal["user_text", "conversation_state", "heuristic"] -SymbolKindHint = Literal["class", "function", "method", "module", "unknown"] -SymbolResolutionStatus = Literal["not_requested", "pending", "resolved", "ambiguous", "not_found"] -MatchedAnchorType = Literal["endpoint", "entity", "component", "workflow", "topic", "document", "none"] -MatchedIntentSource = Literal["deterministic", "llm"] -_INLINE_CODE_RE = re.compile(r"`([^`]*)`") -_CODE_SYMBOL_RE = re.compile(r"\b([A-Za-z_][A-Za-z0-9_]{2,})\b") - - -class AnchorSpan(BaseModel): - model_config = ConfigDict(extra="forbid") - - start: int = 0 - end: int = 0 - - -class QueryAnchor(BaseModel): - model_config = ConfigDict(extra="forbid") - - type: AnchorType - value: str - source: AnchorSource = "user_text" - subtype: str | None = None - span: AnchorSpan | None = None - confidence: float = 0.0 - - @field_validator("confidence") - @classmethod - def clamp_confidence(cls, value: float) -> float: - return max(0.0, min(1.0, float(value))) - - -class QueryPlan(BaseModel): - model_config = ConfigDict(extra="forbid") - - raw: str - normalized: str - sub_intent: str = "EXPLAIN" - negations: list[str] = Field(default_factory=list) - expansions: list[str] = Field(default_factory=list) - keyword_hints: list[str] = Field(default_factory=list) - path_hints: list[str] = Field(default_factory=list) - doc_scope_hints: list[str] = Field(default_factory=list) - symbol_candidates: list[str] = Field(default_factory=list) - symbol_kind_hint: SymbolKindHint = "unknown" - anchors: list[QueryAnchor] = Field(default_factory=list) - - -class FuzzySymbolSearch(BaseModel): - model_config = ConfigDict(extra="forbid") - - enabled: bool = True - max_distance: int = 2 - top_k: int = 5 - - -class RetrievalConstraints(BaseModel): - model_config = ConfigDict(extra="forbid") - - include_globs: list[str] = Field(default_factory=list) - exclude_globs: list[str] = Field(default_factory=list) - prefer_globs: list[str] = Field(default_factory=list) - test_file_globs: list[str] = Field(default_factory=list) - test_symbol_patterns: list[str] = Field(default_factory=list) - max_candidates: int = 20 - fuzzy_symbol_search: FuzzySymbolSearch = Field(default_factory=FuzzySymbolSearch) - - -class SymbolResolution(BaseModel): - model_config = ConfigDict(extra="forbid") - - status: SymbolResolutionStatus = "not_requested" - resolved_symbol: str | None = None - alternatives: list[str] = Field(default_factory=list) - confidence: float = 0.0 - - -class LayerQuery(BaseModel): - model_config = ConfigDict(extra="forbid") - - layer_id: str - top_k: int - - -class CodeRetrievalFilters(BaseModel): - model_config = ConfigDict(extra="forbid") - - test_policy: str = "EXCLUDE" - path_scope: list[str] = Field(default_factory=list) - language: list[str] = Field(default_factory=list) - - -class DocsRetrievalFilters(BaseModel): - model_config = ConfigDict(extra="forbid") - - path_scope: list[str] = Field(default_factory=list) - doc_kinds: list[str] = Field(default_factory=list) - doc_language: list[str] = Field(default_factory=list) - doc_type: str | None = None - - -class HybridRetrievalFilters(BaseModel): - model_config = ConfigDict(extra="forbid") - - test_policy: str = "EXCLUDE" - path_scope: list[str] = Field(default_factory=list) - language: list[str] = Field(default_factory=list) - doc_kinds: list[str] = Field(default_factory=list) - doc_language: list[str] = Field(default_factory=list) - doc_type: str | None = None - - -class RetrievalSpec(BaseModel): - model_config = ConfigDict(extra="forbid") - - domains: list[str] = Field(default_factory=list) - layer_queries: list[LayerQuery] = Field(default_factory=list) - filters: CodeRetrievalFilters | DocsRetrievalFilters | HybridRetrievalFilters = Field(default_factory=CodeRetrievalFilters) - rerank_profile: str = "" - - -class EvidencePolicy(BaseModel): - model_config = ConfigDict(extra="forbid") - - require_def: bool = False - require_flow: bool = False - require_spec: bool = False - allow_answer_without_evidence: bool = False - - -class IntentRouterResult(BaseModel): - model_config = ConfigDict(extra="forbid") - - schema_version: str = "1.1" - intent: IntentType - retrieval_profile: RetrievalProfile = "code" - graph_id: str - conversation_mode: ConversationMode - query_plan: QueryPlan - retrieval_spec: RetrievalSpec - retrieval_constraints: RetrievalConstraints = Field(default_factory=RetrievalConstraints) - symbol_resolution: SymbolResolution = Field(default_factory=SymbolResolution) - evidence_policy: EvidencePolicy - matched_anchor_type: MatchedAnchorType = "none" - matched_anchor_value: str | None = None - matched_intent_source: MatchedIntentSource = "deterministic" - routing_reason: str = "" - routing_mode: str = "deterministic" - is_ambiguous: bool = False - ambiguity_reason: str = "" - deterministic_candidates: list[str] = Field(default_factory=list) - deterministic_selected_sub_intent: str = "" - llm_router_used: bool = False - llm_router_selected_sub_intent: str = "" - llm_router_reason: str = "" - llm_router_confidence: str = "" - llm_router_error: str = "" - - -class ConversationState(BaseModel): - model_config = ConfigDict(extra="forbid") - - active_intent: IntentType | None = None - active_domain: str | None = None - active_anchors: list[QueryAnchor] = Field(default_factory=list) - active_symbol: str | None = None - active_path_scope: list[str] = Field(default_factory=list) - active_code_span_symbols: list[str] = Field(default_factory=list) - last_query: str = "" - turn_index: int = 0 - - def advance(self, result: IntentRouterResult) -> "ConversationState": - user_anchors = [anchor for anchor in result.query_plan.anchors if anchor.source == "user_text"] - symbol_candidates = [anchor.value for anchor in user_anchors if anchor.type == "SYMBOL"] - has_user_file_anchor = any(anchor.type == "FILE_PATH" for anchor in user_anchors) - if symbol_candidates: - active_symbol = symbol_candidates[-1] - elif has_user_file_anchor: - active_symbol = None - else: - active_symbol = self.active_symbol - raw_code_symbols = _extract_code_symbols(result.query_plan.raw) - active_code_span_symbols = raw_code_symbols or list(self.active_code_span_symbols) - path_scope = list(getattr(result.retrieval_spec.filters, "path_scope", []) or []) - active_domains = list(result.retrieval_spec.domains or []) - active_domain = active_domains[0] if len(active_domains) == 1 else self.active_domain - return ConversationState( - active_intent=result.intent, - active_domain=active_domain, - active_anchors=list(user_anchors), - active_symbol=active_symbol, - active_path_scope=path_scope or list(self.active_path_scope), - active_code_span_symbols=active_code_span_symbols, - last_query=result.query_plan.raw, - turn_index=self.turn_index + 1, - ) - - -class RepoContext(BaseModel): - model_config = ConfigDict(extra="forbid") - - languages: list[str] = Field(default_factory=list) - available_domains: list[str] = Field(default_factory=lambda: ["CODE", "DOCS"]) - available_layers: list[str] = Field(default_factory=list) - - -class IntentDecision(BaseModel): - model_config = ConfigDict(extra="forbid") - - intent: IntentType - sub_intent: str | None = None - confidence: float = 0.0 - reason: str = "" - - @field_validator("confidence") - @classmethod - def clamp_confidence(cls, value: float) -> float: - return max(0.0, min(1.0, float(value))) - - -def _extract_code_symbols(raw: str) -> list[str]: - symbols: list[str] = [] - for match in _INLINE_CODE_RE.finditer(raw or ""): - snippet = match.group(1) - for token in _CODE_SYMBOL_RE.findall(snippet): - if token not in symbols: - symbols.append(token) - return symbols[:8] diff --git a/src/app/modules/agent/intent_router_v2/protocols.py b/src/app/modules/agent/intent_router_v2/protocols.py deleted file mode 100644 index 4b88f20..0000000 --- a/src/app/modules/agent/intent_router_v2/protocols.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import annotations - -from typing import Protocol - - -class TextGenerator(Protocol): - def generate(self, prompt_name: str, user_input: str, *, log_context: str | None = None) -> str: ... diff --git a/src/app/modules/agent/intent_router_v2/readme.md b/src/app/modules/agent/intent_router_v2/readme.md deleted file mode 100644 index 50ef330..0000000 --- a/src/app/modules/agent/intent_router_v2/readme.md +++ /dev/null @@ -1,37 +0,0 @@ -# intent_router_v2 - -## Назначение -Маршрутизация пользовательского запроса в retrieval-профиль и граф выполнения. - -## Структура пакета -- `router.py` — фасад `IntentRouterV2`. -- `intent/` — классификация intent и политика диалога. -- `analysis/` — нормализация запроса, anchors, sub-intent, план запроса. -- `retrieval/` — выбор слоев RAG и фильтров retrieval. -- `factory.py` — сборка роутера с GigaChat-классификатором. - -## Публичный API -- `IntentRouterV2.route(user_query, conversation_state, repo_context) -> IntentRouterResult` -- `GigaChatIntentRouterFactory.build() -> IntentRouterV2` -- `IntentRouterScenarioRunner.run(queries, repo_context) -> list[IntentRouterResult]` -- `models`: - - `ConversationState` - - `RepoContext` - - `IntentRouterResult` - - `QueryPlan` - - `QueryAnchor` - -## Контракт результата `IntentRouterResult` -- `intent`: `CODE_QA | DOCUMENTATION_EXPLAIN | GENERATE_DOCS_FROM_CODE | FALLBACK` -- `retrieval_profile`: `code | docs | fallback` -- `graph_id`: целевой graph в agent runtime -- `query_plan`: нормализованный запрос, anchors, sub-intent, keyword/path/doc hints -- `retrieval_spec`: слои + фильтры для RAG -- `retrieval_constraints`: include/exclude ограничения -- `symbol_resolution`: начальный статус резолва символа -- `evidence_policy`: политика набора источников - -## Правила расширения -- Новая логика анализа запроса добавляется в `analysis/`. -- Новая политика retrieval добавляется в `retrieval/`. -- `router.py` остается orchestration-слоем и не содержит доменной логики парсинга. diff --git a/src/app/modules/agent/intent_router_v2/retrieval_planning/__init__.py b/src/app/modules/agent/intent_router_v2/retrieval_planning/__init__.py deleted file mode 100644 index a3764ae..0000000 --- a/src/app/modules/agent/intent_router_v2/retrieval_planning/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from app.modules.agent.intent_router_v2.retrieval_planning.retrieval_spec_factory import RetrievalSpecFactory -from app.modules.agent.intent_router_v2.retrieval_planning.retrieval_constraints_factory import RetrievalConstraintsFactory - -__all__ = ["RetrievalSpecFactory", "RetrievalConstraintsFactory"] diff --git a/src/app/modules/agent/intent_router_v2/retrieval_planning/evidence_policy_factory.py b/src/app/modules/agent/intent_router_v2/retrieval_planning/evidence_policy_factory.py deleted file mode 100644 index 100e5b3..0000000 --- a/src/app/modules/agent/intent_router_v2/retrieval_planning/evidence_policy_factory.py +++ /dev/null @@ -1,41 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.intent_router_v2.models import EvidencePolicy - - -class EvidencePolicyFactory: - def build( - self, - intent: str, - *, - sub_intent: str = "EXPLAIN", - negations: list[str] | None = None, - has_user_anchor: bool = True, - ) -> EvidencePolicy: - negations_set = set(negations or []) - if intent == "CODE_QA": - if sub_intent == "OPEN_FILE": - return EvidencePolicy(require_def=False, require_flow=False, require_spec=False, allow_answer_without_evidence=False) - if sub_intent == "EXPLAIN_LOCAL": - return EvidencePolicy(require_def=True, require_flow=False, require_spec=False, allow_answer_without_evidence=False) - if sub_intent == "TRACE_FLOW": - return EvidencePolicy(require_def=True, require_flow=True, require_spec=False, allow_answer_without_evidence=False) - if sub_intent == "ARCHITECTURE": - return EvidencePolicy(require_def=True, require_flow=True, require_spec=False, allow_answer_without_evidence=False) - if "tests" in negations_set and not has_user_anchor: - return EvidencePolicy(require_def=True, require_flow=False, require_spec=False, allow_answer_without_evidence=False) - return EvidencePolicy(require_def=True, require_flow=True, require_spec=False, allow_answer_without_evidence=False) - if intent in { - "DOCUMENTATION_EXPLAIN", - "OPENAPI_GENERATION", - "GENERAL_QA", - "DOCUMENTATION_DISCOVERY", - "DOCUMENTATION_NAVIGATION", - "OPENAPI_FROM_DOCUMENTATION", - }: - return EvidencePolicy(require_def=False, require_flow=False, require_spec=True, allow_answer_without_evidence=False) - if intent == "FALLBACK": - return EvidencePolicy(require_def=False, require_flow=False, require_spec=False, allow_answer_without_evidence=True) - if intent == "GENERATE_DOCS_FROM_CODE": - return EvidencePolicy(require_def=True, require_flow=False, require_spec=False, allow_answer_without_evidence=False) - return EvidencePolicy(require_def=False, require_flow=False, require_spec=False, allow_answer_without_evidence=True) diff --git a/src/app/modules/agent/intent_router_v2/retrieval_planning/layer_query_builder.py b/src/app/modules/agent/intent_router_v2/retrieval_planning/layer_query_builder.py deleted file mode 100644 index 911d493..0000000 --- a/src/app/modules/agent/intent_router_v2/retrieval_planning/layer_query_builder.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.intent_router_v2.models import LayerQuery, RepoContext - - -class LayerQueryBuilder: - def build(self, intent: str, repo_context: RepoContext, *, domains: list[str], layers_map: dict[str, list[tuple[str, int]]]) -> list[LayerQuery]: - available = set(repo_context.available_layers or []) - result: list[LayerQuery] = [] - for layer_id, top_k in layers_map[intent]: - if not self._layer_matches_domains(layer_id, domains): - continue - if available and layer_id not in available: - continue - result.append(LayerQuery(layer_id=layer_id, top_k=top_k)) - if result: - return result - return [ - LayerQuery(layer_id=layer_id, top_k=top_k) - for layer_id, top_k in layers_map[intent] - if self._layer_matches_domains(layer_id, domains) - ] - - def _layer_matches_domains(self, layer_id: str, domains: list[str]) -> bool: - if domains == ["CODE"]: - return layer_id.startswith("C") - if domains == ["DOCS"]: - return layer_id.startswith("D") - return layer_id.startswith("C") or layer_id.startswith("D") diff --git a/src/app/modules/agent/intent_router_v2/retrieval_planning/retrieval_constraints_factory.py b/src/app/modules/agent/intent_router_v2/retrieval_planning/retrieval_constraints_factory.py deleted file mode 100644 index 14e2198..0000000 --- a/src/app/modules/agent/intent_router_v2/retrieval_planning/retrieval_constraints_factory.py +++ /dev/null @@ -1,118 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.intent_router_v2.models import QueryAnchor, RetrievalConstraints, RetrievalProfile -from app.modules.agent.intent_router_v2.analysis.test_signals import has_test_focus, is_negative_test_request - - -class RetrievalConstraintsFactory: - _DEFAULT_DOCS_INCLUDE = ["docs/**", "README*", "**/*.md"] - _DEFAULT_DOCS_EXCLUDE = [".venv/**", "node_modules/**", "**/*.bin", "**/*.png", "**/*.jpg"] - _DEFAULT_EXCLUDE_TESTS = [ - "tests/**", - "**/test_*.py", - "**/*_test.py", - ] - _TEST_FILE_GLOBS = [ - "tests/**", - "**/test_*.py", - "**/*_test.py", - "**/conftest.py", - ] - - def build( - self, - *, - retrieval_profile: RetrievalProfile, - sub_intent: str, - raw_query: str, - anchors: list[QueryAnchor], - path_scope: list[str], - ) -> RetrievalConstraints: - if retrieval_profile in {"docs", "fallback"}: - return self._docs_constraints(sub_intent=sub_intent, path_scope=path_scope) - return self._code_constraints(sub_intent=sub_intent, raw_query=raw_query, anchors=anchors) - - def _code_constraints(self, *, sub_intent: str, raw_query: str, anchors: list[QueryAnchor]) -> RetrievalConstraints: - include_tests = sub_intent == "FIND_TESTS" or has_test_focus(raw_query) - exclude_tests = is_negative_test_request(raw_query) - if include_tests: - include_globs = ["src/**", *self._TEST_FILE_GLOBS] - prefer_globs = ["tests/**", "**/test_*.py", "**/*_test.py"] - exclude_globs: list[str] = [] - else: - include_globs = ["src/**"] - prefer_globs = [] - exclude_globs = list(self._DEFAULT_EXCLUDE_TESTS) - if exclude_tests: - include_globs = ["src/**"] - prefer_globs = [] - exclude_globs = list(self._DEFAULT_EXCLUDE_TESTS) - if sub_intent == "OPEN_FILE": - include_globs = self._open_file_globs(anchors) or include_globs - prefer_globs = [] - test_file_globs = list(self._TEST_FILE_GLOBS) if sub_intent == "FIND_TESTS" else [] - test_symbol_patterns = self._test_symbol_patterns(anchors) if sub_intent == "FIND_TESTS" else [] - return RetrievalConstraints( - include_globs=include_globs, - exclude_globs=exclude_globs, - prefer_globs=prefer_globs, - test_file_globs=test_file_globs, - test_symbol_patterns=test_symbol_patterns, - max_candidates=20, - fuzzy_symbol_search={ - "enabled": sub_intent != "OPEN_FILE", - "max_distance": 2, - "top_k": 5, - }, - ) - - def _docs_constraints(self, *, sub_intent: str, path_scope: list[str]) -> RetrievalConstraints: - include_globs = self._dedupe([*path_scope, *self._DEFAULT_DOCS_INCLUDE]) if path_scope else list(self._DEFAULT_DOCS_INCLUDE) - return RetrievalConstraints( - include_globs=include_globs, - exclude_globs=list(self._DEFAULT_DOCS_EXCLUDE), - prefer_globs=[], - test_file_globs=[], - test_symbol_patterns=[], - max_candidates=20, - fuzzy_symbol_search={ - "enabled": sub_intent != "OPEN_FILE", - "max_distance": 2, - "top_k": 5, - }, - ) - - def _open_file_globs(self, anchors: list[QueryAnchor]) -> list[str]: - for anchor in anchors: - if anchor.type != "FILE_PATH": - continue - value = anchor.value.strip() - if not value: - continue - return [value] - return [] - - def _test_symbol_patterns(self, anchors: list[QueryAnchor]) -> list[str]: - result: list[str] = [] - symbols = [anchor.value for anchor in anchors if anchor.type == "SYMBOL"] - for symbol in symbols[:3]: - snake = self._camel_to_snake(symbol) - for pattern in (f"test_{snake}", f"Test{symbol}", symbol): - if pattern and pattern not in result: - result.append(pattern) - return result - - def _camel_to_snake(self, value: str) -> str: - chars: list[str] = [] - for index, char in enumerate(value): - if index > 0 and char.isupper() and value[index - 1].isalnum(): - chars.append("_") - chars.append(char.lower()) - return "".join(chars).strip("_") - - def _dedupe(self, values: list[str]) -> list[str]: - result: list[str] = [] - for value in values: - if value and value not in result: - result.append(value) - return result diff --git a/src/app/modules/agent/intent_router_v2/retrieval_planning/retrieval_filter_builder.py b/src/app/modules/agent/intent_router_v2/retrieval_planning/retrieval_filter_builder.py deleted file mode 100644 index 7c36905..0000000 --- a/src/app/modules/agent/intent_router_v2/retrieval_planning/retrieval_filter_builder.py +++ /dev/null @@ -1,120 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.intent_router_v2.models import ( - CodeRetrievalFilters, - ConversationState, - DocsRetrievalFilters, - HybridRetrievalFilters, - QueryAnchor, - RepoContext, -) -from app.modules.agent.intent_router_v2.analysis.test_signals import has_test_focus, is_negative_test_request, is_test_related_token - - -class RetrievalFilterBuilder: - def build( - self, - domains: list[str], - anchors: list[QueryAnchor], - repo_context: RepoContext, - *, - raw_query: str, - conversation_state: ConversationState | None, - conversation_mode: str, - sub_intent: str = "EXPLAIN", - ) -> CodeRetrievalFilters | DocsRetrievalFilters | HybridRetrievalFilters: - path_scope = self._path_scope( - anchors, - conversation_state=conversation_state, - conversation_mode=conversation_mode, - raw_query=raw_query, - sub_intent=sub_intent, - ) - if domains == ["DOCS"]: - return DocsRetrievalFilters( - path_scope=path_scope, - doc_kinds=self._doc_kinds(anchors, raw_query), - doc_language=[], - doc_type=self._doc_type(sub_intent), - ) - if domains == ["CODE"]: - return CodeRetrievalFilters( - test_policy=self._test_policy(raw_query, anchors, sub_intent=sub_intent), - path_scope=path_scope, - language=list(repo_context.languages), - ) - return HybridRetrievalFilters( - test_policy=self._test_policy(raw_query, anchors, sub_intent=sub_intent), - path_scope=path_scope, - language=list(repo_context.languages), - doc_kinds=self._doc_kinds(anchors, raw_query), - doc_language=[], - doc_type=self._doc_type(sub_intent), - ) - - def _test_policy(self, raw_query: str, anchors: list[QueryAnchor], *, sub_intent: str) -> str: - if sub_intent == "FIND_TESTS": - return "INCLUDE" - if is_negative_test_request(raw_query): - return "EXCLUDE" - if has_test_focus(raw_query): - return "INCLUDE" - has_test_keyterm = any(anchor.type == "KEY_TERM" and is_test_related_token(anchor.value) for anchor in anchors) - return "INCLUDE" if has_test_keyterm else "EXCLUDE" - - def _path_scope( - self, - anchors: list[QueryAnchor], - *, - conversation_state: ConversationState | None, - conversation_mode: str, - raw_query: str, - sub_intent: str, - ) -> list[str]: - values: list[str] = [] - has_user_file_anchor = False - file_values: list[str] = [] - for anchor in anchors: - if anchor.type != "FILE_PATH": - continue - if anchor.source == "user_text": - has_user_file_anchor = True - if anchor.value not in values: - values.append(anchor.value) - if self._looks_like_file_path(anchor.value) and anchor.value not in file_values: - file_values.append(anchor.value) - parent = anchor.value.rsplit("/", 1)[0] if "/" in anchor.value and self._looks_like_file_path(anchor.value) else "" - if parent and parent not in values: - values.append(parent) - if sub_intent in {"OPEN_FILE", "EXPLAIN_LOCAL"} and file_values and not self._is_explicit_directory_scope(raw_query): - return file_values[:6] - if has_user_file_anchor or conversation_mode != "CONTINUE": - return values[:6] - if values: - return values[:6] - inherited = list((conversation_state.active_path_scope if conversation_state else []) or []) - return inherited[:6] - - def _doc_kinds(self, anchors: list[QueryAnchor], raw_query: str) -> list[str]: - text = (raw_query or "").lower() - kinds: list[str] = [] - has_readme = "readme" in text or any( - anchor.type in {"DOC_REF", "FILE_PATH"} and anchor.value.lower().endswith("readme.md") - for anchor in anchors - ) - if has_readme: - kinds.append("README") - return kinds - - def _doc_type(self, sub_intent: str) -> str | None: - if sub_intent in {"API_METHOD_EXPLAIN", "OPENAPI_METHOD_GENERATE", "OPENAPI_FRAGMENT_GENERATE"}: - return "api_method" - return None - - def _looks_like_file_path(self, value: str) -> bool: - filename = value.rsplit("/", 1)[-1] - return "." in filename - - def _is_explicit_directory_scope(self, raw_query: str) -> bool: - text = (raw_query or "").lower() - return any(marker in text for marker in ("в папке", "в директории", "в каталоге")) diff --git a/src/app/modules/agent/intent_router_v2/retrieval_planning/retrieval_spec_factory.py b/src/app/modules/agent/intent_router_v2/retrieval_planning/retrieval_spec_factory.py deleted file mode 100644 index 8a55c41..0000000 --- a/src/app/modules/agent/intent_router_v2/retrieval_planning/retrieval_spec_factory.py +++ /dev/null @@ -1,227 +0,0 @@ -from __future__ import annotations - -from app.modules.rag.contracts.enums import RagLayer -from app.modules.agent.intent_router_v2.retrieval_planning.layer_query_builder import LayerQueryBuilder -from app.modules.agent.intent_router_v2.models import ConversationState, QueryAnchor, RepoContext, RetrievalSpec -from app.modules.agent.intent_router_v2.retrieval_planning.retrieval_filter_builder import RetrievalFilterBuilder - - -class RetrievalSpecFactory: - _LAYERS = { - "CODE_QA": [ - (RagLayer.CODE_SYMBOL_CATALOG, 8), - (RagLayer.CODE_SOURCE_CHUNKS, 8), - (RagLayer.CODE_SEMANTIC_ROLES, 8), - (RagLayer.CODE_DEPENDENCY_GRAPH, 6), - (RagLayer.CODE_ENTRYPOINTS, 6), - ], - "DOCUMENTATION_EXPLAIN": [ - (RagLayer.DOCS_DOCUMENT_CATALOG, 6), - (RagLayer.DOCS_FACT_INDEX, 8), - (RagLayer.DOCS_RELATION_GRAPH, 6), - ], - "OPENAPI_GENERATION": [ - (RagLayer.DOCS_DOCUMENT_CATALOG, 8), - (RagLayer.DOCS_FACT_INDEX, 8), - (RagLayer.DOCS_DOC_CHUNKS, 6), - ], - "GENERAL_QA": [ - (RagLayer.DOCS_DOCUMENT_CATALOG, 4), - (RagLayer.DOCS_DOC_CHUNKS, 4), - ], - "GENERATE_DOCS_FROM_CODE": [ - (RagLayer.CODE_SYMBOL_CATALOG, 12), - (RagLayer.CODE_DEPENDENCY_GRAPH, 8), - (RagLayer.CODE_SOURCE_CHUNKS, 12), - (RagLayer.CODE_ENTRYPOINTS, 6), - ], - "FALLBACK": [ - (RagLayer.DOCS_DOCUMENT_CATALOG, 4), - (RagLayer.DOCS_DOC_CHUNKS, 6), - ], - } - _DOMAINS = { - "CODE_QA": ["CODE"], - "DOCUMENTATION_EXPLAIN": ["DOCS"], - "OPENAPI_GENERATION": ["DOCS"], - "GENERAL_QA": ["DOCS"], - "GENERATE_DOCS_FROM_CODE": ["CODE"], - "FALLBACK": ["DOCS"], - } - _RERANK = { - "CODE_QA": "code", - "DOCUMENTATION_EXPLAIN": "docs", - "OPENAPI_GENERATION": "docs", - "GENERAL_QA": "fallback", - "GENERATE_DOCS_FROM_CODE": "generate", - "FALLBACK": "fallback", - } - _OPEN_FILE_LAYERS = [ - (RagLayer.CODE_SOURCE_CHUNKS, 12), - ] - _FIND_ENTRYPOINTS_LAYERS = [ - (RagLayer.CODE_ENTRYPOINTS, 12), - (RagLayer.CODE_SOURCE_CHUNKS, 6), - ] - _EXPLAIN_LOCAL_LAYERS = [ - (RagLayer.CODE_SYMBOL_CATALOG, 8), - (RagLayer.CODE_SOURCE_CHUNKS, 12), - (RagLayer.CODE_DEPENDENCY_GRAPH, 4), - ] - _FIND_TESTS_LAYERS = [ - (RagLayer.CODE_SYMBOL_CATALOG, 8), - (RagLayer.CODE_DEPENDENCY_GRAPH, 6), - (RagLayer.CODE_SOURCE_CHUNKS, 10), - ] - _TRACE_FLOW_LAYERS = [ - (RagLayer.CODE_SYMBOL_CATALOG, 8), - (RagLayer.CODE_SOURCE_CHUNKS, 8), - (RagLayer.CODE_SEMANTIC_ROLES, 8), - (RagLayer.CODE_DEPENDENCY_GRAPH, 10), - (RagLayer.CODE_ENTRYPOINTS, 10), - ] - _ARCHITECTURE_LAYERS = [ - (RagLayer.CODE_SEMANTIC_ROLES, 12), - (RagLayer.CODE_ENTRYPOINTS, 8), - (RagLayer.CODE_DEPENDENCY_GRAPH, 8), - (RagLayer.CODE_SYMBOL_CATALOG, 6), - (RagLayer.CODE_SOURCE_CHUNKS, 4), - ] - _DOCS_SCOPED_LAYERS = [(RagLayer.DOCS_DOC_CHUNKS, 8)] - _DOCS_SYSTEM_FLOW_LAYERS = [ - (RagLayer.DOCS_WORKFLOW_INDEX, 8), - (RagLayer.DOCS_RELATION_GRAPH, 8), - (RagLayer.DOCS_DOCUMENT_CATALOG, 4), - (RagLayer.DOCS_DOC_CHUNKS, 4), - ] - _DOCS_COMPONENT_LAYERS = [ - (RagLayer.DOCS_FACT_INDEX, 8), - (RagLayer.DOCS_RELATION_GRAPH, 8), - (RagLayer.DOCS_DOCUMENT_CATALOG, 4), - (RagLayer.DOCS_DOC_CHUNKS, 4), - ] - _DOCS_API_METHOD_LAYERS = [ - (RagLayer.DOCS_FACT_INDEX, 8), - (RagLayer.DOCS_WORKFLOW_INDEX, 8), - (RagLayer.DOCS_DOCUMENT_CATALOG, 4), - (RagLayer.DOCS_DOC_CHUNKS, 4), - ] - _DOCS_ENTITY_LAYERS = [ - (RagLayer.DOCS_ENTITY_CATALOG, 8), - (RagLayer.DOCS_RELATION_GRAPH, 8), - (RagLayer.DOCS_DOCUMENT_CATALOG, 4), - (RagLayer.DOCS_DOC_CHUNKS, 4), - ] - _DOCS_RELATED_LAYERS = [ - (RagLayer.DOCS_RELATION_GRAPH, 8), - (RagLayer.DOCS_DOCUMENT_CATALOG, 4), - (RagLayer.DOCS_DOC_CHUNKS, 3), - ] - _DOCS_OPENAPI_LAYERS = [ - (RagLayer.DOCS_DOCUMENT_CATALOG, 8), - (RagLayer.DOCS_FACT_INDEX, 8), - (RagLayer.DOCS_DOC_CHUNKS, 6), - ] - - def __init__( - self, - layer_builder: LayerQueryBuilder | None = None, - filter_builder: RetrievalFilterBuilder | None = None, - ) -> None: - self._layer_builder = layer_builder or LayerQueryBuilder() - self._filter_builder = filter_builder or RetrievalFilterBuilder() - - def build( - self, - intent: str, - anchors: list[QueryAnchor], - repo_context: RepoContext, - *, - raw_query: str = "", - conversation_state: ConversationState | None = None, - conversation_mode: str = "START", - sub_intent: str = "EXPLAIN", - ) -> RetrievalSpec: - domains = self._domains(intent, repo_context) - layers_map = self._with_sub_intent_layers(intent, sub_intent, anchors) - layer_queries = self._layer_builder.build(intent, repo_context, domains=domains, layers_map=layers_map) - filters = self._filter_builder.build( - domains, - anchors, - repo_context, - raw_query=raw_query, - conversation_state=conversation_state, - conversation_mode=conversation_mode, - sub_intent=sub_intent, - ) - if intent == "DOCUMENTATION_EXPLAIN" and list(getattr(filters, "path_scope", []) or []): - scoped_map = dict(self._LAYERS) - scoped_map[intent] = list(self._DOCS_SCOPED_LAYERS) - layer_queries = self._layer_builder.build(intent, repo_context, domains=domains, layers_map=scoped_map) - return RetrievalSpec( - domains=domains, - layer_queries=layer_queries, - filters=filters, - rerank_profile=self._RERANK[intent], - ) - - def _domains(self, intent: str, repo_context: RepoContext) -> list[str]: - available = set(repo_context.available_domains or ["CODE", "DOCS"]) - result = [domain for domain in self._DOMAINS[intent] if domain in available] - return result or list(self._DOMAINS[intent]) - - def _with_sub_intent_layers( - self, - intent: str, - sub_intent: str, - anchors: list[QueryAnchor], - ) -> dict[str, list[tuple[str, int]]]: - if intent in {"DOCUMENTATION_EXPLAIN", "OPENAPI_GENERATION", "GENERAL_QA"}: - return self._with_docs_sub_intent_layers(intent, sub_intent) - if intent != "CODE_QA": - return self._LAYERS - layers_map = dict(self._LAYERS) - if sub_intent == "OPEN_FILE": - layers_map["CODE_QA"] = list(self._OPEN_FILE_LAYERS) - elif sub_intent == "FIND_ENTRYPOINTS": - layers_map["CODE_QA"] = list(self._FIND_ENTRYPOINTS_LAYERS) - elif sub_intent == "FIND_TESTS": - layers_map["CODE_QA"] = list(self._FIND_TESTS_LAYERS) - elif sub_intent == "TRACE_FLOW": - layers_map["CODE_QA"] = list(self._TRACE_FLOW_LAYERS) - elif sub_intent == "ARCHITECTURE": - layers_map["CODE_QA"] = list(self._ARCHITECTURE_LAYERS) - elif sub_intent == "EXPLAIN_LOCAL": - layers_map["CODE_QA"] = list(self._EXPLAIN_LOCAL_LAYERS) - elif sub_intent != "EXPLAIN" and not self._needs_entrypoints(anchors): - layers_map["CODE_QA"] = [ - (RagLayer.CODE_SYMBOL_CATALOG, 8), - (RagLayer.CODE_SOURCE_CHUNKS, 8), - (RagLayer.CODE_DEPENDENCY_GRAPH, 6), - ] - return layers_map - - def _with_docs_sub_intent_layers(self, intent: str, sub_intent: str) -> dict[str, list[tuple[str, int]]]: - layers_map = dict(self._LAYERS) - if intent == "DOCUMENTATION_EXPLAIN": - if sub_intent == "SYSTEM_FLOW_EXPLAIN": - layers_map[intent] = list(self._DOCS_SYSTEM_FLOW_LAYERS) - elif sub_intent == "API_METHOD_EXPLAIN": - layers_map[intent] = list(self._DOCS_API_METHOD_LAYERS) - elif sub_intent == "ENTITY_EXPLAIN": - layers_map[intent] = list(self._DOCS_ENTITY_LAYERS) - elif sub_intent == "RELATED_DOCS_EXPLAIN": - layers_map[intent] = list(self._DOCS_RELATED_LAYERS) - else: - layers_map[intent] = list(self._DOCS_COMPONENT_LAYERS) - return layers_map - if intent == "GENERAL_QA": - layers_map[intent] = list(self._LAYERS["GENERAL_QA"]) - return layers_map - layers_map[intent] = list(self._DOCS_OPENAPI_LAYERS) - return layers_map - - def _needs_entrypoints(self, anchors: list[QueryAnchor]) -> bool: - values = " ".join(anchor.value.lower() for anchor in anchors if anchor.type in {"KEY_TERM", "SYMBOL"}) - markers = ("entrypoint", "endpoint", "вызыва", "поток", "flow", "запуска") - return any(marker in values for marker in markers) diff --git a/src/app/modules/agent/intent_router_v2/router.py b/src/app/modules/agent/intent_router_v2/router.py deleted file mode 100644 index 2bca83d..0000000 --- a/src/app/modules/agent/intent_router_v2/router.py +++ /dev/null @@ -1,186 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.intent_router_v2.analysis.ambiguity_detector import DocsAmbiguityDetector -from app.modules.agent.intent_router_v2.intent.classifier import IntentClassifierV2 -from app.modules.agent.intent_router_v2.analysis.docs_query_signals import DocsQuerySignals -from app.modules.agent.intent_router_v2.intent.llm_disambiguator import DocsLlmDisambiguator -from app.modules.agent.intent_router_v2.intent.conversation_policy import ConversationPolicy -from app.modules.agent.intent_router_v2.retrieval_planning.evidence_policy_factory import EvidencePolicyFactory -from app.modules.agent.intent_router_v2.intent.graph_id_resolver import GraphIdResolver -from app.modules.agent.intent_router_v2.logger import IntentRouterLogger -from app.modules.agent.intent_router_v2.models import ConversationState, IntentRouterResult, RepoContext, SymbolResolution -from app.modules.agent.intent_router_v2.analysis.query_plan_builder import QueryPlanBuilder -from app.modules.agent.intent_router_v2.retrieval_planning.retrieval_constraints_factory import RetrievalConstraintsFactory -from app.modules.agent.intent_router_v2.retrieval_planning.retrieval_spec_factory import RetrievalSpecFactory - - -class IntentRouterV2: - def __init__( - self, - classifier: IntentClassifierV2 | None = None, - conversation_policy: ConversationPolicy | None = None, - query_plan_builder: QueryPlanBuilder | None = None, - retrieval_factory: RetrievalSpecFactory | None = None, - constraints_factory: RetrievalConstraintsFactory | None = None, - evidence_factory: EvidencePolicyFactory | None = None, - graph_resolver: GraphIdResolver | None = None, - logger: IntentRouterLogger | None = None, - ambiguity_detector: DocsAmbiguityDetector | None = None, - llm_disambiguator: DocsLlmDisambiguator | None = None, - enable_llm_disambiguation: bool = False, - ) -> None: - self._classifier = classifier or IntentClassifierV2() - self._conversation_policy = conversation_policy or ConversationPolicy() - self._query_plan_builder = query_plan_builder or QueryPlanBuilder() - self._retrieval_factory = retrieval_factory or RetrievalSpecFactory() - self._constraints_factory = constraints_factory or RetrievalConstraintsFactory() - self._evidence_factory = evidence_factory or EvidencePolicyFactory() - self._graph_resolver = graph_resolver or GraphIdResolver() - self._logger = logger or IntentRouterLogger() - self._ambiguity_detector = ambiguity_detector or DocsAmbiguityDetector() - self._llm_disambiguator = llm_disambiguator - self._enable_llm_disambiguation = enable_llm_disambiguation - self._docs_signals = DocsQuerySignals() - - def route( - self, - user_query: str, - conversation_state: ConversationState | None = None, - repo_context: RepoContext | None = None, - ) -> IntentRouterResult: - state = conversation_state or ConversationState() - context = repo_context or RepoContext() - self._logger.log_request(user_query, state, context) - decision = self._classifier.classify(user_query, state) - intent, conversation_mode = self._conversation_policy.resolve(decision, user_query, state) - retrieval_profile = self._resolve_retrieval_profile(intent) - query_plan = self._query_plan_builder.build( - user_query, - state, - continue_mode=conversation_mode in {"CONTINUE", "FOLLOWUP_LIKELY"}, - conversation_mode=conversation_mode, - intent=intent, - ) - ambiguity = self._ambiguity_detector.detect(user_query, intent=intent, sub_intent=query_plan.sub_intent) - query_plan, intent, routing_mode, matched_source, llm_info, routing_reason = self._resolve_final_routing( - user_query=user_query, - query_plan=query_plan, - intent=intent, - ambiguity=ambiguity, - routing_reason=str(decision.reason or ""), - ) - retrieval_spec = self._retrieval_factory.build( - intent, - query_plan.anchors, - context, - raw_query=query_plan.raw, - conversation_state=state, - conversation_mode=conversation_mode, - sub_intent=query_plan.sub_intent, - ) - path_scope = list(getattr(retrieval_spec.filters, "path_scope", []) or []) - matched_anchor_type, matched_anchor_value = self._docs_signals.detect_anchor(user_query) - result = IntentRouterResult( - intent=intent, - retrieval_profile=retrieval_profile, - graph_id=self._graph_resolver.resolve(intent), - conversation_mode=conversation_mode, - query_plan=query_plan, - retrieval_spec=retrieval_spec, - retrieval_constraints=self._constraints_factory.build( - retrieval_profile=retrieval_profile, - sub_intent=query_plan.sub_intent, - raw_query=query_plan.raw, - anchors=query_plan.anchors, - path_scope=path_scope, - ), - symbol_resolution=self._initial_symbol_resolution( - retrieval_profile, - query_plan.sub_intent, - query_plan.symbol_candidates, - ), - evidence_policy=self._evidence_factory.build( - intent, - sub_intent=query_plan.sub_intent, - negations=query_plan.negations, - has_user_anchor=any(anchor.source == "user_text" for anchor in query_plan.anchors), - ), - matched_anchor_type=matched_anchor_type, # type: ignore[arg-type] - matched_anchor_value=matched_anchor_value, - matched_intent_source=matched_source, - routing_reason=routing_reason, - routing_mode=routing_mode, - is_ambiguous=bool(ambiguity.get("is_ambiguous")), - ambiguity_reason=str(ambiguity.get("ambiguity_reason") or ""), - deterministic_candidates=list(ambiguity.get("deterministic_candidates") or []), - deterministic_selected_sub_intent=str(ambiguity.get("deterministic_primary_candidate") or query_plan.sub_intent), - llm_router_used=bool(llm_info.get("used")), - llm_router_selected_sub_intent=str(llm_info.get("sub_intent") or ""), - llm_router_reason=str(llm_info.get("reason") or ""), - llm_router_confidence=str(llm_info.get("confidence") or ""), - llm_router_error=str(llm_info.get("error") or ""), - ) - self._logger.log_result(result) - return result - - def _initial_symbol_resolution( - self, - retrieval_profile: str, - sub_intent: str, - symbol_candidates: list[str], - ) -> SymbolResolution: - if retrieval_profile in {"docs", "fallback"}: - return SymbolResolution(status="not_requested") - if sub_intent == "OPEN_FILE": - return SymbolResolution(status="not_requested") - if not symbol_candidates: - return SymbolResolution(status="not_requested") - return SymbolResolution( - status="pending", - resolved_symbol=None, - alternatives=list(symbol_candidates), - confidence=0.0, - ) - - def _resolve_retrieval_profile(self, intent: str) -> str: - if intent in {"DOCUMENTATION_EXPLAIN", "OPENAPI_GENERATION", "GENERAL_QA"}: - return "docs" - if intent == "FALLBACK": - return "fallback" - return "code" - - def _resolve_final_routing( - self, - *, - user_query: str, - query_plan, - intent: str, - ambiguity: dict[str, object], - routing_reason: str, - ): - if not bool(ambiguity.get("is_ambiguous")): - source = "llm" if not str(routing_reason).startswith("deterministic_") else "deterministic" - return query_plan, intent, "deterministic", source, {"used": False}, routing_reason - if not self._enable_llm_disambiguation or self._llm_disambiguator is None: - return query_plan, intent, "deterministic_fallback", "deterministic", {"used": False}, routing_reason - payload = { - "query": user_query, - "normalized_query": query_plan.normalized, - "deterministic_primary_candidate": str(ambiguity.get("deterministic_primary_candidate") or query_plan.sub_intent), - "deterministic_candidates": list(ambiguity.get("deterministic_candidates") or []), - "ambiguity_reason": str(ambiguity.get("ambiguity_reason") or ""), - "matched_anchor_type": self._docs_signals.detect_anchor(user_query)[0], - "query_entity_candidates": self._docs_signals.query_entity_candidates(user_query), - "query_anchor_candidates": self._docs_signals.query_anchor_candidates(user_query), - } - try: - llm_choice = self._llm_disambiguator.choose(payload) - except Exception as exc: - return query_plan, intent, "deterministic_fallback", "deterministic", {"used": False, "error": str(exc)}, routing_reason - if llm_choice is None: - return query_plan, intent, "deterministic_fallback", "deterministic", {"used": False, "error": "invalid_llm_output"}, routing_reason - final_sub_intent = str(llm_choice.get("sub_intent") or query_plan.sub_intent) - final_intent = "GENERAL_QA" if final_sub_intent == "GENERIC_QA" else intent - final_intent = "DOCUMENTATION_EXPLAIN" if final_sub_intent in {"SYSTEM_FLOW_EXPLAIN", "COMPONENT_EXPLAIN", "API_METHOD_EXPLAIN", "ENTITY_EXPLAIN", "RELATED_DOCS_EXPLAIN"} else final_intent - final_query_plan = query_plan.model_copy(update={"sub_intent": final_sub_intent}) - return final_query_plan, final_intent, "llm_disambiguation", "llm", {"used": True, **llm_choice}, f"llm_disambiguation:{llm_choice.get('reason') or 'override'}" diff --git a/src/app/modules/agent/llm/__init__.py b/src/app/modules/agent/llm/__init__.py deleted file mode 100644 index ba06118..0000000 --- a/src/app/modules/agent/llm/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from app.modules.agent.llm.service import AgentLlmService -from app.modules.agent.llm.prompt_loader import PromptLoader - -__all__ = ["AgentLlmService", "PromptLoader"] diff --git a/src/app/modules/agent/llm/prompt_loader.py b/src/app/modules/agent/llm/prompt_loader.py deleted file mode 100644 index e432c78..0000000 --- a/src/app/modules/agent/llm/prompt_loader.py +++ /dev/null @@ -1,27 +0,0 @@ -from pathlib import Path -import os - -import yaml - - -class PromptLoader: - def __init__(self, prompts_path: Path | None = None) -> None: - base = prompts_path or Path(__file__).resolve().parent / "prompts.yml" - env_override = os.getenv("AGENT_PROMPTS_DIR", "").strip() - raw_path = Path(env_override) if env_override else base - self._path = raw_path / "prompts.yml" if raw_path.is_dir() else raw_path - self._prompts = self._load_prompts() - - def load(self, name: str) -> str: - return str(self._prompts.get(name, "") or "").strip() - - def _load_prompts(self) -> dict[str, str]: - if not self._path.is_file(): - return {} - payload = yaml.safe_load(self._path.read_text(encoding="utf-8")) or {} - if not isinstance(payload, dict): - return {} - prompts = payload.get("prompts", payload) - if not isinstance(prompts, dict): - return {} - return {str(key): str(value or "") for key, value in prompts.items()} diff --git a/src/app/modules/agent/llm/prompts.yml b/src/app/modules/agent/llm/prompts.yml deleted file mode 100644 index 48c7bf1..0000000 --- a/src/app/modules/agent/llm/prompts.yml +++ /dev/null @@ -1,386 +0,0 @@ -prompts: - code_explain_answer_v2: | - Объяснение кода осуществляется только с использованием предоставленного ExplainPack. - - Правила: - - Сначала используйте доказательства. - - Каждый ключевой шаг в процессе должен содержать один или несколько идентификаторов доказательств в квадратных скобках, например, [entrypoint_1] или [excerpt_3]. - - Не придумывайте символы, файлы, маршруты или фрагменты кода, отсутствующие в пакете. - - Если доказательства неполные, укажите это явно. - - В качестве якорей используйте выбранные точки входа и пути трассировки. - - Верните Markdown со следующей структурой: - 1. Краткое описание - 2. Пошаговый процесс - 3. Данные и побочные эффекты - 4. Ошибки и граничные случаи - 5. Указатели - - Указатели должны представлять собой короткий маркированный список, сопоставляющий идентификаторы доказательств с местоположениями файлов. - code_qa_architecture_answer: | - Ты инженер, который объясняет устройство подсистемы только по наблюдаемым компонентам и связям из кода. - - В payload есть `answer_contract`, `must_mention_components`, `must_mention_relations`, `must_mention_relation_summaries`, `must_use_relation_verbs`. Это обязательный каркас: ответ должен перечислять компоненты уровня класса/модуля и связи между ними с глаголами (создаёт, вызывает, импортирует, читает, записывает, наследует). Учитывай `fact_gaps`. - - Отвечай только по коду из контекста. Пиши естественным языком, без лишних markdown-секций. - Строй ответ вокруг компонентов из `must_mention_components` и связей из `must_mention_relations` / `must_mention_relation_summaries`. Каждую связь формулируй с relation verb из `must_use_relation_verbs`. Методы и функции упоминай только как обоснование связи (например, "A вызывает B через метод X"), а не как основные "компоненты" списка. - Запрещено использовать в ответе raw retrieval labels: dataflow_slice, execution_trace, trace_path. Запрещено подменять архитектуру перечислением одних только методов без компонентов и связей. Запрещены абстрактные формулы без опоры на payload: "главный компонент", "управляет потоками данных", "этап пайплайна". - Не используй semantic_hints как primary explanation. Если связей в payload нет (fact_gaps), так и скажи — не додумывай связи. Не расширяй архитектуру за пределы извлечённого контекста. - code_qa_degraded_answer: | - Ты формируешь осторожный деградированный ответ. - Нужно честно описать, что удалось подтвердить, а чего не хватает. - Не выдавай предположения за факты и не заполняй пробелы догадками. - code_qa_explain_answer: | - Ты senior Python-инженер и code reviewer, который объясняет устройство кода без домысливания. - - В payload есть блок `answer_contract` и списки must_mention_* — это обязательный каркас ответа. Если списки непусты, ты обязан использовать из них конкретные имена (методы, вызовы, зависимости, поля), а не подменять их общими фразами. Учитывай `fact_gaps`: если там указаны пробелы в данных, явно скажи об этом и не додумывай. - - Отвечай только по коду из контекста. Пиши естественным инженерным языком, без лишних markdown-секций. - Начни с идентификации сущности и её расположения. Затем обязательно опирайся на: `must_mention_methods`, `must_mention_calls`, `must_mention_dependencies`, `must_mention_fields`, `must_mention_constructor_args`, `must_mention_files`. Каждый непустой список должен быть отражён в ответе конкретными именами из списка — хотя бы часть. Не заменяй их формулировками вроде "принимает ряд аргументов", "имеет responsibilities", "регистрирует основные службы", "используется в службах". - Если в fact_gaps указано, что методы или вызовы не подтверждены, прямо скажи об этом и не строй объяснение на догадках. - Запрещено использовать semantic_hints как основной каркас ответа; только concrete code edges (C0/C1/C2). Избегай расплывчатых фраз: "ряд аргументов", "ключевой компонент", "играет роль", "представляет собой" без конкретики. - Если сущность не найдена или evidence слабый — скажи об этом и остановись. Не используй обязательные секции и подзаголовки. - code_qa_explain_local_answer: | - Ты инженер, который объясняет локальный фрагмент кода без лишней теории и без перехода на уровень всей архитектуры. - - Отвечай только по коду и структуре проекта, которые есть в контексте. - Пиши естественным инженерным языком, без искусственных markdown-секций и без повторов одной и той же мысли. - Если ответ можно дать в 1-3 фразах, не раздувай его. - Упоминай файлы, классы, функции, методы и связи только если они реально присутствуют в извлечённых данных. - Каждое содержательное утверждение по возможности привязывай к конкретному наблюдаемому имени или факту из контекста: пути файла, имени класса, функции, метода, аргумента, поля, route path, вызова или связи. - Если конкретные имена, параметры, вызовы или связи не видны, прямо скажи, чего именно не видно, вместо общих формулировок. - Не вводи новые сущности, зависимости или сценарии, которых нет в контексте. - Явно различай подтверждённые факты и осторожные выводы по косвенным признакам. - Если данных мало, честно скажи об этом вместо общего обзора. - Не используй жирные заголовки блоков, если пользователь их не просил. - Строго соблюдай контракт sub-intent и не подменяй локальный ответ архитектурным обзором. - Избегай расплывчатых и пустых формулировок вроде: "различные аргументы", "ряд аргументов", "различные подпакеты", "основные службы", "ключевой компонент", "играет роль", "представляет собой", если после них нет конкретики. - Не добавляй очевидные метафразы о том, что ответ основан на контексте или на видимом фрагменте, если это ничего не добавляет по сути. - Если сущность не найдена, остановись на факте not_found и не объясняй её предполагаемое назначение по одному только названию. - Не выводи пустые разделы, пустые списки и формулировки вида "кандидатов нет", если это не помогает ответу. - - Дай локальное объяснение по конкретному файлу, символу или короткому участку кода. - Сконцентрируйся на том, что делает этот участок, какие входы и выходы видны и какие ближайшие вызовы или зависимости заметны рядом. - Если виден только фрагмент, ограничь вывод тем, что прямо видно в этом фрагменте. - Не компенсируй нехватку локального контекста общими архитектурными фразами. - Не расписывай всю архитектуру проекта и не используй секции без необходимости. - - code_qa_find_entrypoints_answer: | - Ты инженер, который находит подтверждённые точки входа и отдельно помечает только возможные кандидаты. - - Отвечай только по коду и структуре проекта, которые есть в контексте. - Пиши естественным инженерным языком, без искусственных markdown-секций и без повторов одной и той же мысли. - Если ответ можно дать в 1-3 фразах, не раздувай его. - Упоминай файлы, классы, функции, методы и связи только если они реально присутствуют в извлечённых данных. - Каждое содержательное утверждение по возможности привязывай к конкретному наблюдаемому имени или факту из контекста: пути файла, имени класса, функции, метода, аргумента, поля, route path, вызова или связи. - Если конкретные имена, параметры, вызовы или связи не видны, прямо скажи, чего именно не видно, вместо общих формулировок. - Не вводи новые сущности, зависимости или сценарии, которых нет в контексте. - Явно различай подтверждённые факты и осторожные выводы по косвенным признакам. - Если данных мало, честно скажи об этом вместо общего обзора. - Не используй жирные заголовки блоков, если пользователь их не просил. - Строго соблюдай контракт sub-intent и не подменяй локальный ответ архитектурным обзором. - Избегай расплывчатых и пустых формулировок вроде: "различные аргументы", "ряд аргументов", "различные подпакеты", "основные службы", "ключевой компонент", "играет роль", "представляет собой", если после них нет конкретики. - Не добавляй очевидные метафразы о том, что ответ основан на контексте или на видимом фрагменте, если это ничего не добавляет по сути. - Если сущность не найдена, остановись на факте not_found и не объясняй её предполагаемое назначение по одному только названию. - Не выводи пустые разделы, пустые списки и формулировки вида "кандидатов нет", если это не помогает ответу. - - Найди точки входа, обработчики запуска или важные entrypoints. - Для подтверждённых HTTP route сначала называй их в прикладном виде: HTTP method и route path, например `GET /health`. - Затем коротко добавляй, где route объявлен и какой handler, функция, метод или контекст его обслуживает, если это видно. - Если во входе есть `required_entrypoints`, каждый такой route должен быть явно назван в ответе в виде `METHOD /path`. - Если во входе есть `confirmed_entrypoints` с `query_match=true`, не пиши, что route не найден, пока не перечислишь эти совпавшие подтверждённые route. - Подтверждённые entrypoints перечисляй первыми. - Кандидатов без явного route marker упоминай только если они действительно полезны, и явно помечай как кандидатов. - Не своди ответ к обсуждению декораторов вроде `@app.get`; пользователю важнее method, path и контекст. - Не используй искусственные секции, если ответ можно дать компактным списком или коротким абзацем. - Если кандидатов нет, не создавай отдельную строку или блок про их отсутствие. - Не заменяй `GET /health` абстрактной формулой вроде "route для health-check"; сначала всегда пиши method и path. - code_qa_find_tests_answer: | - Ты инженер, который ищет тестовое покрытие и различает прямые и косвенные тесты. - - Отвечай только по коду и структуре проекта, которые есть в контексте. - Пиши естественным инженерным языком, без искусственных markdown-секций и без повторов одной и той же мысли. - Если ответ можно дать в 1-3 фразах, не раздувай его. - Упоминай файлы, классы, функции, методы и связи только если они реально присутствуют в извлечённых данных. - Каждое содержательное утверждение по возможности привязывай к конкретному наблюдаемому имени или факту из контекста: пути файла, имени класса, функции, метода, аргумента, поля, route path, вызова или связи. - Если конкретные имена, параметры, вызовы или связи не видны, прямо скажи, чего именно не видно, вместо общих формулировок. - Не вводи новые сущности, зависимости или сценарии, которых нет в контексте. - Явно различай подтверждённые факты и осторожные выводы по косвенным признакам. - Если данных мало, честно скажи об этом вместо общего обзора. - Не используй жирные заголовки блоков, если пользователь их не просил. - Строго соблюдай контракт sub-intent и не подменяй локальный ответ архитектурным обзором. - Избегай расплывчатых и пустых формулировок вроде: "различные аргументы", "ряд аргументов", "различные подпакеты", "основные службы", "ключевой компонент", "играет роль", "представляет собой", если после них нет конкретики. - Не добавляй очевидные метафразы о том, что ответ основан на контексте или на видимом фрагменте, если это ничего не добавляет по сути. - Если сущность не найдена, остановись на факте not_found и не объясняй её предполагаемое назначение по одному только названию. - Не выводи пустые разделы, пустые списки и формулировки вида "кандидатов нет", если это не помогает ответу. - - Найди связанные тесты и ответь, где они расположены. - Сначала назови прямые тесты, только если связь с сущностью подтверждается именем, импортом, вызовом или проверяемым поведением. - Если прямых тестов нет, прямо скажи это и только потом упомяни ближайшие косвенные тесты, если они есть. - Коротко поясни, что именно проверяется. - Не выдавай косвенные совпадения за подтверждённое покрытие и не используй отчётные секции без нужды. - Если косвенных тестов тоже нет, не добавляй отдельный пустой блок про их отсутствие. - code_qa_general_answer: | - Ты senior Python-инженер, который даёт обзорный ответ по подсистеме или проекту, но остаётся строго привязанным к коду из контекста. - - Отвечай только по коду и структуре проекта, которые есть в контексте. - Пиши естественным инженерным языком, без искусственных markdown-секций и без повторов одной и той же мысли. - Если ответ можно дать в 1-3 фразах, не раздувай его. - Упоминай файлы, классы, функции, методы и связи только если они реально присутствуют в извлечённых данных. - Каждое содержательное утверждение по возможности привязывай к конкретному наблюдаемому имени или факту из контекста: пути файла, имени класса, функции, метода, аргумента, поля, route path, вызова или связи. - Если конкретные имена, параметры, вызовы или связи не видны, прямо скажи, чего именно не видно, вместо общих формулировок. - Не вводи новые сущности, зависимости или сценарии, которых нет в контексте. - Явно различай подтверждённые факты и осторожные выводы по косвенным признакам. - Если данных мало, честно скажи об этом вместо общего обзора. - Не используй жирные заголовки блоков, если пользователь их не просил. - Строго соблюдай контракт sub-intent и не подменяй локальный ответ архитектурным обзором. - Избегай расплывчатых и пустых формулировок вроде: "различные аргументы", "ряд аргументов", "различные подпакеты", "основные службы", "ключевой компонент", "играет роль", "представляет собой", если после них нет конкретики. - Не добавляй очевидные метафразы о том, что ответ основан на контексте или на видимом фрагменте, если это ничего не добавляет по сути. - Если сущность не найдена, остановись на факте not_found и не объясняй её предполагаемое назначение по одному только названию. - Не выводи пустые разделы, пустые списки и формулировки вида "кандидатов нет", если это не помогает ответу. - - Дай обзорный ответ по вопросу пользователя о коде, подсистеме или сценарии работы. - Сначала скажи, что можно уверенно подтвердить по коду, затем коротко укажи, какие файлы, классы, функции или route это подтверждают. - Если данных недостаточно, прямо скажи, чего именно не хватает. - Не подменяй обзор общими рассуждениями о типичной архитектуре таких систем. - Не используй секции без необходимости. - Не заполняй пробелы общими словами вроде "несколько модулей", "различные компоненты" или "ряд зависимостей", если конкретные имена не видны. - code_qa_open_file_answer: | - Ты технический ассистент, который помогает открыть конкретный файл и показать, что в нём реально видно. - - Отвечай только по коду и структуре проекта, которые есть в контексте. - Пиши естественным инженерным языком, без искусственных markdown-секций и без повторов одной и той же мысли. - Если ответ можно дать в 1-3 фразах, не раздувай его. - Упоминай файлы, классы, функции, методы и связи только если они реально присутствуют в извлечённых данных. - Каждое содержательное утверждение по возможности привязывай к конкретному наблюдаемому имени или факту из контекста: пути файла, имени класса, функции, метода, аргумента, поля, route path, вызова или связи. - Если конкретные имена, параметры, вызовы или связи не видны, прямо скажи, чего именно не видно, вместо общих формулировок. - Не вводи новые сущности, зависимости или сценарии, которых нет в контексте. - Явно различай подтверждённые факты и осторожные выводы по косвенным признакам. - Если данных мало, честно скажи об этом вместо общего обзора. - Не используй жирные заголовки блоков, если пользователь их не просил. - Строго соблюдай контракт sub-intent и не подменяй локальный ответ архитектурным обзором. - Избегай расплывчатых и пустых формулировок вроде: "различные аргументы", "ряд аргументов", "различные подпакеты", "основные службы", "ключевой компонент", "играет роль", "представляет собой", если после них нет конкретики. - Не добавляй очевидные метафразы о том, что ответ основан на контексте или на видимом фрагменте, если это ничего не добавляет по сути. - Если сущность не найдена, остановись на факте not_found и не объясняй её предполагаемое назначение по одному только названию. - Не выводи пустые разделы, пустые списки и формулировки вида "кандидатов нет", если это не помогает ответу. - - Сосредоточься на указанном файле и отвечай коротко. - Обычно достаточно назвать путь файла и в 1-3 фразах сказать, какие конкретные сущности или элементы видны: класс, функция, метод, импорт, route, константа. - Не используй общие описания файла без конкретных имён. - Если в контексте виден только фрагмент файла, не добавляй общую фразу про то, что ответ основан на видимом фрагменте. Вместо этого просто ограничься тем, что реально видно. - Не превращай ответ в архитектурный обзор проекта. - Не используй секции и подзаголовки. - Если файла нет, ответь одной короткой фразой: `Файл не найден.` - Не придумывай анализ отсутствующего файла. - code_qa_repair_answer: | - Ты исправляешь черновой ответ по результатам проверки groundedness. Вход: draft_answer, validation_reasons, repair_focus, prompt_payload. Исправь только то, на что указывает repair_focus; остальное сохрани. Ответ должен строго опираться на prompt_payload (must_mention_*, fact_gaps). - - По repair_focus: - - missing_concrete_methods / missing_concrete_calls / missing_concrete_dependencies / missing_concrete_fields / too_vague_for_explain: встрой в ответ конкретные имена из must_mention_methods, must_mention_calls, must_mention_dependencies, must_mention_fields в payload. Убери общие фразы про "ряд аргументов", "responsibilities", "основные службы". - - semantic_labels_without_code_edges: убери формулировки, опирающиеся на semantic role labels; оставь только то, что подкреплено concrete code edges (методы, вызовы, зависимости из payload). - - missing_concrete_components / missing_concrete_relations / missing_relation_verbs / too_vague_for_architecture: перечисли компоненты и связи из must_mention_components, must_mention_relations, must_mention_relation_summaries; используй глаголы из must_use_relation_verbs. Не перечисляй только методы. - - contains_retrieval_artifacts: удали из текста слова dataflow_slice, execution_trace, trace_path и подобные raw labels. - - methods_as_primary_components: переформулируй так, чтобы компонентами были классы/модули, а методы упоминались только как обоснование связей. - - missing_flow_steps / missing_sequence_edges / too_vague_for_trace_flow: построй ответ как явную последовательность шагов из must_mention_flow_steps / must_mention_ordered_steps; назови конкретные вызовы и edges из payload. - - overclaims_trace_completeness: убери фразы про "полностью восстанавливается", "полный поток"; если в fact_gaps указана частичность, добавь формулировку вроде "видна только часть цепочки". - Если проверка требовала not_found или degraded — отрази это явно, без спекуляций. - code_qa_trace_flow_answer: | - Ты инженер, который восстанавливает поток вызовов и движение данных только по доказуемой цепочке из контекста. - - В payload есть `answer_contract`, `must_mention_flow_steps`, `must_mention_ordered_steps`, `must_mention_calls`, `must_mention_sequence_edges`, `fact_gaps`. Ответ обязан описывать поток как упорядоченную последовательность шагов из этих полей. Не заявляй полноту потока, если в fact_gaps указано иное. Не делай неподтверждённых утверждений. - - Отвечай только по коду из контекста. Пиши естественным языком, без лишних markdown-секций. - Опиши шаги по порядку, используя конкретные имена из `must_mention_ordered_steps` или `must_mention_flow_steps`: источник, глагол (вызывает, создаёт и т.д.), цель. Не заменяй их общими фразами ("обрабатывает запрос", "передаёт данные", "инициализирует службы") — называй конкретные вызовы/методы/route из payload. - Запрещены формулировки вроде "полностью восстанавливается", "полный поток виден", "полностью прослеживается", если в fact_gaps сказано, что последовательность частичная или данных недостаточно. Если поток частичный — явно скажи об этом в конце. - Не склеивай шаги без прямой связи в payload. Не добавляй шаги, которых нет в must_mention_*. - docs_explain_answer: | - Ты объясняешь документацию системы. - - На вход приходит JSON с полями: - - question - - intent - - sub_intent - - documents - - facts - - relations - - Правила: - - Используй только предоставленные факты - - Не додумывай - - Если данных недостаточно, скажи это явно - - Объясняй структурировано - - Формат ответа: - 1. Краткое описание - 2. Основные элементы - 3. Как это работает - 4. Связи с другими частями системы (если есть) - docs_general_answer: | - Ты отвечаешь на общий вопрос по документации проекта. - - На вход приходит JSON с полями: - - question - - intent - - sub_intent - - documents - - facts - - relations - - Правила: - - Используй только предоставленные документы и факты - - Не додумывай отсутствующие детали - - Если данных недостаточно, скажи это прямо - - Дай короткий понятный ответ без лишней структуры - docs_openapi_answer: | - Ты генерируешь OpenAPI спецификацию по документации API. - - На вход приходит JSON с полями: - - question - - intent - - sub_intent - - documents - - facts - - relations - - api_contract - - Правила: - - Используй только данные из документации - - Не придумывай поля - - Если данных нет, не заполняй - - Верни ТОЛЬКО YAML без пояснений - - Формат: - paths: - /path: - method: - summary: ... - requestBody: - responses: - docs_openapi_fragment_answer: | - Ты генерируешь часть OpenAPI schema по документации API. - docs_template_generation: | - Ты генерируешь проект документации по системной аналитике по заданному шаблону. - - На вход приходит JSON с полями: - - question - - template_id - - title - - sections - - attachments - - files - - context - - Правила: - - Строго следуй структуре шаблона - - Не выдумывай факты, которых нет во входе - - Если данных недостаточно, в соответствующем разделе явно укажи "Недостаточно данных" - - Верни Markdown документ с заголовком и секциями из шаблона - docs_fallback_answer: | - Ты отвечаешь на нетиповой вопрос в контуре документации и аналитики. - - На вход приходит JSON с полями: - - question - - intent - - attachments - - confluence_urls - - Правила: - - Дай короткий и честный ответ - - Если вопрос лучше перевести в один из специализированных workflow, мягко скажи об этом - - Не придумывай факты, если контекста недостаточно - - На вход приходит JSON с полями: - - question - - intent - - sub_intent - - documents - - facts - - relations - - api_contract - - Правила: - - Только schema - - Без полного OpenAPI документа - - Используй только данные из payload - - Не придумывай поля - - Верни ТОЛЬКО YAML без пояснений - rag_intent_router_v2: | - Ты intent-router для layered RAG. - На вход ты получаешь JSON с полями: - - message: текущий запрос пользователя - - active_intent: текущий активный intent диалога или null - - last_query: предыдущий запрос пользователя - - allowed_intents: допустимые intent'ы - - Выбери ровно один intent из allowed_intents и один подходящий sub_intent. - Верни только JSON без markdown и пояснений. - - Строгий формат ответа: - {"intent":"","sub_intent":"","confidence":} - - Правила: - - CODE_QA: объяснение по коду, архитектуре, классам, методам, файлам, блокам кода, поведению приложения по реализации. - - DOCUMENTATION_EXPLAIN: объяснение сущности, компонента, API метода, flow или связанных документов по документации. - - OPENAPI_GENERATION: генерация OpenAPI/Swagger/YAML/spec/schema по документации API. - - GENERAL_QA: слишком общий или нечеткий вопрос по документации/проекту, который нельзя уверенно отнести к explain/openapi. - - GENERATE_DOCS_FROM_CODE: просьба сгенерировать, подготовить или обновить документацию по коду. - - Допустимые docs sub-intents: - - SYSTEM_FLOW_EXPLAIN - - COMPONENT_EXPLAIN - - API_METHOD_EXPLAIN - - ENTITY_EXPLAIN - - RELATED_DOCS_EXPLAIN - - OPENAPI_METHOD_GENERATE - - OPENAPI_FRAGMENT_GENERATE - - GENERIC_QA - - Приоритет: - - Если пользователь просит именно подготовить документацию по коду, выбирай GENERATE_DOCS_FROM_CODE. - - Если есть openapi, swagger, yaml, schema или spec, выбирай OPENAPI_GENERATION. - Если запрос про request, response или schema, выбирай OPENAPI_FRAGMENT_GENERATE. - Иначе выбирай OPENAPI_METHOD_GENERATE. - - Если запрос про связанные документы, где еще описано, что еще посмотреть, какие страницы связаны, какие документы по теме, выбирай DOCUMENTATION_EXPLAIN и sub_intent RELATED_DOCS_EXPLAIN. - - Если есть объясни, как работает, что делает или что такое по документации, выбирай DOCUMENTATION_EXPLAIN. - Для API/endpoint/method выбирай API_METHOD_EXPLAIN. - Для flow/workflow/process выбирай SYSTEM_FLOW_EXPLAIN. - Для entity/сущности выбирай ENTITY_EXPLAIN. - Иначе выбирай COMPONENT_EXPLAIN. - - Если пользователь спрашивает про конкретный класс, файл, метод или блок кода, выбирай CODE_QA. - - Если пользователь спрашивает про README, docs, markdown или конкретную документацию без явного openapi, выбирай DOCUMENTATION_EXPLAIN. - - Если сигнал неочевиден, выбирай GENERAL_QA и confidence <= 0.6. - rag_docs_router_disambiguation_v1: | - Ты помогаешь разрешить неоднозначность в docs sub-intent router. - - На вход приходит JSON: - - query - - normalized_query - - deterministic_primary_candidate - - deterministic_candidates - - ambiguity_reason - - matched_anchor_type - - query_entity_candidates - - query_anchor_candidates - - Выбери ровно один sub_intent только из списка deterministic_candidates. - Не придумывай новые labels. - - Допустимые labels: - - SYSTEM_FLOW_EXPLAIN - - COMPONENT_EXPLAIN - - API_METHOD_EXPLAIN - - ENTITY_EXPLAIN - - RELATED_DOCS_EXPLAIN - - GENERIC_QA - - OPENAPI_METHOD_GENERATE - - OPENAPI_FRAGMENT_GENERATE - - Правила: - - Если запрос обзорный, про структуру документации, "что есть", "с чего начать", выбирай GENERIC_QA. - - Если запрос про runtime health, статус воркера, состояние runtime как понятие/сущность, выбирай ENTITY_EXPLAIN. - - Если запрос про процесс, health check flow, последовательность шагов, выбирай SYSTEM_FLOW_EXPLAIN. - - Если есть точный endpoint/path anchor, не уводи запрос в GENERIC_QA. - - Если есть CamelCase component-like token, предпочитай COMPONENT_EXPLAIN. - - Верни только JSON: - {"sub_intent":"","reason":"","confidence":"low|medium|high"} diff --git a/src/app/modules/agent/orchestration/adapters/intent_router_adapter.py b/src/app/modules/agent/orchestration/adapters/intent_router_adapter.py deleted file mode 100644 index f75cf7a..0000000 --- a/src/app/modules/agent/orchestration/adapters/intent_router_adapter.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.observability.module_trace import ModuleTrace -from app.modules.agent.intent_router_v2 import IntentRouterV2 - - -class IntentRouterAdapter: - def __init__(self, router: IntentRouterV2) -> None: - self._router = router - - def route(self, user_query: str, conversation_state, repo_context, trace: ModuleTrace | None = None): - if trace is not None: - trace.log("started", {"question": user_query}) - result = self._router.route(user_query, conversation_state, repo_context) - if trace is not None: - trace.log( - "completed", - { - "intent": result.intent, - "sub_intent": result.query_plan.sub_intent, - "matched_intent_source": result.matched_intent_source, - }, - ) - return result diff --git a/src/app/modules/agent/orchestration/adapters/llm_chat_adapter.py b/src/app/modules/agent/orchestration/adapters/llm_chat_adapter.py deleted file mode 100644 index 32de6ab..0000000 --- a/src/app/modules/agent/orchestration/adapters/llm_chat_adapter.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations - -import asyncio - -from app.modules.agent.observability.module_trace import ModuleTrace -from app.modules.agent.llm.service import AgentLlmService - - -class LlmChatAdapter: - def __init__(self, llm: AgentLlmService, prompt_name: str = "simple_llm_answer") -> None: - self._llm = llm - self._prompt_name = prompt_name - - @property - def prompt_name(self) -> str: - return self._prompt_name - - def build_request(self, message: str, request_id: str) -> dict[str, str]: - return self._llm.build_request( - self._prompt_name, - message, - log_context=f"agent:{request_id}", - ) - - async def generate(self, message: str, request_id: str, trace: ModuleTrace | None = None) -> str: - return await asyncio.to_thread( - self._llm.generate, - self._prompt_name, - message, - log_context=f"agent:{request_id}", - trace=trace, - ) diff --git a/src/app/modules/agent/orchestration/adapters/task_runtime_adapter.py b/src/app/modules/agent/orchestration/adapters/task_runtime_adapter.py deleted file mode 100644 index 42ac762..0000000 --- a/src/app/modules/agent/orchestration/adapters/task_runtime_adapter.py +++ /dev/null @@ -1,44 +0,0 @@ -from __future__ import annotations - -from types import SimpleNamespace - -from app.core.exceptions import AppError -from app.modules.agent.task_runtime.facade import AgentTaskRuntimeFacade -from app.modules.api.domain.models.agent_session import AgentSession -from app.modules.agent.orchestration.context.execution_context import ExecutionContext -from app.schemas.common import ModuleName - - -class TaskRuntimeAdapter: - def __init__(self, runtime: AgentTaskRuntimeFacade) -> None: - self._runtime = runtime - - async def run(self, context: ExecutionContext) -> SimpleNamespace: - rag_session_id = context.session.active_rag_session_id - if not rag_session_id: - raise AppError( - "rag_session_not_bound", - "Agent session has no active rag_session_id for process v2.", - ModuleName.RAG, - ) - - def progress_cb(stage: str, message: str, kind: str = "task_progress", meta: dict | None = None): - payload = dict(meta or {}) - payload.setdefault("kind", kind) - return context.publisher.publish_status( - context.request.request_id, - stage, - message, - payload, - ) - - return await self._runtime.run( - task_id=context.request.request_id, - dialog_session_id=context.session.session_id, - rag_session_id=rag_session_id, - mode="auto", - message=context.request.message, - attachments=[], - files=[], - progress_cb=progress_cb, - ) diff --git a/src/app/modules/agent/orchestration/context/execution_context.py b/src/app/modules/agent/orchestration/context/execution_context.py deleted file mode 100644 index 9db381f..0000000 --- a/src/app/modules/agent/orchestration/context/execution_context.py +++ /dev/null @@ -1,22 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass -from typing import Any - -from app.modules.api.domain.models.agent_request import AgentRequest -from app.modules.api.domain.models.agent_session import AgentSession -from app.modules.api.infrastructure.logging.request_trace_logger import RequestTraceLogger -from app.modules.agent.observability.module_trace import RequestTraceContext -from app.modules.agent.orchestration.messaging.client_message_publisher import ClientMessagePublisher - - -@dataclass(slots=True) -class ExecutionContext: - request: AgentRequest - session: AgentSession - publisher: ClientMessagePublisher - trace_logger: RequestTraceLogger - trace: RequestTraceContext - task_context: Any = None - route_result: Any = None - workflow_result: Any = None diff --git a/src/app/modules/agent/orchestration/facade.py b/src/app/modules/agent/orchestration/facade.py deleted file mode 100644 index 25bf6d8..0000000 --- a/src/app/modules/agent/orchestration/facade.py +++ /dev/null @@ -1,72 +0,0 @@ -from __future__ import annotations - -from datetime import datetime, timezone - -from app.core.exceptions import AppError -from app.modules.api.domain.models.agent_request import AgentRequest -from app.modules.api.domain.models.agent_session import AgentSession -from app.modules.api.infrastructure.logging.request_trace_logger import RequestTraceLogger -from app.modules.agent.observability.module_trace import RequestTraceContext -from app.modules.api.infrastructure.stores.in_memory_request_store import InMemoryRequestStore -from app.modules.agent.orchestration.context.execution_context import ExecutionContext -from app.modules.agent.orchestration.messaging.client_message_publisher import ClientMessagePublisher -from app.modules.agent.orchestration.processes.registry import ProcessRegistry -from app.modules.agent.orchestration.runtime.process_runner import ProcessRunner -from app.schemas.common import ErrorPayload, ModuleName -from app.schemas.orchestration import RequestExecutionStatus - - -class OrchestrationFacade: - def __init__( - self, - request_store: InMemoryRequestStore, - process_registry: ProcessRegistry, - process_runner: ProcessRunner, - publisher: ClientMessagePublisher, - trace_logger: RequestTraceLogger, - ) -> None: - self._request_store = request_store - self._process_registry = process_registry - self._process_runner = process_runner - self._publisher = publisher - self._trace_logger = trace_logger - - async def run(self, request: AgentRequest, session: AgentSession) -> None: - try: - process = self._process_registry.get(request.process_version) - if process is None: - raise AppError("process_not_found", f"Unsupported process version: {request.process_version}", ModuleName.AGENT) - request.status = RequestExecutionStatus.RUNNING - self._request_store.save(request) - self._trace_logger.start_request(request, session) - context = ExecutionContext( - request=request, - session=session, - publisher=self._publisher, - trace_logger=self._trace_logger, - trace=RequestTraceContext(request_id=request.request_id, logger=self._trace_logger), - ) - await self._process_runner.run(context, process.steps()) - request.status = RequestExecutionStatus.DONE - request.completed_at = datetime.now(timezone.utc) - self._request_store.save(request) - self._trace_logger.complete_request(request) - except Exception as exc: - request.status = RequestExecutionStatus.ERROR - request.completed_at = datetime.now(timezone.utc) - if isinstance(exc, AppError): - request.error = ErrorPayload(code=exc.code, desc=exc.desc, module=exc.module) - else: - request.error = ErrorPayload( - code="api_runtime_error", - desc="Agent request failed unexpectedly.", - module=ModuleName.AGENT, - ) - self._request_store.save(request) - self._trace_logger.fail_request(request) - await self._publisher.publish_status( - request.request_id, - "orchestrator", - "Во время обработки запроса произошла ошибка.", - {"code": request.error.code}, - ) diff --git a/src/app/modules/agent/orchestration/messaging/client_message_publisher.py b/src/app/modules/agent/orchestration/messaging/client_message_publisher.py deleted file mode 100644 index cdfb20f..0000000 --- a/src/app/modules/agent/orchestration/messaging/client_message_publisher.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import annotations - -from app.modules.api.infrastructure.logging.request_trace_logger import RequestTraceLogger -from app.modules.api.infrastructure.streaming.sse_event_channel import SseEventChannel -from app.modules.agent.orchestration.messaging.status_message_factory import StatusMessageFactory -from app.modules.agent.orchestration.messaging.user_message_factory import UserMessageFactory - - -class ClientMessagePublisher: - def __init__(self, channel: SseEventChannel, trace_logger: RequestTraceLogger) -> None: - self._channel = channel - self._trace_logger = trace_logger - self._status = StatusMessageFactory() - self._user = UserMessageFactory() - - async def publish_status(self, request_id: str, source: str, text: str, payload: dict | None = None) -> None: - event = self._status.create(request_id, source, text, payload) - self._trace_logger.log_event(event) - await self._channel.publish(event) - - async def publish_user(self, request_id: str, source: str, text: str, payload: dict | None = None) -> None: - event = self._user.create(request_id, source, text, payload) - self._trace_logger.log_event(event) - await self._channel.publish(event) diff --git a/src/app/modules/agent/orchestration/messaging/status_message_factory.py b/src/app/modules/agent/orchestration/messaging/status_message_factory.py deleted file mode 100644 index b11befd..0000000 --- a/src/app/modules/agent/orchestration/messaging/status_message_factory.py +++ /dev/null @@ -1,15 +0,0 @@ -from __future__ import annotations - -from app.modules.api.domain.events.client_event import ClientEventRecord -from app.schemas.client_events import ClientEventType - - -class StatusMessageFactory: - def create(self, request_id: str, source: str, text: str, payload: dict | None = None) -> ClientEventRecord: - return ClientEventRecord( - request_id=request_id, - type=ClientEventType.STATUS, - source=source, - text=text, - payload=payload or {}, - ) diff --git a/src/app/modules/agent/orchestration/messaging/user_message_factory.py b/src/app/modules/agent/orchestration/messaging/user_message_factory.py deleted file mode 100644 index aa24fb5..0000000 --- a/src/app/modules/agent/orchestration/messaging/user_message_factory.py +++ /dev/null @@ -1,15 +0,0 @@ -from __future__ import annotations - -from app.modules.api.domain.events.client_event import ClientEventRecord -from app.schemas.client_events import ClientEventType - - -class UserMessageFactory: - def create(self, request_id: str, source: str, text: str, payload: dict | None = None) -> ClientEventRecord: - return ClientEventRecord( - request_id=request_id, - type=ClientEventType.USER, - source=source, - text=text, - payload=payload or {}, - ) diff --git a/src/app/modules/agent/orchestration/processes/registry.py b/src/app/modules/agent/orchestration/processes/registry.py deleted file mode 100644 index 6da53ba..0000000 --- a/src/app/modules/agent/orchestration/processes/registry.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.orchestration.processes.v1.process import V1Process -from app.modules.agent.orchestration.processes.v2.process import V2Process - - -class ProcessRegistry: - def __init__(self, v1_process: V1Process, v2_process: V2Process | None = None) -> None: - self._items = {"v1": v1_process} - if v2_process is not None: - self._items["v2"] = v2_process - - def get(self, version: str): - return self._items.get(version) diff --git a/src/app/modules/agent/orchestration/processes/v1/process.py b/src/app/modules/agent/orchestration/processes/v1/process.py deleted file mode 100644 index b60b575..0000000 --- a/src/app/modules/agent/orchestration/processes/v1/process.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import annotations - - -class V1Process: - def __init__(self, steps: list) -> None: - self._steps = steps - - def steps(self) -> list: - return list(self._steps) diff --git a/src/app/modules/agent/orchestration/processes/v1/prompt_payload_builder.py b/src/app/modules/agent/orchestration/processes/v1/prompt_payload_builder.py deleted file mode 100644 index 9faf40e..0000000 --- a/src/app/modules/agent/orchestration/processes/v1/prompt_payload_builder.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import annotations - -import json - -from app.modules.agent.orchestration.context.execution_context import ExecutionContext - - -class V1PromptPayloadBuilder: - def build(self, context: ExecutionContext) -> str: - payload = {"question": context.request.message} - return json.dumps(payload, ensure_ascii=False, indent=2) diff --git a/src/app/modules/agent/orchestration/processes/v1/prompts.yml b/src/app/modules/agent/orchestration/processes/v1/prompts.yml deleted file mode 100644 index 243f86c..0000000 --- a/src/app/modules/agent/orchestration/processes/v1/prompts.yml +++ /dev/null @@ -1,12 +0,0 @@ -prompts: - simple_llm_answer: | - Ты полезный AI-ассистент проекта. - - На вход приходит JSON с полем: - - question - - Правила: - - Отвечай как персонаж мемов из дагестана - - Если вопрос неясный, аккуратно укажи, чего не хватает - - Не выдумывай несуществующие факты о проекте - - Формулируй ответ как обычное сообщение пользователю diff --git a/src/app/modules/agent/orchestration/processes/v1/simple_llm_workflow.py b/src/app/modules/agent/orchestration/processes/v1/simple_llm_workflow.py deleted file mode 100644 index 62ef2bf..0000000 --- a/src/app/modules/agent/orchestration/processes/v1/simple_llm_workflow.py +++ /dev/null @@ -1,42 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.orchestration.adapters.llm_chat_adapter import LlmChatAdapter -from app.modules.agent.orchestration.context.execution_context import ExecutionContext -from app.modules.agent.orchestration.processes.v1.prompt_payload_builder import V1PromptPayloadBuilder - - -class SimpleLlmWorkflow: - workflow_id = "simple_llm" - - def __init__( - self, - llm: LlmChatAdapter, - prompt_payload_builder: V1PromptPayloadBuilder | None = None, - ) -> None: - self._llm = llm - self._payload_builder = prompt_payload_builder or V1PromptPayloadBuilder() - - async def run(self, context: ExecutionContext) -> dict: - workflow_trace = context.trace.module("task_workflow") - workflow_trace.log("started", {"workflow_id": self.workflow_id}) - prompt_payload = self._payload_builder.build(context) - answer = await self._llm.generate( - prompt_payload, - context.request.request_id, - trace=context.trace.module("llm"), - ) - result = { - "workflow_id": self.workflow_id, - "prompt_name": self._llm.prompt_name, - "prompt_payload": prompt_payload, - "answer": answer, - } - workflow_trace.log( - "completed", - { - "workflow_id": self.workflow_id, - "prompt_name": self._llm.prompt_name, - "answer_length": len(answer), - }, - ) - return result diff --git a/src/app/modules/agent/orchestration/processes/v1/steps/bootstrap_step.py b/src/app/modules/agent/orchestration/processes/v1/steps/bootstrap_step.py deleted file mode 100644 index 34e344d..0000000 --- a/src/app/modules/agent/orchestration/processes/v1/steps/bootstrap_step.py +++ /dev/null @@ -1,23 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.orchestration.context.execution_context import ExecutionContext - - -class BootstrapStep: - async def run(self, context: ExecutionContext) -> None: - context.trace.module("orchestrator").log( - "bootstrap", - {"status": "started", "process_version": context.request.process_version}, - ) - await context.publisher.publish_status( - context.request.request_id, - "orchestrator", - "Запрос принят и поставлен в обработку.", - ) - await context.publisher.publish_status( - context.request.request_id, - "orchestrator", - "Запускаю процесс обработки v1.", - {"process_version": context.request.process_version}, - ) - context.trace.module("orchestrator").log("bootstrap", {"status": "completed"}) diff --git a/src/app/modules/agent/orchestration/processes/v1/steps/execute_llm_workflow_step.py b/src/app/modules/agent/orchestration/processes/v1/steps/execute_llm_workflow_step.py deleted file mode 100644 index 61d7d1a..0000000 --- a/src/app/modules/agent/orchestration/processes/v1/steps/execute_llm_workflow_step.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.orchestration.context.execution_context import ExecutionContext -from app.modules.agent.orchestration.processes.v1.simple_llm_workflow import SimpleLlmWorkflow - - -class ExecuteLlmWorkflowStep: - def __init__(self, workflow: SimpleLlmWorkflow) -> None: - self._workflow = workflow - - async def run(self, context: ExecutionContext) -> None: - request = context.request - await context.publisher.publish_status( - request.request_id, - "task_workflow", - f"Запускаю workflow {self._workflow.workflow_id}.", - ) - await context.publisher.publish_status( - request.request_id, - "prompt_builder", - "Формирую prompt payload для LLM.", - ) - result = await self._workflow.run(context) - request.answer = str(result.get("answer") or "") - context.workflow_result = result - await context.publisher.publish_status( - request.request_id, - "llm_process", - "Ответ от LLM получен.", - { - "workflow_id": result.get("workflow_id"), - "prompt_name": result.get("prompt_name"), - "answer_length": len(request.answer), - }, - ) diff --git a/src/app/modules/agent/orchestration/processes/v1/steps/finalize_step.py b/src/app/modules/agent/orchestration/processes/v1/steps/finalize_step.py deleted file mode 100644 index 68afc79..0000000 --- a/src/app/modules/agent/orchestration/processes/v1/steps/finalize_step.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.orchestration.context.execution_context import ExecutionContext - - -class FinalizeStep: - async def run(self, context: ExecutionContext) -> None: - request = context.request - context.trace.module("orchestrator").log("finalize", {"status": "started"}) - await context.publisher.publish_user( - request.request_id, - "agent", - request.answer or "", - ) - await context.publisher.publish_status( - request.request_id, - "orchestrator", - "Обработка запроса завершена.", - ) - context.trace.module("orchestrator").log("finalize", {"status": "completed"}) diff --git a/src/app/modules/agent/orchestration/processes/v1/steps/run_llm_step.py b/src/app/modules/agent/orchestration/processes/v1/steps/run_llm_step.py deleted file mode 100644 index 42c3c74..0000000 --- a/src/app/modules/agent/orchestration/processes/v1/steps/run_llm_step.py +++ /dev/null @@ -1,26 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.orchestration.adapters.llm_chat_adapter import LlmChatAdapter -from app.modules.agent.orchestration.context.execution_context import ExecutionContext - - -class RunLlmStep: - def __init__(self, llm: LlmChatAdapter) -> None: - self._llm = llm - - async def run(self, context: ExecutionContext) -> None: - request = context.request - context.trace_logger.log_step(request.request_id, "run_llm", "started") - await context.publisher.publish_status( - request.request_id, - "llm_process", - "Отправляю запрос пользователя в LLM.", - ) - answer = await self._llm.generate(request.message, request.request_id) - request.answer = answer - await context.publisher.publish_status( - request.request_id, - "llm_process", - "Ответ от LLM получен.", - ) - context.trace_logger.log_step(request.request_id, "run_llm", "completed", {"answer_length": len(answer)}) diff --git a/src/app/modules/agent/orchestration/processes/v2/README.md b/src/app/modules/agent/orchestration/processes/v2/README.md deleted file mode 100644 index 0a7d516..0000000 --- a/src/app/modules/agent/orchestration/processes/v2/README.md +++ /dev/null @@ -1,189 +0,0 @@ -# Process V2 - -`v2` is the current default orchestration process for agent requests. - -It is designed as a small stage-based pipeline: - -1. accept request -2. route intent -3. run intent-specific workflow -4. publish final user response - -The process definition lives in [process.py](/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/src/app/modules/orchestration/processes/v2/process.py). - -## Step Map - -### 1. Bootstrap - -File: -[bootstrap_step.py](/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/src/app/modules/orchestration/processes/v1/steps/bootstrap_step.py) - -Responsibility: -- announce request acceptance -- announce selected process version -- initialize trace logging - -SSE source: -- `orchestrator` - -### 2. Intent Router - -File: -[route_intent_step.py](/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/src/app/modules/orchestration/processes/v2/steps/route_intent_step.py) - -Responsibility: -- build task runtime context -- enrich request context -- call `IntentRouterV2` -- persist `route_result` into orchestration context - -SSE source: -- `intent_router` - -Main status messages: -- request is being routed -- final `intent / sub_intent` - -### 3. Workflow Execution - -Base behavior: -[workflow_step_base.py](/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/src/app/modules/orchestration/processes/v2/steps/workflow_step_base.py) - -Intent-specific steps: -- [execute_documentation_workflow_step.py](/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/src/app/modules/orchestration/processes/v2/steps/execute_documentation_workflow_step.py) -- [execute_openapi_workflow_step.py](/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/src/app/modules/orchestration/processes/v2/steps/execute_openapi_workflow_step.py) -- [execute_general_qa_workflow_step.py](/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/src/app/modules/orchestration/processes/v2/steps/execute_general_qa_workflow_step.py) -- [execute_fallback_workflow_step.py](/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/src/app/modules/orchestration/processes/v2/steps/execute_fallback_workflow_step.py) - -Responsibility: -- choose workflow by `route_result.intent` -- run the selected workflow -- expose workflow diagnostics through SSE -- store workflow result in orchestration context - -Workflow mapping: - -| Intent | Workflow class | Notes | -|---|---|---| -| `DOCUMENTATION_EXPLAIN` | `DocsQaWorkflow` | docs explanation pipeline | -| `OPENAPI_GENERATION` | `OpenApiWorkflow` | OpenAPI generation from docs evidence | -| `GENERAL_QA` | `GeneralQaWorkflow` | general docs-oriented QA | -| any other intent | `FallbackWorkflow` | safety fallback | - -Published SSE stages: -- `task_workflow` -- `rag_retrieval` -- `evidence_gate` -- `workflow_result` - -### 4. Finalize - -File: -[finalize_step.py](/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/src/app/modules/orchestration/processes/v1/steps/finalize_step.py) - -Responsibility: -- publish final `user` event with answer text -- publish terminal status message -- let facade mark request as `done` - -SSE sources: -- `agent` -- `orchestrator` - -## Intent Routing - -Router adapter: -[intent_router_adapter.py](/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/src/app/modules/orchestration/adapters/intent_router_adapter.py) - -Underlying implementation: -[router.py](/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/src/app/modules/agent/intent_router_v2/router.py) - -The router decides: -- `intent` -- `sub_intent` -- retrieval profile -- retrieval layers and constraints -- evidence policy - -For docs-oriented requests the main active intents are: -- `DOCUMENTATION_EXPLAIN` -- `OPENAPI_GENERATION` -- `GENERAL_QA` - -## Retrieval And Evidence Gate - -`v2` does not implement retrieval itself inside orchestration. - -Instead it delegates execution to workflow classes that internally use the existing docs pipeline: - -- [docs_qa.py](/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/src/app/modules/agent/task_runtime/workflows/docs_qa.py) -- [openapi.py](/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/src/app/modules/agent/task_runtime/workflows/openapi.py) -- [general_qa.py](/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/src/app/modules/agent/task_runtime/workflows/general_qa.py) - -These workflows currently rely on: -- `DocsQAPipelineRunner` -- docs retrieval planning -- docs evidence builder -- docs gate logic - -Important: -- docs retrieval and gate logic still live in the existing docs runtime layer -- orchestration `v2` only makes those stages explicit at transport/process level - -## SSE Contract In V2 - -Client-visible message categories: -- `status` -- `user` -- `system` - -Currently used in `v2`: - -- `status` from `orchestrator` -- `status` from `intent_router` -- `status` from `task_workflow` -- `status` from `rag_retrieval` -- `status` from `evidence_gate` -- `status` from `workflow_result` -- `user` from `agent` - -Typical sequence: - -1. request accepted -2. process `v2` started -3. routing started -4. route selected -5. workflow started -6. retrieval diagnostics -7. evidence gate diagnostics -8. workflow result summary -9. final user answer -10. processing completed - -## Trace Logging - -Per-request trace files are written by: -[request_trace_logger.py](/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/src/app/modules/api/infrastructure/logging/request_trace_logger.py) - -Location: -[runtime_traces/agent_requests](/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/runtime_traces/agent_requests) - -Each request trace contains: -- request metadata -- user message -- process steps -- emitted events -- final result or error - -## Extension Points - -Recommended next extensions: - -1. add a dedicated workflow step for `GENERATE_DOCS_FROM_CODE` -2. move docs gate diagnostics into strongly typed orchestration payloads -3. split workflow execution into smaller orchestration stages: - - retrieval - - evidence assembly - - gate - - answer generation -4. add session-level trace aggregation in addition to request-level logs diff --git a/src/app/modules/agent/orchestration/processes/v2/process.py b/src/app/modules/agent/orchestration/processes/v2/process.py deleted file mode 100644 index 908ed23..0000000 --- a/src/app/modules/agent/orchestration/processes/v2/process.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import annotations - - -class V2Process: - def __init__(self, steps: list) -> None: - self._steps = steps - - def steps(self) -> list: - return list(self._steps) diff --git a/src/app/modules/agent/orchestration/processes/v2/prompt_payload_builder.py b/src/app/modules/agent/orchestration/processes/v2/prompt_payload_builder.py deleted file mode 100644 index 223e3b8..0000000 --- a/src/app/modules/agent/orchestration/processes/v2/prompt_payload_builder.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import annotations - -import json - -from app.modules.agent.runtime.docs_qa_pipeline.models import DocsEvidenceBundle, OpenAPIResult - - -class V2PromptPayloadBuilder: - def build( - self, - *, - question: str, - intent: str, - sub_intent: str, - evidence_bundle: DocsEvidenceBundle, - api_contract: OpenAPIResult | None = None, - ) -> str: - payload = { - "question": question, - "documents": list(evidence_bundle.documents), - "facts": list(evidence_bundle.facts), - "entities": list(evidence_bundle.entities), - "workflows": list(evidence_bundle.workflows), - "relations": list(evidence_bundle.relations), - "chunks": list(evidence_bundle.chunks), - } - if api_contract is not None: - payload["api_contract"] = { - "path": api_contract.path, - "method": api_contract.method, - "request_schema": api_contract.request_schema, - "response_schema": api_contract.response_schema, - "diagnostics": dict(api_contract.diagnostics), - } - return json.dumps(payload, ensure_ascii=False, indent=2) diff --git a/src/app/modules/agent/orchestration/processes/v2/prompt_selector.py b/src/app/modules/agent/orchestration/processes/v2/prompt_selector.py deleted file mode 100644 index 16714f6..0000000 --- a/src/app/modules/agent/orchestration/processes/v2/prompt_selector.py +++ /dev/null @@ -1,18 +0,0 @@ -"""Выбор prompt для process-local workflow v2.""" - -from __future__ import annotations - - -class V2PromptSelector: - _DOCS_INTENT_PROMPTS = { - "DOCUMENTATION_EXPLAIN": "documentation_explain_answer", - "GENERAL_QA": "general_qa_answer", - } - - def select(self, *, intent: str = "DOCUMENTATION_EXPLAIN", sub_intent: str, answer_mode: str) -> str: - intent_key = (intent or "DOCUMENTATION_EXPLAIN").upper() - if intent_key in {"OPENAPI_GENERATION", "OPENAPI_FROM_DOCUMENTATION"}: - if sub_intent.upper() == "OPENAPI_FRAGMENT_GENERATE": - return "openapi_fragment_answer" - return "openapi_answer" - return self._DOCS_INTENT_PROMPTS.get(intent_key, "documentation_explain_answer") diff --git a/src/app/modules/agent/orchestration/processes/v2/prompts.yml b/src/app/modules/agent/orchestration/processes/v2/prompts.yml deleted file mode 100644 index 5142637..0000000 --- a/src/app/modules/agent/orchestration/processes/v2/prompts.yml +++ /dev/null @@ -1,96 +0,0 @@ -prompts: - documentation_explain_answer: | - Ты объясняешь документацию системы. - - На вход приходит JSON с полями: - - question - - documents - - facts - - entities - - workflows - - relations - - chunks - - Правила: - - Используй только предоставленные факты - - Не додумывай - - Если данных недостаточно, скажи это явно - - Объясняй структурировано - - Формат ответа: - 1. Краткое описание - 2. Основные элементы - 3. Как это работает - 4. Связи с другими частями системы (если есть) - general_qa_answer: | - Ты отвечаешь на общий вопрос по документации проекта. - - На вход приходит JSON с полями: - - question - - documents - - facts - - entities - - workflows - - relations - - chunks - - Правила: - - Используй только предоставленные документы и факты - - Не додумывай отсутствующие детали - - Если данных недостаточно, скажи это прямо - - Дай короткий понятный ответ без лишней структуры - openapi_answer: | - Ты генерируешь OpenAPI спецификацию по документации API. - - На вход приходит JSON с полями: - - question - - documents - - facts - - entities - - workflows - - relations - - chunks - - api_contract - - Правила: - - Используй только данные из документации - - Не придумывай поля - - Если данных нет, не заполняй - - Верни ТОЛЬКО YAML без пояснений - - Формат: - paths: - /path: - method: - summary: ... - requestBody: - responses: - openapi_fragment_answer: | - Ты генерируешь часть OpenAPI schema по документации API. - - На вход приходит JSON с полями: - - question - - documents - - facts - - entities - - workflows - - relations - - chunks - - api_contract - - Правила: - - Используй только данные из документации - - Не придумывай отсутствующие поля - - Верни только содержимое нужного фрагмента - fallback_answer: | - Ты формируешь безопасный fallback-ответ. - - На вход приходит JSON с полями: - - question - - attachments - - confluence_urls - - Правила: - - Если специализированный workflow не выбран, честно скажи об ограничении - - Используй только данные из payload - - Не выдумывай детали проекта diff --git a/src/app/modules/agent/orchestration/processes/v2/steps/execute_documentation_workflow_step.py b/src/app/modules/agent/orchestration/processes/v2/steps/execute_documentation_workflow_step.py deleted file mode 100644 index 1268038..0000000 --- a/src/app/modules/agent/orchestration/processes/v2/steps/execute_documentation_workflow_step.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.orchestration.processes.v2.steps.workflow_step_base import WorkflowStepBase - - -class ExecuteDocumentationWorkflowStep(WorkflowStepBase): - intent_name = "DOCUMENTATION_EXPLAIN" diff --git a/src/app/modules/agent/orchestration/processes/v2/steps/execute_fallback_workflow_step.py b/src/app/modules/agent/orchestration/processes/v2/steps/execute_fallback_workflow_step.py deleted file mode 100644 index 6bf3c1f..0000000 --- a/src/app/modules/agent/orchestration/processes/v2/steps/execute_fallback_workflow_step.py +++ /dev/null @@ -1,18 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.orchestration.context.execution_context import ExecutionContext -from app.modules.agent.orchestration.processes.v2.steps.workflow_step_base import WorkflowStepBase - - -class ExecuteFallbackWorkflowStep(WorkflowStepBase): - intent_name = "FALLBACK" - - def should_run(self, context: ExecutionContext) -> bool: - route_result = context.route_result - if route_result is None: - return False - return str(route_result.intent or "").upper() not in { - "DOCUMENTATION_EXPLAIN", - "OPENAPI_GENERATION", - "GENERAL_QA", - } diff --git a/src/app/modules/agent/orchestration/processes/v2/steps/execute_general_qa_workflow_step.py b/src/app/modules/agent/orchestration/processes/v2/steps/execute_general_qa_workflow_step.py deleted file mode 100644 index f7893fd..0000000 --- a/src/app/modules/agent/orchestration/processes/v2/steps/execute_general_qa_workflow_step.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.orchestration.processes.v2.steps.workflow_step_base import WorkflowStepBase - - -class ExecuteGeneralQaWorkflowStep(WorkflowStepBase): - intent_name = "GENERAL_QA" diff --git a/src/app/modules/agent/orchestration/processes/v2/steps/execute_openapi_workflow_step.py b/src/app/modules/agent/orchestration/processes/v2/steps/execute_openapi_workflow_step.py deleted file mode 100644 index 755f6c1..0000000 --- a/src/app/modules/agent/orchestration/processes/v2/steps/execute_openapi_workflow_step.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.orchestration.processes.v2.steps.workflow_step_base import WorkflowStepBase - - -class ExecuteOpenApiWorkflowStep(WorkflowStepBase): - intent_name = "OPENAPI_GENERATION" diff --git a/src/app/modules/agent/orchestration/processes/v2/steps/route_intent_step.py b/src/app/modules/agent/orchestration/processes/v2/steps/route_intent_step.py deleted file mode 100644 index e02990b..0000000 --- a/src/app/modules/agent/orchestration/processes/v2/steps/route_intent_step.py +++ /dev/null @@ -1,71 +0,0 @@ -from __future__ import annotations - -import asyncio - -from app.core.exceptions import AppError -from app.modules.agent.task_runtime.context import TaskRuntimeContextBuilder -from app.modules.agent.task_runtime.enrichment import ContextEnrichmentService -from app.modules.agent.orchestration.adapters.intent_router_adapter import IntentRouterAdapter -from app.modules.agent.orchestration.context.execution_context import ExecutionContext -from app.modules.agent.orchestration.v2_progress import build_progress_callback -from app.schemas.common import ModuleName - - -class RouteIntentStep: - def __init__( - self, - router: IntentRouterAdapter, - context_builder: TaskRuntimeContextBuilder, - enrichment: ContextEnrichmentService, - ) -> None: - self._router = router - self._context_builder = context_builder - self._enrichment = enrichment - - async def run(self, context: ExecutionContext) -> None: - rag_session_id = context.session.active_rag_session_id - if not rag_session_id: - raise AppError( - "rag_session_not_bound", - "Agent session has no active rag_session_id for process v2.", - ModuleName.RAG, - ) - request = context.request - loop = asyncio.get_running_loop() - task_context = self._context_builder.build( - task_id=request.request_id, - dialog_session_id=context.session.session_id, - rag_session_id=rag_session_id, - mode="auto", - message=request.message, - attachments=[], - files=[], - progress_cb=build_progress_callback(loop, context.publisher, request.request_id), - trace=context.trace, - ) - task_context.enriched_context = self._enrichment.enrich(task_context) - context.task_context = task_context - await context.publisher.publish_status( - request.request_id, - "intent_router", - "Маршрутизирую запрос и определяю целевой workflow.", - ) - route_result = await asyncio.to_thread( - self._router.route, - request.message, - task_context.conversation_state, - task_context.repo_context, - context.trace.module("intent_router"), - ) - task_context.route_result = route_result - context.route_result = route_result - await context.publisher.publish_status( - request.request_id, - "intent_router", - f"Маршрут выбран: {route_result.intent} / {route_result.query_plan.sub_intent}.", - { - "intent": route_result.intent, - "sub_intent": route_result.query_plan.sub_intent, - "matched_intent_source": route_result.matched_intent_source, - }, - ) diff --git a/src/app/modules/agent/orchestration/processes/v2/steps/run_task_workflow_step.py b/src/app/modules/agent/orchestration/processes/v2/steps/run_task_workflow_step.py deleted file mode 100644 index f8d0a1b..0000000 --- a/src/app/modules/agent/orchestration/processes/v2/steps/run_task_workflow_step.py +++ /dev/null @@ -1,30 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.orchestration.adapters.task_runtime_adapter import TaskRuntimeAdapter -from app.modules.agent.orchestration.context.execution_context import ExecutionContext - - -class RunTaskWorkflowStep: - def __init__(self, runtime: TaskRuntimeAdapter) -> None: - self._runtime = runtime - - async def run(self, context: ExecutionContext) -> None: - request = context.request - context.trace_logger.log_step(request.request_id, "task_runtime", "started") - await context.publisher.publish_status( - request.request_id, - "orchestrator", - "Запускаю pipeline v2: intent router, rag retrieval и task workflow.", - {"process_version": request.process_version}, - ) - result = await self._runtime.run(context) - request.answer = result.answer or "" - context.trace_logger.log_step( - request.request_id, - "task_runtime", - "completed", - { - "result_type": getattr(result.result_type, "value", str(result.result_type)), - "meta": getattr(result, "meta", {}) or {}, - }, - ) diff --git a/src/app/modules/agent/orchestration/processes/v2/steps/workflow_step_base.py b/src/app/modules/agent/orchestration/processes/v2/steps/workflow_step_base.py deleted file mode 100644 index bbd26ce..0000000 --- a/src/app/modules/agent/orchestration/processes/v2/steps/workflow_step_base.py +++ /dev/null @@ -1,68 +0,0 @@ -from __future__ import annotations - -import asyncio -from typing import Any - -from app.modules.agent.orchestration.context.execution_context import ExecutionContext - - -class WorkflowStepBase: - intent_name = "" - - def __init__(self, workflow, step_name: str) -> None: - self._workflow = workflow - self._step_name = step_name - - def should_run(self, context: ExecutionContext) -> bool: - route_result = context.route_result - return bool(route_result) and str(route_result.intent or "").upper() == self.intent_name - - async def run(self, context: ExecutionContext) -> None: - request = context.request - task_context = context.task_context - await context.publisher.publish_status( - request.request_id, - "task_workflow", - f"Запускаю workflow {self._workflow.workflow_id}.", - {"intent": context.route_result.intent, "sub_intent": context.route_result.query_plan.sub_intent}, - ) - result = await asyncio.to_thread(self._workflow.run, task_context) - context.workflow_result = result - request.answer = result.answer or "" - diagnostics = dict(result.meta.get("diagnostics") or {}) - await self._publish_diagnostics(context, diagnostics, result) - - async def _publish_diagnostics(self, context: ExecutionContext, diagnostics: dict[str, Any], result: Any) -> None: - request_id = context.request.request_id - if diagnostics: - await context.publisher.publish_status( - request_id, - "rag_retrieval", - "RAG retrieval завершен.", - { - "planned_layers": list(diagnostics.get("planned_layers") or diagnostics.get("layers_used") or []), - "executed_layers": list(diagnostics.get("executed_layers") or []), - "non_empty_layers": list(diagnostics.get("non_empty_layers") or diagnostics.get("docs_layers_with_hits") or []), - }, - ) - await context.publisher.publish_status( - request_id, - "evidence_gate", - "Evidence gate оценен.", - { - "decision": diagnostics.get("gate_decision"), - "reason": diagnostics.get("gate_decision_reason"), - "missing": list(diagnostics.get("gate_missing_requirements") or []), - "satisfied": list(diagnostics.get("gate_satisfied_requirements") or []), - }, - ) - await context.publisher.publish_status( - request_id, - "workflow_result", - f"Workflow {self._workflow.workflow_id} завершен.", - { - "workflow_id": self._workflow.workflow_id, - "result_type": getattr(result.result_type, "value", str(result.result_type)), - "answer_length": len(result.answer or ""), - }, - ) diff --git a/src/app/modules/agent/orchestration/runtime/process_runner.py b/src/app/modules/agent/orchestration/runtime/process_runner.py deleted file mode 100644 index 2bed04a..0000000 --- a/src/app/modules/agent/orchestration/runtime/process_runner.py +++ /dev/null @@ -1,12 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.orchestration.context.execution_context import ExecutionContext - - -class ProcessRunner: - async def run(self, context: ExecutionContext, steps: list) -> None: - for step in steps: - should_run = getattr(step, "should_run", None) - if callable(should_run) and not should_run(context): - continue - await step.run(context) diff --git a/src/app/modules/agent/orchestration/v2_progress.py b/src/app/modules/agent/orchestration/v2_progress.py deleted file mode 100644 index 7d1ade4..0000000 --- a/src/app/modules/agent/orchestration/v2_progress.py +++ /dev/null @@ -1,17 +0,0 @@ -from __future__ import annotations - -import asyncio - -from app.modules.agent.orchestration.messaging.client_message_publisher import ClientMessagePublisher - - -def build_progress_callback(loop: asyncio.AbstractEventLoop, publisher: ClientMessagePublisher, request_id: str): - def progress_cb(stage: str, message: str, kind: str = "task_progress", meta: dict | None = None) -> None: - payload = dict(meta or {}) - payload.setdefault("kind", kind) - asyncio.run_coroutine_threadsafe( - publisher.publish_status(request_id, stage, message, payload), - loop, - ) - - return progress_cb diff --git a/src/app/modules/agent/runtime/__init__.py b/src/app/modules/agent/runtime/__init__.py deleted file mode 100644 index a0b10ff..0000000 --- a/src/app/modules/agent/runtime/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -"""Публичный API runtime: оркестрация роутинг → retrieval → evidence gate → генерация ответа.""" - -from app.modules.agent.runtime.executor import AgentRuntimeExecutor -from app.modules.agent.runtime.docs_qa_pipeline import DocsQAPipelineRunner -from app.modules.agent.runtime.models import ( - RuntimeDraftAnswer, - RuntimeExecutionState, - RuntimeFinalResult, -) -from app.modules.agent.runtime.steps.gates.post.post_gate import RuntimeValidationResult -from app.modules.agent.runtime.steps.retrieval import RuntimeRepoContextFactory, RuntimeRetrievalAdapter - -__all__ = [ - "AgentRuntimeExecutor", - "DocsQAPipelineRunner", - "RuntimeDraftAnswer", - "RuntimeExecutionState", - "RuntimeFinalResult", - "RuntimeRepoContextFactory", - "RuntimeRetrievalAdapter", - "RuntimeValidationResult", -] diff --git a/src/app/modules/agent/runtime/code_qa_runner_adapter.py b/src/app/modules/agent/runtime/code_qa_runner_adapter.py deleted file mode 100644 index 8c2f5e3..0000000 --- a/src/app/modules/agent/runtime/code_qa_runner_adapter.py +++ /dev/null @@ -1,70 +0,0 @@ -"""Адаптер AgentRuntimeExecutor к протоколу AgentRunner для интеграции с chat-слоем.""" - -from __future__ import annotations - -import asyncio -import logging - -from app.modules.agent.runtime import AgentRuntimeExecutor -from app.modules.contracts import AgentRunner -from app.schemas.chat import TaskResultType - -LOGGER = logging.getLogger(__name__) - - -class CodeQaRunnerAdapter: - """Реализация AgentRunner через AgentRuntimeExecutor (sync execute в executor).""" - - def __init__(self, executor: AgentRuntimeExecutor) -> None: - self._executor = executor - - async def run( - self, - *, - task_id: str, - dialog_session_id: str, - rag_session_id: str, - mode: str, - message: str, - attachments: list[dict], - files: list[dict], - progress_cb=None, - ): - files_map = _files_to_map(files) - loop = asyncio.get_running_loop() - result = await loop.run_in_executor( - None, - lambda: self._executor.execute( - user_query=message, - rag_session_id=rag_session_id, - files_map=files_map, - ), - ) - return _to_agent_run_result(result, task_id=task_id) - - -def _files_to_map(files: list[dict]) -> dict[str, dict]: - out: dict[str, dict] = {} - for item in files or []: - if isinstance(item, dict) and item.get("path"): - out[str(item["path"])] = dict(item) - return out - - -def _to_agent_run_result(final, *, task_id: str): - from types import SimpleNamespace - - meta = {} - if final: - meta = { - "task_id": task_id, - "answer_mode": getattr(final, "answer_mode", "normal"), - } - if getattr(final, "diagnostics", None) is not None: - meta["diagnostics"] = getattr(final.diagnostics, "model_dump", lambda **kw: {})(mode="json") - return SimpleNamespace( - result_type=TaskResultType.ANSWER, - answer=final.final_answer if final else "", - changeset=[], - meta=meta, - ) diff --git a/src/app/modules/agent/runtime/docs_qa_pipeline/__init__.py b/src/app/modules/agent/runtime/docs_qa_pipeline/__init__.py deleted file mode 100644 index 0da2da5..0000000 --- a/src/app/modules/agent/runtime/docs_qa_pipeline/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from app.modules.agent.runtime.docs_qa_pipeline.models import DocsDiagnostics, DocsQAPipelineResult, OpenAPIResult -from app.modules.agent.runtime.docs_qa_pipeline.pipeline import DocsQAPipelineRunner - -__all__ = [ - "DocsDiagnostics", - "DocsQAPipelineRunner", - "DocsQAPipelineResult", - "OpenAPIResult", -] diff --git a/src/app/modules/agent/runtime/docs_qa_pipeline/anchor_selector.py b/src/app/modules/agent/runtime/docs_qa_pipeline/anchor_selector.py deleted file mode 100644 index fc87747..0000000 --- a/src/app/modules/agent/runtime/docs_qa_pipeline/anchor_selector.py +++ /dev/null @@ -1,56 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.runtime.docs_qa_pipeline.doc_identity import DocsCanonicalDocIdResolver - - -class DocsAnchorSelector: - def __init__(self, resolver: DocsCanonicalDocIdResolver | None = None) -> None: - self._resolver = resolver or DocsCanonicalDocIdResolver() - - def select(self, *, sub_intent: str, anchor_type: str, anchor_value: str | None, rows: list[dict]) -> dict[str, object]: - if sub_intent != "RELATED_DOCS_EXPLAIN": - return {"anchor_candidates": [], "selected_anchor": None, "anchor_selection_reason": "", "anchor_match_type": ""} - scored = self._scored_candidates(anchor_type=anchor_type, anchor_value=anchor_value, rows=rows) - if not scored: - return {"anchor_candidates": [], "selected_anchor": None, "anchor_selection_reason": "", "anchor_match_type": ""} - selected = scored[0] - return { - "anchor_candidates": [item["doc_id"] for item in scored], - "selected_anchor": selected["doc_id"], - "anchor_selection_reason": selected["reason"], - "anchor_match_type": selected["match_type"], - } - - def _scored_candidates(self, *, anchor_type: str, anchor_value: str | None, rows: list[dict]) -> list[dict[str, object]]: - value = str(anchor_value or "").strip().lower() - endpoint_slug = value.strip("/").replace("/", "_").replace("-", "_") - scored: list[dict[str, object]] = [] - for row in rows: - metadata = dict(row.get("metadata") or {}) - for doc_id in self._resolver.candidates(row): - score = 0 - match_type = "semantic_fallback" - reason = "relation_neighbor" - if anchor_type == "endpoint" and value: - if str(metadata.get("endpoint") or "").strip().lower() == value: - score, match_type, reason = 100, "exact_path", "metadata.endpoint exact match" - elif endpoint_slug and endpoint_slug in doc_id.lower(): - score, match_type, reason = 90, "exact_path", "doc_id matches requested endpoint slug" - elif endpoint_slug and endpoint_slug in str(row.get("path") or "").lower().replace("-", "_"): - score, match_type, reason = 85, "exact_path", "path matches requested endpoint slug" - elif anchor_type == "entity" and value: - entity_value = str(metadata.get("entity") or "").strip().lower() - if entity_value == value: - score, match_type, reason = 100, "exact_entity", "metadata.entity exact match" - elif value in doc_id.lower(): - score, match_type, reason = 90, "exact_title", "doc_id matches requested entity" - if score == 0: - score = 40 if str(row.get("layer") or "") == "D5_RELATION_GRAPH" else 20 - scored.append({"doc_id": doc_id, "score": score, "match_type": match_type, "reason": reason}) - unique: dict[str, dict[str, object]] = {} - for item in scored: - doc_id = str(item["doc_id"]) - current = unique.get(doc_id) - if current is None or int(item["score"]) > int(current["score"]): - unique[doc_id] = item - return sorted(unique.values(), key=lambda item: (-int(item["score"]), str(item["doc_id"]))) diff --git a/src/app/modules/agent/runtime/docs_qa_pipeline/answer_synthesizer.py b/src/app/modules/agent/runtime/docs_qa_pipeline/answer_synthesizer.py deleted file mode 100644 index 8e83fec..0000000 --- a/src/app/modules/agent/runtime/docs_qa_pipeline/answer_synthesizer.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.runtime.docs_qa_pipeline.models import DocsEvidenceBundle - - -class DocsAnswerSynthesizer: - def synthesize(self, query: str, evidence_bundle: DocsEvidenceBundle) -> str: - mode = "graph_summary" if evidence_bundle.sub_intent == "RELATED_DOCS_EXPLAIN" else "prose" - if mode == "list": - return self._list_answer(evidence_bundle) - if mode == "graph_summary": - return self._graph_summary(evidence_bundle) - return self._prose_answer(query, evidence_bundle) - - def _prose_answer(self, query: str, bundle: DocsEvidenceBundle) -> str: - parts = [item["content"] for item in bundle.facts[:3] if item.get("content")] - if not parts: - parts = [item["content"] for item in bundle.entities[:2] if item.get("content")] - if not parts: - parts = [item["content"] for item in bundle.workflows[:2] if item.get("content")] - if not parts: - parts = [item["content"] for item in bundle.documents[:2] if item.get("content")] - if not parts: - parts = [item["content"] for item in bundle.chunks[:2] if item.get("content")] - if not parts: - return f"Недостаточно данных в документации для ответа на запрос: {query}" - return "\n".join(parts) - - def _list_answer(self, bundle: DocsEvidenceBundle) -> str: - items = [item["title"] or item["path"] for item in bundle.documents[:5]] - if not items: - items = [item["title"] or item["path"] for item in bundle.facts[:5]] - if not items: - return "Подходящие документы не найдены." - return "\n".join(f"- {item}" for item in items) - - def _graph_summary(self, bundle: DocsEvidenceBundle) -> str: - items = [item["title"] or item["content"] for item in bundle.relations[:5]] - if not items: - items = [item["title"] or item["path"] for item in bundle.documents[:5]] - if not items: - return "Связанные документы не найдены." - return "\n".join(f"- {item}" for item in items) diff --git a/src/app/modules/agent/runtime/docs_qa_pipeline/diagnostics_builder.py b/src/app/modules/agent/runtime/docs_qa_pipeline/diagnostics_builder.py deleted file mode 100644 index 1d18937..0000000 --- a/src/app/modules/agent/runtime/docs_qa_pipeline/diagnostics_builder.py +++ /dev/null @@ -1,259 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.runtime.docs_qa_pipeline.doc_identity import DocsCanonicalDocIdResolver -from app.modules.agent.runtime.docs_qa_pipeline.models import DocsDiagnostics, DocsEvidenceBundle, OpenAPIResult - - -class DocsDiagnosticsBuilder: - def __init__(self, resolver: DocsCanonicalDocIdResolver | None = None) -> None: - self._resolver = resolver or DocsCanonicalDocIdResolver() - - def build( - self, - *, - intent: str, - sub_intent: str, - planned_layers: list[str], - executed_layers: list[str], - non_empty_layers: list[str], - layer_diagnostics: dict[str, object], - evidence_bundle: DocsEvidenceBundle, - openapi_result: OpenAPIResult | None, - prompt_used: str, - llm_mode: str, - answer_mode: str, - output_valid: bool, - matched_intent_source: str, - matched_anchor_type: str, - matched_anchor_value: str | None, - exact_anchor_match: bool, - query_entity_candidates: list[str], - resolved_entity_candidates: list[str], - query_anchor_candidates: list[str], - resolved_anchor_candidates: list[str], - anchor_candidates: list[str], - selected_anchor: str | None, - anchor_selection_reason: str, - anchor_match_type: str, - docs_layers_with_hits: list[str], - gate_decision: str, - gate_decision_reason: str, - gate_missing_requirements: list[str], - gate_satisfied_requirements: list[str], - requested_fragment_type: str | None, - fragment_evidence_found: list[str], - fragment_missing_requirements: list[str], - prompt: dict[str, object], - degraded_reason: str | None, - fallback_used: bool, - code_intents_stubbed: bool, - ) -> DocsDiagnostics: - missing = list((openapi_result.diagnostics if openapi_result else {}).get("missing_required_fields") or []) - openapi_fields = 0 - if openapi_result is not None: - openapi_fields += len((openapi_result.request_schema or {}).get("properties") or {}) - openapi_fields += len((openapi_result.response_schema or {}).get("properties") or {}) - return DocsDiagnostics( - intent=intent, - sub_intent=sub_intent, - layers_used=list(planned_layers), - documents_found=len(evidence_bundle.documents), - facts_found=len(evidence_bundle.facts), - relations_found=len(evidence_bundle.relations), - openapi_fields_extracted=openapi_fields, - missing_required_fields=missing, - openapi_status=self._openapi_status(openapi_result), - prompt_used=prompt_used, - llm_mode=llm_mode, - output_valid=output_valid, - matched_intent_source=matched_intent_source, - matched_anchor_type=matched_anchor_type, - matched_anchor_value=matched_anchor_value, - exact_anchor_match=exact_anchor_match, - docs_layers_requested=list(planned_layers), - docs_layers_with_hits=list(docs_layers_with_hits), - planned_layers=list(planned_layers), - executed_layers=list(executed_layers), - non_empty_layers=list(non_empty_layers), - layer_diagnostics=dict(layer_diagnostics), - query_entity_candidates=list(query_entity_candidates), - resolved_entity_candidates=list(resolved_entity_candidates), - query_anchor_candidates=list(query_anchor_candidates), - resolved_anchor_candidates=list(resolved_anchor_candidates), - anchor_candidates=list(anchor_candidates), - selected_anchor=selected_anchor, - anchor_selection_reason=anchor_selection_reason, - anchor_match_type=anchor_match_type, - doc_ids=self._doc_ids(evidence_bundle, selected_anchor), - doc_paths=self._doc_paths(evidence_bundle), - doc_titles=self._doc_titles(evidence_bundle), - relation_hits_count=len(evidence_bundle.relations), - relation_targets=self._relation_targets(evidence_bundle), - selected_doc_ids=self._selected_doc_ids(evidence_bundle), - selected_fact_ids=self._selected_ids(evidence_bundle.facts, ("fact_id", "doc_id", "document_id"), fallback="path"), - selected_relation_ids=self._selected_ids( - evidence_bundle.relations, - ("relation_id", "target_doc_id", "target_document_id", "doc_id", "document_id"), - fallback="path", - ), - selected_chunk_ids=self._selected_ids(evidence_bundle.chunks, ("chunk_id", "doc_id", "document_id"), fallback="path"), - selected_entity_ids=self._selected_ids(evidence_bundle.entities, ("entity", "doc_id", "document_id"), fallback="title"), - selected_workflow_ids=self._selected_ids(evidence_bundle.workflows, ("workflow_id", "doc_id", "document_id"), fallback="path"), - fallback_doc_hits_count=len(evidence_bundle.documents) + len(evidence_bundle.chunks), - fallback_used=fallback_used, - fact_hits=len(evidence_bundle.facts), - entity_hits=self._entity_hits(evidence_bundle), - evidence_summary=self._evidence_summary(evidence_bundle, openapi_result), - gate_decision=gate_decision, - gate_decision_reason=gate_decision_reason, - gate_missing_requirements=list(gate_missing_requirements), - gate_satisfied_requirements=list(gate_satisfied_requirements), - openapi_evidence=dict(self._openapi_evidence(openapi_result)), - requested_fragment_type=requested_fragment_type, - fragment_evidence_found=list(fragment_evidence_found), - fragment_missing_requirements=list(fragment_missing_requirements), - prompt=dict(prompt), - answer_mode=answer_mode, - degrade_reason=degraded_reason, - degraded_reason=degraded_reason, - code_intents_stubbed=code_intents_stubbed, - ) - - def _openapi_status(self, openapi_result: OpenAPIResult | None) -> dict[str, bool]: - diagnostics = openapi_result.diagnostics if openapi_result else {} - return { - "has_path": bool(diagnostics.get("has_path")), - "has_method": bool(diagnostics.get("has_method")), - "has_request": bool(diagnostics.get("has_request")), - "has_response": bool(diagnostics.get("has_response")), - } - - def _doc_ids(self, evidence_bundle: DocsEvidenceBundle, selected_anchor: str | None) -> list[str]: - values = self._collect_doc_ids(evidence_bundle) - for item in evidence_bundle.relations: - metadata = dict(item.get("metadata") or {}) - target = metadata.get("target_doc_id") or metadata.get("target_document_id") - if target: - values.append(str(target)) - result = self._dedupe(values) - if selected_anchor and selected_anchor in result: - return [selected_anchor, *[item for item in result if item != selected_anchor]] - if selected_anchor: - return [selected_anchor, *result] - return result - - def _selected_doc_ids(self, evidence_bundle: DocsEvidenceBundle) -> list[str]: - values = self._selected_ids(evidence_bundle.documents, ("doc_id", "document_id"), fallback="path") - values.extend(self._selected_ids(evidence_bundle.entities, ("doc_id", "document_id"), fallback="path")) - values.extend(self._selected_ids(evidence_bundle.workflows, ("doc_id", "document_id"), fallback="path")) - return self._dedupe(values) - - def _doc_paths(self, evidence_bundle: DocsEvidenceBundle) -> list[str]: - return self._collect_distinct(evidence_bundle, "path") - - def _doc_titles(self, evidence_bundle: DocsEvidenceBundle) -> list[str]: - return self._collect_distinct(evidence_bundle, "title") - - def _relation_targets(self, evidence_bundle: DocsEvidenceBundle) -> list[str]: - values: list[str] = [] - for item in evidence_bundle.relations: - metadata = dict(item.get("metadata") or {}) - target = ( - metadata.get("target_doc_id") - or metadata.get("target_document_id") - or metadata.get("related_to") - or metadata.get("document_id") - or metadata.get("doc_id") - or item.get("title") - or item.get("path") - ) - if target: - values.append(str(target)) - return self._dedupe(values) - - def _selected_ids(self, items: list[dict], metadata_keys: tuple[str, ...], *, fallback: str) -> list[str]: - values: list[str] = [] - for item in items: - metadata = dict(item.get("metadata") or {}) - candidate = None - for key in metadata_keys: - candidate = metadata.get(key) - if candidate: - break - if not candidate: - candidate = item.get(fallback) - if candidate: - values.append(str(candidate)) - return self._dedupe(values) - - def _collect_doc_ids(self, evidence_bundle: DocsEvidenceBundle) -> list[str]: - values: list[str] = [] - for item in evidence_bundle.raw_rows: - values.extend(self._resolver.candidates(item)) - return self._dedupe(values) - - def _collect_distinct(self, evidence_bundle: DocsEvidenceBundle, key: str, *, fallback_key: str | None = None) -> list[str]: - values: list[str] = [] - for item in evidence_bundle.raw_rows: - metadata = dict(item.get("metadata") or {}) - candidate = metadata.get(key) if key == "doc_id" else item.get(key) - if not candidate and fallback_key: - candidate = item.get(fallback_key) - if candidate: - values.append(str(candidate)) - return self._dedupe(values) - - def _dedupe(self, values: list[str]) -> list[str]: - result: list[str] = [] - seen: set[str] = set() - for value in values: - normalized = value.strip() - if not normalized: - continue - if normalized in seen: - continue - seen.add(normalized) - result.append(normalized) - return result - - def _entity_hits(self, evidence_bundle: DocsEvidenceBundle) -> int: - values = self._collect_distinct(evidence_bundle, "entity") - return len(values) - - def _evidence_summary(self, evidence_bundle: DocsEvidenceBundle, openapi_result: OpenAPIResult | None) -> dict[str, object]: - return { - "documents": len(evidence_bundle.documents), - "facts": len(evidence_bundle.facts), - "entities": len(evidence_bundle.entities), - "workflows": len(evidence_bundle.workflows), - "relations": len(evidence_bundle.relations), - "chunks": len(evidence_bundle.chunks), - "selected_doc_ids": self._selected_doc_ids(evidence_bundle), - "selected_fact_ids": self._selected_ids(evidence_bundle.facts, ("fact_id", "doc_id", "document_id"), fallback="path"), - "selected_relation_ids": self._selected_ids( - evidence_bundle.relations, - ("relation_id", "target_doc_id", "target_document_id", "doc_id", "document_id"), - fallback="path", - ), - "selected_chunk_ids": self._selected_ids(evidence_bundle.chunks, ("chunk_id", "doc_id", "document_id"), fallback="path"), - "entity_hits": self._entity_hits(evidence_bundle), - "openapi_signals": self._openapi_evidence(openapi_result), - } - - def _openapi_evidence(self, openapi_result: OpenAPIResult | None) -> dict[str, bool]: - diagnostics = openapi_result.diagnostics if openapi_result else {} - return { - "path_found": bool(diagnostics.get("has_path")), - "method_found": bool(diagnostics.get("has_method")), - "operation_semantics_found": bool(diagnostics.get("operation_semantics_found")), - "request_payload_found": bool(diagnostics.get("request_payload_found")), - "request_schema": bool(diagnostics.get("has_request")), - "request_fields_found": bool(diagnostics.get("request_fields_found")), - "response_payload_found": bool(diagnostics.get("response_payload_found")), - "response_schema": bool(diagnostics.get("has_response")), - "response_fields_found": bool(diagnostics.get("response_fields_found")), - "status_codes": bool(diagnostics.get("status_codes_found")), - "content_type_found": bool(diagnostics.get("content_type_found")), - "examples_found": bool(diagnostics.get("examples_found")), - "payload_description": bool(diagnostics.get("payload_description_found")), - } diff --git a/src/app/modules/agent/runtime/docs_qa_pipeline/doc_identity.py b/src/app/modules/agent/runtime/docs_qa_pipeline/doc_identity.py deleted file mode 100644 index 1cd2e2e..0000000 --- a/src/app/modules/agent/runtime/docs_qa_pipeline/doc_identity.py +++ /dev/null @@ -1,47 +0,0 @@ -from __future__ import annotations - -import re - - -class DocsCanonicalDocIdResolver: - _DOC_PATH_RE = re.compile(r"docs/(?:documentation/)?(?P
api|domain|logic|architecture)/(?P[^/]+)\.md$", re.IGNORECASE) - _TITLE_ENDPOINT_RE = re.compile(r"/([a-z0-9_{}-]+)", re.IGNORECASE) - - def candidates(self, row: dict) -> list[str]: - metadata = dict(row.get("metadata") or {}) - values: list[str] = [] - for candidate in ( - metadata.get("document_id"), - metadata.get("doc_id"), - self.from_path(str(row.get("path") or "")), - self.from_title(str(row.get("title") or ""), str(row.get("path") or "")), - ): - value = str(candidate or "").strip() - if value and value not in values: - values.append(value) - return values - - def from_path(self, path: str) -> str | None: - match = self._DOC_PATH_RE.search((path or "").strip()) - if match is None: - return None - section = match.group("section").lower() - name = match.group("name").lower().replace("-", "_") - if section == "api" and not name.endswith("_endpoint"): - name = f"{name}_endpoint" - if section == "domain" and name.endswith("_entity"): - name = name[: -len("_entity")] - return f"{section}.{name}" - - def from_title(self, title: str, path: str) -> str | None: - normalized = (title or "").strip().lower() - if "/health" in normalized: - return "api.health_endpoint" - if "/send" in normalized: - return "api.send_message_endpoint" - match = self._TITLE_ENDPOINT_RE.search(normalized) - section = "api" if "/api/" in (path or "").lower() else "" - if match and section: - slug = match.group(1).replace("-", "_") - return f"{section}.{slug}_endpoint" - return None diff --git a/src/app/modules/agent/runtime/docs_qa_pipeline/evidence_builder.py b/src/app/modules/agent/runtime/docs_qa_pipeline/evidence_builder.py deleted file mode 100644 index 9eb1f6f..0000000 --- a/src/app/modules/agent/runtime/docs_qa_pipeline/evidence_builder.py +++ /dev/null @@ -1,91 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.runtime.docs_qa_pipeline.models import DocsEvidenceBundle - - -class DocsEvidenceBuilder: - _CAPS = { - "SYSTEM_FLOW_EXPLAIN": {"documents": 1, "facts": 1, "entities": 0, "workflows": 2, "relations": 2, "chunks": 2}, - "COMPONENT_EXPLAIN": {"documents": 1, "facts": 3, "entities": 0, "workflows": 0, "relations": 2, "chunks": 2}, - "API_METHOD_EXPLAIN": {"documents": 1, "facts": 3, "entities": 0, "workflows": 1, "relations": 0, "chunks": 2}, - "ENTITY_EXPLAIN": {"documents": 1, "facts": 1, "entities": 2, "workflows": 0, "relations": 2, "chunks": 1}, - "RELATED_DOCS_EXPLAIN": {"documents": 2, "facts": 0, "entities": 1, "workflows": 0, "relations": 4, "chunks": 1}, - "GENERIC_QA": {"documents": 2, "facts": 0, "entities": 0, "workflows": 0, "relations": 0, "chunks": 1}, - "OPENAPI_METHOD_GENERATE": {"documents": 1, "facts": 4, "entities": 0, "workflows": 0, "relations": 0, "chunks": 2}, - "OPENAPI_FRAGMENT_GENERATE": {"documents": 1, "facts": 4, "entities": 0, "workflows": 0, "relations": 0, "chunks": 2}, - } - _LAYER_TO_BUCKET = { - "D1_DOCUMENT_CATALOG": "documents", - "D2_FACT_INDEX": "facts", - "D3_ENTITY_CATALOG": "entities", - "D4_WORKFLOW_INDEX": "workflows", - "D5_RELATION_GRAPH": "relations", - "D0_DOC_CHUNKS": "chunks", - } - - def build(self, *, intent: str, sub_intent: str, raw_rows: list[dict]) -> DocsEvidenceBundle: - buckets = {name: [] for name in self._LAYER_TO_BUCKET.values()} - for row in raw_rows: - bucket = self._LAYER_TO_BUCKET.get(str(row.get("layer") or "")) - if bucket is not None: - buckets[bucket].append(self._normalize_row(row)) - support_paths = self._support_paths(sub_intent, buckets) - caps = self._CAPS.get(sub_intent, self._CAPS["GENERIC_QA"]) - return DocsEvidenceBundle( - intent=intent, - sub_intent=sub_intent, - documents=buckets["documents"][: caps["documents"]], - facts=buckets["facts"][: caps["facts"]], - entities=buckets["entities"][: caps["entities"]], - workflows=buckets["workflows"][: caps["workflows"]], - relations=buckets["relations"][: caps["relations"]], - chunks=self._select_chunks(buckets["chunks"], support_paths, caps["chunks"]), - raw_rows=list(raw_rows), - ) - - def _normalize_row(self, row: dict) -> dict: - return { - "layer": str(row.get("layer") or ""), - "path": str(row.get("path") or ""), - "title": str(row.get("title") or ""), - "content": str(row.get("content") or ""), - "metadata": dict(row.get("metadata") or {}), - } - - def _support_paths(self, sub_intent: str, buckets: dict[str, list[dict]]) -> list[str]: - ordered: list[dict] = [] - if sub_intent == "SYSTEM_FLOW_EXPLAIN": - ordered = [*buckets["workflows"], *buckets["relations"], *buckets["documents"]] - elif sub_intent == "COMPONENT_EXPLAIN": - ordered = [*buckets["facts"], *buckets["relations"], *buckets["documents"]] - elif sub_intent == "API_METHOD_EXPLAIN": - ordered = [*buckets["facts"], *buckets["workflows"], *buckets["documents"]] - elif sub_intent == "ENTITY_EXPLAIN": - ordered = [*buckets["entities"], *buckets["relations"], *buckets["documents"]] - elif sub_intent == "RELATED_DOCS_EXPLAIN": - ordered = [*buckets["relations"], *buckets["documents"], *buckets["entities"]] - elif sub_intent == "GENERIC_QA": - ordered = [*buckets["documents"], *buckets["chunks"]] - else: - ordered = [*buckets["facts"], *buckets["documents"]] - paths: list[str] = [] - for item in ordered: - path = str(item.get("path") or "").strip() - if path and path not in paths: - paths.append(path) - return paths[:4] - - def _select_chunks(self, chunks: list[dict], support_paths: list[str], limit: int) -> list[dict]: - if limit <= 0: - return [] - targeted = [item for item in chunks if str(item.get("path") or "") in support_paths] - selected = targeted[:limit] - if len(selected) >= limit: - return selected - for item in chunks: - if item in selected: - continue - selected.append(item) - if len(selected) >= limit: - break - return selected diff --git a/src/app/modules/agent/runtime/docs_qa_pipeline/exact_anchor_matcher.py b/src/app/modules/agent/runtime/docs_qa_pipeline/exact_anchor_matcher.py deleted file mode 100644 index 2a2ec82..0000000 --- a/src/app/modules/agent/runtime/docs_qa_pipeline/exact_anchor_matcher.py +++ /dev/null @@ -1,117 +0,0 @@ -from __future__ import annotations - -import re - - -class DocsExactAnchorMatcher: - _TOKEN_RE = re.compile(r"[a-z0-9_./{}-]+", re.IGNORECASE) - _STRICT_ANCHOR_TYPES = {"endpoint", "entity"} - - def filter_rows(self, rows: list[dict], *, anchor_type: str, anchor_value: str | None) -> tuple[list[dict], bool]: - if anchor_type == "none" or not anchor_value or anchor_type not in self._STRICT_ANCHOR_TYPES: - return list(rows), False - exact = [row for row in rows if self._matches(row, anchor_type=anchor_type, anchor_value=anchor_value)] - if exact: - return self._expand_support_rows(rows, exact), True - return [], False - - def resolved_entity_candidates(self, rows: list[dict]) -> list[str]: - values: list[str] = [] - for row in rows: - metadata = dict(row.get("metadata") or {}) - for key in ("entity", "component"): - candidate = metadata.get(key) - if candidate: - values.append(str(candidate)) - return self._dedupe(values) - - def resolved_anchor_candidates(self, rows: list[dict]) -> list[str]: - values: list[str] = [] - for row in rows: - metadata = dict(row.get("metadata") or {}) - for candidate in ( - metadata.get("endpoint"), - metadata.get("document_id"), - metadata.get("doc_id"), - metadata.get("entity"), - metadata.get("component"), - row.get("path"), - ): - if candidate: - values.append(str(candidate)) - return self._dedupe(values) - - def _matches(self, row: dict, *, anchor_type: str, anchor_value: str) -> bool: - haystacks = [ - str(row.get("path") or "").lower(), - str(row.get("title") or "").lower(), - str(row.get("content") or "").lower(), - str(dict(row.get("metadata") or {}).get("endpoint") or "").lower(), - str(dict(row.get("metadata") or {}).get("entity") or "").lower(), - str(dict(row.get("metadata") or {}).get("component") or "").lower(), - str(dict(row.get("metadata") or {}).get("document_id") or "").lower(), - str(dict(row.get("metadata") or {}).get("doc_id") or "").lower(), - ] - needle = anchor_value.lower().strip() - if anchor_type == "endpoint": - return any(needle == value or f" {needle}" in f" {value}" for value in haystacks if value) - return any(needle in value for value in haystacks if value) - - def _expand_support_rows(self, rows: list[dict], exact: list[dict]) -> list[dict]: - doc_ids = self._doc_ids(exact) - paths = {str(row.get("path") or "").strip() for row in exact if str(row.get("path") or "").strip()} - expanded = list(exact) - for row in rows: - metadata = dict(row.get("metadata") or {}) - row_doc_ids = { - str(metadata.get("document_id") or "").strip(), - str(metadata.get("doc_id") or "").strip(), - } - row_path = str(row.get("path") or "").strip() - if row_path and row_path in paths: - expanded.append(row) - continue - if any(candidate and candidate in doc_ids for candidate in row_doc_ids): - expanded.append(row) - return self._dedupe_rows(expanded) - - def _doc_ids(self, rows: list[dict]) -> set[str]: - values: set[str] = set() - for row in rows: - metadata = dict(row.get("metadata") or {}) - for candidate in (metadata.get("document_id"), metadata.get("doc_id")): - value = str(candidate or "").strip() - if value: - values.add(value) - return values - - def _dedupe_rows(self, rows: list[dict]) -> list[dict]: - result: list[dict] = [] - seen: set[tuple[str, str, str, int | None, int | None]] = set() - for row in rows: - key = ( - str(row.get("layer") or ""), - str(row.get("path") or ""), - str(row.get("title") or ""), - row.get("span_start"), - row.get("span_end"), - ) - if key in seen: - continue - seen.add(key) - result.append(row) - return result - - def _dedupe(self, values: list[str]) -> list[str]: - result: list[str] = [] - seen: set[str] = set() - for value in values: - normalized = value.strip() - if not normalized: - continue - key = normalized.lower() - if key in seen: - continue - seen.add(key) - result.append(normalized) - return result diff --git a/src/app/modules/agent/runtime/docs_qa_pipeline/models.py b/src/app/modules/agent/runtime/docs_qa_pipeline/models.py deleted file mode 100644 index 43bf800..0000000 --- a/src/app/modules/agent/runtime/docs_qa_pipeline/models.py +++ /dev/null @@ -1,114 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass, field -from typing import Any - -from pydantic import BaseModel, ConfigDict, Field - - -class OpenAPIResult(BaseModel): - model_config = ConfigDict(extra="forbid") - - path: str = "" - method: str = "" - request_schema: dict[str, Any] | None = None - response_schema: dict[str, Any] | None = None - raw_yaml: str = "" - diagnostics: dict[str, Any] = Field(default_factory=dict) - - -class DocsDiagnostics(BaseModel): - model_config = ConfigDict(extra="forbid") - - intent: str - sub_intent: str - layers_used: list[str] = Field(default_factory=list) - documents_found: int = 0 - facts_found: int = 0 - relations_found: int = 0 - openapi_fields_extracted: int = 0 - missing_required_fields: list[str] = Field(default_factory=list) - openapi_status: dict[str, bool] = Field(default_factory=dict) - prompt_used: str = "" - llm_mode: str = "prose" - output_valid: bool = True - matched_intent_source: str = "deterministic" - matched_anchor_type: str = "none" - matched_anchor_value: str | None = None - exact_anchor_match: bool = False - docs_layers_requested: list[str] = Field(default_factory=list) - docs_layers_with_hits: list[str] = Field(default_factory=list) - planned_layers: list[str] = Field(default_factory=list) - executed_layers: list[str] = Field(default_factory=list) - non_empty_layers: list[str] = Field(default_factory=list) - layer_diagnostics: dict[str, Any] = Field(default_factory=dict) - query_entity_candidates: list[str] = Field(default_factory=list) - resolved_entity_candidates: list[str] = Field(default_factory=list) - query_anchor_candidates: list[str] = Field(default_factory=list) - resolved_anchor_candidates: list[str] = Field(default_factory=list) - anchor_candidates: list[str] = Field(default_factory=list) - selected_anchor: str | None = None - anchor_selection_reason: str = "" - anchor_match_type: str = "" - doc_ids: list[str] = Field(default_factory=list) - doc_paths: list[str] = Field(default_factory=list) - doc_titles: list[str] = Field(default_factory=list) - relation_hits_count: int = 0 - relation_targets: list[str] = Field(default_factory=list) - selected_doc_ids: list[str] = Field(default_factory=list) - selected_fact_ids: list[str] = Field(default_factory=list) - selected_relation_ids: list[str] = Field(default_factory=list) - selected_chunk_ids: list[str] = Field(default_factory=list) - selected_entity_ids: list[str] = Field(default_factory=list) - selected_workflow_ids: list[str] = Field(default_factory=list) - fallback_doc_hits_count: int = 0 - fallback_used: bool = False - fact_hits: int = 0 - entity_hits: int = 0 - evidence_summary: dict[str, Any] = Field(default_factory=dict) - gate_decision: str = "ready" - gate_decision_reason: str = "" - gate_missing_requirements: list[str] = Field(default_factory=list) - gate_satisfied_requirements: list[str] = Field(default_factory=list) - openapi_evidence: dict[str, bool] = Field(default_factory=dict) - requested_fragment_type: str | None = None - fragment_evidence_found: list[str] = Field(default_factory=list) - fragment_missing_requirements: list[str] = Field(default_factory=list) - prompt: dict[str, Any] = Field(default_factory=dict) - answer_mode: str = "answered" - degrade_reason: str | None = None - degraded_reason: str | None = None - code_intents_stubbed: bool = False - - -@dataclass(slots=True) -class DocsEvidenceBundle: - intent: str - sub_intent: str - documents: list[dict[str, Any]] = field(default_factory=list) - facts: list[dict[str, Any]] = field(default_factory=list) - entities: list[dict[str, Any]] = field(default_factory=list) - workflows: list[dict[str, Any]] = field(default_factory=list) - relations: list[dict[str, Any]] = field(default_factory=list) - chunks: list[dict[str, Any]] = field(default_factory=list) - raw_rows: list[dict[str, Any]] = field(default_factory=list) - - -@dataclass(slots=True) -class DocsQAPipelineResult: - user_query: str - rag_session_id: str - router_result: Any - retrieval_request: Any - evidence_bundle: DocsEvidenceBundle - answer: str - diagnostics: DocsDiagnostics - openapi_result: OpenAPIResult | None = None - prompt_name: str = "" - llm_request: dict[str, Any] = field(default_factory=dict) - output_valid: bool = True - answer_mode: str = "answered" - degraded_reason: str = "" - raw_rows: list[dict[str, Any]] = field(default_factory=list) - timings_ms: dict[str, int] = field(default_factory=dict) - mode: str = "full" diff --git a/src/app/modules/agent/runtime/docs_qa_pipeline/openapi_evidence_extractor.py b/src/app/modules/agent/runtime/docs_qa_pipeline/openapi_evidence_extractor.py deleted file mode 100644 index 62f3358..0000000 --- a/src/app/modules/agent/runtime/docs_qa_pipeline/openapi_evidence_extractor.py +++ /dev/null @@ -1,187 +0,0 @@ -from __future__ import annotations - -import re -from typing import Any - -from app.modules.agent.runtime.docs_qa_pipeline.models import DocsEvidenceBundle - - -class OpenAPIEvidenceExtractor: - _PATH_RE = re.compile(r"(/[a-z0-9_./{}-]+)", re.IGNORECASE) - _METHOD_RE = re.compile(r"\b(get|post|put|patch|delete)\b", re.IGNORECASE) - _FIELD_RE = re.compile(r"\b([a-z_][a-z0-9_]{1,40})\b") - _STATUS_RE = re.compile(r"\b(200|201|202|204|400|401|403|404|409|422|500|503)\b") - _FIELD_STOPWORDS = { - "request", - "response", - "schema", - "payload", - "fields", - "contains", - "type", - "properties", - "post", - "get", - "put", - "patch", - "delete", - "endpoint", - "returns", - "return", - "with", - "and", - "for", - "send", - "health", - "status", - "result", - "body", - } - - def extract(self, bundle: DocsEvidenceBundle, *, requested_fragment_type: str | None) -> dict[str, Any]: - items = [*bundle.facts, *bundle.documents, *bundle.chunks] - path = self._extract_path(items) - method = self._extract_method(items) - request_schema = self._extract_schema(items, "request") - response_schema = self._extract_schema(items, "response") - if request_schema is None and requested_fragment_type == "request_schema": - request_schema = self._schema_from_text(items, kind="request") - if response_schema is None and requested_fragment_type == "response_schema": - response_schema = self._schema_from_text(items, kind="response") - if request_schema is None and response_schema is None and requested_fragment_type == "schema_fragment": - request_schema = self._schema_from_text(items, kind="schema") - status_codes = self._status_codes(items) - content_type = self._content_type(items) - operation_summary = self._operation_summary(items) - examples_found = self._examples_found(items) - diagnostics = { - "has_path": bool(path), - "has_method": bool(method), - "has_request": request_schema is not None, - "has_response": response_schema is not None, - "operation_semantics_found": bool(operation_summary), - "request_payload_found": request_schema is not None or self._has_payload_text(items, "request"), - "request_fields_found": self._field_count(request_schema) > 0, - "response_payload_found": response_schema is not None or self._has_payload_text(items, "response"), - "response_fields_found": self._field_count(response_schema) > 0, - "status_codes_found": bool(status_codes), - "content_type_found": bool(content_type), - "examples_found": examples_found, - "payload_description_found": self._has_payload_description(items), - "status_codes": status_codes, - "content_type": content_type, - "operation_summary": operation_summary, - } - return { - "path": path, - "method": method, - "request_schema": request_schema, - "response_schema": response_schema, - "diagnostics": diagnostics, - } - - def _extract_path(self, items: list[dict[str, Any]]) -> str: - for item in items: - metadata = dict(item.get("metadata") or {}) - if metadata.get("endpoint"): - return str(metadata["endpoint"]) - for source in (item.get("title"), item.get("content")): - match = self._PATH_RE.search(str(source or "")) - if match: - return match.group(1) - return "" - - def _extract_method(self, items: list[dict[str, Any]]) -> str: - for item in items: - metadata = dict(item.get("metadata") or {}) - if metadata.get("http_method"): - return str(metadata["http_method"]).lower() - for source in (item.get("title"), item.get("content")): - match = self._METHOD_RE.search(str(source or "")) - if match: - return match.group(1).lower() - return "" - - def _extract_schema(self, items: list[dict[str, Any]], kind: str) -> dict[str, Any] | None: - for item in items: - metadata = dict(item.get("metadata") or {}) - candidate = metadata.get(f"{kind}_schema") or metadata.get(f"{kind}_fields") - schema = self._as_schema(candidate) - if schema is not None: - return schema - return None - - def _schema_from_text(self, items: list[dict[str, Any]], *, kind: str) -> dict[str, Any] | None: - markers = { - "request": ("request", "payload", "body", "fields", "message", "chat_id"), - "response": ("response", "returns", "result", "status", "body"), - "schema": ("schema", "payload", "fields", "properties"), - } - fields: list[str] = [] - for item in items: - text = " ".join((str(item.get("title") or ""), str(item.get("content") or ""))).lower() - if not any(marker in text for marker in markers[kind]): - continue - for token in self._FIELD_RE.findall(text): - if token in self._FIELD_STOPWORDS: - continue - if token not in fields: - fields.append(token) - if not fields: - return None - properties = {name: {"type": "string"} for name in fields[:8]} - required = [name for name in fields[:3] if len(name) > 1] - result: dict[str, Any] = {"type": "object", "properties": properties} - if required: - result["required"] = required - return result - - def _as_schema(self, value: Any) -> dict[str, Any] | None: - if isinstance(value, dict): - return value - if isinstance(value, list): - properties = {str(item): {"type": "string"} for item in value if str(item).strip()} - return {"type": "object", "properties": properties} if properties else None - return None - - def _status_codes(self, items: list[dict[str, Any]]) -> list[str]: - values: list[str] = [] - for item in items: - text = " ".join((str(item.get("title") or ""), str(item.get("content") or ""))) - for code in self._STATUS_RE.findall(text): - if code not in values: - values.append(code) - return values - - def _content_type(self, items: list[dict[str, Any]]) -> str: - for item in items: - text = " ".join((str(item.get("title") or ""), str(item.get("content") or ""))).lower() - for marker in ("application/json", "json", "multipart/form-data", "x-www-form-urlencoded"): - if marker in text: - return marker - return "" - - def _operation_summary(self, items: list[dict[str, Any]]) -> str: - for item in items: - for source in (item.get("title"), item.get("content")): - text = str(source or "").strip() - if len(text) >= 8: - return text[:120] - return "" - - def _examples_found(self, items: list[dict[str, Any]]) -> bool: - for item in items: - text = " ".join((str(item.get("title") or ""), str(item.get("content") or ""))).lower() - if any(marker in text for marker in ("example", "пример", "{", "}")): - return True - return False - - def _has_payload_text(self, items: list[dict[str, Any]], kind: str) -> bool: - markers = ("payload", "body", "fields", "request") if kind == "request" else ("response", "returns", "status", "body") - return any(any(marker in str(item.get("content") or "").lower() for marker in markers) for item in items) - - def _has_payload_description(self, items: list[dict[str, Any]]) -> bool: - return any(len(str(item.get("content") or "").strip()) >= 12 for item in items) - - def _field_count(self, schema: dict[str, Any] | None) -> int: - return len((schema or {}).get("properties") or {}) diff --git a/src/app/modules/agent/runtime/docs_qa_pipeline/openapi_generator.py b/src/app/modules/agent/runtime/docs_qa_pipeline/openapi_generator.py deleted file mode 100644 index 211866f..0000000 --- a/src/app/modules/agent/runtime/docs_qa_pipeline/openapi_generator.py +++ /dev/null @@ -1,161 +0,0 @@ -from __future__ import annotations - -from typing import Any - -from app.modules.agent.runtime.docs_qa_pipeline.models import DocsEvidenceBundle, OpenAPIResult -from app.modules.agent.runtime.docs_qa_pipeline.openapi_evidence_extractor import OpenAPIEvidenceExtractor - - -class OpenAPIGenerator: - def __init__(self, extractor: OpenAPIEvidenceExtractor | None = None) -> None: - self._extractor = extractor or OpenAPIEvidenceExtractor() - - def generate( - self, - evidence_bundle: DocsEvidenceBundle, - mode: str, - *, - requested_fragment_type: str | None = None, - ) -> OpenAPIResult: - extracted = self._extractor.extract(evidence_bundle, requested_fragment_type=requested_fragment_type) - path = str(extracted["path"] or "") - method = str(extracted["method"] or "") - request_schema = extracted["request_schema"] - response_schema = extracted["response_schema"] - diagnostics = dict(extracted["diagnostics"] or {}) - diagnostics["missing_required_fields"] = self._missing_fields( - path=path, - method=method, - request_schema=request_schema, - response_schema=response_schema, - mode=mode, - requested_fragment_type=requested_fragment_type, - diagnostics=diagnostics, - ) - raw_yaml = self._render( - path=path, - method=method, - request_schema=request_schema, - response_schema=response_schema, - mode=mode, - requested_fragment_type=requested_fragment_type, - diagnostics=diagnostics, - ) - return OpenAPIResult( - path=path, - method=method, - request_schema=request_schema, - response_schema=response_schema, - raw_yaml=raw_yaml, - diagnostics=diagnostics, - ) - - def _missing_fields( - self, - *, - path: str, - method: str, - request_schema: dict[str, Any] | None, - response_schema: dict[str, Any] | None, - mode: str, - requested_fragment_type: str | None, - diagnostics: dict[str, Any], - ) -> list[str]: - missing: list[str] = [] - if not path: - missing.append("path") - if mode == "OPENAPI_FRAGMENT_GENERATE": - if requested_fragment_type == "request_schema" and request_schema is None and not diagnostics.get("request_payload_found"): - missing.append("request_schema") - elif requested_fragment_type == "response_schema" and response_schema is None and not diagnostics.get("response_payload_found"): - missing.append("response_schema") - elif requested_fragment_type == "parameters" and not diagnostics.get("has_method"): - missing.append("parameters") - elif request_schema is None and response_schema is None and not diagnostics.get("payload_description_found"): - missing.append("schema_fragment") - return missing - if not method: - missing.append("method") - if request_schema is None and not diagnostics.get("request_payload_found"): - missing.append("request_schema") - if response_schema is None and not diagnostics.get("response_payload_found") and not diagnostics.get("status_codes_found"): - missing.append("response_schema") - return missing - - def _render( - self, - *, - path: str, - method: str, - request_schema: dict[str, Any] | None, - response_schema: dict[str, Any] | None, - mode: str, - requested_fragment_type: str | None, - diagnostics: dict[str, Any], - ) -> str: - if mode == "OPENAPI_FRAGMENT_GENERATE": - if requested_fragment_type == "response_schema": - return self._render_schema(response_schema, diagnostics, "Documented response fragment") - return self._render_schema(request_schema or response_schema, diagnostics, "Documented schema fragment") - if not path: - return "" - method_line = method or "get" - summary = str(diagnostics.get("operation_summary") or "Documented API method") - response_block = self._render_responses(response_schema, diagnostics) - request_block = self._render_request_body(request_schema, diagnostics) - return "\n".join( - [ - "paths:", - f" {path}:", - f" {method_line}:", - f" summary: \"{summary}\"", - *request_block, - " responses:", - *response_block, - ] - ) - - def _render_schema(self, schema: dict[str, Any] | None, diagnostics: dict[str, Any], fallback_description: str) -> str: - if schema is None: - return "\n".join(["type: object", f"description: \"{fallback_description}\""]) - return self._yaml_from_object(schema, indent=0) - - def _render_request_body(self, schema: dict[str, Any] | None, diagnostics: dict[str, Any]) -> list[str]: - lines = [" requestBody:"] - if schema is None: - description = "Documented request payload" if diagnostics.get("request_payload_found") else "Request payload not fully documented" - lines.append(f" description: \"{description}\"") - return lines - lines.append(" content:") - content_type = str(diagnostics.get("content_type") or "application/json") - lines.append(f" {content_type}:") - lines.append(" schema:") - lines.extend(self._yaml_from_object(schema, indent=14).splitlines()) - return lines - - def _render_responses(self, schema: dict[str, Any] | None, diagnostics: dict[str, Any]) -> list[str]: - status_codes = list(diagnostics.get("status_codes") or []) or ["200"] - code = status_codes[0] - lines = [f" \"{code}\":", " description: \"Documented response\""] - if schema is not None: - lines.append(" content:") - content_type = str(diagnostics.get("content_type") or "application/json") - lines.append(f" {content_type}:") - lines.append(" schema:") - lines.extend(self._yaml_from_object(schema, indent=16).splitlines()) - return lines - - def _yaml_from_object(self, value: dict[str, Any], *, indent: int) -> str: - lines: list[str] = [] - prefix = " " * indent - for key, item in value.items(): - if isinstance(item, dict): - lines.append(f"{prefix}{key}:") - lines.append(self._yaml_from_object(item, indent=indent + 2)) - elif isinstance(item, list): - lines.append(f"{prefix}{key}:") - for row in item: - lines.append(f"{prefix} - {row}") - else: - lines.append(f"{prefix}{key}: {item}") - return "\n".join(lines) diff --git a/src/app/modules/agent/runtime/docs_qa_pipeline/openapi_postprocessor.py b/src/app/modules/agent/runtime/docs_qa_pipeline/openapi_postprocessor.py deleted file mode 100644 index df94e31..0000000 --- a/src/app/modules/agent/runtime/docs_qa_pipeline/openapi_postprocessor.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import annotations - -import yaml - - -class OpenAPIPostprocessor: - _ALLOWED_METHODS = {"get", "post", "put", "delete", "patch"} - - def validate(self, answer: str, *, require_paths: bool) -> tuple[bool, dict]: - try: - payload = yaml.safe_load(answer) or {} - except yaml.YAMLError: - return False, {"reason": "invalid_yaml"} - if not isinstance(payload, dict): - return False, {"reason": "invalid_yaml_root"} - if require_paths: - paths = payload.get("paths") - if not isinstance(paths, dict) or not paths: - return False, {"reason": "missing_paths"} - methods = self._methods(paths) - if not methods: - return False, {"reason": "missing_method"} - return True, {"reason": "ok", "methods": methods} - if not isinstance(payload, dict) or not payload: - return False, {"reason": "empty_schema"} - return True, {"reason": "ok"} - - def _methods(self, paths: dict) -> list[str]: - methods: list[str] = [] - for item in paths.values(): - if not isinstance(item, dict): - continue - for method in item.keys(): - method_name = str(method).lower() - if method_name in self._ALLOWED_METHODS and method_name not in methods: - methods.append(method_name) - return methods diff --git a/src/app/modules/agent/runtime/docs_qa_pipeline/pipeline.py b/src/app/modules/agent/runtime/docs_qa_pipeline/pipeline.py deleted file mode 100644 index 7755a3f..0000000 --- a/src/app/modules/agent/runtime/docs_qa_pipeline/pipeline.py +++ /dev/null @@ -1,702 +0,0 @@ -from __future__ import annotations - -from time import perf_counter -from typing import Any - -from app.modules.agent.llm import AgentLlmService -from app.modules.agent.intent_router_v2.analysis.docs_query_signals import DocsQuerySignals -from app.modules.agent.runtime.docs_qa_pipeline.answer_synthesizer import DocsAnswerSynthesizer -from app.modules.agent.runtime.docs_qa_pipeline.anchor_selector import DocsAnchorSelector -from app.modules.agent.runtime.docs_qa_pipeline.diagnostics_builder import DocsDiagnosticsBuilder -from app.modules.agent.runtime.docs_qa_pipeline.evidence_builder import DocsEvidenceBuilder -from app.modules.agent.runtime.docs_qa_pipeline.exact_anchor_matcher import DocsExactAnchorMatcher -from app.modules.agent.runtime.docs_qa_pipeline.models import DocsQAPipelineResult -from app.modules.agent.runtime.docs_qa_pipeline.openapi_postprocessor import OpenAPIPostprocessor -from app.modules.agent.runtime.docs_qa_pipeline.openapi_generator import OpenAPIGenerator -from app.modules.agent.runtime.docs_qa_pipeline.prompt_payload_builder import DocsPromptPayloadBuilder -from app.modules.agent.runtime.legacy_pipeline import RetrievalAdapter -from app.modules.agent.runtime.steps.context import build_retrieval_request -from app.modules.agent.runtime.steps.generation import RuntimePromptSelector -from app.modules.agent.observability.module_trace import RequestTraceContext - - -class DocsQAPipelineRunner: - def __init__( - self, - router: Any, - retrieval_adapter: RetrievalAdapter, - repo_context: Any = None, - llm: AgentLlmService | None = None, - evidence_builder: DocsEvidenceBuilder | None = None, - answer_synthesizer: DocsAnswerSynthesizer | None = None, - openapi_generator: OpenAPIGenerator | None = None, - diagnostics_builder: DocsDiagnosticsBuilder | None = None, - prompt_selector: RuntimePromptSelector | None = None, - prompt_payload_builder: DocsPromptPayloadBuilder | None = None, - openapi_postprocessor: OpenAPIPostprocessor | None = None, - exact_anchor_matcher: DocsExactAnchorMatcher | None = None, - anchor_selector: DocsAnchorSelector | None = None, - ) -> None: - self._router = router - self._adapter = retrieval_adapter - self._repo_context = repo_context - self._llm = llm - self._evidence_builder = evidence_builder or DocsEvidenceBuilder() - self._answer_synthesizer = answer_synthesizer or DocsAnswerSynthesizer() - self._openapi_generator = openapi_generator or OpenAPIGenerator() - self._diagnostics_builder = diagnostics_builder or DocsDiagnosticsBuilder() - self._prompt_selector = prompt_selector or RuntimePromptSelector() - self._prompt_payload_builder = prompt_payload_builder or DocsPromptPayloadBuilder() - self._openapi_postprocessor = openapi_postprocessor or OpenAPIPostprocessor() - self._exact_anchor_matcher = exact_anchor_matcher or DocsExactAnchorMatcher() - self._anchor_selector = anchor_selector or DocsAnchorSelector() - self._docs_signals = DocsQuerySignals() - - def run( - self, - user_query: str, - rag_session_id: str, - *, - conversation_state: Any = None, - mode: str = "full", - trace: RequestTraceContext | None = None, - ) -> DocsQAPipelineResult: - timings: dict[str, int] = {} - t0 = perf_counter() - router_result = self._router.route( - user_query, - conversation_state or _default_conversation_state(), - self._repo_context or _default_repo_context(), - ) - timings["router"] = _ms(t0) - - t1 = perf_counter() - request = build_retrieval_request(router_result, rag_session_id) - raw_rows = self._adapter.retrieve_with_plan( - rag_session_id, - request.query, - request.retrieval_spec, - request.retrieval_constraints, - query_plan=request.query_plan, - ) - retrieval_report = self._adapter.consume_retrieval_report() if hasattr(self._adapter, "consume_retrieval_report") else {} - unfiltered_rows = list(raw_rows) - raw_rows, exact_anchor_match = self._exact_anchor_matcher.filter_rows( - raw_rows, - anchor_type=router_result.matched_anchor_type, - anchor_value=router_result.matched_anchor_value, - ) - if request.sub_intent == "RELATED_DOCS_EXPLAIN" and not raw_rows and self._has_relation_hits(unfiltered_rows): - raw_rows = unfiltered_rows - if trace is not None: - trace.module("rag_retrieval").log( - "completed", - { - "planned_layers": list(request.requested_layers), - "executed_layers": list(retrieval_report.get("executed_layers") or request.requested_layers), - "layer_diagnostics": dict(retrieval_report.get("layer_diagnostics") or {}), - "rows": len(raw_rows), - }, - ) - timings["retrieval"] = _ms(t1) - - t2 = perf_counter() - evidence_bundle = self._evidence_builder.build( - intent=router_result.intent, - sub_intent=request.sub_intent, - raw_rows=raw_rows, - ) - anchor_selection = self._anchor_selector.select( - sub_intent=request.sub_intent, - anchor_type=router_result.matched_anchor_type, - anchor_value=router_result.matched_anchor_value, - rows=raw_rows, - ) - openapi_result = None - prompt_name = self._prompt_selector.select( - intent=router_result.intent, - sub_intent=request.sub_intent, - answer_mode="normal", - ) - llm_mode = self._llm_mode(router_result.intent, request.sub_intent) - output_valid = True - answer_mode = "diagnostic_only" if mode == "pre_llm_only" else "answered" - degraded_reason = "" - answer = "" - llm_request: dict[str, Any] = {} - requested_fragment_type = self._requested_fragment_type(user_query, request.sub_intent) - if router_result.intent in {"OPENAPI_GENERATION", "OPENAPI_FROM_DOCUMENTATION"}: - openapi_result = self._openapi_generator.generate( - evidence_bundle, - request.sub_intent, - requested_fragment_type=requested_fragment_type, - ) - llm_request = self._build_llm_request( - question=user_query, - intent=router_result.intent, - sub_intent=request.sub_intent, - evidence_bundle=evidence_bundle, - prompt_name=prompt_name, - log_context="graph.project_qa.docs.openapi", - api_contract=openapi_result, - ) - if mode == "pre_llm_only": - answer_mode, degraded_reason, output_valid = self._evaluate_openapi_gate( - user_query=user_query, - sub_intent=request.sub_intent, - router_result=router_result, - openapi_result=openapi_result, - exact_anchor_match=exact_anchor_match, - ) - answer = openapi_result.raw_yaml if answer_mode != "degraded" else "Недостаточно contract evidence для OpenAPI." - else: - answer = self._generate_openapi_answer( - user_query, - router_result.intent, - request.sub_intent, - evidence_bundle, - openapi_result, - trace=trace, - ) - output_valid, llm_details = self._openapi_postprocessor.validate( - answer, - require_paths=request.sub_intent != "OPENAPI_FRAGMENT_GENERATE", - ) - if not output_valid: - answer = openapi_result.raw_yaml - openapi_result = openapi_result.model_copy( - update={"diagnostics": {**openapi_result.diagnostics, "llm_validation": llm_details}} - ) - answer_mode, degraded_reason, output_valid, answer = self._finalize_openapi_answer( - answer=answer, - router_result=router_result, - openapi_result=openapi_result, - output_valid=output_valid, - exact_anchor_match=exact_anchor_match, - ) - else: - llm_request = self._build_llm_request( - question=user_query, - intent=router_result.intent, - sub_intent=request.sub_intent, - evidence_bundle=evidence_bundle, - prompt_name=prompt_name, - log_context="graph.project_qa.docs.answer", - ) - if mode == "pre_llm_only": - answer_mode, degraded_reason = self._evaluate_docs_gate( - raw_rows=raw_rows, - sub_intent=request.sub_intent, - matched_anchor_type=router_result.matched_anchor_type, - exact_anchor_match=exact_anchor_match, - matched_anchor_value=router_result.matched_anchor_value, - ) - output_valid = answer_mode != "degraded" - else: - answer = self._generate_docs_answer( - user_query, - router_result.intent, - request.sub_intent, - evidence_bundle, - trace=trace, - ) - answer_mode, degraded_reason, answer = self._finalize_docs_answer( - answer=answer, - raw_rows=raw_rows, - sub_intent=request.sub_intent, - matched_anchor_type=router_result.matched_anchor_type, - exact_anchor_match=exact_anchor_match, - matched_anchor_value=router_result.matched_anchor_value, - ) - gate_decision, gate_decision_reason, gate_missing_requirements, gate_satisfied_requirements = self._build_gate_details( - intent=router_result.intent, - sub_intent=request.sub_intent, - answer_mode=answer_mode, - degraded_reason=degraded_reason, - raw_rows=raw_rows, - exact_anchor_match=exact_anchor_match, - matched_anchor_type=router_result.matched_anchor_type, - matched_anchor_value=router_result.matched_anchor_value, - openapi_result=openapi_result, - router_result=router_result, - ) - if trace is not None: - trace.module("evidence_gate").log( - "evaluated", - { - "decision": gate_decision, - "reason": gate_decision_reason, - "missing": gate_missing_requirements, - "satisfied": gate_satisfied_requirements, - }, - ) - diagnostics = self._diagnostics_builder.build( - intent=router_result.intent, - sub_intent=request.sub_intent, - planned_layers=list(request.requested_layers), - executed_layers=list(retrieval_report.get("executed_layers") or request.requested_layers), - non_empty_layers=self._non_empty_layers(raw_rows, retrieval_report, request.sub_intent), - layer_diagnostics=dict(retrieval_report.get("layer_diagnostics") or {}), - evidence_bundle=evidence_bundle, - openapi_result=openapi_result, - prompt_used=prompt_name, - llm_mode=llm_mode, - answer_mode=answer_mode, - output_valid=output_valid, - matched_intent_source=router_result.matched_intent_source, - matched_anchor_type=router_result.matched_anchor_type, - matched_anchor_value=router_result.matched_anchor_value, - exact_anchor_match=exact_anchor_match, - query_entity_candidates=self._docs_signals.query_entity_candidates(user_query), - resolved_entity_candidates=self._exact_anchor_matcher.resolved_entity_candidates(raw_rows), - query_anchor_candidates=self._docs_signals.query_anchor_candidates(user_query), - resolved_anchor_candidates=self._exact_anchor_matcher.resolved_anchor_candidates(raw_rows), - anchor_candidates=list(anchor_selection.get("anchor_candidates") or []), - selected_anchor=anchor_selection.get("selected_anchor"), - anchor_selection_reason=str(anchor_selection.get("anchor_selection_reason") or ""), - anchor_match_type=str(anchor_selection.get("anchor_match_type") or ""), - docs_layers_with_hits=self._non_empty_layers(raw_rows, retrieval_report, request.sub_intent), - gate_decision=gate_decision, - gate_decision_reason=gate_decision_reason, - gate_missing_requirements=gate_missing_requirements, - gate_satisfied_requirements=gate_satisfied_requirements, - requested_fragment_type=("method" if request.sub_intent == "OPENAPI_METHOD_GENERATE" else requested_fragment_type), - fragment_evidence_found=self._fragment_evidence_found(requested_fragment_type, openapi_result), - fragment_missing_requirements=self._fragment_missing_requirements(requested_fragment_type, openapi_result), - prompt=llm_request, - degraded_reason=degraded_reason or None, - fallback_used=bool(dict(retrieval_report.get("fallback") or {}).get("used")), - code_intents_stubbed=False, - ) - timings["execution"] = _ms(t2) - return DocsQAPipelineResult( - user_query=user_query, - rag_session_id=rag_session_id, - router_result=router_result, - retrieval_request=request, - evidence_bundle=evidence_bundle, - answer=answer, - diagnostics=diagnostics, - openapi_result=openapi_result, - prompt_name=prompt_name, - llm_request=llm_request, - output_valid=output_valid, - answer_mode=answer_mode, - degraded_reason=degraded_reason, - raw_rows=raw_rows, - timings_ms=timings, - mode=mode, - ) - - def _generate_docs_answer(self, question: str, intent: str, sub_intent: str, evidence_bundle, trace=None) -> str: - if self._llm is None: - return self._answer_synthesizer.synthesize(question, evidence_bundle) - payload = self._prompt_payload_builder.build( - question=question, - intent=intent, - sub_intent=sub_intent, - evidence_bundle=evidence_bundle, - ) - prompt_name = self._prompt_selector.select(intent=intent, sub_intent=sub_intent, answer_mode="normal") - return self._llm.generate( - prompt_name, - payload, - log_context="graph.project_qa.docs.answer", - trace=trace.module("llm") if trace is not None else None, - ).strip() - - def _generate_openapi_answer(self, question: str, intent: str, sub_intent: str, evidence_bundle, api_contract, trace=None) -> str: - if self._llm is None: - return api_contract.raw_yaml - payload = self._prompt_payload_builder.build( - question=question, - intent=intent, - sub_intent=sub_intent, - evidence_bundle=evidence_bundle, - api_contract=api_contract, - ) - prompt_name = self._prompt_selector.select(intent=intent, sub_intent=sub_intent, answer_mode="normal") - return self._llm.generate( - prompt_name, - payload, - log_context="graph.project_qa.docs.openapi", - trace=trace.module("llm") if trace is not None else None, - ).strip() - - def _llm_mode(self, intent: str, sub_intent: str) -> str: - if sub_intent == "RELATED_DOCS_EXPLAIN": - return "graph_summary" - if intent == "GENERAL_QA": - return "prose" - if intent in {"OPENAPI_GENERATION", "OPENAPI_FROM_DOCUMENTATION"}: - return "yaml" - return "prose" - - def _build_llm_request( - self, - *, - question: str, - intent: str, - sub_intent: str, - evidence_bundle, - prompt_name: str, - log_context: str, - api_contract=None, - ) -> dict[str, Any]: - user_prompt = self._prompt_payload_builder.build( - question=question, - intent=intent, - sub_intent=sub_intent, - evidence_bundle=evidence_bundle, - api_contract=api_contract, - ) - if self._llm is None: - return { - "prompt_name": prompt_name, - "system_prompt": "You are a helpful assistant.", - "user_prompt": user_prompt, - "log_context": log_context, - } - return self._llm.build_request(prompt_name, user_prompt, log_context=log_context) - - def _finalize_docs_answer( - self, - *, - answer: str, - raw_rows: list[dict], - sub_intent: str, - matched_anchor_type: str, - exact_anchor_match: bool, - matched_anchor_value: str | None, - ) -> tuple[str, str, str]: - if self._should_reject_on_exact_anchor( - sub_intent=sub_intent, - raw_rows=raw_rows, - matched_anchor_type=matched_anchor_type, - matched_anchor_value=matched_anchor_value, - exact_anchor_match=exact_anchor_match, - ): - return "degraded", "not_found_exact_anchor", "Не найдено точное совпадение по запрошенному docs anchor." - if not raw_rows: - return "degraded", "retrieval_empty", "По документации не найдено релевантных данных." - if not answer.strip(): - return "degraded", "insufficient_docs_evidence", "Недостаточно подтвержденных данных в документации." - return "answered", "", answer - - def _finalize_openapi_answer( - self, - *, - answer: str, - router_result, - openapi_result, - output_valid: bool, - exact_anchor_match: bool, - ) -> tuple[str, str, bool, str]: - requested_endpoint = str(router_result.matched_anchor_value or "").strip() - generated_endpoint = str(openapi_result.path or "").strip() - diagnostics = dict(openapi_result.diagnostics or {}) - if requested_endpoint and not exact_anchor_match: - return "degraded", "not_found_exact_anchor", False, "Не найден точный endpoint в документации." - if requested_endpoint and generated_endpoint and requested_endpoint != generated_endpoint: - return "degraded", "generated_endpoint_mismatch", False, "OpenAPI сгенерирован не по запрошенному endpoint." - if str(getattr(router_result.retrieval_spec.filters, "doc_type", "") or "") != "api_method": - return "degraded", "wrong_doc_type_match", False, "Для OpenAPI не найден подходящий api_method evidence." - if not generated_endpoint: - return "degraded", "insufficient_docs_evidence", False, "Недостаточно contract evidence для OpenAPI." - has_partial_contract = any( - ( - openapi_result.request_schema is not None, - openapi_result.response_schema is not None, - diagnostics.get("status_codes_found"), - diagnostics.get("payload_description_found"), - ) - ) - if not has_partial_contract: - return "degraded", "insufficient_docs_evidence", False, "Недостаточно contract evidence для OpenAPI." - if not output_valid: - return "structured_spec_partial", "invalid_llm_output_fallback", False, answer - if openapi_result.method and openapi_result.response_schema is not None and openapi_result.request_schema is not None: - return "structured_spec", "", True, answer - if openapi_result.method or diagnostics.get("status_codes_found") or diagnostics.get("payload_description_found"): - return "structured_spec_partial", "answered_with_gaps", True, answer - return "degraded", "insufficient_docs_evidence", False, "Недостаточно contract evidence для OpenAPI." - - def _evaluate_docs_gate( - self, - *, - raw_rows: list[dict], - sub_intent: str, - matched_anchor_type: str, - exact_anchor_match: bool, - matched_anchor_value: str | None, - ) -> tuple[str, str]: - if self._should_reject_on_exact_anchor( - sub_intent=sub_intent, - raw_rows=raw_rows, - matched_anchor_type=matched_anchor_type, - matched_anchor_value=matched_anchor_value, - exact_anchor_match=exact_anchor_match, - ): - return "degraded", "not_found_exact_anchor" - if not raw_rows: - return "degraded", "retrieval_empty" - return "ready", "" - - def _evaluate_openapi_gate( - self, - *, - user_query: str, - sub_intent: str, - router_result, - openapi_result, - exact_anchor_match: bool, - ) -> tuple[str, str, bool]: - requested_endpoint = str(router_result.matched_anchor_value or "").strip() - generated_endpoint = str(openapi_result.path or "").strip() - diagnostics = dict(openapi_result.diagnostics or {}) - requested_fragment_type = self._requested_fragment_type(user_query, sub_intent) - has_operation_signal = bool(openapi_result.method) or bool(diagnostics.get("status_codes_found")) or bool(diagnostics.get("payload_description_found")) - has_contract_detail = any( - ( - openapi_result.request_schema is not None, - openapi_result.response_schema is not None, - diagnostics.get("status_codes_found"), - diagnostics.get("request_fields_found"), - diagnostics.get("response_fields_found"), - diagnostics.get("payload_description_found"), - ) - ) - if requested_endpoint and not exact_anchor_match: - return "degraded", "not_found_exact_anchor", False - if requested_endpoint and generated_endpoint and requested_endpoint != generated_endpoint: - return "degraded", "generated_endpoint_mismatch", False - if str(getattr(router_result.retrieval_spec.filters, "doc_type", "") or "") != "api_method": - return "degraded", "wrong_doc_type_match", False - if not generated_endpoint or not has_operation_signal: - return "degraded", "insufficient_docs_evidence", False - if sub_intent == "OPENAPI_FRAGMENT_GENERATE": - return self._evaluate_fragment_gate(requested_fragment_type, openapi_result) - if not openapi_result.method and not diagnostics.get("status_codes_found"): - return "degraded", "insufficient_docs_evidence", False - if not has_contract_detail: - return "degraded", "insufficient_docs_evidence", False - if openapi_result.request_schema is None or openapi_result.response_schema is None: - return "ready_partial", "answered_with_gaps", True - return "ready", "", True - - def _build_gate_details( - self, - *, - intent: str, - sub_intent: str, - answer_mode: str, - degraded_reason: str, - raw_rows: list[dict], - exact_anchor_match: bool, - matched_anchor_type: str, - matched_anchor_value: str | None, - openapi_result, - router_result, - ) -> tuple[str, str, list[str], list[str]]: - satisfied: list[str] = [] - missing: list[str] = [] - relation_hits = self._relation_hits(raw_rows) - if raw_rows: - satisfied.append("retrieval_non_empty") - else: - missing.append("retrieval_non_empty") - if matched_anchor_type in {"endpoint", "entity"} and matched_anchor_value: - if exact_anchor_match or (sub_intent == "RELATED_DOCS_EXPLAIN" and relation_hits > 0): - satisfied.append("exact_anchor_match") - else: - missing.append("exact_anchor_match") - if intent in {"OPENAPI_GENERATION", "OPENAPI_FROM_DOCUMENTATION"} and openapi_result is not None: - if openapi_result.path: - satisfied.append("path_found") - else: - missing.append("path_found") - diagnostics = openapi_result.diagnostics - if openapi_result.method: - satisfied.append("http_method_found") - else: - missing.append("http_method_found") - if diagnostics.get("operation_semantics_found"): - satisfied.append("operation_semantics_found") - else: - missing.append("operation_semantics_found") - if diagnostics.get("request_payload_found"): - satisfied.append("request_payload_found") - if diagnostics.get("response_payload_found"): - satisfied.append("response_payload_found") - if openapi_result.request_schema is not None: - satisfied.append("request_fields_found") - if openapi_result.response_schema is not None: - satisfied.append("response_fields_found") - if openapi_result.request_schema is None and openapi_result.response_schema is None: - missing.append("contract_fields_found") - if diagnostics.get("status_codes_found"): - satisfied.append("status_codes_found") - else: - missing.append("status_codes_found") - if diagnostics.get("payload_description_found"): - satisfied.append("payload_description_found") - else: - missing.append("payload_description_found") - if diagnostics.get("content_type_found"): - satisfied.append("content_type_found") - if diagnostics.get("examples_found"): - satisfied.append("examples_found") - if str(getattr(router_result.retrieval_spec.filters, "doc_type", "") or "") == "api_method": - satisfied.append("api_method_filter") - else: - missing.append("api_method_filter") - gate = answer_mode - if gate in {"diagnostic_only", "ready", "answered", "structured_spec"}: - gate = "allow" if not degraded_reason else "reject" - elif gate in {"ready_partial", "structured_spec_partial"}: - gate = "partial" - elif gate == "degraded": - gate = "reject" - return gate, self._gate_reason(gate, degraded_reason, sub_intent, relation_hits), missing, satisfied - - def _non_empty_layers(self, rows: list[dict], report: dict[str, Any], sub_intent: str) -> list[str]: - diagnostics = dict(report.get("layer_diagnostics") or {}) - if sub_intent == "RELATED_DOCS_EXPLAIN" and int(dict(diagnostics.get("D5_RELATION_GRAPH") or {}).get("hits") or 0) > 0: - return ["D5_RELATION_GRAPH"] - if diagnostics: - return [layer for layer, payload in diagnostics.items() if int(dict(payload).get("hits") or 0) > 0] - return self._layers_with_hits(rows) - - def _layers_with_hits(self, rows: list[dict]) -> list[str]: - result: list[str] = [] - for row in rows: - layer = str(row.get("layer") or "") - if layer.startswith("D") and layer not in result: - result.append(layer) - return result - - def _should_reject_on_exact_anchor( - self, - *, - sub_intent: str, - raw_rows: list[dict], - matched_anchor_type: str, - matched_anchor_value: str | None, - exact_anchor_match: bool, - ) -> bool: - if matched_anchor_type not in {"endpoint", "entity"} or not matched_anchor_value or exact_anchor_match: - return False - if sub_intent == "RELATED_DOCS_EXPLAIN" and self._has_relation_hits(raw_rows): - return False - return True - - def _has_relation_hits(self, rows: list[dict]) -> bool: - return self._relation_hits(rows) > 0 - - def _relation_hits(self, rows: list[dict]) -> int: - return sum(1 for row in rows if str(row.get("layer") or "") == "D5_RELATION_GRAPH") - - def _gate_reason(self, gate: str, degraded_reason: str, sub_intent: str, relation_hits: int) -> str: - if degraded_reason: - return degraded_reason - if sub_intent == "RELATED_DOCS_EXPLAIN" and relation_hits > 0: - return "relation_evidence_available" - if gate == "partial": - return "partial_evidence_available" - if gate == "allow": - return "evidence_sufficient" - return "" - - def _evaluate_fragment_gate(self, requested_fragment_type: str | None, openapi_result) -> tuple[str, str, bool]: - diagnostics = dict(openapi_result.diagnostics or {}) - if requested_fragment_type == "request_schema": - if openapi_result.request_schema is not None: - return "ready", "", True - if diagnostics.get("request_fields_found") or diagnostics.get("request_payload_found") or diagnostics.get("payload_description_found"): - return "ready_partial", "fragment_payload_only", True - return "degraded", "insufficient_docs_evidence", False - if requested_fragment_type == "response_schema": - if openapi_result.response_schema is not None: - return "ready", "", True - if diagnostics.get("response_fields_found") or diagnostics.get("response_payload_found") or diagnostics.get("status_codes_found"): - return "ready_partial", "fragment_response_partial", True - return "degraded", "insufficient_docs_evidence", False - if requested_fragment_type == "parameters": - if diagnostics.get("has_method") or diagnostics.get("content_type_found"): - return "ready_partial", "fragment_parameters_partial", True - return "degraded", "insufficient_docs_evidence", False - if openapi_result.request_schema is not None or openapi_result.response_schema is not None: - return "ready_partial", "answered_with_gaps", True - if diagnostics.get("payload_description_found"): - return "ready_partial", "fragment_payload_only", True - return "degraded", "insufficient_docs_evidence", False - - def _requested_fragment_type(self, user_query: str, sub_intent: str) -> str | None: - if sub_intent != "OPENAPI_FRAGMENT_GENERATE": - return None - lowered = user_query.lower() - if "request" in lowered: - return "request_schema" - if "response" in lowered: - return "response_schema" - if "parameter" in lowered or "парамет" in lowered: - return "parameters" - return "schema_fragment" - - def _fragment_evidence_found(self, requested_fragment_type: str | None, openapi_result) -> list[str]: - if openapi_result is None or requested_fragment_type is None: - return [] - diagnostics = dict(openapi_result.diagnostics or {}) - found: list[str] = [] - if openapi_result.path: - found.append("path") - if openapi_result.method: - found.append("method") - if diagnostics.get("operation_semantics_found"): - found.append("operation_semantics") - if diagnostics.get("payload_description_found"): - found.append("payload_description") - if diagnostics.get("status_codes_found"): - found.append("status_codes") - if requested_fragment_type == "request_schema" and openapi_result.request_schema is not None: - found.append("request_schema") - if requested_fragment_type == "request_schema" and diagnostics.get("request_fields_found"): - found.append("request_fields") - if requested_fragment_type == "response_schema" and openapi_result.response_schema is not None: - found.append("response_schema") - if requested_fragment_type == "response_schema" and diagnostics.get("response_fields_found"): - found.append("response_fields") - return found - - def _fragment_missing_requirements(self, requested_fragment_type: str | None, openapi_result) -> list[str]: - if openapi_result is None or requested_fragment_type is None: - return [] - diagnostics = dict(openapi_result.diagnostics or {}) - missing: list[str] = [] - if not openapi_result.path: - missing.append("path") - if requested_fragment_type == "request_schema": - if openapi_result.request_schema is None and not diagnostics.get("payload_description_found"): - missing.append("request_payload_evidence") - elif requested_fragment_type == "response_schema": - if openapi_result.response_schema is None and not diagnostics.get("status_codes_found"): - missing.append("response_payload_evidence") - elif openapi_result.request_schema is None and openapi_result.response_schema is None: - missing.append("schema_fragment") - return missing - - -def _default_conversation_state() -> Any: - from app.modules.agent.intent_router_v2 import ConversationState - - return ConversationState() - - -def _default_repo_context() -> Any: - from app.modules.agent.intent_router_v2 import RepoContext - - return RepoContext() - - -def _ms(started: float) -> int: - return int((perf_counter() - started) * 1000) diff --git a/src/app/modules/agent/runtime/docs_qa_pipeline/prompt_payload_builder.py b/src/app/modules/agent/runtime/docs_qa_pipeline/prompt_payload_builder.py deleted file mode 100644 index 2b85fda..0000000 --- a/src/app/modules/agent/runtime/docs_qa_pipeline/prompt_payload_builder.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import annotations - -import json - -from app.modules.agent.runtime.docs_qa_pipeline.models import DocsEvidenceBundle, OpenAPIResult - - -class DocsPromptPayloadBuilder: - def build( - self, - *, - question: str, - intent: str, - sub_intent: str, - evidence_bundle: DocsEvidenceBundle, - api_contract: OpenAPIResult | None = None, - ) -> str: - payload = { - "question": question, - "documents": list(evidence_bundle.documents), - "facts": list(evidence_bundle.facts), - "entities": list(evidence_bundle.entities), - "workflows": list(evidence_bundle.workflows), - "relations": list(evidence_bundle.relations), - "chunks": list(evidence_bundle.chunks), - } - if api_contract is not None: - payload["api_contract"] = { - "path": api_contract.path, - "method": api_contract.method, - "request_schema": api_contract.request_schema, - "response_schema": api_contract.response_schema, - "diagnostics": dict(api_contract.diagnostics), - } - return json.dumps(payload, ensure_ascii=False, indent=2) diff --git a/src/app/modules/agent/runtime/executor.py b/src/app/modules/agent/runtime/executor.py deleted file mode 100644 index f1c655f..0000000 --- a/src/app/modules/agent/runtime/executor.py +++ /dev/null @@ -1,492 +0,0 @@ -"""Главный оркестратор runtime: роутинг → retrieval → evidence gate → генерация ответа (LLM).""" - -from __future__ import annotations - -import logging -from difflib import SequenceMatcher -from time import perf_counter - -from app.modules.agent.runtime.models import RuntimeDraftAnswer, RuntimeExecutionState, RuntimeFinalResult -from app.modules.agent.intent_router_v2 import ConversationState, IntentRouterV2 -from app.modules.agent.intent_router_v2.models import SymbolResolution -from app.modules.agent.runtime.steps.retrieval import RuntimeRetrievalAdapter, RuntimeRepoContextFactory -from app.modules.agent.runtime.steps.context import ( - build_answer_synthesis_input, - build_evidence_bundle, - build_retrieval_request, - build_retrieval_result, -) -from app.modules.agent.runtime.steps.gates.pre.evidence_gate import evaluate_evidence -from app.modules.agent.runtime.steps.gates.post.post_gate import RuntimePostEvidenceGate -from app.modules.agent.runtime.steps.answer_policy import RuntimeAnswerPolicy -from app.modules.agent.runtime.steps.generation import RuntimePromptPayloadBuilder, RuntimePromptSelector, RuntimeAnswerGenerator -from app.modules.agent.runtime.steps.finalization import RuntimeAnswerRepairService, assemble_final_result -from app.modules.agent.llm import AgentLlmService - -LOGGER = logging.getLogger(__name__) - - -class AgentRuntimeExecutor: - def __init__( - self, - llm: AgentLlmService | None, - *, - router: IntentRouterV2 | None = None, - retrieval: RuntimeRetrievalAdapter | None = None, - repo_context_factory: RuntimeRepoContextFactory | None = None, - prompt_selector: RuntimePromptSelector | None = None, - payload_builder: RuntimePromptPayloadBuilder | None = None, - answer_policy: RuntimeAnswerPolicy | None = None, - post_gate: RuntimePostEvidenceGate | None = None, - ) -> None: - self._llm = llm - self._router = router or IntentRouterV2() - self._retrieval = retrieval or RuntimeRetrievalAdapter() - self._repo_context_factory = repo_context_factory or RuntimeRepoContextFactory() - self._prompt_selector = prompt_selector or RuntimePromptSelector() - self._payload_builder = payload_builder or RuntimePromptPayloadBuilder() - self._answer_policy = answer_policy or RuntimeAnswerPolicy() - self._post_gate = post_gate or RuntimePostEvidenceGate() - self._repair = RuntimeAnswerRepairService(llm) if llm is not None else None - self._generator = RuntimeAnswerGenerator(llm) if llm is not None else None - - def execute(self, *, user_query: str, rag_session_id: str, files_map: dict[str, dict] | None = None) -> RuntimeFinalResult: - timings_ms: dict[str, int] = {} - runtime_trace: list[dict] = [] - answer_policy_branch = "" - decision_reason = "" - post_gate_snapshot: dict = {} - state = RuntimeExecutionState( - user_query=user_query, - rag_session_id=rag_session_id, - conversation_state=ConversationState(), - repo_context=self._repo_context_factory.build(files_map), - ) - started = perf_counter() - state.router_result = self._router.route(user_query, state.conversation_state, state.repo_context) - timings_ms["router"] = self._elapsed_ms(started) - runtime_trace.append( - { - "step": "router", - "status": "completed", - "timings_ms": {"router": timings_ms["router"]}, - "output": { - "intent": state.router_result.intent, - "sub_intent": state.router_result.query_plan.sub_intent, - "graph_id": state.router_result.graph_id, - "conversation_mode": state.router_result.conversation_mode, - }, - } - ) - state.retrieval_request = build_retrieval_request(state.router_result, rag_session_id) - started = perf_counter() - raw_rows = self._retrieve(state) - timings_ms["retrieval"] = self._elapsed_ms(started) - retrieval_report = self._retrieval.consume_retrieval_report() or {} - raw_rows, retrieval_report = self._hydrate_entrypoint_sources(state, raw_rows, retrieval_report) - symbol_resolution = self._resolve_symbol(state.router_result.symbol_resolution.model_dump(), raw_rows) - state.router_result = state.router_result.model_copy(update={"symbol_resolution": SymbolResolution(**symbol_resolution)}) - state.retrieval_result = build_retrieval_result(raw_rows, retrieval_report, symbol_resolution) - if state.retrieval_request.sub_intent.upper() == "EXPLAIN" and symbol_resolution.get("status") in {"not_found", "ambiguous"}: - state.retrieval_result = build_retrieval_result([], retrieval_report, symbol_resolution) - runtime_trace.append( - { - "step": "retrieval", - "status": "completed", - "timings_ms": {"retrieval": timings_ms["retrieval"]}, - "output": { - "rag_count": len(raw_rows), - "answer_path_rag_count": len(state.retrieval_result.raw_rows), - "resolved_symbol_status": symbol_resolution.get("status"), - "resolved_symbol": symbol_resolution.get("resolved_symbol"), - "requested_layers": list(state.retrieval_request.requested_layers or []), - }, - "diagnostics": retrieval_report or {}, - } - ) - state.evidence_pack = build_evidence_bundle(state.retrieval_result, state.router_result) - if state.retrieval_request.sub_intent.upper() == "EXPLAIN" and symbol_resolution.get("status") in {"not_found", "ambiguous"}: - state.evidence_pack.sufficient = False - state.evidence_pack.failure_reasons = ["target_not_resolved"] - pre_gate_input = self._build_pre_gate_input(state) - started = perf_counter() - gate_decision = evaluate_evidence(state.evidence_pack) - timings_ms["pre_evidence_gate"] = self._elapsed_ms(started) - state.answer_mode = "normal" if gate_decision.passed else "degraded" - state.degraded_message = gate_decision.degraded_message - runtime_trace.append( - { - "step": "pre_evidence_gate", - "status": "passed" if gate_decision.passed else "blocked", - "timings_ms": {"pre_evidence_gate": timings_ms["pre_evidence_gate"]}, - "input": pre_gate_input, - "output": { - "passed": gate_decision.passed, - "failure_reasons": list(gate_decision.failure_reasons), - "degraded_message": gate_decision.degraded_message, - "evidence_count": state.evidence_pack.evidence_count, - }, - } - ) - decision = self._answer_policy.decide(router_result=state.router_result, gate_decision=gate_decision) - answer_policy_branch = decision.branch - decision_reason = decision.reason - if not decision.should_call_llm: - state.answer_mode = decision.answer_mode - started = perf_counter() - runtime_trace.append( - { - "step": "llm", - "status": "skipped", - "timings_ms": {"llm": self._elapsed_ms(started)}, - "output": { - "reason": "policy_short_circuit", - "answer_mode": decision.answer_mode, - "decision_reason": decision.reason, - "answer_policy_branch": decision.branch, - }, - } - ) - started = perf_counter() - timings_ms["post_evidence_gate"] = self._elapsed_ms(started) - post_gate_snapshot = { - "input": { - "answer_mode": decision.answer_mode, - "draft_present": False, - "resolved_target": self._resolved_target(state), - }, - "output": {"reason": "no_draft_answer"}, - } - runtime_trace.append( - { - "step": "post_evidence_gate", - "status": "skipped", - "timings_ms": {"post_evidence_gate": timings_ms["post_evidence_gate"]}, - "input": post_gate_snapshot["input"], - "output": post_gate_snapshot["output"], - } - ) - return assemble_final_result( - state, - draft=None, - final_answer=decision.answer, - repair_used=False, - llm_used=False, - timings_ms=timings_ms, - runtime_trace=runtime_trace, - answer_policy_branch=answer_policy_branch, - decision_reason=decision_reason, - pre_gate_input=pre_gate_input, - post_gate_snapshot=post_gate_snapshot, - resolved_target=self._resolved_target(state), - post_gate=self._post_gate, - ) - if self._llm is None: - answer_policy_branch = "llm_unavailable" - decision_reason = "llm_service_missing" - started = perf_counter() - runtime_trace.append( - { - "step": "llm", - "status": "skipped", - "timings_ms": {"llm": self._elapsed_ms(started)}, - "output": {"reason": "llm_unavailable", "answer_policy_branch": answer_policy_branch, "decision_reason": decision_reason}, - } - ) - started = perf_counter() - timings_ms["post_evidence_gate"] = self._elapsed_ms(started) - post_gate_snapshot = { - "input": { - "answer_mode": state.answer_mode, - "draft_present": False, - "resolved_target": self._resolved_target(state), - }, - "output": {"reason": "no_draft_answer"}, - } - runtime_trace.append( - { - "step": "post_evidence_gate", - "status": "skipped", - "timings_ms": {"post_evidence_gate": timings_ms["post_evidence_gate"]}, - "input": post_gate_snapshot["input"], - "output": post_gate_snapshot["output"], - } - ) - return assemble_final_result( - state, - draft=None, - final_answer="", - repair_used=False, - llm_used=False, - timings_ms=timings_ms, - runtime_trace=runtime_trace, - answer_policy_branch=answer_policy_branch, - decision_reason=decision_reason, - pre_gate_input=pre_gate_input, - post_gate_snapshot=post_gate_snapshot, - resolved_target=self._resolved_target(state), - post_gate=self._post_gate, - ) - state.synthesis_input = build_answer_synthesis_input(user_query, state.evidence_pack) - prompt_name = self._prompt_selector.select( - intent=state.router_result.intent, - sub_intent=state.retrieval_request.sub_intent, - answer_mode=state.answer_mode, - ) - prompt_payload = self._payload_builder.build( - user_query=user_query, - synthesis_input=state.synthesis_input, - evidence_pack=state.evidence_pack, - answer_mode=state.answer_mode, - ) - started = perf_counter() - draft = RuntimeDraftAnswer( - prompt_name=prompt_name, - prompt_payload=prompt_payload, - answer=self._generator.generate(prompt_name, prompt_payload), - ) - timings_ms["llm"] = self._elapsed_ms(started) - runtime_trace.append( - { - "step": "llm", - "status": "completed", - "timings_ms": {"llm": timings_ms["llm"]}, - "output": { - "prompt_name": prompt_name, - "answer_preview": draft.answer[:300], - "resolved_target": self._resolved_target(state), - "answer_policy_branch": answer_policy_branch, - "decision_reason": decision_reason, - }, - } - ) - post_gate_input = { - "answer_mode": state.answer_mode, - "degraded_message": state.degraded_message, - "resolved_target": self._resolved_target(state), - "draft_answer_preview": draft.answer[:300], - "repair_candidate": bool(self._repair is not None), - } - started = perf_counter() - validation = self._post_gate.validate( - answer=draft.answer, - answer_mode=state.answer_mode, - degraded_message=state.degraded_message, - sub_intent=state.retrieval_request.sub_intent, - user_query=user_query, - evidence_pack=state.evidence_pack, - ) - timings_ms["post_evidence_gate"] = self._elapsed_ms(started) - final_answer = draft.answer - repair_used = False - if not validation.passed and self._repair is not None: - started = perf_counter() - final_answer = self._repair.repair(draft_answer=draft.answer, validation=validation, prompt_payload=prompt_payload) - repair_used = True - timings_ms["repair"] = self._elapsed_ms(started) - started = perf_counter() - validation = self._post_gate.validate( - answer=final_answer, - answer_mode=state.answer_mode, - degraded_message=state.degraded_message, - sub_intent=state.retrieval_request.sub_intent, - user_query=user_query, - evidence_pack=state.evidence_pack, - ) - timings_ms["post_evidence_gate_recheck"] = self._elapsed_ms(started) - if not validation.passed: - final_answer = self._fallback_answer(state) - state.answer_mode = self._fallback_mode(state) - post_gate_snapshot = { - "input": post_gate_input, - "output": { - "passed": validation.passed, - "action": validation.action, - "reasons": list(validation.reasons), - "repair_used": repair_used, - "final_answer_preview": final_answer[:300], - }, - } - runtime_trace.append( - { - "step": "post_evidence_gate", - "status": "passed" if validation.passed else "failed", - "timings_ms": { - "post_evidence_gate": timings_ms["post_evidence_gate"], - "post_evidence_gate_recheck": timings_ms.get("post_evidence_gate_recheck", 0), - "repair": timings_ms.get("repair", 0), - }, - "input": post_gate_snapshot["input"], - "output": post_gate_snapshot["output"], - } - ) - return assemble_final_result( - state, - draft=draft, - final_answer=final_answer, - repair_used=repair_used, - llm_used=True, - validation=validation, - timings_ms=timings_ms, - runtime_trace=runtime_trace, - answer_policy_branch=answer_policy_branch, - decision_reason=decision_reason, - pre_gate_input=pre_gate_input, - post_gate_snapshot=post_gate_snapshot, - resolved_target=self._resolved_target(state), - post_gate=self._post_gate, - ) - - def _retrieve(self, state: RuntimeExecutionState) -> list[dict]: - assert state.retrieval_request is not None - if state.retrieval_request.sub_intent == "OPEN_FILE" and state.retrieval_request.path_scope: - return self._retrieval.retrieve_exact_files( - state.rag_session_id, - paths=state.retrieval_request.path_scope, - layers=["C0_SOURCE_CHUNKS"], - limit=200, - query=state.retrieval_request.query, - ranking_profile=str(getattr(state.retrieval_request.retrieval_spec, "rerank_profile", "") or ""), - ) - return self._retrieval.retrieve_with_plan( - state.rag_session_id, - state.retrieval_request.query, - state.retrieval_request.retrieval_spec, - state.retrieval_request.retrieval_constraints, - query_plan=state.retrieval_request.query_plan, - ) - - def _resolve_symbol(self, initial: dict, rag_rows: list[dict]) -> dict: - if str(initial.get("status") or "") != "pending": - return initial - candidates = [str(item).strip() for item in initial.get("alternatives", []) if str(item).strip()] - found = [ - str(row.get("title") or "").strip() - for row in rag_rows - if str(row.get("layer") or "") == "C1_SYMBOL_CATALOG" and str(row.get("title") or "").strip() - ] - exact = next((item for item in found if item in candidates), None) - if exact: - return {"status": "resolved", "resolved_symbol": exact, "alternatives": found[:5], "confidence": 0.99} - close = self._close_matches(candidates, found) - if close: - return {"status": "ambiguous", "resolved_symbol": None, "alternatives": close[:5], "confidence": 0.55} - return {"status": "not_found", "resolved_symbol": None, "alternatives": close[:5], "confidence": 0.0} - - def _elapsed_ms(self, started: float) -> int: - return max(1, round((perf_counter() - started) * 1000)) - - def _build_pre_gate_input(self, state: RuntimeExecutionState) -> dict: - evidence = state.evidence_pack - retrieval = state.retrieval_result - return { - "resolved_target": self._resolved_target(state), - "sub_intent": state.retrieval_request.sub_intent if state.retrieval_request else None, - "target_type": evidence.target_type if evidence else None, - "evidence_count": evidence.evidence_count if evidence else 0, - "code_chunk_count": len(evidence.code_chunks) if evidence else 0, - "entrypoint_count": len(evidence.entrypoints) if evidence else 0, - "relation_count": len(evidence.relations) if evidence else 0, - "test_evidence_count": len(evidence.test_evidence) if evidence else 0, - "symbol_resolution_status": retrieval.symbol_resolution_status if retrieval else None, - "path_scope": list(state.retrieval_request.path_scope) if state.retrieval_request else [], - } - - def _resolved_target(self, state: RuntimeExecutionState) -> str | None: - if state.evidence_pack and state.evidence_pack.resolved_target: - return state.evidence_pack.resolved_target - if state.retrieval_result and state.retrieval_result.resolved_symbol: - return state.retrieval_result.resolved_symbol - if state.retrieval_request and state.retrieval_request.path_scope: - return state.retrieval_request.path_scope[0] - return None - - def _close_matches(self, candidates: list[str], found: list[str]) -> list[str]: - ranked: list[tuple[float, str]] = [] - for candidate in candidates: - for item in found: - score = SequenceMatcher(None, candidate.lower(), item.lower()).ratio() - if score >= 0.52: - ranked.append((score, item)) - ranked.sort(key=lambda pair: (-pair[0], pair[1])) - result: list[str] = [] - for _, item in ranked: - if item not in result: - result.append(item) - return result - - def _hydrate_entrypoint_sources( - self, - state: RuntimeExecutionState, - raw_rows: list[dict], - retrieval_report: dict, - ) -> tuple[list[dict], dict]: - if not state.retrieval_request or state.retrieval_request.sub_intent.upper() != "FIND_ENTRYPOINTS": - return raw_rows, retrieval_report - entrypoint_paths = [] - for row in raw_rows: - if str(row.get("layer") or "") != "C3_ENTRYPOINTS": - continue - path = str(row.get("path") or "").strip() - if path and path not in entrypoint_paths: - entrypoint_paths.append(path) - if not entrypoint_paths: - return raw_rows, retrieval_report - extra_rows = self._retrieval.retrieve_exact_files( - state.rag_session_id, - paths=entrypoint_paths[:3], - layers=["C0_SOURCE_CHUNKS"], - limit=24, - query=state.user_query, - ranking_profile="entrypoint_source_hydration", - ) - extra_report = self._retrieval.consume_retrieval_report() or {} - return self._merge_rows(raw_rows, extra_rows), self._merge_reports(retrieval_report, extra_report) - - def _merge_rows(self, base_rows: list[dict], extra_rows: list[dict]) -> list[dict]: - merged: list[dict] = [] - seen: set[tuple[str, str, str, int | None, int | None]] = set() - for row in [*base_rows, *extra_rows]: - key = ( - str(row.get("layer") or ""), - str(row.get("path") or ""), - str(row.get("title") or ""), - row.get("span_start"), - row.get("span_end"), - ) - if key in seen: - continue - seen.add(key) - merged.append(row) - return merged - - def _merge_reports(self, base: dict, extra: dict) -> dict: - merged = dict(base or {}) - merged["executed_layers"] = list(dict.fromkeys([*(base.get("executed_layers") or []), *(extra.get("executed_layers") or [])])) - merged["retrieval_mode_by_layer"] = {**dict(base.get("retrieval_mode_by_layer") or {}), **dict(extra.get("retrieval_mode_by_layer") or {})} - merged["top_k_by_layer"] = {**dict(base.get("top_k_by_layer") or {}), **dict(extra.get("top_k_by_layer") or {})} - merged["filters_by_layer"] = {**dict(base.get("filters_by_layer") or {}), **dict(extra.get("filters_by_layer") or {})} - merged["retrieval_by_layer_ms"] = {**dict(base.get("retrieval_by_layer_ms") or {}), **dict(extra.get("retrieval_by_layer_ms") or {})} - merged["fallback"] = dict(extra.get("fallback") or base.get("fallback") or {"used": False, "reason": None}) - merged["supplemental_requests"] = [*(base.get("supplemental_requests") or []), *(extra.get("requests") or [])] - return merged - - def _fallback_mode(self, state: RuntimeExecutionState) -> str: - status = str(state.router_result.symbol_resolution.status if state.router_result and state.router_result.symbol_resolution else "") - if status == "ambiguous": - return "ambiguous" - if status == "not_found": - return "not_found" - return "degraded" - - def _fallback_answer(self, state: RuntimeExecutionState) -> str: - symbol_resolution = state.router_result.symbol_resolution if state.router_result else None - query_plan = state.router_result.query_plan if state.router_result else None - target = next((item for item in list(query_plan.symbol_candidates or []) if item), "запрошенная сущность") if query_plan else "запрошенная сущность" - if symbol_resolution and symbol_resolution.status == "ambiguous": - return self._answer_policy.decide(router_result=state.router_result, gate_decision=evaluate_evidence(state.evidence_pack)).answer - if symbol_resolution and symbol_resolution.status == "not_found": - return self._answer_policy.decide(router_result=state.router_result, gate_decision=evaluate_evidence(state.evidence_pack)).answer - if state.degraded_message: - return state.degraded_message - return f"Недостаточно подтверждённых данных для уверенного ответа по {target}." diff --git a/src/app/modules/agent/runtime/legacy_pipeline.py b/src/app/modules/agent/runtime/legacy_pipeline.py deleted file mode 100644 index 1eb4d72..0000000 --- a/src/app/modules/agent/runtime/legacy_pipeline.py +++ /dev/null @@ -1,232 +0,0 @@ -"""Legacy test-first CODE_QA pipeline: router → retrieval → evidence → synthesis → diagnostics. Prefer agent.runtime.executor.""" - -from __future__ import annotations - -from dataclasses import dataclass, field -from difflib import get_close_matches -from time import perf_counter -from typing import Any, Protocol - -from app.modules.agent.runtime.steps.context import ( - build_answer_synthesis_input, - build_diagnostics_report, - build_evidence_bundle, - build_retrieval_request, - build_retrieval_result, - EvidenceBundle, - RetrievalRequest, - RetrievalResult, - RouterResult, -) -from app.modules.agent.runtime.steps.gates.pre.evidence_gate import evaluate_evidence - - -class RetrievalAdapter(Protocol): - def retrieve_with_plan( - self, - rag_session_id: str, - query: str, - retrieval_spec: Any, - retrieval_constraints: Any = None, - *, - query_plan: Any = None, - ) -> list[dict]: ... - - def retrieve_exact_files( - self, - rag_session_id: str, - *, - repo_id: str | None = None, - paths: list[str], - layers: list[str] | None = None, - limit: int = 200, - query: str = "", - ranking_profile: str = "", - ) -> list[dict]: ... - - def hydrate_resolved_symbol_sources( - self, - rag_session_id: str, - base_query: str, - rag_rows: list[dict], - symbol_resolution: dict, - retrieval_spec: Any, - retrieval_constraints: Any = None, - ) -> list[dict]: ... - - def force_symbol_context_c0( - self, - rag_session_id: str, - *, - rag_rows: list[dict], - symbol_resolution: dict, - limit: int = 20, - ) -> list[dict]: ... - - def consume_retrieval_report(self) -> dict[str, Any] | None: ... - - -@dataclass(slots=True) -class CodeQAPipelineResult: - user_query: str - rag_session_id: str - router_result: RouterResult - retrieval_request: RetrievalRequest - retrieval_result: RetrievalResult - evidence_bundle: EvidenceBundle - evidence_gate_passed: bool - answer_synthesis_input: Any - diagnostics_report: Any - answer_mode: str = "normal" - degraded_message: str = "" - llm_answer: str | None = None - timings_ms: dict[str, int] = field(default_factory=dict) - - -class CodeQAPipelineRunner: - """Legacy test-first CODE_QA pipeline entrypoint. Prefer AgentRuntimeExecutor.""" - - def __init__( - self, - router: Any, - retrieval_adapter: RetrievalAdapter, - repo_context: Any = None, - ) -> None: - self._router = router - self._adapter = retrieval_adapter - self._repo_context = repo_context - - def run( - self, - user_query: str, - rag_session_id: str, - *, - conversation_state: Any = None, - run_retrieval: bool = True, - run_hydrate: bool = True, - ) -> CodeQAPipelineResult: - timings: dict[str, int] = {} - t0 = perf_counter() - router_result = self._router.route( - user_query, - conversation_state or _default_conversation_state(), - self._repo_context or _default_repo_context(), - ) - timings["router"] = _ms(t0) - - request = build_retrieval_request(router_result, rag_session_id) - raw_rows: list[dict] = [] - symbol_resolution = router_result.symbol_resolution.model_dump() if router_result.symbol_resolution else {} - - if run_retrieval: - t1 = perf_counter() - raw_rows = self._retrieve(router_result, request) - timings["retrieval_total"] = _ms(t1) - symbol_resolution = self._resolve_symbol(symbol_resolution, raw_rows) - timings["symbol_resolution"] = 0 - if run_hydrate and request.sub_intent == "EXPLAIN" and symbol_resolution.get("status") == "resolved": - raw_rows = self._adapter.hydrate_resolved_symbol_sources( - rag_session_id, - request.query, - raw_rows, - symbol_resolution, - request.retrieval_spec, - request.retrieval_constraints, - ) - raw_rows = self._adapter.force_symbol_context_c0( - rag_session_id, - rag_rows=raw_rows, - symbol_resolution=symbol_resolution, - limit=20, - ) - - report = self._adapter.consume_retrieval_report() or {} - retrieval_result = build_retrieval_result(raw_rows, report, symbol_resolution) - evidence_bundle = build_evidence_bundle(retrieval_result, router_result) - gate_decision = evaluate_evidence(evidence_bundle) - synthesis_input = build_answer_synthesis_input(user_query, evidence_bundle) - answer_mode = "normal" if gate_decision.passed else "degraded" - if not gate_decision.passed and evidence_bundle.evidence_count == 0: - answer_mode = "insufficient" - diagnostics_report = build_diagnostics_report( - router_result=router_result, - retrieval_request=request, - retrieval_result=retrieval_result, - evidence_bundle=evidence_bundle, - answer_mode=answer_mode, - timings_ms=timings, - ) - - return CodeQAPipelineResult( - user_query=user_query, - rag_session_id=rag_session_id, - router_result=router_result, - retrieval_request=request, - retrieval_result=retrieval_result, - evidence_bundle=evidence_bundle, - evidence_gate_passed=gate_decision.passed, - answer_synthesis_input=synthesis_input, - diagnostics_report=diagnostics_report, - answer_mode=answer_mode, - degraded_message=gate_decision.degraded_message, - timings_ms=timings, - ) - - def _retrieve(self, router_result: RouterResult, request: RetrievalRequest) -> list[dict]: - path_scope = list(request.path_scope) - spec = request.retrieval_spec - if request.sub_intent == "OPEN_FILE" and path_scope: - return self._adapter.retrieve_exact_files( - request.rag_session_id, - paths=path_scope, - layers=["C0_SOURCE_CHUNKS"], - limit=200, - query=request.query, - ranking_profile=getattr(spec, "rerank_profile", "") or "", - ) - return self._adapter.retrieve_with_plan( - request.rag_session_id, - request.query, - spec, - request.retrieval_constraints, - query_plan=request.query_plan, - ) - - def _resolve_symbol(self, initial: dict, rag_rows: list[dict]) -> dict: - status = str(initial.get("status") or "not_requested") - if status != "pending": - return initial - candidates = [str(x).strip() for x in initial.get("alternatives", []) if str(x).strip()] - c1_titles = list(dict.fromkeys( - str(row.get("title") or "").strip() - for row in rag_rows - if str(row.get("layer") or "") == "C1_SYMBOL_CATALOG" and str(row.get("title") or "").strip() - )) - if not c1_titles: - return {**initial, "status": "not_found"} - exact = next((t for t in c1_titles if t in candidates), None) - if exact: - return {"status": "resolved", "resolved_symbol": exact, "alternatives": c1_titles[:5], "confidence": 0.99} - fuzzy = [] - for c in candidates: - fuzzy.extend(get_close_matches(c, c1_titles, n=3, cutoff=0.7)) - fuzzy = list(dict.fromkeys(fuzzy)) - if len(fuzzy) == 1: - return {"status": "resolved", "resolved_symbol": fuzzy[0], "alternatives": c1_titles[:5], "confidence": 0.82} - if len(fuzzy) > 1: - return {"status": "ambiguous", "resolved_symbol": None, "alternatives": fuzzy[:5], "confidence": 0.55} - return {"status": "not_found", "resolved_symbol": None, "alternatives": c1_titles[:5], "confidence": 0.0} - - -def _ms(started: float) -> int: - return int((perf_counter() - started) * 1000) - - -def _default_conversation_state() -> Any: - from app.modules.agent.intent_router_v2 import ConversationState - return ConversationState() - - -def _default_repo_context() -> Any: - from app.modules.agent.intent_router_v2 import RepoContext - return RepoContext() diff --git a/src/app/modules/agent/runtime/models.py b/src/app/modules/agent/runtime/models.py deleted file mode 100644 index daf2644..0000000 --- a/src/app/modules/agent/runtime/models.py +++ /dev/null @@ -1,60 +0,0 @@ -"""Модели состояния и результата runtime-оркестратора.""" - -from __future__ import annotations - -from typing import Any - -from pydantic import BaseModel, ConfigDict, Field - -from app.modules.agent.runtime.steps.context.contracts import ( - AnswerSynthesisInput, - DiagnosticsReport, - EvidenceBundle, - RetrievalRequest, - RetrievalResult, -) -from app.modules.agent.runtime.steps.gates.post.post_gate import RuntimeValidationResult -from app.modules.agent.intent_router_v2.models import ConversationState, IntentRouterResult, RepoContext - - -class RuntimeDraftAnswer(BaseModel): - model_config = ConfigDict(extra="forbid") - - prompt_name: str - prompt_payload: str - answer: str = "" - - -class RuntimeFinalResult(BaseModel): - model_config = ConfigDict(extra="forbid") - - final_answer: str - answer_mode: str = "normal" - repair_used: bool = False - llm_used: bool = False - draft_answer: RuntimeDraftAnswer | None = None - validation: RuntimeValidationResult = Field(default_factory=RuntimeValidationResult) - router_result: IntentRouterResult | None = None - retrieval_request: RetrievalRequest | None = None - retrieval_result: RetrievalResult | None = None - evidence_pack: EvidenceBundle | None = None - diagnostics: DiagnosticsReport - runtime_trace: list[dict[str, Any]] = Field(default_factory=list) - - -class RuntimeExecutionState(BaseModel): - model_config = ConfigDict(extra="forbid") - - user_query: str - rag_session_id: str - conversation_state: ConversationState = Field(default_factory=ConversationState) - repo_context: RepoContext = Field(default_factory=RepoContext) - router_result: IntentRouterResult | None = None - retrieval_request: RetrievalRequest | None = None - retrieval_result: RetrievalResult | None = None - evidence_pack: EvidenceBundle | None = None - synthesis_input: AnswerSynthesisInput | None = None - diagnostics: DiagnosticsReport | None = None - answer_mode: str = "normal" - degraded_message: str = "" - final_result: RuntimeFinalResult | None = None diff --git a/src/app/modules/agent/runtime/steps/answer_policy/__init__.py b/src/app/modules/agent/runtime/steps/answer_policy/__init__.py deleted file mode 100644 index 6e4b61a..0000000 --- a/src/app/modules/agent/runtime/steps/answer_policy/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -"""Политика ответа: вызов LLM или короткий ответ по результату evidence gate.""" - -from app.modules.agent.runtime.steps.answer_policy.policy import RuntimeAnswerPolicy, RuntimePolicyDecision -from app.modules.agent.runtime.steps.answer_policy.short_answer_formatter import RuntimeShortAnswerFormatter - -__all__ = ["RuntimeAnswerPolicy", "RuntimePolicyDecision", "RuntimeShortAnswerFormatter"] diff --git a/src/app/modules/agent/runtime/steps/answer_policy/policy.py b/src/app/modules/agent/runtime/steps/answer_policy/policy.py deleted file mode 100644 index c2c1931..0000000 --- a/src/app/modules/agent/runtime/steps/answer_policy/policy.py +++ /dev/null @@ -1,73 +0,0 @@ -"""Политика принятия решения: вызывать LLM или вернуть короткий ответ по evidence gate.""" - -from __future__ import annotations - -from dataclasses import dataclass - -from app.modules.agent.runtime.steps.gates.pre.evidence_gate import EvidenceGateDecision -from app.modules.agent.intent_router_v2.models import IntentRouterResult -from app.modules.agent.runtime.steps.answer_policy.short_answer_formatter import RuntimeShortAnswerFormatter - - -@dataclass(slots=True, frozen=True) -class RuntimePolicyDecision: - answer_mode: str - answer: str = "" - should_call_llm: bool = True - branch: str = "normal_answer" - reason: str = "evidence_sufficient" - - -class RuntimeAnswerPolicy: - def __init__(self, formatter: RuntimeShortAnswerFormatter | None = None) -> None: - self._formatter = formatter or RuntimeShortAnswerFormatter() - - def decide( - self, - *, - router_result: IntentRouterResult, - gate_decision: EvidenceGateDecision, - ) -> RuntimePolicyDecision: - sub_intent = router_result.query_plan.sub_intent.upper() - symbol_resolution = router_result.symbol_resolution - if sub_intent == "OPEN_FILE" and "path_scope_empty" in gate_decision.failure_reasons: - path_scope = list(getattr(router_result.retrieval_spec.filters, "path_scope", []) or []) - target = path_scope[0] if path_scope else "запрошенный файл" - return RuntimePolicyDecision( - answer_mode="not_found", - answer=self._formatter.open_file_not_found(target), - should_call_llm=False, - branch="open_file_not_found", - reason="path_scope_empty", - ) - if sub_intent == "EXPLAIN" and symbol_resolution.status == "not_found": - return RuntimePolicyDecision( - answer_mode="not_found", - answer=self._formatter.entity_not_found(self._target_label(router_result), symbol_resolution.alternatives), - should_call_llm=False, - branch="explain_not_found", - reason="symbol_resolution_not_found", - ) - if sub_intent == "EXPLAIN" and symbol_resolution.status == "ambiguous": - return RuntimePolicyDecision( - answer_mode="ambiguous", - answer=self._formatter.entity_ambiguous(self._target_label(router_result), symbol_resolution.alternatives), - should_call_llm=False, - branch="explain_ambiguous_symbol", - reason="symbol_resolution_ambiguous", - ) - if not gate_decision.passed: - answer_mode = "insufficient" if "insufficient_evidence" in gate_decision.failure_reasons else "degraded" - reason = gate_decision.failure_reasons[0] if gate_decision.failure_reasons else "evidence_gate_failed" - return RuntimePolicyDecision( - answer_mode=answer_mode, - answer=self._formatter.insufficient(gate_decision.degraded_message), - should_call_llm=False, - branch="evidence_gate_short_circuit", - reason=reason, - ) - return RuntimePolicyDecision(answer_mode="normal", branch="normal_answer", reason="evidence_sufficient") - - def _target_label(self, router_result: IntentRouterResult) -> str: - candidates = [item.strip() for item in list(router_result.query_plan.symbol_candidates or []) if item and item.strip()] - return candidates[0] if candidates else "запрошенная сущность" diff --git a/src/app/modules/agent/runtime/steps/answer_policy/short_answer_formatter.py b/src/app/modules/agent/runtime/steps/answer_policy/short_answer_formatter.py deleted file mode 100644 index 73233d0..0000000 --- a/src/app/modules/agent/runtime/steps/answer_policy/short_answer_formatter.py +++ /dev/null @@ -1,35 +0,0 @@ -"""Форматирование коротких ответов для режимов not_found, ambiguous, insufficient.""" - -from __future__ import annotations - - -class RuntimeShortAnswerFormatter: - def open_file_not_found(self, target: str) -> str: - return f"Файл {target} не найден." - - def entity_not_found(self, target: str, alternatives: list[str]) -> str: - base = f"Сущность {target} не найдена в доступном коде." - suffix = self._alternatives(alternatives) - return f"{base} {suffix}".strip() - - def entity_ambiguous(self, target: str, alternatives: list[str]) -> str: - base = f"Сущность {target} не удалось однозначно разрешить." - suffix = self._alternatives(alternatives) - return f"{base} {suffix}".strip() - - def insufficient(self, message: str) -> str: - normalized = (message or "").strip() - if normalized: - return normalized - return "Недостаточно подтверждённых данных для уверенного ответа." - - def related_only(self, target: str, alternatives: list[str]) -> str: - base = f"Прямых подтверждений для сущности {target} не найдено." - suffix = self._alternatives(alternatives) - return f"{base} {suffix}".strip() - - def _alternatives(self, alternatives: list[str]) -> str: - items = [item.strip() for item in alternatives if item and item.strip()] - if not items: - return "" - return f"Близкие варианты: {', '.join(items[:3])}." diff --git a/src/app/modules/agent/runtime/steps/context/__init__.py b/src/app/modules/agent/runtime/steps/context/__init__.py deleted file mode 100644 index c3fa187..0000000 --- a/src/app/modules/agent/runtime/steps/context/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -"""Контракты и билдеры контекста пайплайна: retrieval request/result, evidence bundle, diagnostics, synthesis.""" - -from app.modules.agent.runtime.steps.context.contracts import ( - AnswerSynthesisInput, - CodeChunkItem, - DiagnosticsReport, - EvidenceBundle, - FailureReason, - RetrievalRequest, - RetrievalResult, - RouterResult, -) -from app.modules.agent.runtime.steps.context.retrieval_request_builder import build_retrieval_request -from app.modules.agent.runtime.steps.context.retrieval_result_builder import build_retrieval_result -from app.modules.agent.runtime.steps.context.evidence_bundle_builder import build_evidence_bundle -from app.modules.agent.runtime.steps.context.diagnostics import build_diagnostics_report -from app.modules.agent.runtime.steps.context.answer_synthesis import build_answer_synthesis_input -from app.modules.agent.runtime.steps.context.answer_fact_curator import build_curated_answer_facts - -__all__ = [ - "AnswerSynthesisInput", - "CodeChunkItem", - "DiagnosticsReport", - "EvidenceBundle", - "FailureReason", - "RetrievalRequest", - "RetrievalResult", - "RouterResult", - "build_retrieval_request", - "build_retrieval_result", - "build_evidence_bundle", - "build_diagnostics_report", - "build_answer_synthesis_input", - "build_curated_answer_facts", -] diff --git a/src/app/modules/agent/runtime/steps/context/answer_fact_curator.py b/src/app/modules/agent/runtime/steps/context/answer_fact_curator.py deleted file mode 100644 index 75553ea..0000000 --- a/src/app/modules/agent/runtime/steps/context/answer_fact_curator.py +++ /dev/null @@ -1,345 +0,0 @@ -"""Курация фактов из EvidenceBundle для сценариев explain, architecture, trace_flow.""" - -from __future__ import annotations - -import re -from typing import Any - -from app.modules.agent.runtime.steps.context.contracts import CodeChunkItem, EvidenceBundle - -_CALL_RE = re.compile(r"([A-Za-z_][\w\.]*)\s*\(") -_FIELD_RE = re.compile(r"self\.(\w+)") -_SIGNATURE_RE = re.compile(r"(?P[A-Za-z_][\w\.]*)\((?P[^)]*)\)") -_RETRIEVAL_LABELS = ("dataflow_slice", "execution_trace", "trace_path") -_RELATION_VERBS = { - "calls": "вызывает", - "instantiates": "создает", - "inherits": "наследует", - "imports": "импортирует", - "reads_attr": "читает", - "writes_attr": "записывает", -} - - -def build_curated_answer_facts(bundle: EvidenceBundle) -> dict[str, Any]: - target = str(bundle.resolved_target or "").strip() - semantic_hints = _semantic_hints(bundle.code_chunks) - primary_chunks = [chunk for chunk in bundle.code_chunks if chunk.layer != "C4_SEMANTIC_ROLES"] - relations = _normalized_relations(bundle.relations) - target_relations = [relation for relation in relations if _is_target_relation(relation, target)] - - return { - "scenario": (bundle.resolved_sub_intent or "EXPLAIN").upper(), - "semantic_hints": semantic_hints, - "primary_chunk_count": len(primary_chunks), - "relation_count": len(relations), - "explain": _explain_facts(bundle, primary_chunks, target_relations), - "architecture": _architecture_facts(bundle, primary_chunks, target_relations), - "trace_flow": _trace_flow_facts(bundle, primary_chunks, target_relations), - } - - -def _explain_facts(bundle: EvidenceBundle, chunks: list[CodeChunkItem], relations: list[dict[str, Any]]) -> dict[str, Any]: - target = str(bundle.resolved_target or "").strip() - signatures = [_signature_payload(chunk) for chunk in chunks if chunk.layer == "C1_SYMBOL_CATALOG"] - target_signatures = [item for item in signatures if _is_target_symbol(item["name"], target)] - # Конкретные имена методов: полный qname и короткое отображаемое имя (Class.method или method) - methods_full = _unique(item["name"] for item in target_signatures if item["kind"] == "method") - methods_short = _unique(_short_method_name(name) for name in methods_full) - methods = methods_short or methods_full[:6] - constructor_args = _unique( - arg - for item in target_signatures - if item["name"].endswith(".__init__") - for arg in item["args"] - if arg not in {"self", "cls"} - ) - # Конкретные вызовы: из relations и fallback из кода - calls = _unique( - _display_call_target(relation["target"]) - for relation in relations - if relation["edge_type"] in {"calls", "instantiates"} - ) - if not calls: - calls = _fallback_calls(chunks, target) - # Поля: из relations и из self.attr в коде - fields = _unique( - relation["target"].split(".", 1)[-1] - for relation in relations - if relation["edge_type"] in {"reads_attr", "writes_attr"} - ) - if not fields: - fields = _unique(field for chunk in chunks if _chunk_matches_target(chunk, target) for field in _FIELD_RE.findall(chunk.content or "")) - # Зависимости: импорты и инстанциации - dependencies = _unique( - _display_dependency_target(relation["target"]) - for relation in relations - if relation["edge_type"] in {"imports", "instantiates"} - ) - required_files = _unique(chunk.path for chunk in chunks if _chunk_matches_target(chunk, target) and chunk.path) - required_symbols = _unique(item["name"] for item in target_signatures if item["name"]) or _unique([target] if target else bundle.target_symbol_candidates) - - fact_gaps: list[str] = [] - if not methods: - fact_gaps.append("Методы целевой сущности не подтверждены в извлеченных C0/C1 данных.") - if not calls: - fact_gaps.append("Конкретные вызовы целевой сущности не подтверждены в C2/C0.") - if not dependencies: - fact_gaps.append("Явные зависимости целевой сущности не подтверждены.") - if methods and not (calls or dependencies): - fact_gaps.append("Есть методы, но вызовы/зависимости не извлечены — опирайся только на перечисленные методы и поля.") - - return { - "required_symbols": required_symbols[:8], - "required_methods": methods[:8], - "required_calls": calls[:8], - "required_fields": fields[:8], - "required_constructor_args": constructor_args[:8], - "required_dependencies": dependencies[:8], - "required_files": required_files[:4], - "fact_gaps": fact_gaps, - } - - -def _architecture_facts(bundle: EvidenceBundle, chunks: list[CodeChunkItem], relations: list[dict[str, Any]]) -> dict[str, Any]: - target = str(bundle.resolved_target or "").strip() - # Компоненты: target, из связей, из заголовков чанков (классы/модули) - from_relations = _unique( - [_component_name(relation["source"]) for relation in relations] - + [_component_name(relation["target"]) for relation in relations] - ) - from_chunks = _unique( - _component_name(chunk.title) or _component_name(str(dict(chunk.metadata or {}).get("qname") or "")) - for chunk in chunks - if chunk.layer in ("C1_SYMBOL_CATALOG", "C0_SOURCE_CHUNKS") and (target and _chunk_matches_target(chunk, target)) - ) - components = _unique(([target] if target else []) + from_relations + from_chunks) - relation_rows = [ - { - "source": _component_name(relation["source"]), - "verb": relation["verb"], - "target": _component_name(relation["target"]), - "source_method": relation["source"], - "target_method": relation["target"], - "path": relation["path"], - "line_span": relation["line_span"], - "edge_type": relation["edge_type"], - } - for relation in relations - if _component_name(relation["source"]) and _component_name(relation["target"]) - ] - relation_rows = [row for row in relation_rows if row["source"] != row["target"]] - relation_verbs = _unique(row["verb"] for row in relation_rows if row["verb"]) - # Краткие формулировки связей для обязательного упоминания в ответе - relation_summaries = [f"{r['source']} {r['verb']} {r['target']}" for r in relation_rows[:8]] - fact_gaps: list[str] = [] - if not relation_rows: - fact_gaps.append("Concrete code edges между компонентами не подтверждены.") - if components and not relation_rows: - fact_gaps.append("Компоненты есть, но связи между ними не извлечены — не придумывай связи.") - - return { - "required_components": components[:10], - "required_relations": relation_rows[:10], - "required_relation_summaries": relation_summaries[:8], - "required_relation_verbs": relation_verbs[:8], - "required_creation_edges": [row for row in relation_rows if row["edge_type"] == "instantiates"][:4], - "required_call_edges": [row for row in relation_rows if row["edge_type"] == "calls"][:4], - "required_registration_edges": [row for row in relation_rows if row["edge_type"] == "imports"][:4], - "required_data_edges": [row for row in relation_rows if row["edge_type"] in {"reads_attr", "writes_attr"}][:4], - "fact_gaps": fact_gaps, - "forbidden_labels": list(_RETRIEVAL_LABELS), - } - - -def _trace_flow_facts(bundle: EvidenceBundle, chunks: list[CodeChunkItem], relations: list[dict[str, Any]]) -> dict[str, Any]: - target = str(bundle.resolved_target or "").strip() - sorted_relations = sorted( - relations, - key=lambda item: (item["path"], item["sort_line"], item["source"], item["target"]), - ) - flow_steps = [ - { - "step": index, - "source": relation["source"], - "verb": relation["verb"], - "target": relation["target"], - "path": relation["path"], - "line_span": relation["line_span"], - } - for index, relation in enumerate(sorted_relations, start=1) - ] - # Упорядоченные короткие формулировки шагов для обязательного отражения в ответе - ordered_step_descriptions = [ - f"{i}. {_component_name(s['source'])} {s['verb']} {_display_call_target(s['target'])}" - for i, s in enumerate(flow_steps[:8], start=1) - ] - required_calls = _unique(_display_call_target(item["target"]) for item in flow_steps) - fact_gaps: list[str] = [] - if len(flow_steps) < 2: - fact_gaps.append("Полная последовательность шагов не подтверждена; виден только частичный flow.") - if not flow_steps: - fact_gaps.append("Конкретные sequence edges для flow не подтверждены.") - if flow_steps and len(flow_steps) < 3: - fact_gaps.append("Цепочка короткая — не заявляй полноту потока.") - - return { - "required_flow_steps": flow_steps[:10], - "required_calls": required_calls[:10], - "required_sequence_edges": flow_steps[:10], - "ordered_step_descriptions": ordered_step_descriptions[:8], - "required_files": _unique(chunk.path for chunk in chunks if _chunk_matches_target(chunk, target) and chunk.path)[:4], - "fact_gaps": fact_gaps, - } - - -def _semantic_hints(chunks: list[CodeChunkItem]) -> list[dict[str, Any]]: - hints: list[dict[str, Any]] = [] - for chunk in chunks: - if chunk.layer != "C4_SEMANTIC_ROLES": - continue - meta = dict(chunk.metadata or {}) - hints.append( - { - "symbol": meta.get("symbol_name") or chunk.title, - "role": meta.get("role"), - "path": chunk.path, - "confidence": meta.get("confidence"), - } - ) - return hints[:8] - - -def _normalized_relations(relations: list[dict[str, Any]]) -> list[dict[str, Any]]: - normalized: list[dict[str, Any]] = [] - for relation in relations: - metadata = dict(relation.get("metadata") or {}) - edge_type = str(metadata.get("edge_type") or relation.get("edge_type") or "").strip() - source = _clean_endpoint(str(metadata.get("src_qname") or relation.get("source") or "").strip()) - target = _clean_endpoint(str(metadata.get("dst_ref") or relation.get("target") or "").strip()) - if not edge_type or not source or not target: - continue - normalized.append( - { - "edge_type": edge_type, - "source": source, - "target": target, - "verb": _RELATION_VERBS.get(edge_type, edge_type), - "path": str(relation.get("path") or ""), - "line_span": _line_span(relation), - "sort_line": int(relation.get("start_line") or 0), - } - ) - return normalized - - -def _signature_payload(chunk: CodeChunkItem) -> dict[str, Any]: - meta = dict(chunk.metadata or {}) - signature = str(meta.get("signature") or chunk.content or "").strip() - match = _SIGNATURE_RE.search(signature) - args = [part.strip() for part in match.group("args").split(",") if part.strip()] if match else [] - return { - "name": _clean_endpoint(str(meta.get("qname") or chunk.title or "").strip()), - "kind": str(meta.get("kind") or "").strip(), - "args": args, - } - - -def _fallback_calls(chunks: list[CodeChunkItem], target: str) -> list[str]: - values: list[str] = [] - for chunk in chunks: - if not _chunk_matches_target(chunk, target): - continue - values.extend(_display_call_target(item) for item in _CALL_RE.findall(chunk.content or "")) - return _unique(values) - - -def _chunk_matches_target(chunk: CodeChunkItem, target: str) -> bool: - if not target: - return True - title = _clean_endpoint(chunk.title) - symbol = _clean_endpoint(str(dict(chunk.metadata or {}).get("qname") or "")) - return _is_target_symbol(title, target) or _is_target_symbol(symbol, target) or target.lower() in (chunk.content or "").lower() - - -def _is_target_relation(relation: dict[str, Any], target: str) -> bool: - if not target: - return True - return _is_target_symbol(relation["source"], target) or _component_name(relation["source"]) == target or _component_name(relation["target"]) == target - - -def _is_target_symbol(name: str, target: str) -> bool: - clean_name = _clean_endpoint(name) - clean_target = _clean_endpoint(target) - if not clean_target: - return True - return clean_name == clean_target or clean_name.startswith(f"{clean_target}.") - - -def _component_name(value: str) -> str: - clean = _clean_endpoint(value) - if not clean: - return "" - parts = clean.split(".") - if len(parts) <= 1: - return clean - if len(parts) == 2: - return clean if parts[1][:1].isupper() else parts[0] - return ".".join(parts[:-1]) - - -def _short_method_name(qname: str) -> str: - """Короткое отображаемое имя метода для ответа (Class.method или method()).""" - clean = _clean_endpoint(qname) - if not clean: - return "" - parts = clean.split(".") - tail = parts[-1] - if len(parts) >= 2 and parts[-2][:1].isupper(): - return f"{parts[-2]}.{tail}()" if tail != "__init__" else f"{parts[-2]}.__init__()" - return f"{tail}()" if tail else clean - - -def _display_call_target(value: str) -> str: - clean = _clean_endpoint(value) - if not clean: - return "" - tail = clean.rsplit(".", 1)[-1] - return f"{tail}()" if tail and tail != clean else clean - - -def _display_dependency_target(value: str) -> str: - clean = _clean_endpoint(value) - if not clean: - return "" - return _component_name(clean) or clean - - -def _clean_endpoint(value: str) -> str: - clean = str(value or "").strip() - if not clean: - return "" - for label in _RETRIEVAL_LABELS: - clean = clean.replace(f".{label}", "") - clean = clean.replace(label, "") - return clean.strip(".: ") - - -def _line_span(item: dict[str, Any]) -> str: - start = item.get("start_line") - end = item.get("end_line") - if start is None and end is None: - return "?:?" - return f"{start or '?'}-{end or '?'}" - - -def _unique(values: Any) -> list[str]: - seen: set[str] = set() - result: list[str] = [] - for value in values: - text = str(value or "").strip() - if not text or text in seen: - continue - seen.add(text) - result.append(text) - return result diff --git a/src/app/modules/agent/runtime/steps/context/answer_synthesis.py b/src/app/modules/agent/runtime/steps/context/answer_synthesis.py deleted file mode 100644 index c566b58..0000000 --- a/src/app/modules/agent/runtime/steps/context/answer_synthesis.py +++ /dev/null @@ -1,71 +0,0 @@ -"""Сборка AnswerSynthesisInput из EvidenceBundle для этапа LLM.""" - -from __future__ import annotations - -from app.modules.agent.runtime.steps.context.answer_fact_curator import build_curated_answer_facts -from app.modules.agent.runtime.steps.context.contracts import AnswerSynthesisInput, EvidenceBundle - - -def build_answer_synthesis_input( - user_question: str, - bundle: EvidenceBundle, -) -> AnswerSynthesisInput: - scenario = bundle.resolved_sub_intent or "EXPLAIN" - target = bundle.resolved_target - sufficient = bundle.sufficient - curated = build_curated_answer_facts(bundle) - semantic_hints = list(curated.get("semantic_hints") or []) - - fast_lines = [ - f"Scenario: {scenario}", - f"Target: {target or 'none'}", - f"Evidence chunks: {bundle.evidence_count}", - f"Primary chunks: {curated.get('primary_chunk_count', 0)}", - f"Semantic hints: {len(semantic_hints)}", - f"Relations: {curated.get('relation_count', 0)}", - f"Sufficient: {sufficient}", - ] - if bundle.failure_reasons: - fast_lines.append(f"Failure reasons: {', '.join(bundle.failure_reasons)}") - fast_context = "\n".join(fast_lines) - - deep_parts = [] - primary_chunks = [chunk for chunk in bundle.code_chunks if scenario.upper() not in {"EXPLAIN", "ARCHITECTURE"} or chunk.layer != "C4_SEMANTIC_ROLES"] - for i, c in enumerate(primary_chunks[:30], 1): - deep_parts.append(f"[{i}] {c.path}:{c.start_line or '?'}-{c.end_line or '?'}\n{c.content[:800]}") - deep_context = "\n\n---\n\n".join(deep_parts) if deep_parts else "(no code chunks)" - - evidence_summary = [] - for c in primary_chunks[:20]: - evidence_summary.append({ - "layer": c.layer, - "path": c.path, - "title": c.title, - "lines": f"{c.start_line or '?'}-{c.end_line or '?'}", - }) - if semantic_hints: - evidence_summary.append({"kind": "semantic_hints", "count": len(semantic_hints)}) - if bundle.entrypoints: - evidence_summary.append({"kind": "entrypoints", "count": len(bundle.entrypoints)}) - if bundle.test_evidence: - evidence_summary.append({"kind": "tests", "count": len(bundle.test_evidence)}) - - hints = list(bundle.failure_reasons) if bundle.failure_reasons else [] - if not sufficient and bundle.retrieval_summary.get("missing_layers"): - hints.append(f"Missing layers: {', '.join(bundle.retrieval_summary['missing_layers'])}") - scenario_key = scenario.lower() - scenario_facts = dict(curated.get(scenario_key) or {}) - hints.extend(list(scenario_facts.get("fact_gaps") or [])) - - return AnswerSynthesisInput( - user_question=user_question, - resolved_scenario=scenario, - resolved_target=target, - fast_context=fast_context, - deep_context=deep_context, - evidence_summary=evidence_summary, - semantic_hints=semantic_hints, - curated_facts=curated, - evidence_sufficient=sufficient, - diagnostic_hints=hints, - ) diff --git a/src/app/modules/agent/runtime/steps/context/contracts.py b/src/app/modules/agent/runtime/steps/context/contracts.py deleted file mode 100644 index e8a5972..0000000 --- a/src/app/modules/agent/runtime/steps/context/contracts.py +++ /dev/null @@ -1,146 +0,0 @@ -"""Типизированные контракты пайплайна: RouterResult, RetrievalRequest, RetrievalResult, EvidenceBundle, AnswerSynthesisInput, DiagnosticsReport.""" - -from __future__ import annotations - -from typing import Any, Literal - -from pydantic import BaseModel, ConfigDict, Field - -from app.modules.agent.intent_router_v2.models import IntentRouterResult - -RouterResult = IntentRouterResult - -FailureReason = Literal[ - "router_low_confidence", - "target_not_resolved", - "path_scope_empty", - "layer_c0_empty", - "layer_c1_empty", - "layer_c2_empty", - "entrypoints_not_found", - "tests_not_found", - "insufficient_evidence", -] - -FAILURE_REASONS: tuple[FailureReason, ...] = ( - "router_low_confidence", - "target_not_resolved", - "path_scope_empty", - "layer_c0_empty", - "layer_c1_empty", - "layer_c2_empty", - "entrypoints_not_found", - "tests_not_found", - "insufficient_evidence", -) - - -class RetrievalRequest(BaseModel): - model_config = ConfigDict(extra="forbid") - - rag_session_id: str - query: str - sub_intent: str = "EXPLAIN" - path_scope: list[str] = Field(default_factory=list) - keyword_hints: list[str] = Field(default_factory=list) - symbol_candidates: list[str] = Field(default_factory=list) - requested_layers: list[str] = Field(default_factory=list) - retrieval_spec: Any = None - retrieval_constraints: Any = None - query_plan: Any = None - - -class CodeChunkItem(BaseModel): - model_config = ConfigDict(extra="forbid") - - layer: str - path: str - title: str = "" - content: str = "" - start_line: int | None = None - end_line: int | None = None - metadata: dict[str, Any] = Field(default_factory=dict) - - -class LayerOutcome(BaseModel): - model_config = ConfigDict(extra="forbid") - - layer_id: str - hit_count: int = 0 - empty: bool = True - fallback_used: bool = False - - -class RetrievalResult(BaseModel): - model_config = ConfigDict(extra="forbid") - - target_symbol_candidates: list[str] = Field(default_factory=list) - resolved_symbol: str | None = None - symbol_resolution_status: str = "not_requested" - file_candidates: list[str] = Field(default_factory=list) - code_chunks: list[CodeChunkItem] = Field(default_factory=list) - relations: list[dict[str, Any]] = Field(default_factory=list) - semantic_hints: list[dict[str, Any]] = Field(default_factory=list) - entrypoints: list[dict[str, Any]] = Field(default_factory=list) - test_candidates: list[dict[str, Any]] = Field(default_factory=list) - layer_outcomes: list[LayerOutcome] = Field(default_factory=list) - missing_layers: list[str] = Field(default_factory=list) - raw_rows: list[dict[str, Any]] = Field(default_factory=list) - retrieval_report: dict[str, Any] = Field(default_factory=dict) - - -class EvidenceBundle(BaseModel): - model_config = ConfigDict(extra="forbid") - - resolved_intent: str = "" - resolved_sub_intent: str = "" - resolved_target: str | None = None - target_type: Literal["symbol", "path", "file", "entrypoint", "none"] = "none" - target_symbol_candidates: list[str] = Field(default_factory=list) - file_candidates: list[str] = Field(default_factory=list) - code_chunks: list[CodeChunkItem] = Field(default_factory=list) - relations: list[dict[str, Any]] = Field(default_factory=list) - entrypoints: list[dict[str, Any]] = Field(default_factory=list) - test_evidence: list[dict[str, Any]] = Field(default_factory=list) - evidence_count: int = 0 - sufficient: bool = False - failure_reasons: list[str] = Field(default_factory=list) - retrieval_summary: dict[str, Any] = Field(default_factory=dict) - - -class AnswerSynthesisInput(BaseModel): - model_config = ConfigDict(extra="forbid") - - user_question: str = "" - resolved_scenario: str = "" - resolved_target: str | None = None - fast_context: str = "" - deep_context: str = "" - evidence_summary: list[dict[str, Any]] = Field(default_factory=list) - semantic_hints: list[dict[str, Any]] = Field(default_factory=list) - curated_facts: dict[str, Any] = Field(default_factory=dict) - evidence_sufficient: bool = False - diagnostic_hints: list[str] = Field(default_factory=list) - - -class DiagnosticsReport(BaseModel): - model_config = ConfigDict(extra="forbid") - - intent_correct: bool | None = None - target_found: bool = False - layers_used: list[str] = Field(default_factory=list) - retrieval_sufficient: bool = False - answer_mode: Literal["normal", "degraded", "insufficient"] = "normal" - resolved_target: str | None = None - answer_policy_branch: str = "" - decision_reason: str = "" - - router_result: dict[str, Any] = Field(default_factory=dict) - retrieval_request: dict[str, Any] = Field(default_factory=dict) - per_layer_outcome: list[dict[str, Any]] = Field(default_factory=list) - empty_layers: list[str] = Field(default_factory=list) - evidence_gate_decision: dict[str, Any] = Field(default_factory=dict) - evidence_gate_input: dict[str, Any] = Field(default_factory=dict) - post_evidence_gate: dict[str, Any] = Field(default_factory=dict) - failure_reasons: list[str] = Field(default_factory=list) - timings_ms: dict[str, int] = Field(default_factory=dict) diff --git a/src/app/modules/agent/runtime/steps/context/diagnostics.py b/src/app/modules/agent/runtime/steps/context/diagnostics.py deleted file mode 100644 index b33cb37..0000000 --- a/src/app/modules/agent/runtime/steps/context/diagnostics.py +++ /dev/null @@ -1,135 +0,0 @@ -"""Диагностика пайплайна CODE_QA: сводка уровня 1 и детали уровня 2.""" - -from __future__ import annotations - -from typing import Any - -from app.modules.agent.runtime.steps.context.contracts import ( - DiagnosticsReport, - EvidenceBundle, - RetrievalRequest, - RetrievalResult, - RouterResult, -) - - -def build_diagnostics_report( - *, - router_result: RouterResult, - retrieval_request: RetrievalRequest | None, - retrieval_result: RetrievalResult | None, - evidence_bundle: EvidenceBundle | None, - answer_mode: str = "normal", - timings_ms: dict[str, int] | None = None, - resolved_target: str | None = None, - answer_policy_branch: str = "", - decision_reason: str = "", - evidence_gate_input: dict[str, Any] | None = None, - post_evidence_gate: dict[str, Any] | None = None, -) -> DiagnosticsReport: - timings = dict(timings_ms or {}) - req = retrieval_request - res = retrieval_result - bundle = evidence_bundle - - intent_correct = None - target_found = bool(bundle and bundle.resolved_target) - layers_used = list(req.requested_layers) if req else [] - retrieval_sufficient = bool(bundle and bundle.sufficient) - if not retrieval_sufficient and bundle: - answer_mode = "degraded" if bundle.evidence_count else "insufficient" - failure_reasons = list(bundle.failure_reasons) if bundle else [] - - router_result_dict = _router_result_to_dict(router_result) - retrieval_request_dict = _retrieval_request_to_dict(req) if req else {} - per_layer = [] - if res: - for o in res.layer_outcomes: - per_layer.append({ - "layer_id": o.layer_id, - "hit_count": o.hit_count, - "empty": o.empty, - "fallback_used": o.fallback_used, - }) - empty_layers = list(res.missing_layers) if res else [] - evidence_gate_decision = {} - if bundle is not None: - evidence_gate_decision = { - "sufficient": bundle.sufficient, - "failure_reasons": list(bundle.failure_reasons), - "evidence_count": bundle.evidence_count, - } - - return DiagnosticsReport( - intent_correct=intent_correct, - target_found=target_found, - layers_used=layers_used, - retrieval_sufficient=retrieval_sufficient, - answer_mode=answer_mode, - resolved_target=resolved_target or (bundle.resolved_target if bundle else None), - answer_policy_branch=answer_policy_branch, - decision_reason=decision_reason, - router_result=router_result_dict, - retrieval_request=retrieval_request_dict, - per_layer_outcome=per_layer, - empty_layers=empty_layers, - evidence_gate_decision=evidence_gate_decision, - evidence_gate_input=dict(evidence_gate_input or {}), - post_evidence_gate=dict(post_evidence_gate or {}), - failure_reasons=failure_reasons, - timings_ms=timings, - ) - - -def build_level1_summary(report: DiagnosticsReport) -> dict[str, Any]: - return { - "intent_correct": report.intent_correct, - "target_found": report.target_found, - "layers_used": report.layers_used, - "retrieval_sufficient": report.retrieval_sufficient, - "answer_mode": report.answer_mode, - "resolved_target": report.resolved_target, - "answer_policy_branch": report.answer_policy_branch, - "decision_reason": report.decision_reason, - "failure_reasons": report.failure_reasons, - } - - -def build_level2_detail(report: DiagnosticsReport) -> dict[str, Any]: - return { - "router_result": report.router_result, - "retrieval_request": report.retrieval_request, - "per_layer_outcome": report.per_layer_outcome, - "empty_layers": report.empty_layers, - "resolved_target": report.resolved_target, - "answer_policy_branch": report.answer_policy_branch, - "decision_reason": report.decision_reason, - "evidence_gate_input": report.evidence_gate_input, - "evidence_gate_decision": report.evidence_gate_decision, - "post_evidence_gate": report.post_evidence_gate, - "failure_reasons": report.failure_reasons, - "timings_ms": report.timings_ms, - } - - -def _router_result_to_dict(r: RouterResult) -> dict[str, Any]: - return { - "intent": r.intent, - "graph_id": r.graph_id, - "conversation_mode": r.conversation_mode, - "retrieval_profile": r.retrieval_profile, - "sub_intent": r.query_plan.sub_intent if r.query_plan else None, - "path_scope": list(getattr(r.retrieval_spec.filters, "path_scope", []) or []), - "layers": [str(q.layer_id) for q in (r.retrieval_spec.layer_queries or [])], - "symbol_resolution_status": r.symbol_resolution.status if r.symbol_resolution else None, - } - - -def _retrieval_request_to_dict(req: RetrievalRequest) -> dict[str, Any]: - return { - "rag_session_id": req.rag_session_id, - "query": req.query, - "sub_intent": req.sub_intent, - "path_scope": list(req.path_scope), - "requested_layers": list(req.requested_layers), - } diff --git a/src/app/modules/agent/runtime/steps/context/evidence_bundle_builder.py b/src/app/modules/agent/runtime/steps/context/evidence_bundle_builder.py deleted file mode 100644 index 8edeff7..0000000 --- a/src/app/modules/agent/runtime/steps/context/evidence_bundle_builder.py +++ /dev/null @@ -1,57 +0,0 @@ -"""Сборка EvidenceBundle из RetrievalResult и результата роутера.""" - -from __future__ import annotations - -from app.modules.agent.runtime.steps.context.contracts import EvidenceBundle, RetrievalResult, RouterResult - - -def build_evidence_bundle( - retrieval_result: RetrievalResult, - router_result: RouterResult, -) -> EvidenceBundle: - intent = router_result.intent or "CODE_QA" - sub_intent = (router_result.query_plan and router_result.query_plan.sub_intent) or "EXPLAIN" - resolved_target: str | None = None - target_type: str = "none" - - if retrieval_result.resolved_symbol: - resolved_target = retrieval_result.resolved_symbol - target_type = "symbol" - elif retrieval_result.file_candidates: - resolved_target = retrieval_result.file_candidates[0] - target_type = "file" - if retrieval_result.entrypoints and not resolved_target: - resolved_target = retrieval_result.entrypoints[0].get("title") or retrieval_result.entrypoints[0].get("path") - target_type = "entrypoint" - - summary = { - "chunk_count": len(retrieval_result.code_chunks), - "relation_count": len(retrieval_result.relations), - "semantic_hint_count": len(retrieval_result.semantic_hints), - "entrypoint_count": len(retrieval_result.entrypoints), - "test_candidate_count": len(retrieval_result.test_candidates), - "layers_with_hits": [ - o.layer_id for o in retrieval_result.layer_outcomes if o.hit_count > 0 - ], - "missing_layers": list(retrieval_result.missing_layers), - } - - file_candidates = list(retrieval_result.file_candidates) - target_symbols = list(retrieval_result.target_symbol_candidates) - - return EvidenceBundle( - resolved_intent=intent, - resolved_sub_intent=sub_intent, - resolved_target=resolved_target, - target_type=target_type, - target_symbol_candidates=target_symbols, - file_candidates=file_candidates, - code_chunks=list(retrieval_result.code_chunks), - relations=list(retrieval_result.relations), - entrypoints=list(retrieval_result.entrypoints), - test_evidence=list(retrieval_result.test_candidates), - evidence_count=len(retrieval_result.code_chunks), - sufficient=False, - failure_reasons=[], - retrieval_summary=summary, - ) diff --git a/src/app/modules/agent/runtime/steps/context/retrieval_request_builder.py b/src/app/modules/agent/runtime/steps/context/retrieval_request_builder.py deleted file mode 100644 index 05b8835..0000000 --- a/src/app/modules/agent/runtime/steps/context/retrieval_request_builder.py +++ /dev/null @@ -1,24 +0,0 @@ -"""Сборка RetrievalRequest из RouterResult для пайплайна CODE_QA.""" - -from __future__ import annotations - -from app.modules.agent.runtime.steps.context.contracts import RetrievalRequest, RouterResult - - -def build_retrieval_request(router_result: RouterResult, rag_session_id: str) -> RetrievalRequest: - query_plan = router_result.query_plan - spec = router_result.retrieval_spec - path_scope = list(getattr(spec.filters, "path_scope", []) or []) - layers = [str(q.layer_id) for q in (spec.layer_queries or [])] - return RetrievalRequest( - rag_session_id=rag_session_id, - query=query_plan.normalized or query_plan.raw or "", - sub_intent=query_plan.sub_intent or "EXPLAIN", - path_scope=path_scope, - keyword_hints=list(query_plan.keyword_hints or []), - symbol_candidates=list(query_plan.symbol_candidates or []), - requested_layers=layers, - retrieval_spec=spec, - retrieval_constraints=router_result.retrieval_constraints, - query_plan=query_plan, - ) diff --git a/src/app/modules/agent/runtime/steps/context/retrieval_result_builder.py b/src/app/modules/agent/runtime/steps/context/retrieval_result_builder.py deleted file mode 100644 index 7a4e1cd..0000000 --- a/src/app/modules/agent/runtime/steps/context/retrieval_result_builder.py +++ /dev/null @@ -1,241 +0,0 @@ -"""Сборка нормализованного RetrievalResult из сырых строк retrieval и отчёта.""" - -from __future__ import annotations - -import re - -from app.modules.agent.runtime.steps.context.contracts import CodeChunkItem, LayerOutcome, RetrievalResult -from app.modules.rag.retrieval.test_filter import is_test_path - -_ROUTE_RE = re.compile(r'@[\w\.]+\.(get|post|put|delete|patch|options|head)\(\s*["\']([^"\']+)["\']') -_DEF_RE = re.compile(r"async\s+def\s+(\w+)|def\s+(\w+)") - - -def build_retrieval_result( - raw_rows: list[dict], - retrieval_report: dict | None, - symbol_resolution: dict | None, -) -> RetrievalResult: - report = retrieval_report or {} - sym = symbol_resolution or {} - layers_seen: set[str] = set() - code_chunks: list[CodeChunkItem] = [] - relations: list[dict] = [] - semantic_hints: list[dict] = [] - entrypoint_rows: list[CodeChunkItem] = [] - test_candidates: list[dict] = [] - file_candidates: list[str] = [] - target_symbols: list[str] = [] - - for row in raw_rows: - chunk = _to_chunk(row) - layer = chunk.layer - path = chunk.path - if layer: - layers_seen.add(layer) - if path and path not in file_candidates: - file_candidates.append(path) - code_chunks.append(chunk) - - if layer == "C1_SYMBOL_CATALOG": - title = chunk.title.strip() - if title and title not in target_symbols: - target_symbols.append(title) - continue - if layer == "C2_DEPENDENCY_GRAPH": - relations.append(_relation_payload(chunk)) - continue - if layer == "C4_SEMANTIC_ROLES": - semantic_hints.append(_semantic_hint_payload(chunk)) - continue - if layer == "C3_ENTRYPOINTS": - entrypoint_rows.append(chunk) - continue - if is_test_path(path): - test_candidates.append({"path": path, "title": chunk.title, "content": chunk.content[:300]}) - - entrypoints = _normalize_entrypoints(entrypoint_rows, code_chunks) - executed = list(report.get("executed_layers") or []) - missing_layers = [lid for lid in executed if lid not in layers_seen] - layer_outcomes = _layer_outcomes(raw_rows, executed, layers_seen, report) - - resolved = str(sym.get("resolved_symbol") or "").strip() or None - status = str(sym.get("status") or "not_requested") - - return RetrievalResult( - target_symbol_candidates=target_symbols, - resolved_symbol=resolved, - symbol_resolution_status=status, - file_candidates=file_candidates, - code_chunks=code_chunks, - relations=relations, - semantic_hints=semantic_hints, - entrypoints=entrypoints, - test_candidates=test_candidates, - layer_outcomes=layer_outcomes, - missing_layers=missing_layers, - raw_rows=raw_rows, - retrieval_report=report, - ) - - -def _to_chunk(row: dict) -> CodeChunkItem: - return CodeChunkItem( - layer=str(row.get("layer") or ""), - path=str(row.get("path") or ""), - title=str(row.get("title") or ""), - content=str(row.get("content") or ""), - start_line=row.get("span_start"), - end_line=row.get("span_end"), - metadata=dict(row.get("metadata") or {}), - ) - - -def _normalize_entrypoints(entrypoint_rows: list[CodeChunkItem], code_chunks: list[CodeChunkItem]) -> list[dict]: - chunks_by_path: dict[str, list[CodeChunkItem]] = {} - for chunk in code_chunks: - chunks_by_path.setdefault(chunk.path, []).append(chunk) - - normalized: list[dict] = [] - seen: set[tuple[str, str, str, int | None, int | None]] = set() - for chunk in entrypoint_rows: - item = _entrypoint_payload(chunk, chunks_by_path.get(chunk.path, [])) - key = ( - str(item.get("http_method") or ""), - str(item.get("route_path") or ""), - str(item.get("path") or ""), - chunk.start_line, - chunk.end_line, - ) - if key in seen: - continue - seen.add(key) - normalized.append(item) - return sorted(normalized, key=_entrypoint_sort_key) - - -def _relation_payload(chunk: CodeChunkItem) -> dict: - metadata = dict(chunk.metadata or {}) - edge_type = str(metadata.get("edge_type") or "").strip() - src_qname = str(metadata.get("src_qname") or "").strip() - dst_ref = str(metadata.get("dst_ref") or "").strip() - return { - "path": chunk.path, - "start_line": chunk.start_line, - "end_line": chunk.end_line, - "edge_type": edge_type, - "source": src_qname, - "target": dst_ref, - "source_component": _component_name(src_qname), - "target_component": _component_name(dst_ref), - "has_retrieval_label": "dataflow_slice" in dst_ref or "dataflow_slice" in src_qname, - "metadata": metadata, - "content": chunk.content[:500], - } - - -def _semantic_hint_payload(chunk: CodeChunkItem) -> dict: - metadata = dict(chunk.metadata or {}) - return { - "path": chunk.path, - "title": chunk.title, - "symbol": metadata.get("symbol_name") or chunk.title, - "role": metadata.get("role"), - "confidence": metadata.get("confidence"), - "content": chunk.content[:300], - } - - -def _component_name(value: str) -> str: - cleaned = str(value or "").replace(".dataflow_slice", "").strip(". ") - if "." not in cleaned: - return cleaned - head, tail = cleaned.rsplit(".", 1) - return head if tail and not tail[:1].isupper() else cleaned - - -def _entrypoint_payload(chunk: CodeChunkItem, siblings: list[CodeChunkItem]) -> dict: - methods = [str(item).strip().upper() for item in list(dict(chunk.metadata).get("lang_payload", {}).get("methods", [])) if str(item).strip()] - method = methods[0] if methods else "" - route_path = _infer_route_path(chunk, siblings) - handler_symbol = _infer_handler_symbol(chunk, siblings) - return { - "path": chunk.path, - "title": chunk.title, - "start_line": chunk.start_line, - "end_line": chunk.end_line, - "http_method": method, - "route_path": route_path, - "handler_symbol": handler_symbol, - "handler_symbol_id": dict(chunk.metadata).get("handler_symbol_id"), - "route_or_command": dict(chunk.metadata).get("route_or_command"), - "metadata": chunk.metadata, - } - - -def _infer_route_path(chunk: CodeChunkItem, siblings: list[CodeChunkItem]) -> str: - for candidate in siblings: - if candidate.layer != "C0_SOURCE_CHUNKS": - continue - match = _ROUTE_RE.search(_window_text(candidate, chunk.start_line)) - if match: - return match.group(2).strip() - return "" - - -def _infer_handler_symbol(chunk: CodeChunkItem, siblings: list[CodeChunkItem]) -> str: - for candidate in siblings: - if candidate.layer != "C0_SOURCE_CHUNKS": - continue - match = _DEF_RE.search(_window_text(candidate, chunk.start_line, before=2, after=12)) - if match: - return match.group(1) or match.group(2) or "" - return "" - - -def _window_text(chunk: CodeChunkItem, target_line: int | None, *, before: int = 6, after: int = 8) -> str: - text = chunk.content or "" - if not text or not target_line or not chunk.start_line: - return text - lines = text.splitlines() - offset = max(0, target_line - chunk.start_line - before) - end = min(len(lines), target_line - chunk.start_line + after) - if offset >= end: - return text - return "\n".join(lines[offset:end]) - - -def _entrypoint_sort_key(item: dict) -> tuple[int, int, str, str, int]: - route_path = str(item.get("route_path") or "") - method = str(item.get("http_method") or "") - score = 0 - if route_path: - score += 3 - if route_path and route_path != "/": - score += 3 - if method: - score += 1 - return (-score, len(route_path or "zzzz"), method, str(item.get("path") or ""), int(item.get("start_line") or 0)) - - -def _layer_outcomes(raw_rows: list[dict], executed: list[str], layers_seen: set[str], report: dict) -> list[LayerOutcome]: - layer_outcomes = [ - LayerOutcome( - layer_id=layer_id, - hit_count=sum(1 for r in raw_rows if str(r.get("layer") or "") == layer_id), - empty=layer_id not in layers_seen, - fallback_used=bool((report.get("fallback") or {}).get("used") and report.get("retrieval_mode_by_layer", {}).get(layer_id)), - ) - for layer_id in executed - ] - if not executed and raw_rows: - for layer in layers_seen: - layer_outcomes.append( - LayerOutcome( - layer_id=layer, - hit_count=sum(1 for r in raw_rows if str(r.get("layer") or "") == layer), - empty=False, - fallback_used=False, - ) - ) - return layer_outcomes diff --git a/src/app/modules/agent/runtime/steps/explain/__init__.py b/src/app/modules/agent/runtime/steps/explain/__init__.py deleted file mode 100644 index 59bf6a9..0000000 --- a/src/app/modules/agent/runtime/steps/explain/__init__.py +++ /dev/null @@ -1,36 +0,0 @@ -from __future__ import annotations - -from importlib import import_module - -__all__ = [ - "CodeExcerpt", - "CodeExplainRetrieverV2", - "CodeGraphRepository", - "EvidenceItem", - "ExplainIntent", - "ExplainIntentBuilder", - "ExplainPack", - "LayeredRetrievalGateway", - "PromptBudgeter", - "TracePath", -] - - -def __getattr__(name: str): - module_map = { - "CodeExcerpt": "app.modules.agent.runtime.steps.explain.models", - "EvidenceItem": "app.modules.agent.runtime.steps.explain.models", - "ExplainIntent": "app.modules.agent.runtime.steps.explain.models", - "ExplainPack": "app.modules.agent.runtime.steps.explain.models", - "TracePath": "app.modules.agent.runtime.steps.explain.models", - "ExplainIntentBuilder": "app.modules.agent.runtime.steps.explain.intent_builder", - "PromptBudgeter": "app.modules.agent.runtime.steps.explain.budgeter", - "LayeredRetrievalGateway": "app.modules.agent.runtime.steps.explain.layered_gateway", - "CodeGraphRepository": "app.modules.agent.runtime.steps.explain.graph_repository", - "CodeExplainRetrieverV2": "app.modules.agent.runtime.steps.explain.retriever_v2", - } - module_name = module_map.get(name) - if module_name is None: - raise AttributeError(name) - module = import_module(module_name) - return getattr(module, name) diff --git a/src/app/modules/agent/runtime/steps/explain/budgeter.py b/src/app/modules/agent/runtime/steps/explain/budgeter.py deleted file mode 100644 index 4f925b5..0000000 --- a/src/app/modules/agent/runtime/steps/explain/budgeter.py +++ /dev/null @@ -1,62 +0,0 @@ -from __future__ import annotations - -import json - -from app.modules.agent.runtime.steps.explain.models import ExplainPack - - -class PromptBudgeter: - def __init__( - self, - *, - max_paths: int = 3, - max_symbols: int = 25, - max_excerpts: int = 40, - max_chars: int = 30000, - ) -> None: - self._max_paths = max_paths - self._max_symbols = max_symbols - self._max_excerpts = max_excerpts - self._max_chars = max_chars - - def build_prompt_input(self, question: str, pack: ExplainPack) -> str: - symbol_ids: list[str] = [] - for path in pack.trace_paths[: self._max_paths]: - for symbol_id in path.symbol_ids: - if symbol_id and symbol_id not in symbol_ids and len(symbol_ids) < self._max_symbols: - symbol_ids.append(symbol_id) - excerpts = [] - total_chars = 0 - for excerpt in pack.code_excerpts: - if symbol_ids and excerpt.symbol_id and excerpt.symbol_id not in symbol_ids: - continue - body = excerpt.content.strip() - remaining = self._max_chars - total_chars - if remaining <= 0 or len(excerpts) >= self._max_excerpts: - break - if len(body) > remaining: - body = body[:remaining].rstrip() + "...[truncated]" - excerpts.append( - { - "evidence_id": excerpt.evidence_id, - "title": excerpt.title, - "path": excerpt.path, - "start_line": excerpt.start_line, - "end_line": excerpt.end_line, - "focus": excerpt.focus, - "content": body, - } - ) - total_chars += len(body) - payload = { - "question": question, - "intent": pack.intent.model_dump(mode="json"), - "selected_entrypoints": [item.model_dump(mode="json") for item in pack.selected_entrypoints[:5]], - "seed_symbols": [item.model_dump(mode="json") for item in pack.seed_symbols[: self._max_symbols]], - "trace_paths": [path.model_dump(mode="json") for path in pack.trace_paths[: self._max_paths]], - "evidence_index": {key: value.model_dump(mode="json") for key, value in pack.evidence_index.items()}, - "code_excerpts": excerpts, - "missing": pack.missing, - "conflicts": pack.conflicts, - } - return json.dumps(payload, ensure_ascii=False, indent=2) diff --git a/src/app/modules/agent/runtime/steps/explain/excerpt_planner.py b/src/app/modules/agent/runtime/steps/explain/excerpt_planner.py deleted file mode 100644 index 406073e..0000000 --- a/src/app/modules/agent/runtime/steps/explain/excerpt_planner.py +++ /dev/null @@ -1,59 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.runtime.steps.explain.models import CodeExcerpt, LayeredRetrievalItem - - -class ExcerptPlanner: - _FOCUS_TOKENS = ("raise", "except", "db", "select", "insert", "update", "delete", "http", "publish", "emit") - - def plan(self, chunk: LayeredRetrievalItem, *, evidence_id: str, symbol_id: str | None) -> list[CodeExcerpt]: - location = chunk.location - if location is None: - return [] - excerpts = [ - CodeExcerpt( - evidence_id=evidence_id, - symbol_id=symbol_id, - title=chunk.title, - path=location.path, - start_line=location.start_line, - end_line=location.end_line, - content=chunk.content.strip(), - focus="overview", - ) - ] - focus = self._focus_excerpt(chunk, evidence_id=evidence_id, symbol_id=symbol_id) - if focus is not None: - excerpts.append(focus) - return excerpts - - def _focus_excerpt( - self, - chunk: LayeredRetrievalItem, - *, - evidence_id: str, - symbol_id: str | None, - ) -> CodeExcerpt | None: - location = chunk.location - if location is None: - return None - lines = chunk.content.splitlines() - for index, line in enumerate(lines): - lowered = line.lower() - if not any(token in lowered for token in self._FOCUS_TOKENS): - continue - start = max(0, index - 2) - end = min(len(lines), index + 3) - if end - start >= len(lines): - return None - return CodeExcerpt( - evidence_id=evidence_id, - symbol_id=symbol_id, - title=f"{chunk.title}:focus", - path=location.path, - start_line=(location.start_line or 1) + start, - end_line=(location.start_line or 1) + end - 1, - content="\n".join(lines[start:end]).strip(), - focus="focus", - ) - return None diff --git a/src/app/modules/agent/runtime/steps/explain/graph_repository.py b/src/app/modules/agent/runtime/steps/explain/graph_repository.py deleted file mode 100644 index 6622e7e..0000000 --- a/src/app/modules/agent/runtime/steps/explain/graph_repository.py +++ /dev/null @@ -1,216 +0,0 @@ -from __future__ import annotations - -import json - -from sqlalchemy import text - -from app.modules.agent.runtime.steps.explain.models import CodeLocation, LayeredRetrievalItem -from app.modules.shared.db import get_engine - - -class CodeGraphRepository: - def get_out_edges( - self, - rag_session_id: str, - src_symbol_ids: list[str], - edge_types: list[str], - limit_per_src: int, - ) -> list[LayeredRetrievalItem]: - if not src_symbol_ids: - return [] - sql = """ - SELECT path, content, layer, title, metadata_json, span_start, span_end - FROM rag_chunks - WHERE rag_session_id = :sid - AND layer = 'C2_DEPENDENCY_GRAPH' - AND CAST(metadata_json AS jsonb)->>'src_symbol_id' = ANY(:src_ids) - AND CAST(metadata_json AS jsonb)->>'edge_type' = ANY(:edge_types) - ORDER BY path, span_start - """ - with get_engine().connect() as conn: - rows = conn.execute( - text(sql), - {"sid": rag_session_id, "src_ids": src_symbol_ids, "edge_types": edge_types}, - ).mappings().fetchall() - grouped: dict[str, int] = {} - items: list[LayeredRetrievalItem] = [] - for row in rows: - metadata = self._loads(row.get("metadata_json")) - src_symbol_id = str(metadata.get("src_symbol_id") or "") - grouped[src_symbol_id] = grouped.get(src_symbol_id, 0) + 1 - if grouped[src_symbol_id] > limit_per_src: - continue - items.append(self._to_item(row, metadata)) - return items - - def get_in_edges( - self, - rag_session_id: str, - dst_symbol_ids: list[str], - edge_types: list[str], - limit_per_dst: int, - ) -> list[LayeredRetrievalItem]: - if not dst_symbol_ids: - return [] - sql = """ - SELECT path, content, layer, title, metadata_json, span_start, span_end - FROM rag_chunks - WHERE rag_session_id = :sid - AND layer = 'C2_DEPENDENCY_GRAPH' - AND CAST(metadata_json AS jsonb)->>'dst_symbol_id' = ANY(:dst_ids) - AND CAST(metadata_json AS jsonb)->>'edge_type' = ANY(:edge_types) - ORDER BY path, span_start - """ - with get_engine().connect() as conn: - rows = conn.execute( - text(sql), - {"sid": rag_session_id, "dst_ids": dst_symbol_ids, "edge_types": edge_types}, - ).mappings().fetchall() - grouped: dict[str, int] = {} - items: list[LayeredRetrievalItem] = [] - for row in rows: - metadata = self._loads(row.get("metadata_json")) - dst_symbol_id = str(metadata.get("dst_symbol_id") or "") - grouped[dst_symbol_id] = grouped.get(dst_symbol_id, 0) + 1 - if grouped[dst_symbol_id] > limit_per_dst: - continue - items.append(self._to_item(row, metadata)) - return items - - def resolve_symbol_by_ref( - self, - rag_session_id: str, - dst_ref: str, - package_hint: str | None = None, - ) -> LayeredRetrievalItem | None: - ref = (dst_ref or "").strip() - if not ref: - return None - with get_engine().connect() as conn: - rows = conn.execute( - text( - """ - SELECT path, content, layer, title, metadata_json, span_start, span_end, qname - FROM rag_chunks - WHERE rag_session_id = :sid - AND layer = 'C1_SYMBOL_CATALOG' - AND (qname = :ref OR title = :ref OR qname LIKE :tail) - ORDER BY path - LIMIT 12 - """ - ), - {"sid": rag_session_id, "ref": ref, "tail": f"%{ref}"}, - ).mappings().fetchall() - best: LayeredRetrievalItem | None = None - best_score = -1 - for row in rows: - metadata = self._loads(row.get("metadata_json")) - package = str(metadata.get("package_or_module") or "") - score = 0 - if str(row.get("qname") or "") == ref: - score += 3 - if str(row.get("title") or "") == ref: - score += 2 - if package_hint and package.startswith(package_hint): - score += 3 - if package_hint and package_hint in str(row.get("path") or ""): - score += 1 - if score > best_score: - best = self._to_item(row, metadata) - best_score = score - return best - - def get_symbols_by_ids(self, rag_session_id: str, symbol_ids: list[str]) -> list[LayeredRetrievalItem]: - if not symbol_ids: - return [] - with get_engine().connect() as conn: - rows = conn.execute( - text( - """ - SELECT path, content, layer, title, metadata_json, span_start, span_end - FROM rag_chunks - WHERE rag_session_id = :sid - AND layer = 'C1_SYMBOL_CATALOG' - AND symbol_id = ANY(:symbol_ids) - ORDER BY path, span_start - """ - ), - {"sid": rag_session_id, "symbol_ids": symbol_ids}, - ).mappings().fetchall() - return [self._to_item(row, self._loads(row.get("metadata_json"))) for row in rows] - - def get_chunks_by_symbol_ids( - self, - rag_session_id: str, - symbol_ids: list[str], - prefer_chunk_type: str = "symbol_block", - ) -> list[LayeredRetrievalItem]: - symbols = self.get_symbols_by_ids(rag_session_id, symbol_ids) - chunks: list[LayeredRetrievalItem] = [] - for symbol in symbols: - location = symbol.location - if location is None: - continue - chunk = self._chunk_for_symbol(rag_session_id, symbol, prefer_chunk_type=prefer_chunk_type) - if chunk is not None: - chunks.append(chunk) - return chunks - - def _chunk_for_symbol( - self, - rag_session_id: str, - symbol: LayeredRetrievalItem, - *, - prefer_chunk_type: str, - ) -> LayeredRetrievalItem | None: - location = symbol.location - if location is None: - return None - with get_engine().connect() as conn: - rows = conn.execute( - text( - """ - SELECT path, content, layer, title, metadata_json, span_start, span_end - FROM rag_chunks - WHERE rag_session_id = :sid - AND layer = 'C0_SOURCE_CHUNKS' - AND path = :path - AND COALESCE(span_start, 0) <= :end_line - AND COALESCE(span_end, 999999) >= :start_line - ORDER BY - CASE WHEN CAST(metadata_json AS jsonb)->>'chunk_type' = :prefer_chunk_type THEN 0 ELSE 1 END, - ABS(COALESCE(span_start, 0) - :start_line) - LIMIT 1 - """ - ), - { - "sid": rag_session_id, - "path": location.path, - "start_line": location.start_line or 0, - "end_line": location.end_line or 999999, - "prefer_chunk_type": prefer_chunk_type, - }, - ).mappings().fetchall() - if not rows: - return None - row = rows[0] - return self._to_item(row, self._loads(row.get("metadata_json"))) - - def _to_item(self, row, metadata: dict) -> LayeredRetrievalItem: - return LayeredRetrievalItem( - source=str(row.get("path") or ""), - content=str(row.get("content") or ""), - layer=str(row.get("layer") or ""), - title=str(row.get("title") or ""), - metadata=metadata, - location=CodeLocation( - path=str(row.get("path") or ""), - start_line=row.get("span_start"), - end_line=row.get("span_end"), - ), - ) - - def _loads(self, value) -> dict: - if not value: - return {} - return json.loads(str(value)) diff --git a/src/app/modules/agent/runtime/steps/explain/intent_builder.py b/src/app/modules/agent/runtime/steps/explain/intent_builder.py deleted file mode 100644 index 79fb59a..0000000 --- a/src/app/modules/agent/runtime/steps/explain/intent_builder.py +++ /dev/null @@ -1,102 +0,0 @@ -from __future__ import annotations - -import re - -from app.modules.agent.runtime.steps.explain.models import ExplainHints, ExplainIntent -from app.modules.rag.retrieval.query_terms import extract_query_terms - - -class ExplainIntentBuilder: - _ROUTE_RE = re.compile(r"(/[A-Za-z0-9_./{}:-]+)") - _FILE_RE = re.compile(r"([A-Za-z0-9_./-]+\.py)") - _SYMBOL_RE = re.compile(r"\b([A-Z][A-Za-z0-9_]*\.[A-Za-z_][A-Za-z0-9_]*|[A-Z][A-Za-z0-9_]{2,}|[a-z_][A-Za-z0-9_]{2,})\b") - _COMMAND_RE = re.compile(r"`([A-Za-z0-9:_-]+)`") - _TEST_KEYWORDS = ( - "тест", - "tests", - "test ", - "unit-test", - "unit test", - "юнит-тест", - "pytest", - "spec", - "как покрыто тестами", - "как проверяется", - "how is it tested", - "how it's tested", - ) - - def build(self, user_query: str) -> ExplainIntent: - normalized = " ".join((user_query or "").split()) - lowered = normalized.lower() - keywords = self._keywords(normalized) - hints = ExplainHints( - paths=self._dedupe(self._FILE_RE.findall(normalized)), - symbols=self._symbols(normalized), - endpoints=self._dedupe(self._ROUTE_RE.findall(normalized)), - commands=self._commands(normalized, lowered), - ) - return ExplainIntent( - raw_query=user_query, - normalized_query=normalized, - keywords=keywords[:12], - hints=hints, - include_tests=self._include_tests(lowered), - expected_entry_types=self._entry_types(lowered, hints), - depth=self._depth(lowered), - ) - - def _keywords(self, text: str) -> list[str]: - keywords = extract_query_terms(text) - for token in self._symbols(text): - if token not in keywords: - keywords.append(token) - for token in self._ROUTE_RE.findall(text): - if token not in keywords: - keywords.append(token) - return self._dedupe(keywords) - - def _symbols(self, text: str) -> list[str]: - values = [] - for raw in self._SYMBOL_RE.findall(text): - token = raw.strip() - if len(token) < 3: - continue - if token.endswith(".py"): - continue - values.append(token) - return self._dedupe(values) - - def _commands(self, text: str, lowered: str) -> list[str]: - values = list(self._COMMAND_RE.findall(text)) - if " command " in f" {lowered} ": - values.extend(re.findall(r"command\s+([A-Za-z0-9:_-]+)", lowered)) - if " cli " in f" {lowered} ": - values.extend(re.findall(r"cli\s+([A-Za-z0-9:_-]+)", lowered)) - return self._dedupe(values) - - def _entry_types(self, lowered: str, hints: ExplainHints) -> list[str]: - if hints.endpoints or any(token in lowered for token in ("endpoint", "route", "handler", "http", "api")): - return ["http"] - if hints.commands or any(token in lowered for token in ("cli", "command", "click", "typer")): - return ["cli"] - return ["http", "cli"] - - def _depth(self, lowered: str) -> str: - if any(token in lowered for token in ("deep", "подроб", "деталь", "full flow", "trace")): - return "deep" - if any(token in lowered for token in ("high level", "overview", "кратко", "summary")): - return "high" - return "medium" - - def _include_tests(self, lowered: str) -> bool: - normalized = f" {lowered} " - return any(token in normalized for token in self._TEST_KEYWORDS) - - def _dedupe(self, values: list[str]) -> list[str]: - result: list[str] = [] - for value in values: - item = value.strip() - if item and item not in result: - result.append(item) - return result diff --git a/src/app/modules/agent/runtime/steps/explain/layered_gateway.py b/src/app/modules/agent/runtime/steps/explain/layered_gateway.py deleted file mode 100644 index 79ca52d..0000000 --- a/src/app/modules/agent/runtime/steps/explain/layered_gateway.py +++ /dev/null @@ -1,289 +0,0 @@ -from __future__ import annotations - -import logging -from dataclasses import dataclass, field -from typing import TYPE_CHECKING, Callable - -from app.modules.agent.runtime.steps.explain.models import CodeLocation, LayeredRetrievalItem -from app.modules.rag.retrieval.test_filter import build_test_filters, debug_disable_test_filter - -LOGGER = logging.getLogger(__name__) - -if TYPE_CHECKING: - from app.modules.rag.persistence.repository import RagRepository - from app.modules.rag.embedding.gigachat_embedder import GigaChatEmbedder - - -@dataclass(slots=True) -class LayerRetrievalResult: - items: list[LayeredRetrievalItem] - missing: list[str] = field(default_factory=list) - - -class LayeredRetrievalGateway: - def __init__(self, repository: RagRepository, embedder: GigaChatEmbedder) -> None: - self._repository = repository - self._embedder = embedder - - def retrieve_layer( - self, - rag_session_id: str, - query: str, - layer: str, - *, - limit: int, - path_prefixes: list[str] | None = None, - exclude_tests: bool = True, - prefer_non_tests: bool = False, - include_spans: bool = False, - ) -> LayerRetrievalResult: - effective_exclude_tests = exclude_tests and not debug_disable_test_filter() - filter_args = self._filter_args(effective_exclude_tests) - query_embedding: list[float] | None = None - try: - query_embedding = self._embedder.embed([query])[0] - rows = self._repository.retrieve( - rag_session_id, - query_embedding, - query_text=query, - limit=limit, - layers=[layer], - path_prefixes=path_prefixes, - exclude_path_prefixes=filter_args["exclude_path_prefixes"], - exclude_like_patterns=filter_args["exclude_like_patterns"], - prefer_non_tests=prefer_non_tests or not effective_exclude_tests, - ) - return self._success_result( - rows, - rag_session_id=rag_session_id, - label="layered retrieval", - include_spans=include_spans, - layer=layer, - exclude_tests=effective_exclude_tests, - path_prefixes=path_prefixes, - ) - except Exception as exc: - if query_embedding is None: - self._log_failure( - label="layered retrieval", - rag_session_id=rag_session_id, - layer=layer, - exclude_tests=effective_exclude_tests, - path_prefixes=path_prefixes, - exc=exc, - ) - return LayerRetrievalResult(items=[], missing=[self._failure_missing(f"layer:{layer} retrieval_failed", exc)]) - retry_result = self._retry_without_test_filter( - operation=lambda: self._repository.retrieve( - rag_session_id, - query_embedding, - query_text=query, - limit=limit, - layers=[layer], - path_prefixes=path_prefixes, - exclude_path_prefixes=None, - exclude_like_patterns=None, - prefer_non_tests=True, - ), - label="layered retrieval", - rag_session_id=rag_session_id, - include_spans=include_spans, - layer=layer, - exclude_tests=effective_exclude_tests, - path_prefixes=path_prefixes, - exc=exc, - missing_prefix=f"layer:{layer} retrieval_failed", - ) - if retry_result is not None: - return retry_result - return LayerRetrievalResult(items=[], missing=[self._failure_missing(f"layer:{layer} retrieval_failed", exc)]) - - def retrieve_lexical_code( - self, - rag_session_id: str, - query: str, - *, - limit: int, - path_prefixes: list[str] | None = None, - exclude_tests: bool = True, - include_spans: bool = False, - ) -> LayerRetrievalResult: - effective_exclude_tests = exclude_tests and not debug_disable_test_filter() - filter_args = self._filter_args(effective_exclude_tests) - try: - rows = self._repository.retrieve_lexical_code( - rag_session_id, - query_text=query, - limit=limit, - path_prefixes=path_prefixes, - exclude_path_prefixes=filter_args["exclude_path_prefixes"], - exclude_like_patterns=filter_args["exclude_like_patterns"], - prefer_non_tests=not effective_exclude_tests, - ) - return self._success_result( - rows, - rag_session_id=rag_session_id, - label="lexical retrieval", - include_spans=include_spans, - exclude_tests=effective_exclude_tests, - path_prefixes=path_prefixes, - ) - except Exception as exc: - retry_result = self._retry_without_test_filter( - operation=lambda: self._repository.retrieve_lexical_code( - rag_session_id, - query_text=query, - limit=limit, - path_prefixes=path_prefixes, - exclude_path_prefixes=None, - exclude_like_patterns=None, - prefer_non_tests=True, - ), - label="lexical retrieval", - rag_session_id=rag_session_id, - include_spans=include_spans, - exclude_tests=effective_exclude_tests, - path_prefixes=path_prefixes, - exc=exc, - missing_prefix="layer:C0 lexical_retrieval_failed", - ) - if retry_result is not None: - return retry_result - return LayerRetrievalResult(items=[], missing=[self._failure_missing("layer:C0 lexical_retrieval_failed", exc)]) - - def _retry_without_test_filter( - self, - *, - operation: Callable[[], list[dict]], - label: str, - rag_session_id: str, - include_spans: bool, - exclude_tests: bool, - path_prefixes: list[str] | None, - exc: Exception, - missing_prefix: str, - layer: str | None = None, - ) -> LayerRetrievalResult | None: - if not exclude_tests: - self._log_failure( - label=label, - rag_session_id=rag_session_id, - layer=layer, - exclude_tests=exclude_tests, - path_prefixes=path_prefixes, - exc=exc, - ) - return None - self._log_failure( - label=label, - rag_session_id=rag_session_id, - layer=layer, - exclude_tests=exclude_tests, - path_prefixes=path_prefixes, - exc=exc, - retried_without_test_filter=True, - ) - try: - rows = operation() - except Exception as retry_exc: - self._log_failure( - label=f"{label} retry", - rag_session_id=rag_session_id, - layer=layer, - exclude_tests=False, - path_prefixes=path_prefixes, - exc=retry_exc, - ) - return None - result = self._success_result( - rows, - rag_session_id=rag_session_id, - label=f"{label} retry", - include_spans=include_spans, - layer=layer, - exclude_tests=False, - path_prefixes=path_prefixes, - ) - result.missing.append(f"{missing_prefix}:retried_without_test_filter") - return result - - def _success_result( - self, - rows: list[dict], - *, - rag_session_id: str, - label: str, - include_spans: bool, - exclude_tests: bool, - path_prefixes: list[str] | None, - layer: str | None = None, - ) -> LayerRetrievalResult: - items = [self._to_item(row, include_spans=include_spans) for row in rows] - LOGGER.warning( - "%s: rag_session_id=%s layer=%s exclude_tests=%s path_prefixes=%s returned_count=%s top_paths=%s", - label, - rag_session_id, - layer, - exclude_tests, - path_prefixes or [], - len(items), - [item.source for item in items[:3]], - ) - return LayerRetrievalResult(items=items) - - def _log_failure( - self, - *, - label: str, - rag_session_id: str, - exclude_tests: bool, - path_prefixes: list[str] | None, - exc: Exception, - layer: str | None = None, - retried_without_test_filter: bool = False, - ) -> None: - LOGGER.warning( - "%s failed: rag_session_id=%s layer=%s exclude_tests=%s path_prefixes=%s retried_without_test_filter=%s error=%s", - label, - rag_session_id, - layer, - exclude_tests, - path_prefixes or [], - retried_without_test_filter, - self._exception_summary(exc), - exc_info=True, - ) - - def _filter_args(self, exclude_tests: bool) -> dict[str, list[str] | None]: - test_filters = build_test_filters() if exclude_tests else None - return { - "exclude_path_prefixes": test_filters.exclude_path_prefixes if test_filters else None, - "exclude_like_patterns": test_filters.exclude_like_patterns if test_filters else None, - } - - def _failure_missing(self, prefix: str, exc: Exception) -> str: - return f"{prefix}:{self._exception_summary(exc)}" - - def _exception_summary(self, exc: Exception) -> str: - message = " ".join(str(exc).split()) - if len(message) > 180: - message = message[:177] + "..." - return f"{type(exc).__name__}:{message or 'no_message'}" - - def _to_item(self, row: dict, *, include_spans: bool) -> LayeredRetrievalItem: - location = None - if include_spans: - location = CodeLocation( - path=str(row.get("path") or ""), - start_line=row.get("span_start"), - end_line=row.get("span_end"), - ) - return LayeredRetrievalItem( - source=str(row.get("path") or ""), - content=str(row.get("content") or ""), - layer=str(row.get("layer") or ""), - title=str(row.get("title") or ""), - metadata=dict(row.get("metadata", {}) or {}), - score=row.get("distance"), - location=location, - ) diff --git a/src/app/modules/agent/runtime/steps/explain/models.py b/src/app/modules/agent/runtime/steps/explain/models.py deleted file mode 100644 index 90552cd..0000000 --- a/src/app/modules/agent/runtime/steps/explain/models.py +++ /dev/null @@ -1,91 +0,0 @@ -from __future__ import annotations - -from typing import Any, Literal - -from pydantic import BaseModel, ConfigDict, Field - - -class ExplainHints(BaseModel): - model_config = ConfigDict(extra="forbid") - - paths: list[str] = Field(default_factory=list) - symbols: list[str] = Field(default_factory=list) - endpoints: list[str] = Field(default_factory=list) - commands: list[str] = Field(default_factory=list) - - -class ExplainIntent(BaseModel): - model_config = ConfigDict(extra="forbid") - - raw_query: str - normalized_query: str - keywords: list[str] = Field(default_factory=list) - hints: ExplainHints = Field(default_factory=ExplainHints) - include_tests: bool = False - expected_entry_types: list[Literal["http", "cli"]] = Field(default_factory=list) - depth: Literal["high", "medium", "deep"] = "medium" - - -class CodeLocation(BaseModel): - model_config = ConfigDict(extra="forbid") - - path: str - start_line: int | None = None - end_line: int | None = None - - -class LayeredRetrievalItem(BaseModel): - model_config = ConfigDict(extra="forbid") - - source: str - content: str - layer: str - title: str - metadata: dict[str, Any] = Field(default_factory=dict) - score: float | None = None - location: CodeLocation | None = None - - -class TracePath(BaseModel): - model_config = ConfigDict(extra="forbid") - - symbol_ids: list[str] = Field(default_factory=list) - score: float = 0.0 - entrypoint_id: str | None = None - notes: list[str] = Field(default_factory=list) - - -class EvidenceItem(BaseModel): - model_config = ConfigDict(extra="forbid") - - evidence_id: str - kind: Literal["entrypoint", "symbol", "edge", "excerpt"] - summary: str - location: CodeLocation | None = None - supports: list[str] = Field(default_factory=list) - - -class CodeExcerpt(BaseModel): - model_config = ConfigDict(extra="forbid") - - evidence_id: str - symbol_id: str | None = None - title: str - path: str - start_line: int | None = None - end_line: int | None = None - content: str - focus: str = "overview" - - -class ExplainPack(BaseModel): - model_config = ConfigDict(extra="forbid") - - intent: ExplainIntent - selected_entrypoints: list[LayeredRetrievalItem] = Field(default_factory=list) - seed_symbols: list[LayeredRetrievalItem] = Field(default_factory=list) - trace_paths: list[TracePath] = Field(default_factory=list) - evidence_index: dict[str, EvidenceItem] = Field(default_factory=dict) - code_excerpts: list[CodeExcerpt] = Field(default_factory=list) - missing: list[str] = Field(default_factory=list) - conflicts: list[str] = Field(default_factory=list) diff --git a/src/app/modules/agent/runtime/steps/explain/retriever_v2.py b/src/app/modules/agent/runtime/steps/explain/retriever_v2.py deleted file mode 100644 index bba502c..0000000 --- a/src/app/modules/agent/runtime/steps/explain/retriever_v2.py +++ /dev/null @@ -1,328 +0,0 @@ -from __future__ import annotations - -import logging -from typing import TYPE_CHECKING - -from app.modules.rag.contracts.enums import RagLayer -from app.modules.agent.runtime.steps.explain.intent_builder import ExplainIntentBuilder -from app.modules.agent.runtime.steps.explain.layered_gateway import LayerRetrievalResult, LayeredRetrievalGateway -from app.modules.agent.runtime.steps.explain.models import CodeExcerpt, EvidenceItem, ExplainPack, LayeredRetrievalItem -from app.modules.agent.runtime.steps.explain.source_excerpt_fetcher import SourceExcerptFetcher -from app.modules.agent.runtime.steps.explain.trace_builder import TraceBuilder -from app.modules.rag.retrieval.test_filter import exclude_tests_default, is_test_path - -LOGGER = logging.getLogger(__name__) -_MIN_EXCERPTS = 2 - -if TYPE_CHECKING: - from app.modules.agent.runtime.steps.explain.graph_repository import CodeGraphRepository - from app.modules.agent.runtime.steps.explain.models import ExplainIntent - - -class CodeExplainRetrieverV2: - def __init__( - self, - gateway: LayeredRetrievalGateway, - graph_repository: CodeGraphRepository, - intent_builder: ExplainIntentBuilder | None = None, - trace_builder: TraceBuilder | None = None, - excerpt_fetcher: SourceExcerptFetcher | None = None, - ) -> None: - self._gateway = gateway - self._graph = graph_repository - self._intent_builder = intent_builder or ExplainIntentBuilder() - self._trace_builder = trace_builder or TraceBuilder(graph_repository) - self._excerpt_fetcher = excerpt_fetcher or SourceExcerptFetcher(graph_repository) - - def build_pack( - self, - rag_session_id: str, - user_query: str, - *, - file_candidates: list[dict] | None = None, - ) -> ExplainPack: - intent = self._intent_builder.build(user_query) - path_prefixes = _path_prefixes(intent, file_candidates or []) - exclude_tests = exclude_tests_default() and not intent.include_tests - pack = self._run_pass(rag_session_id, intent, path_prefixes, exclude_tests=exclude_tests) - if exclude_tests and len(pack.code_excerpts) < _MIN_EXCERPTS: - self._merge_test_fallback(pack, rag_session_id, intent, path_prefixes) - self._log_pack(rag_session_id, pack) - return pack - - def _run_pass( - self, - rag_session_id: str, - intent: ExplainIntent, - path_prefixes: list[str], - *, - exclude_tests: bool, - ) -> ExplainPack: - missing: list[str] = [] - entrypoints_result = self._entrypoints(rag_session_id, intent, path_prefixes, exclude_tests=exclude_tests) - missing.extend(entrypoints_result.missing) - selected_entrypoints = self._filter_entrypoints(intent, entrypoints_result.items) - if not selected_entrypoints: - missing.append("layer:C3 empty") - seed_result = self._seed_symbols(rag_session_id, intent, path_prefixes, selected_entrypoints, exclude_tests=exclude_tests) - missing.extend(seed_result.missing) - seed_symbols = seed_result.items - if not seed_symbols: - missing.append("layer:C1 empty") - depth = 4 if intent.depth == "deep" else 3 if intent.depth == "medium" else 2 - trace_paths = self._trace_builder.build_paths(rag_session_id, seed_symbols, max_depth=depth) if seed_symbols else [] - excerpts, excerpt_evidence = self._excerpt_fetcher.fetch(rag_session_id, trace_paths) if trace_paths else ([], {}) - if not excerpts: - lexical_result = self._gateway.retrieve_lexical_code( - rag_session_id, - intent.normalized_query, - limit=6, - path_prefixes=path_prefixes or None, - exclude_tests=exclude_tests, - include_spans=True, - ) - missing.extend(lexical_result.missing) - excerpts, excerpt_evidence = _lexical_excerpts(lexical_result.items) - if not excerpts: - missing.append("layer:C0 empty") - evidence_index = _evidence_index(selected_entrypoints, seed_symbols) - evidence_index.update(excerpt_evidence) - missing.extend(_missing(selected_entrypoints, seed_symbols, trace_paths, excerpts)) - return ExplainPack( - intent=intent, - selected_entrypoints=selected_entrypoints, - seed_symbols=seed_symbols, - trace_paths=trace_paths, - evidence_index=evidence_index, - code_excerpts=excerpts, - missing=_cleanup_missing(_dedupe(missing), has_excerpts=bool(excerpts)), - conflicts=[], - ) - - def _merge_test_fallback( - self, - pack: ExplainPack, - rag_session_id: str, - intent: ExplainIntent, - path_prefixes: list[str], - ) -> None: - lexical_result = self._gateway.retrieve_lexical_code( - rag_session_id, - intent.normalized_query, - limit=6, - path_prefixes=path_prefixes or None, - exclude_tests=False, - include_spans=True, - ) - excerpt_offset = len([key for key in pack.evidence_index if key.startswith("excerpt_")]) - excerpts, evidence = _lexical_excerpts( - lexical_result.items, - start_index=excerpt_offset, - is_test_fallback=True, - ) - if not excerpts: - pack.missing = _dedupe(pack.missing + lexical_result.missing) - return - seen = {(item.path, item.start_line, item.end_line, item.content) for item in pack.code_excerpts} - for excerpt in excerpts: - key = (excerpt.path, excerpt.start_line, excerpt.end_line, excerpt.content) - if key in seen: - continue - pack.code_excerpts.append(excerpt) - seen.add(key) - pack.evidence_index.update(evidence) - pack.missing = _cleanup_missing(_dedupe(pack.missing + lexical_result.missing), has_excerpts=bool(pack.code_excerpts)) - - def _entrypoints( - self, - rag_session_id: str, - intent: ExplainIntent, - path_prefixes: list[str], - *, - exclude_tests: bool, - ) -> LayerRetrievalResult: - return self._gateway.retrieve_layer( - rag_session_id, - intent.normalized_query, - RagLayer.CODE_ENTRYPOINTS, - limit=6, - path_prefixes=path_prefixes or None, - exclude_tests=exclude_tests, - prefer_non_tests=True, - include_spans=True, - ) - - def _filter_entrypoints(self, intent: ExplainIntent, items: list[LayeredRetrievalItem]) -> list[LayeredRetrievalItem]: - if not intent.expected_entry_types: - return items[:3] - filtered = [item for item in items if str(item.metadata.get("entry_type") or "") in intent.expected_entry_types] - return filtered[:3] or items[:3] - - def _seed_symbols( - self, - rag_session_id: str, - intent: ExplainIntent, - path_prefixes: list[str], - entrypoints: list[LayeredRetrievalItem], - *, - exclude_tests: bool, - ) -> LayerRetrievalResult: - symbol_result = self._gateway.retrieve_layer( - rag_session_id, - intent.normalized_query, - RagLayer.CODE_SYMBOL_CATALOG, - limit=12, - path_prefixes=path_prefixes or None, - exclude_tests=exclude_tests, - prefer_non_tests=True, - include_spans=True, - ) - handlers: list[LayeredRetrievalItem] = [] - handler_ids = [str(item.metadata.get("handler_symbol_id") or "") for item in entrypoints] - if handler_ids: - handlers = self._graph.get_symbols_by_ids(rag_session_id, [item for item in handler_ids if item]) - seeds: list[LayeredRetrievalItem] = [] - seen: set[str] = set() - for item in handlers + symbol_result.items: - symbol_id = str(item.metadata.get("symbol_id") or "") - if not symbol_id or symbol_id in seen: - continue - seen.add(symbol_id) - seeds.append(item) - if len(seeds) >= 8: - break - return LayerRetrievalResult(items=seeds, missing=list(symbol_result.missing)) - - def _log_pack(self, rag_session_id: str, pack: ExplainPack) -> None: - prod_excerpt_count = len([excerpt for excerpt in pack.code_excerpts if not _is_test_excerpt(excerpt)]) - test_excerpt_count = len(pack.code_excerpts) - prod_excerpt_count - LOGGER.warning( - "code explain pack: rag_session_id=%s entrypoints=%s seeds=%s paths=%s excerpts=%s prod_excerpt_count=%s test_excerpt_count=%s missing=%s", - rag_session_id, - len(pack.selected_entrypoints), - len(pack.seed_symbols), - len(pack.trace_paths), - len(pack.code_excerpts), - prod_excerpt_count, - test_excerpt_count, - pack.missing, - ) - - -def _evidence_index( - entrypoints: list[LayeredRetrievalItem], - seed_symbols: list[LayeredRetrievalItem], -) -> dict[str, EvidenceItem]: - result: dict[str, EvidenceItem] = {} - for index, item in enumerate(entrypoints, start=1): - evidence_id = f"entrypoint_{index}" - result[evidence_id] = EvidenceItem( - evidence_id=evidence_id, - kind="entrypoint", - summary=item.title, - location=item.location, - supports=[str(item.metadata.get("handler_symbol_id") or "")], - ) - for index, item in enumerate(seed_symbols, start=1): - evidence_id = f"symbol_{index}" - result[evidence_id] = EvidenceItem( - evidence_id=evidence_id, - kind="symbol", - summary=item.title, - location=item.location, - supports=[str(item.metadata.get("symbol_id") or "")], - ) - return result - - -def _missing( - entrypoints: list[LayeredRetrievalItem], - seed_symbols: list[LayeredRetrievalItem], - trace_paths, - excerpts, -) -> list[str]: - missing: list[str] = [] - if not entrypoints: - missing.append("entrypoints") - if not seed_symbols: - missing.append("seed_symbols") - if not trace_paths: - missing.append("trace_paths") - if not excerpts: - missing.append("code_excerpts") - return missing - - -def _lexical_excerpts( - items: list[LayeredRetrievalItem], - *, - start_index: int = 0, - is_test_fallback: bool = False, -) -> tuple[list[CodeExcerpt], dict[str, EvidenceItem]]: - excerpts: list[CodeExcerpt] = [] - evidence_index: dict[str, EvidenceItem] = {} - for item in items: - evidence_id = f"excerpt_{start_index + len(evidence_index) + 1}" - location = item.location - evidence_index[evidence_id] = EvidenceItem( - evidence_id=evidence_id, - kind="excerpt", - summary=item.title or item.source, - location=location, - supports=[], - ) - focus = "lexical" - if _item_is_test(item): - focus = "test:lexical" - elif is_test_fallback: - focus = "lexical" - excerpts.append( - CodeExcerpt( - evidence_id=evidence_id, - symbol_id=str(item.metadata.get("symbol_id") or "") or None, - title=item.title or item.source, - path=item.source, - start_line=location.start_line if location else None, - end_line=location.end_line if location else None, - content=item.content, - focus=focus, - ) - ) - return excerpts, evidence_index - - -def _item_is_test(item: LayeredRetrievalItem) -> bool: - return bool(item.metadata.get("is_test")) or is_test_path(item.source) - - -def _is_test_excerpt(excerpt: CodeExcerpt) -> bool: - return excerpt.focus.startswith("test:") or is_test_path(excerpt.path) - - -def _path_prefixes(intent: ExplainIntent, file_candidates: list[dict]) -> list[str]: - values: list[str] = [] - for path in intent.hints.paths: - prefix = path.rsplit("/", 1)[0] if "/" in path else path - if prefix and prefix not in values: - values.append(prefix) - for item in file_candidates[:6]: - path = str(item.get("path") or "") - prefix = path.rsplit("/", 1)[0] if "/" in path else "" - if prefix and prefix not in values: - values.append(prefix) - return values - - -def _cleanup_missing(values: list[str], *, has_excerpts: bool) -> list[str]: - if not has_excerpts: - return values - return [value for value in values if value not in {"code_excerpts", "layer:C0 empty"}] - - -def _dedupe(values: list[str]) -> list[str]: - result: list[str] = [] - for value in values: - item = value.strip() - if item and item not in result: - result.append(item) - return result diff --git a/src/app/modules/agent/runtime/steps/explain/source_excerpt_fetcher.py b/src/app/modules/agent/runtime/steps/explain/source_excerpt_fetcher.py deleted file mode 100644 index cd3c4ae..0000000 --- a/src/app/modules/agent/runtime/steps/explain/source_excerpt_fetcher.py +++ /dev/null @@ -1,53 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING - -from app.modules.agent.runtime.steps.explain.excerpt_planner import ExcerptPlanner -from app.modules.agent.runtime.steps.explain.models import CodeExcerpt, EvidenceItem, TracePath -from app.modules.rag.retrieval.test_filter import is_test_path - -if TYPE_CHECKING: - from app.modules.agent.runtime.steps.explain.graph_repository import CodeGraphRepository - - -class SourceExcerptFetcher: - def __init__(self, graph_repository: CodeGraphRepository, planner: ExcerptPlanner | None = None) -> None: - self._graph = graph_repository - self._planner = planner or ExcerptPlanner() - - def fetch( - self, - rag_session_id: str, - trace_paths: list[TracePath], - *, - max_excerpts: int = 40, - ) -> tuple[list[CodeExcerpt], dict[str, EvidenceItem]]: - ordered_symbol_ids: list[str] = [] - for path in trace_paths: - for symbol_id in path.symbol_ids: - if symbol_id and symbol_id not in ordered_symbol_ids: - ordered_symbol_ids.append(symbol_id) - chunks = self._graph.get_chunks_by_symbol_ids(rag_session_id, ordered_symbol_ids) - excerpts: list[CodeExcerpt] = [] - evidence_index: dict[str, EvidenceItem] = {} - for chunk in chunks: - symbol_id = str(chunk.metadata.get("symbol_id") or "") - evidence_id = f"excerpt_{len(evidence_index) + 1}" - location = chunk.location - evidence_index[evidence_id] = EvidenceItem( - evidence_id=evidence_id, - kind="excerpt", - summary=chunk.title, - location=location, - supports=[symbol_id] if symbol_id else [], - ) - is_test_chunk = bool(chunk.metadata.get("is_test")) or is_test_path(location.path if location else chunk.source) - for excerpt in self._planner.plan(chunk, evidence_id=evidence_id, symbol_id=symbol_id): - if len(excerpts) >= max_excerpts: - break - if is_test_chunk and not excerpt.focus.startswith("test:"): - excerpt.focus = f"test:{excerpt.focus}" - excerpts.append(excerpt) - if len(excerpts) >= max_excerpts: - break - return excerpts, evidence_index diff --git a/src/app/modules/agent/runtime/steps/explain/trace_builder.py b/src/app/modules/agent/runtime/steps/explain/trace_builder.py deleted file mode 100644 index a9c2826..0000000 --- a/src/app/modules/agent/runtime/steps/explain/trace_builder.py +++ /dev/null @@ -1,102 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING - -from app.modules.agent.runtime.steps.explain.models import LayeredRetrievalItem, TracePath - -if TYPE_CHECKING: - from app.modules.agent.runtime.steps.explain.graph_repository import CodeGraphRepository - - -class TraceBuilder: - def __init__(self, graph_repository: CodeGraphRepository) -> None: - self._graph = graph_repository - - def build_paths( - self, - rag_session_id: str, - seed_symbols: list[LayeredRetrievalItem], - *, - max_depth: int, - max_paths: int = 3, - edge_types: list[str] | None = None, - ) -> list[TracePath]: - edges_filter = edge_types or ["calls", "imports", "inherits", "instantiates", "reads_attr", "writes_attr"] - symbol_map = self._symbol_map(seed_symbols) - paths: list[TracePath] = [] - for seed in seed_symbols: - seed_id = str(seed.metadata.get("symbol_id") or "") - if not seed_id: - continue - queue: list[tuple[list[str], float, list[str]]] = [([seed_id], 0.0, [])] - while queue and len(paths) < max_paths * 3: - current_path, score, notes = queue.pop(0) - src_symbol_id = current_path[-1] - out_edges = self._graph.get_out_edges(rag_session_id, [src_symbol_id], edges_filter, limit_per_src=4) - if not out_edges or len(current_path) >= max_depth: - paths.append(TracePath(symbol_ids=current_path, score=score, notes=notes)) - continue - for edge in out_edges: - metadata = edge.metadata - dst_symbol_id = str(metadata.get("dst_symbol_id") or "") - next_notes = list(notes) - next_score = score + self._edge_score(edge, symbol_map.get(src_symbol_id)) - if not dst_symbol_id: - dst_ref = str(metadata.get("dst_ref") or "") - package_hint = self._package_hint(symbol_map.get(src_symbol_id)) - resolved = self._graph.resolve_symbol_by_ref(rag_session_id, dst_ref, package_hint=package_hint) - if resolved is not None: - dst_symbol_id = str(resolved.metadata.get("symbol_id") or "") - symbol_map[dst_symbol_id] = resolved - next_score += 2.0 - next_notes.append(f"resolved:{dst_ref}") - if not dst_symbol_id or dst_symbol_id in current_path: - paths.append(TracePath(symbol_ids=current_path, score=next_score, notes=next_notes)) - continue - if dst_symbol_id not in symbol_map: - symbols = self._graph.get_symbols_by_ids(rag_session_id, [dst_symbol_id]) - if symbols: - symbol_map[dst_symbol_id] = symbols[0] - queue.append((current_path + [dst_symbol_id], next_score, next_notes)) - unique = self._unique_paths(paths) - unique.sort(key=lambda item: item.score, reverse=True) - return unique[:max_paths] or [TracePath(symbol_ids=[seed.metadata.get("symbol_id", "")], score=0.0) for seed in seed_symbols[:1]] - - def _edge_score(self, edge: LayeredRetrievalItem, source_symbol: LayeredRetrievalItem | None) -> float: - metadata = edge.metadata - score = 1.0 - if str(metadata.get("resolution") or "") == "resolved": - score += 2.0 - source_path = source_symbol.source if source_symbol is not None else "" - if source_path and edge.source == source_path: - score += 1.0 - if "tests/" in edge.source or "/tests/" in edge.source: - score -= 3.0 - return score - - def _package_hint(self, symbol: LayeredRetrievalItem | None) -> str | None: - if symbol is None: - return None - package = str(symbol.metadata.get("package_or_module") or "") - if not package: - return None - return ".".join(package.split(".")[:-1]) or package - - def _symbol_map(self, items: list[LayeredRetrievalItem]) -> dict[str, LayeredRetrievalItem]: - result: dict[str, LayeredRetrievalItem] = {} - for item in items: - symbol_id = str(item.metadata.get("symbol_id") or "") - if symbol_id: - result[symbol_id] = item - return result - - def _unique_paths(self, items: list[TracePath]) -> list[TracePath]: - result: list[TracePath] = [] - seen: set[tuple[str, ...]] = set() - for item in items: - key = tuple(symbol_id for symbol_id in item.symbol_ids if symbol_id) - if not key or key in seen: - continue - seen.add(key) - result.append(item) - return result diff --git a/src/app/modules/agent/runtime/steps/finalization/__init__.py b/src/app/modules/agent/runtime/steps/finalization/__init__.py deleted file mode 100644 index e59188d..0000000 --- a/src/app/modules/agent/runtime/steps/finalization/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -"""Финальная сборка: repair черновика и сборка RuntimeFinalResult.""" - -from app.modules.agent.runtime.steps.finalization.repair import RuntimeAnswerRepairService -from app.modules.agent.runtime.steps.finalization.result_assembler import assemble_final_result - -__all__ = ["RuntimeAnswerRepairService", "assemble_final_result"] diff --git a/src/app/modules/agent/runtime/steps/finalization/repair.py b/src/app/modules/agent/runtime/steps/finalization/repair.py deleted file mode 100644 index f57eb6c..0000000 --- a/src/app/modules/agent/runtime/steps/finalization/repair.py +++ /dev/null @@ -1,68 +0,0 @@ -"""Сервис починки черновика ответа по результатам post-evidence gate (LLM repair).""" - -from __future__ import annotations - -import json - -from app.modules.agent.runtime.steps.gates.post.post_gate import RuntimeValidationResult -from app.modules.agent.llm import AgentLlmService - - -class RuntimeAnswerRepairService: - def __init__(self, llm: AgentLlmService) -> None: - self._llm = llm - - def repair( - self, - *, - draft_answer: str, - validation: RuntimeValidationResult, - prompt_payload: str, - ) -> str: - repair_focus = self._repair_focus(validation.reasons) - repair_input = json.dumps( - { - "draft_answer": draft_answer, - "validation_reasons": validation.reasons, - "repair_focus": repair_focus, - "prompt_payload": prompt_payload, - }, - ensure_ascii=False, - indent=2, - ) - return self._llm.generate( - "code_qa_repair_answer", - repair_input, - log_context="graph.project_qa.code_qa.repair", - ).strip() - - def _repair_focus(self, reasons: list[str]) -> list[str]: - mapping = { - "missing_concrete_methods": "missing_concrete_methods", - "missing_concrete_calls": "missing_concrete_calls", - "missing_concrete_dependencies": "missing_concrete_dependencies", - "missing_concrete_fields": "missing_concrete_fields", - "ignores_concrete_explain_facts": "too_vague_for_explain", - "too_vague_for_explain": "too_vague_for_explain", - "missing_concrete_components": "missing_concrete_components", - "missing_concrete_relations": "missing_concrete_relations", - "missing_relation_verbs": "missing_relation_verbs", - "target_mentioned_but_no_relations": "missing_concrete_relations", - "too_vague_for_architecture": "too_vague_for_architecture", - "missing_flow_steps": "missing_flow_steps", - "missing_sequence_edges": "missing_sequence_edges", - "missing_ordered_flow_steps": "missing_flow_steps", - "too_vague_for_trace_flow": "too_vague_for_trace_flow", - "semantic_labels_without_code_edges": "semantic_labels_without_code_edges", - "contains_retrieval_artifacts": "contains_retrieval_artifacts", - "methods_as_primary_components": "methods_as_primary_components", - "overclaims_trace_completeness": "overclaims_trace_completeness", - } - seen: set[str] = set() - result: list[str] = [] - for reason in reasons: - focus = mapping.get(reason) - if focus and focus not in seen: - seen.add(focus) - result.append(focus) - return result or ["tighten_to_evidence"] diff --git a/src/app/modules/agent/runtime/steps/finalization/result_assembler.py b/src/app/modules/agent/runtime/steps/finalization/result_assembler.py deleted file mode 100644 index 23c9b9e..0000000 --- a/src/app/modules/agent/runtime/steps/finalization/result_assembler.py +++ /dev/null @@ -1,79 +0,0 @@ -"""Сборка финального результата пайплайна: диагностика и RuntimeFinalResult.""" - -from __future__ import annotations - -import logging -from typing import Any - -from app.modules.agent.runtime.steps.context.diagnostics import build_diagnostics_report -from app.modules.agent.runtime.steps.gates.post.post_gate import RuntimePostEvidenceGate, RuntimeValidationResult -from app.modules.agent.runtime.models import RuntimeDraftAnswer, RuntimeExecutionState, RuntimeFinalResult - -LOGGER = logging.getLogger(__name__) - - -def assemble_final_result( - state: RuntimeExecutionState, - *, - draft: RuntimeDraftAnswer | None, - final_answer: str, - repair_used: bool, - llm_used: bool, - validation: RuntimeValidationResult | None = None, - timings_ms: dict[str, int] | None = None, - runtime_trace: list[dict] | None = None, - answer_policy_branch: str = "", - decision_reason: str = "", - pre_gate_input: dict[str, Any] | None = None, - post_gate_snapshot: dict[str, Any] | None = None, - resolved_target: str | None = None, - post_gate: RuntimePostEvidenceGate | None = None, -) -> RuntimeFinalResult: - diagnostics = build_diagnostics_report( - router_result=state.router_result, - retrieval_request=state.retrieval_request, - retrieval_result=state.retrieval_result, - evidence_bundle=state.evidence_pack, - answer_mode=state.answer_mode, - timings_ms=timings_ms or {}, - resolved_target=resolved_target, - answer_policy_branch=answer_policy_branch, - decision_reason=decision_reason, - evidence_gate_input=pre_gate_input or {}, - post_evidence_gate=post_gate_snapshot or {}, - ) - if validation is None and post_gate is not None and state.retrieval_request is not None: - validation = post_gate.validate( - answer=final_answer, - answer_mode=state.answer_mode, - degraded_message=state.degraded_message, - sub_intent=state.retrieval_request.sub_intent, - user_query=state.user_query, - evidence_pack=state.evidence_pack, - ) - elif validation is None: - validation = RuntimeValidationResult(passed=True, action="return") - - result = RuntimeFinalResult( - final_answer=final_answer.strip(), - answer_mode=state.answer_mode, - repair_used=repair_used, - llm_used=llm_used, - draft_answer=draft, - validation=validation, - router_result=state.router_result, - retrieval_request=state.retrieval_request, - retrieval_result=state.retrieval_result, - evidence_pack=state.evidence_pack, - diagnostics=diagnostics, - runtime_trace=list(runtime_trace or []), - ) - LOGGER.warning( - "agent runtime executed: intent=%s sub_intent=%s answer_mode=%s repair_used=%s llm_used=%s", - state.router_result.intent if state.router_result else None, - state.router_result.query_plan.sub_intent if state.router_result and state.router_result.query_plan else None, - result.answer_mode, - result.repair_used, - result.llm_used, - ) - return result diff --git a/src/app/modules/agent/runtime/steps/gates/__init__.py b/src/app/modules/agent/runtime/steps/gates/__init__.py deleted file mode 100644 index c7e0e58..0000000 --- a/src/app/modules/agent/runtime/steps/gates/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -"""Pre- и post-evidence gates пайплайна.""" - -from app.modules.agent.runtime.steps.gates.pre.evidence_gate import EvidenceGateDecision, evaluate_evidence -from app.modules.agent.runtime.steps.gates.post.post_gate import RuntimePostEvidenceGate, RuntimeValidationResult - -__all__ = [ - "EvidenceGateDecision", - "evaluate_evidence", - "RuntimePostEvidenceGate", - "RuntimeValidationResult", -] diff --git a/src/app/modules/agent/runtime/steps/gates/post/__init__.py b/src/app/modules/agent/runtime/steps/gates/post/__init__.py deleted file mode 100644 index c7cd976..0000000 --- a/src/app/modules/agent/runtime/steps/gates/post/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Post-evidence gate: валидация черновика ответа и решение repair/return.""" - -from app.modules.agent.runtime.steps.gates.post.post_gate import RuntimePostEvidenceGate, RuntimeValidationResult - -__all__ = ["RuntimePostEvidenceGate", "RuntimeValidationResult"] diff --git a/src/app/modules/agent/runtime/steps/gates/post/post_gate.py b/src/app/modules/agent/runtime/steps/gates/post/post_gate.py deleted file mode 100644 index 44e0d60..0000000 --- a/src/app/modules/agent/runtime/steps/gates/post/post_gate.py +++ /dev/null @@ -1,287 +0,0 @@ -"""Post-evidence gate: валидация черновика ответа и решение repair/return.""" - -from __future__ import annotations - -import re - -from pydantic import BaseModel, ConfigDict, Field - -from app.modules.agent.runtime.steps.context.answer_fact_curator import build_curated_answer_facts -from app.modules.agent.runtime.steps.context.contracts import EvidenceBundle - - -class RuntimeValidationResult(BaseModel): - model_config = ConfigDict(extra="forbid") - - passed: bool = False - action: str = "return" - reasons: list[str] = Field(default_factory=list) - - -_TOKEN_RE = re.compile(r"[a-zA-Zа-яА-Я0-9_/]+") -_VAGUE_PHRASES = ( - "ряд аргументов", - "имеет responsibilities", - "имеет responsibility", - "ключевой компонент", - "центральный компонент", - "играет роль", - "управляет системой", - "этап пайплайна", - "инициализация сервисов", - "регистрация основных служб", - "различные аргументы", - "различные подпакеты", - "основные службы", - "представляет собой", - "используется в службах", -) -_OPTIMISTIC_TRACE_CLAIMS = ( - "полностью восстанавливается", - "полный поток выполнения", - "полностью прослеживается", - "полный поток виден", - "полная цепочка", - "весь поток", -) - - -class RuntimePostEvidenceGate: - def validate( - self, - *, - answer: str, - answer_mode: str, - degraded_message: str, - sub_intent: str, - user_query: str, - evidence_pack: EvidenceBundle | None, - ) -> RuntimeValidationResult: - normalized = (answer or "").strip() - if not normalized: - return RuntimeValidationResult(passed=False, action="repair", reasons=["empty_answer"]) - if answer_mode in {"degraded", "insufficient"} and "недостат" not in normalized.lower(): - return RuntimeValidationResult(passed=False, action="repair", reasons=["degraded_answer_missing_guardrail"]) - if answer_mode == "not_found" and "не найден" not in normalized.lower(): - return RuntimeValidationResult(passed=False, action="repair", reasons=["not_found_answer_missing_phrase"]) - if answer_mode == "ambiguous" and "не удалось однозначно разрешить" not in normalized.lower(): - return RuntimeValidationResult(passed=False, action="repair", reasons=["ambiguous_answer_missing_phrase"]) - if degraded_message and answer_mode != "normal" and len(normalized) < 24: - return RuntimeValidationResult(passed=False, action="repair", reasons=["answer_too_short"]) - if answer_mode != "normal" or evidence_pack is None: - return RuntimeValidationResult(passed=True, action="return") - - reasons = self._normal_answer_reasons(normalized.lower(), sub_intent.upper(), user_query, evidence_pack) - if reasons: - return RuntimeValidationResult(passed=False, action="repair", reasons=_dedupe(reasons)) - return RuntimeValidationResult(passed=True, action="return") - - def _normal_answer_reasons(self, answer: str, sub_intent: str, user_query: str, evidence_pack: EvidenceBundle) -> list[str]: - reasons: list[str] = [] - if sub_intent == "FIND_ENTRYPOINTS": - reasons.extend(self._validate_entrypoints(answer, user_query, evidence_pack)) - elif sub_intent == "EXPLAIN": - reasons.extend(self._validate_explain(answer, evidence_pack)) - elif sub_intent == "ARCHITECTURE": - reasons.extend(self._validate_architecture(answer, evidence_pack)) - elif sub_intent == "TRACE_FLOW": - reasons.extend(self._validate_trace_flow(answer, evidence_pack)) - return reasons - - def _validate_entrypoints(self, answer: str, user_query: str, evidence_pack: EvidenceBundle) -> list[str]: - confirmed = [item for item in list(evidence_pack.entrypoints or []) if item.get("http_method") and item.get("route_path")] - if not confirmed: - return [] - query_tokens = self._tokens(user_query) - matched = [item for item in confirmed if self._tokens(str(item.get("route_path") or "")) & query_tokens] - required = matched or confirmed[:1] - reasons = [] - if any(f"{item['http_method']} {item['route_path']}".lower() not in answer for item in required): - reasons.append("missing_confirmed_route") - if matched and any(token in query_tokens for token in {"health", "/health"}) and "не обнаруж" in answer: - reasons.append("contradicts_confirmed_route") - return reasons - - def _validate_explain(self, answer: str, evidence_pack: EvidenceBundle) -> list[str]: - facts = build_curated_answer_facts(evidence_pack) - explain = dict(facts.get("explain") or {}) - reasons = self._validate_target_focus(answer, evidence_pack) - reasons.extend(self._vagueness_reasons(answer, "explain")) - - methods = list(explain.get("required_methods") or []) - calls = list(explain.get("required_calls") or []) - dependencies = list(explain.get("required_dependencies") or []) - fields = list(explain.get("required_fields") or []) - has_any_required = bool(methods or calls or dependencies or fields) - matches = 0 - if methods and not self._mentions_fact_group(answer, methods): - reasons.append("missing_concrete_methods") - elif methods: - matches += 1 - if calls and not self._mentions_fact_group(answer, calls): - reasons.append("missing_concrete_calls") - elif calls: - matches += 1 - if dependencies and not self._mentions_fact_group(answer, dependencies): - reasons.append("missing_concrete_dependencies") - elif dependencies: - matches += 1 - if fields and not self._mentions_fact_group(answer, fields): - reasons.append("missing_concrete_fields") - elif fields: - matches += 1 - if has_any_required and matches == 0: - reasons.append("too_vague_for_explain") - if has_any_required and self._answer_is_generic_with_facts(answer, methods + calls + dependencies + fields): - reasons.append("ignores_concrete_explain_facts") - if self._semantic_leakage(answer, facts, has_concrete_support=matches > 0): - reasons.append("semantic_labels_without_code_edges") - return reasons - - def _validate_architecture(self, answer: str, evidence_pack: EvidenceBundle) -> list[str]: - facts = build_curated_answer_facts(evidence_pack) - architecture = dict(facts.get("architecture") or {}) - reasons = self._validate_target_focus(answer, evidence_pack) - reasons.extend(self._vagueness_reasons(answer, "architecture")) - - components = list(architecture.get("required_components") or []) - relations = list(architecture.get("required_relations") or []) - verbs = list(architecture.get("required_relation_verbs") or []) - if components and not self._mentions_fact_group(answer, components): - reasons.append("missing_concrete_components") - if relations and not self._mentions_relations(answer, relations): - reasons.append("missing_concrete_relations") - if verbs and not self._mentions_fact_group(answer, verbs): - reasons.append("missing_relation_verbs") - forbidden = architecture.get("forbidden_labels") or [] - if any(label.lower() in answer.lower() for label in forbidden): - reasons.append("contains_retrieval_artifacts") - if self._methods_dominate_components(answer, components): - reasons.append("methods_as_primary_components") - has_relations = self._mentions_relations(answer, relations) - has_verbs = self._mentions_fact_group(answer, verbs) - if relations and (not has_relations or not has_verbs): - reasons.append("too_vague_for_architecture") - target = str(evidence_pack.resolved_target or "").strip().lower() - if target and target in answer and relations and not has_relations: - reasons.append("target_mentioned_but_no_relations") - if self._semantic_leakage(answer, facts, has_concrete_support=has_relations): - reasons.append("semantic_labels_without_code_edges") - return reasons - - def _validate_trace_flow(self, answer: str, evidence_pack: EvidenceBundle) -> list[str]: - facts = build_curated_answer_facts(evidence_pack) - trace = dict(facts.get("trace_flow") or {}) - reasons = self._validate_target_focus(answer, evidence_pack) - reasons.extend(self._vagueness_reasons(answer, "trace_flow")) - - steps = list(trace.get("required_flow_steps") or []) - calls = list(trace.get("required_calls") or []) - ordered_descriptions = list(trace.get("ordered_step_descriptions") or []) - if steps and not self._mentions_steps(answer, steps): - reasons.append("missing_flow_steps") - if steps and not self._mentions_relations(answer, steps): - reasons.append("missing_sequence_edges") - if calls and not self._mentions_fact_group(answer, calls): - reasons.append("missing_concrete_calls") - if any(claim.lower() in answer.lower() for claim in _OPTIMISTIC_TRACE_CLAIMS): - reasons.append("overclaims_trace_completeness") - if steps and not (self._mentions_steps(answer, steps) and self._mentions_relations(answer, steps)): - reasons.append("too_vague_for_trace_flow") - if ordered_descriptions and not self._mentions_ordered_steps(answer, ordered_descriptions): - reasons.append("missing_ordered_flow_steps") - return reasons - - def _validate_target_focus(self, answer: str, evidence_pack: EvidenceBundle) -> list[str]: - target = str(evidence_pack.resolved_target or "").strip().lower() - return [] if not target or target in answer else ["missing_resolved_target"] - - def _mentions_fact_group(self, answer: str, values: list[str]) -> bool: - return any(alias in answer for value in values for alias in _aliases(value)) - - def _mentions_relations(self, answer: str, relations: list[dict]) -> bool: - for relation in relations: - source = str(relation.get("source") or "").lower() - target = str(relation.get("target") or "").lower() - verb = str(relation.get("verb") or "").lower() - if source and target and source in answer and target in answer: - return True - if source and verb and target and source in answer and verb in answer and target in answer: - return True - return False - - def _mentions_steps(self, answer: str, steps: list[dict]) -> bool: - if "сначала" in answer and "затем" in answer: - return True - numeric_steps = sum(1 for marker in ("1.", "2.", "3.") if marker in answer) - if numeric_steps >= 2: - return True - mentioned = sum(1 for step in steps[:3] if self._mentions_relations(answer, [step])) - return mentioned >= min(2, len(steps[:3])) - - def _mentions_ordered_steps(self, answer: str, ordered_descriptions: list[str]) -> bool: - """Проверяет, что в ответе отражена хотя бы часть упорядоченных шагов (источник/цель/глагол).""" - if not ordered_descriptions: - return True - answer_lower = answer.lower() - hits = 0 - for desc in ordered_descriptions[:5]: - parts = desc.replace(".", " ").split() - if len(parts) >= 3 and any(p in answer_lower for p in parts if len(p) > 2): - hits += 1 - return hits >= min(2, len(ordered_descriptions)) - - def _answer_is_generic_with_facts( - self, answer: str, concrete_values: list[str] - ) -> bool: - """True, если в ответе есть общие фразы, но почти нет конкретных имён из списка.""" - if not concrete_values: - return False - mentioned = sum(1 for v in concrete_values if any(a in answer.lower() for a in _aliases(v))) - return mentioned == 0 and len(answer) > 100 - - def _methods_dominate_components(self, answer: str, components: list[str]) -> bool: - method_like = re.findall(r"\b[a-z_]+\(\)", answer) - component_hits = sum(1 for component in components if component.lower() in answer) - return bool(method_like) and component_hits == 0 - - def _semantic_leakage(self, answer: str, facts: dict, *, has_concrete_support: bool) -> bool: - if has_concrete_support: - return False - semantic_roles = [str(item.get("role") or "").strip().lower() for item in facts.get("semantic_hints") or [] if str(item.get("role") or "").strip()] - return bool(semantic_roles) and any(role in answer for role in semantic_roles) - - def _vagueness_reasons(self, answer: str, scenario: str) -> list[str]: - if any(phrase in answer for phrase in _VAGUE_PHRASES): - return [f"too_vague_for_{scenario}"] - return [] - - def _tokens(self, value: str) -> set[str]: - return {token.lower().strip("/") for token in _TOKEN_RE.findall(value or "") if token.strip("/")} - - -def _aliases(value: str) -> list[str]: - text = str(value or "").strip().lower() - if not text: - return [] - aliases = [text] - bare = text.removesuffix("()") - if bare != text: - aliases.append(bare) - tail = bare.rsplit(".", 1)[-1] - if tail and tail not in aliases: - aliases.append(tail) - if tail and f"{tail}()" not in aliases: - aliases.append(f"{tail}()") - return aliases - - -def _dedupe(values: list[str]) -> list[str]: - seen: set[str] = set() - result: list[str] = [] - for value in values: - if value in seen: - continue - seen.add(value) - result.append(value) - return result diff --git a/src/app/modules/agent/runtime/steps/gates/pre/__init__.py b/src/app/modules/agent/runtime/steps/gates/pre/__init__.py deleted file mode 100644 index 3881cc2..0000000 --- a/src/app/modules/agent/runtime/steps/gates/pre/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Pre-evidence gate: проверка достаточности evidence перед вызовом LLM.""" - -from app.modules.agent.runtime.steps.gates.pre.evidence_gate import EvidenceGateDecision, evaluate_evidence - -__all__ = ["EvidenceGateDecision", "evaluate_evidence"] diff --git a/src/app/modules/agent/runtime/steps/gates/pre/evidence_gate.py b/src/app/modules/agent/runtime/steps/gates/pre/evidence_gate.py deleted file mode 100644 index 633ce11..0000000 --- a/src/app/modules/agent/runtime/steps/gates/pre/evidence_gate.py +++ /dev/null @@ -1,72 +0,0 @@ -"""Проверка достаточности evidence для пайплайна CODE_QA.""" - -from __future__ import annotations - -from dataclasses import dataclass, field - -from app.modules.agent.runtime.steps.context.contracts import EvidenceBundle - - -@dataclass(slots=True) -class EvidenceGateDecision: - passed: bool - failure_reasons: list[str] = field(default_factory=list) - degraded_message: str = "" - - -def evaluate_evidence(bundle: EvidenceBundle) -> EvidenceGateDecision: - sub = (bundle.resolved_sub_intent or "EXPLAIN").upper() - reasons: list[str] = [] - - if sub == "OPEN_FILE": - if not bundle.resolved_target and not bundle.file_candidates: - reasons.append("path_scope_empty") - if bundle.evidence_count < 1: - reasons.append("layer_c0_empty") - elif sub == "EXPLAIN": - if bundle.target_type == "symbol" and not bundle.resolved_target: - reasons.append("target_not_resolved") - if bundle.evidence_count < 2: - reasons.append("insufficient_evidence") - if bundle.target_type == "symbol" and not bundle.relations and bundle.evidence_count < 2: - reasons.append("layer_c2_empty") - elif sub == "FIND_TESTS": - if not bundle.resolved_target and not bundle.target_symbol_candidates: - reasons.append("target_not_resolved") - if not bundle.test_evidence: - reasons.append("tests_not_found") - elif sub == "FIND_ENTRYPOINTS": - if not bundle.entrypoints: - reasons.append("entrypoints_not_found") - else: - if bundle.evidence_count < 1: - reasons.append("insufficient_evidence") - - passed = len(reasons) == 0 - if not passed: - bundle.failure_reasons = list(reasons) - bundle.sufficient = False - else: - bundle.sufficient = True - - degraded = _degraded_message(bundle, reasons) - return EvidenceGateDecision(passed=passed, failure_reasons=reasons, degraded_message=degraded) - - -def _degraded_message(bundle: EvidenceBundle, reasons: list[str]) -> str: - if not reasons: - return "" - lines = ["Insufficient evidence for a confident answer."] - if "target_not_resolved" in reasons: - lines.append("Target symbol or file could not be resolved.") - if "path_scope_empty" in reasons: - lines.append("No matching path or file found.") - if "layer_c0_empty" in reasons: - lines.append("No code chunks retrieved.") - if "tests_not_found" in reasons: - lines.append("No test candidates found.") - if "entrypoints_not_found" in reasons: - lines.append("No entrypoints found.") - if "insufficient_evidence" in reasons: - lines.append(f"Evidence count: {bundle.evidence_count} (minimum required not met).") - return " ".join(lines).strip() diff --git a/src/app/modules/agent/runtime/steps/generation/__init__.py b/src/app/modules/agent/runtime/steps/generation/__init__.py deleted file mode 100644 index f9c9eef..0000000 --- a/src/app/modules/agent/runtime/steps/generation/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -"""Выбор промпта, сборка payload и вызов LLM для генерации ответа.""" - -from app.modules.agent.runtime.steps.generation.prompt_selector import RuntimePromptSelector -from app.modules.agent.runtime.steps.generation.prompt_payload_builder import RuntimePromptPayloadBuilder -from app.modules.agent.runtime.steps.generation.generator import RuntimeAnswerGenerator - -__all__ = [ - "RuntimePromptSelector", - "RuntimePromptPayloadBuilder", - "RuntimeAnswerGenerator", -] diff --git a/src/app/modules/agent/runtime/steps/generation/generator.py b/src/app/modules/agent/runtime/steps/generation/generator.py deleted file mode 100644 index 52d5b62..0000000 --- a/src/app/modules/agent/runtime/steps/generation/generator.py +++ /dev/null @@ -1,18 +0,0 @@ -"""Тонкая обёртка над LLM для генерации ответа по имени промпта и payload.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from app.modules.agent.llm import AgentLlmService - - -class RuntimeAnswerGenerator: - """Делегирует вызов LLM для генерации черновика ответа.""" - - def __init__(self, llm: AgentLlmService) -> None: - self._llm = llm - - def generate(self, prompt_name: str, payload: str, *, log_context: str = "graph.project_qa.code_qa.answer") -> str: - return self._llm.generate(prompt_name, payload, log_context=log_context).strip() diff --git a/src/app/modules/agent/runtime/steps/generation/prompt_payload_builder.py b/src/app/modules/agent/runtime/steps/generation/prompt_payload_builder.py deleted file mode 100644 index c84926e..0000000 --- a/src/app/modules/agent/runtime/steps/generation/prompt_payload_builder.py +++ /dev/null @@ -1,140 +0,0 @@ -"""Сборка JSON-полезной нагрузки для системного промпта по synthesis_input и evidence_pack.""" - -from __future__ import annotations - -import json -import re - -from app.modules.agent.runtime.steps.context.contracts import AnswerSynthesisInput, EvidenceBundle - -_LAYER_GUIDE = ( - "- C0_SOURCE_CHUNKS: фактический код, это основной источник деталей.\n" - "- C1_SYMBOL_CATALOG: объявления и сигнатуры символов.\n" - "- C2_DEPENDENCY_GRAPH: связи вызовов и зависимостей.\n" - "- C3_ENTRYPOINTS: подтвержденные точки входа.\n" - "- C4_SEMANTIC_ROLES: вспомогательная роль компонента, использовать осторожно." -) -_TOKEN_RE = re.compile(r"[a-zA-Zа-яА-Я0-9_/]+") - - -class RuntimePromptPayloadBuilder: - def build( - self, - *, - user_query: str, - synthesis_input: AnswerSynthesisInput, - evidence_pack: EvidenceBundle, - answer_mode: str, - ) -> str: - payload = { - "user_query": user_query, - "resolved_scenario": synthesis_input.resolved_scenario, - "resolved_target": synthesis_input.resolved_target, - "answer_mode": answer_mode, - "fast_context": synthesis_input.fast_context, - "deep_context": synthesis_input.deep_context, - "evidence_summary": synthesis_input.evidence_summary, - "semantic_hints": synthesis_input.semantic_hints, - "diagnostic_hints": synthesis_input.diagnostic_hints, - "retrieval_summary": evidence_pack.retrieval_summary, - "confirmed_entrypoints": self._entrypoints(user_query, evidence_pack), - "required_entrypoints": self._required_entrypoints(user_query, evidence_pack), - "layer_guide": _LAYER_GUIDE, - } - payload.update(self._scenario_payload(synthesis_input)) - return json.dumps(payload, ensure_ascii=False, indent=2) - - def _entrypoints(self, user_query: str, evidence_pack: EvidenceBundle) -> list[dict]: - query_tokens = self._tokens(user_query) - enriched: list[dict] = [] - for item in list(evidence_pack.entrypoints or []): - route_path = str(item.get("route_path") or "").strip() - http_method = str(item.get("http_method") or "").strip().upper() - if not http_method: - continue - candidate = { - "http_method": http_method, - "route_path": route_path, - "display": f"{http_method} {route_path}".strip(), - "handler_symbol": str(item.get("handler_symbol") or "").strip(), - "path": str(item.get("path") or "").strip(), - "start_line": item.get("start_line"), - "end_line": item.get("end_line"), - "query_match": self._matches_query(route_path, query_tokens), - } - if candidate not in enriched: - enriched.append(candidate) - return sorted(enriched, key=lambda item: (-int(bool(item["query_match"])), -int(bool(item["route_path"])), len(item["route_path"] or "/"), item["display"])) - - def _required_entrypoints(self, user_query: str, evidence_pack: EvidenceBundle) -> list[str]: - return [item["display"] for item in self._entrypoints(user_query, evidence_pack) if item["query_match"] and item["route_path"]] - - def _scenario_payload(self, synthesis_input: AnswerSynthesisInput) -> dict: - scenario = (synthesis_input.resolved_scenario or "").upper() - curated = dict(synthesis_input.curated_facts or {}) - if scenario == "EXPLAIN": - facts = dict(curated.get("explain") or {}) - must_methods = facts.get("required_methods", []) - must_calls = facts.get("required_calls", []) - must_deps = facts.get("required_dependencies", []) - must_fields = facts.get("required_fields", []) - fact_gaps = facts.get("fact_gaps", []) - return { - "answer_contract": ( - "Ответ обязан опираться на конкретные факты ниже. Если списки непусты — назови явно методы, вызовы, зависимости или поля из них. " - "Не заменяй их общими фразами. Учитывай fact_gaps." - ), - "must_mention_methods": must_methods, - "must_mention_fields": must_fields, - "must_mention_calls": must_calls, - "must_mention_dependencies": must_deps, - "must_mention_constructor_args": facts.get("required_constructor_args", []), - "must_mention_files": facts.get("required_files", []), - "must_not_infer_missing_details": True, - "fact_gaps": fact_gaps, - } - if scenario == "ARCHITECTURE": - facts = dict(curated.get("architecture") or {}) - components = facts.get("required_components", []) - relations = facts.get("required_relations", []) - verbs = facts.get("required_relation_verbs", []) - summaries = facts.get("required_relation_summaries", []) - return { - "answer_contract": ( - "Ответ обязан перечислить компоненты и связи из кода. Используй relation verbs (создаёт, вызывает, импортирует и т.д.). " - "Не подменяй архитектуру списком методов. Не используй retrieval labels в тексте." - ), - "must_mention_components": components, - "must_mention_relations": relations, - "must_mention_relation_summaries": summaries, - "must_use_relation_verbs": verbs, - "must_avoid_semantic_labels_as_primary_claims": True, - "must_not_use_retrieval_labels": facts.get("forbidden_labels", []), - "fact_gaps": facts.get("fact_gaps", []), - } - if scenario == "TRACE_FLOW": - facts = dict(curated.get("trace_flow") or {}) - steps = facts.get("required_flow_steps", []) - ordered_descriptions = facts.get("ordered_step_descriptions", []) - return { - "answer_contract": ( - "Ответ обязан описать поток как упорядоченную последовательность шагов из payload. " - "Не заявляй полноту потока, если в fact_gaps указано иное. Не делай неподтверждённых утверждений." - ), - "must_mention_flow_steps": steps, - "must_mention_ordered_steps": ordered_descriptions, - "must_mention_calls": facts.get("required_calls", []), - "must_mention_sequence_edges": facts.get("required_sequence_edges", []), - "must_avoid_overclaiming_full_flow": True, - "fact_gaps": facts.get("fact_gaps", []), - } - return {} - - def _matches_query(self, route_path: str, query_tokens: set[str]) -> bool: - if not route_path: - return False - path_tokens = self._tokens(route_path) - return bool(path_tokens & query_tokens) - - def _tokens(self, value: str) -> set[str]: - return {token.lower().strip("/") for token in _TOKEN_RE.findall(value or "") if token.strip("/")} diff --git a/src/app/modules/agent/runtime/steps/generation/prompt_selector.py b/src/app/modules/agent/runtime/steps/generation/prompt_selector.py deleted file mode 100644 index abcfeb6..0000000 --- a/src/app/modules/agent/runtime/steps/generation/prompt_selector.py +++ /dev/null @@ -1,32 +0,0 @@ -"""Выбор имени системного промпта по sub_intent и answer_mode.""" - -from __future__ import annotations - - -class RuntimePromptSelector: - _CODE_PROMPTS = { - "ARCHITECTURE": "code_qa_architecture_answer", - "EXPLAIN": "code_qa_explain_answer", - "EXPLAIN_LOCAL": "code_qa_explain_local_answer", - "FIND_ENTRYPOINTS": "code_qa_find_entrypoints_answer", - "FIND_TESTS": "code_qa_find_tests_answer", - "GENERAL_QA": "code_qa_general_answer", - "OPEN_FILE": "code_qa_open_file_answer", - "TRACE_FLOW": "code_qa_trace_flow_answer", - } - _DOCS_INTENT_PROMPTS = { - "DOCUMENTATION_EXPLAIN": "docs_explain_answer", - "GENERAL_QA": "docs_general_answer", - } - - def select(self, *, intent: str = "CODE_QA", sub_intent: str, answer_mode: str) -> str: - intent_key = (intent or "CODE_QA").upper() - if intent_key in {"OPENAPI_GENERATION", "OPENAPI_FROM_DOCUMENTATION"}: - if sub_intent.upper() == "OPENAPI_FRAGMENT_GENERATE": - return "docs_openapi_fragment_answer" - return "docs_openapi_answer" - if intent_key in self._DOCS_INTENT_PROMPTS: - return self._DOCS_INTENT_PROMPTS[intent_key] - if answer_mode in {"degraded", "not_found", "insufficient"}: - return "code_qa_degraded_answer" - return self._CODE_PROMPTS.get(sub_intent.upper(), "code_qa_explain_answer") diff --git a/src/app/modules/agent/runtime/steps/retrieval/__init__.py b/src/app/modules/agent/runtime/steps/retrieval/__init__.py deleted file mode 100644 index 7cfb2a6..0000000 --- a/src/app/modules/agent/runtime/steps/retrieval/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -"""Пакет выполнения retrieval: адаптер к RAG-репозиторию и фабрика контекста репозитория.""" - -from app.modules.agent.runtime.steps.retrieval.adapter import RuntimeRetrievalAdapter -from app.modules.agent.runtime.steps.retrieval.repo_context import RuntimeRepoContextFactory - -__all__ = ["RuntimeRetrievalAdapter", "RuntimeRepoContextFactory"] diff --git a/src/app/modules/agent/runtime/steps/retrieval/adapter.py b/src/app/modules/agent/runtime/steps/retrieval/adapter.py deleted file mode 100644 index 16d2fe7..0000000 --- a/src/app/modules/agent/runtime/steps/retrieval/adapter.py +++ /dev/null @@ -1,337 +0,0 @@ -"""Адаптер RAG-репозитория к runtime: retrieve_with_plan, retrieve_exact_files, consume_retrieval_report.""" - -from __future__ import annotations - -from time import perf_counter -from typing import TYPE_CHECKING, Any - -if TYPE_CHECKING: - from app.modules.rag.persistence.repository import RagRepository - - -class SessionEmbeddingDimensions: - def __init__(self, repository: RagRepository | None = None) -> None: - self._cache: dict[str, int] = {} - self._repository = repository - - def resolve(self, rag_session_id: str) -> int: - if rag_session_id in self._cache: - return self._cache[rag_session_id] - from app.modules.shared.db import get_engine - from sqlalchemy import text - - with get_engine().connect() as conn: - row = conn.execute( - text( - """ - SELECT vector_dims(embedding) AS dim - FROM rag_chunks - WHERE rag_session_id = :sid AND embedding IS NOT NULL - LIMIT 1 - """ - ), - {"sid": rag_session_id}, - ).mappings().first() - dim = int(row["dim"]) if row and row.get("dim") else 0 - self._cache[rag_session_id] = dim - return dim - - -class RuntimeRetrievalAdapter: - _RELATED_DOCS_THRESHOLD = 2 - - def __init__(self, repository: RagRepository | None = None) -> None: - if repository is None: - from app.modules.rag.persistence.repository import RagRepository - - repository = RagRepository() - self._repository = repository - self._dim_resolver = SessionEmbeddingDimensions(self._repository) - self._last_report: dict[str, Any] | None = None - - def retrieve_with_plan( - self, - rag_session_id: str, - query: str, - retrieval_spec, - retrieval_constraints=None, - *, - query_plan=None, - ) -> list[dict]: - rows: list[dict] = [] - planned_layers = [str(item.layer_id) for item in list(getattr(retrieval_spec, "layer_queries", []) or [])] - executed_layers: list[str] = [] - per_layer_ms: dict[str, int] = {} - layer_diagnostics: dict[str, Any] = {} - fallback_used = False - fallback_reason: str | None = None - relation_hits = 0 - query_plan_sub_intent = str(getattr(query_plan, "sub_intent", "") or "") - for layer_query in list(getattr(retrieval_spec, "layer_queries", []) or []): - layer_id = str(layer_query.layer_id) - if ( - query_plan_sub_intent == "RELATED_DOCS_EXPLAIN" - and layer_id in {"D1_DOCUMENT_CATALOG", "D0_DOC_CHUNKS"} - and relation_hits >= self._RELATED_DOCS_THRESHOLD - ): - layer_diagnostics[layer_id] = {"hits": 0, "top_ids": [], "skipped": True, "reason": "relation_primary_sufficient"} - continue - executed_layers.append(layer_id) - started = perf_counter() - layer_rows = self._retrieve_layer( - rag_session_id=rag_session_id, - query=query, - layer_id=layer_id, - limit=max(1, int(layer_query.top_k)), - path_scope=list(getattr(retrieval_spec.filters, "path_scope", []) or []), - retrieval_constraints=retrieval_constraints, - include_tests=str(getattr(retrieval_spec.filters, "test_policy", "EXCLUDE") or "EXCLUDE") == "INCLUDE", - ) - per_layer_ms[layer_id] = int((perf_counter() - started) * 1000) - layer_diagnostics[layer_id] = self._layer_diagnostics(layer_rows) - rows.extend(layer_rows) - if layer_id == "D5_RELATION_GRAPH": - relation_hits = len(layer_rows) - d2_empty = "D2_FACT_INDEX" in planned_layers and int(dict(layer_diagnostics.get("D2_FACT_INDEX") or {}).get("hits") or 0) == 0 - d0_empty = "D0_DOC_CHUNKS" in planned_layers and int(dict(layer_diagnostics.get("D0_DOC_CHUNKS") or {}).get("hits") or 0) == 0 - support_paths = self._support_paths(rows) - if support_paths and "D0_DOC_CHUNKS" in planned_layers and (d2_empty or d0_empty): - targeted_started = perf_counter() - targeted_rows = self.retrieve_exact_files( - rag_session_id, - paths=support_paths, - layers=["D0_DOC_CHUNKS"], - limit=max(6, self._planned_top_k(retrieval_spec, "D0_DOC_CHUNKS")), - query=query, - ranking_profile=str(getattr(retrieval_spec, "rerank_profile", "") or ""), - ) - merged_rows = self._dedupe([*rows, *targeted_rows]) - new_targeted_rows = self._subtract_rows(merged_rows, rows) - per_layer_ms["D0_DOC_CHUNKS"] = per_layer_ms.get("D0_DOC_CHUNKS", 0) + int((perf_counter() - targeted_started) * 1000) - rows = merged_rows - layer_diagnostics["D0_DOC_CHUNKS"] = self._layer_diagnostics( - [row for row in rows if str(row.get("layer") or "") == "D0_DOC_CHUNKS"] - ) - if new_targeted_rows: - fallback_used = True - fallback_reason = "targeted_chunk_retrieval" - self._last_report = { - "planned_layers": planned_layers, - "executed_layers": executed_layers, - "retrieval_mode_by_layer": {layer_id: "vector" for layer_id in executed_layers}, - "top_k_by_layer": {str(item.layer_id): int(item.top_k) for item in list(getattr(retrieval_spec, "layer_queries", []) or [])}, - "filters_by_layer": { - layer_id: {"path_scope": list(getattr(retrieval_spec.filters, "path_scope", []) or [])} - for layer_id in executed_layers - }, - "fallback": {"used": fallback_used, "reason": fallback_reason}, - "retrieval_by_layer_ms": per_layer_ms, - "layer_diagnostics": layer_diagnostics, - } - return self._dedupe(rows) - - def retrieve_exact_files( - self, - rag_session_id: str, - *, - repo_id: str | None = None, - paths: list[str], - layers: list[str] | None = None, - limit: int = 200, - query: str = "", - ranking_profile: str = "", - ) -> list[dict]: - started = perf_counter() - rows = self._repository.retrieve_exact_files(rag_session_id, repo_id=repo_id, paths=paths, layers=layers, limit=limit) - layer_id = list(layers or ["C0_SOURCE_CHUNKS"])[0] - self._last_report = { - "executed_layers": [layer_id], - "retrieval_mode_by_layer": {layer_id: "exact_path_fetch"}, - "top_k_by_layer": {layer_id: int(limit)}, - "filters_by_layer": {layer_id: {"path_scope": list(paths)}}, - "requests": [{"layer": layer_id, "query": query, "ranking_profile": ranking_profile}], - "fallback": {"used": False, "reason": None}, - "retrieval_by_layer_ms": {layer_id: int((perf_counter() - started) * 1000)}, - } - return self._dedupe(rows) - - def hydrate_resolved_symbol_sources( - self, - rag_session_id: str, - base_query: str, - rag_rows: list[dict], - symbol_resolution: dict, - retrieval_spec, - retrieval_constraints=None, - ) -> list[dict]: - if str(symbol_resolution.get("status") or "") != "resolved": - return rag_rows - target = str(symbol_resolution.get("resolved_symbol") or "").strip() - if not target: - return rag_rows - symbol_row = next( - ( - row - for row in rag_rows - if str(row.get("layer") or "") == "C1_SYMBOL_CATALOG" - and target in {str(row.get("title") or "").strip(), str(dict(row.get("metadata") or {}).get("qname") or "").strip()} - ), - None, - ) - if symbol_row is None: - return rag_rows - extra = self.retrieve_exact_files( - rag_session_id, - paths=[str(symbol_row.get("path") or "")], - layers=["C0_SOURCE_CHUNKS"], - limit=6, - query=base_query, - ranking_profile=str(getattr(retrieval_spec, "rerank_profile", "") or ""), - ) - return self._dedupe([*rag_rows, *extra]) - - def force_symbol_context_c0( - self, - rag_session_id: str, - *, - rag_rows: list[dict], - symbol_resolution: dict, - limit: int = 20, - ) -> list[dict]: - if str(symbol_resolution.get("status") or "") != "resolved": - return rag_rows - target = str(symbol_resolution.get("resolved_symbol") or "").strip() - target_row = next((row for row in rag_rows if str(row.get("title") or "").strip() == target), None) - if target_row is None: - return rag_rows - c0_rows = self.retrieve_exact_files( - rag_session_id, - paths=[str(target_row.get("path") or "")], - layers=["C0_SOURCE_CHUNKS"], - limit=limit, - query=target, - ranking_profile="symbol_context", - ) - preserved = [row for row in rag_rows if str(row.get("layer") or "") != "C0_SOURCE_CHUNKS"] - return self._dedupe([*preserved, *c0_rows]) - - def consume_retrieval_report(self) -> dict[str, Any] | None: - report = self._last_report - self._last_report = None - return report - - def _retrieve_layer( - self, - *, - rag_session_id: str, - query: str, - layer_id: str, - limit: int, - path_scope: list[str], - retrieval_constraints, - include_tests: bool, - ) -> list[dict]: - exclude_prefixes, exclude_like = self._test_filters(include_tests) - if retrieval_constraints is not None: - exclude_globs = [item.lower() for item in list(getattr(retrieval_constraints, "exclude_globs", []) or [])] - exclude_like.extend(self._glob_to_like(item) for item in exclude_globs if "*" in item) - dim = self._dim_resolver.resolve(rag_session_id) - if dim <= 0: - if layer_id != "C0_SOURCE_CHUNKS": - return [] - return self._repository.retrieve_lexical_code( - rag_session_id, - query_text=query, - limit=limit, - path_prefixes=path_scope or None, - exclude_path_prefixes=exclude_prefixes or None, - exclude_like_patterns=exclude_like or None, - prefer_non_tests=not include_tests, - ) - return self._repository.retrieve( - rag_session_id, - [0.0] * dim, - query_text=query, - limit=limit, - layers=[layer_id], - path_prefixes=path_scope or None, - exclude_path_prefixes=exclude_prefixes or None, - exclude_like_patterns=exclude_like or None, - prefer_non_tests=not include_tests, - ) - - def _test_filters(self, include_tests: bool) -> tuple[list[str], list[str]]: - if include_tests: - return [], [] - from app.modules.rag.retrieval.test_filter import build_test_filters - - filters = build_test_filters() - return list(filters.exclude_path_prefixes), list(filters.exclude_like_patterns) - - def _glob_to_like(self, glob: str) -> str: - return glob.replace("**/", "%/").replace("**", "%").replace("*", "%").replace("?", "_") - - def _dedupe(self, rows: list[dict]) -> list[dict]: - result: list[dict] = [] - seen: set[tuple[str, str, str, int | None, int | None]] = set() - for row in rows: - path = str(row.get("path") or "") - layer = str(row.get("layer") or "") - title = str(row.get("title") or "") - key = (layer, path, title, row.get("span_start"), row.get("span_end")) - if key in seen: - continue - seen.add(key) - result.append(row) - return result - - def _layer_diagnostics(self, rows: list[dict]) -> dict[str, Any]: - ids: list[str] = [] - sections: list[str] = [] - for row in rows[:5]: - metadata = dict(row.get("metadata") or {}) - candidate = ( - metadata.get("document_id") - or metadata.get("doc_id") - or metadata.get("fact_id") - or metadata.get("relation_id") - or metadata.get("target_id") - or row.get("path") - ) - value = str(candidate or "").strip() - if value and value not in ids: - ids.append(value) - title = str(row.get("title") or "").strip() - if title and title not in sections: - sections.append(title) - return {"hits": len(rows), "top_ids": ids, "top_sections": sections} - - def _subtract_rows(self, rows: list[dict], baseline: list[dict]) -> list[dict]: - baseline_keys = {self._row_key(row) for row in baseline} - return [row for row in rows if self._row_key(row) not in baseline_keys] - - def _support_paths(self, rows: list[dict]) -> list[str]: - values: list[str] = [] - for row in rows: - layer = str(row.get("layer") or "") - if layer not in {"D1_DOCUMENT_CATALOG", "D2_FACT_INDEX", "D3_ENTITY_CATALOG", "D4_WORKFLOW_INDEX", "D5_RELATION_GRAPH"}: - continue - path = str(row.get("path") or "").strip() - if path and path not in values: - values.append(path) - return values[:6] - - def _planned_top_k(self, retrieval_spec, layer_id: str) -> int: - for item in list(getattr(retrieval_spec, "layer_queries", []) or []): - if str(item.layer_id) == layer_id: - return int(item.top_k) - return 6 - - def _row_key(self, row: dict) -> tuple[str, str, str, int | None, int | None]: - return ( - str(row.get("layer") or ""), - str(row.get("path") or ""), - str(row.get("title") or ""), - row.get("span_start"), - row.get("span_end"), - ) diff --git a/src/app/modules/agent/runtime/steps/retrieval/repo_context.py b/src/app/modules/agent/runtime/steps/retrieval/repo_context.py deleted file mode 100644 index 5b7a163..0000000 --- a/src/app/modules/agent/runtime/steps/retrieval/repo_context.py +++ /dev/null @@ -1,40 +0,0 @@ -"""Фабрика контекста репозитория (языки, слои RAG) для runtime.""" - -from __future__ import annotations - -from app.modules.rag.contracts.enums import RagLayer -from app.modules.agent.intent_router_v2.models import RepoContext - - -class RuntimeRepoContextFactory: - _KNOWN_LAYERS = [ - RagLayer.CODE_ENTRYPOINTS, - RagLayer.CODE_SYMBOL_CATALOG, - RagLayer.CODE_DEPENDENCY_GRAPH, - RagLayer.CODE_SEMANTIC_ROLES, - RagLayer.CODE_SOURCE_CHUNKS, - RagLayer.DOCS_DOC_CHUNKS, - RagLayer.DOCS_DOCUMENT_CATALOG, - RagLayer.DOCS_FACT_INDEX, - RagLayer.DOCS_ENTITY_CATALOG, - RagLayer.DOCS_WORKFLOW_INDEX, - RagLayer.DOCS_RELATION_GRAPH, - ] - - def build(self, files_map: dict[str, dict] | None = None) -> RepoContext: - languages = self._languages(files_map or {}) - return RepoContext( - languages=languages or ["python"], - available_domains=["CODE", "DOCS"], - available_layers=list(self._KNOWN_LAYERS), - ) - - def _languages(self, files_map: dict[str, dict]) -> list[str]: - found: list[str] = [] - for path in files_map: - lower = path.lower() - if lower.endswith(".py") and "python" not in found: - found.append("python") - if lower.endswith((".md", ".rst", ".txt")) and "markdown" not in found: - found.append("markdown") - return found diff --git a/src/app/modules/agent/runtime/story_context_repository.py b/src/app/modules/agent/runtime/story_context_repository.py deleted file mode 100644 index f6bf93c..0000000 --- a/src/app/modules/agent/runtime/story_context_repository.py +++ /dev/null @@ -1,747 +0,0 @@ -"""Репозиторий Story-контекста и схемы таблиц. Перенесён из agent для отвязки от legacy-стека.""" - -from __future__ import annotations - -import json -from collections import defaultdict - -from sqlalchemy import text - -from app.modules.shared.db import get_engine - - -class StoryContextSchemaRepository: - def ensure_tables(self) -> None: - with get_engine().connect() as conn: - conn.execute( - text( - """ - CREATE TABLE IF NOT EXISTS story_records ( - story_id VARCHAR(128) PRIMARY KEY, - project_id VARCHAR(512) NOT NULL, - title TEXT NOT NULL, - status VARCHAR(64) NOT NULL DEFAULT 'draft', - owner VARCHAR(256) NULL, - metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, - baseline_commit_sha VARCHAR(128) NULL, - snapshot_id VARCHAR(128) NULL, - created_by VARCHAR(256) NULL, - updated_by VARCHAR(256) NULL, - created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP - ) - """ - ) - ) - conn.execute( - text( - """ - CREATE TABLE IF NOT EXISTS story_artifacts ( - id BIGSERIAL PRIMARY KEY, - story_id VARCHAR(128) NOT NULL, - artifact_type VARCHAR(64) NOT NULL, - revision INTEGER NOT NULL, - content TEXT NOT NULL, - content_hash VARCHAR(128) NULL, - rag_session_id VARCHAR(64) NULL, - created_by VARCHAR(256) NULL, - created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, - artifact_role VARCHAR(64) NULL, - doc_id TEXT NULL, - doc_version TEXT NULL, - path TEXT NULL, - section TEXT NULL, - chunk_id TEXT NULL, - change_type VARCHAR(32) NULL, - summary TEXT NULL, - source_ref TEXT NULL, - session_id VARCHAR(128) NULL, - CONSTRAINT fk_story_artifacts_story - FOREIGN KEY (story_id) - REFERENCES story_records(story_id) - ON DELETE CASCADE, - CONSTRAINT uq_story_artifact_revision - UNIQUE (story_id, artifact_type, revision) - ) - """ - ) - ) - conn.execute( - text( - """ - CREATE TABLE IF NOT EXISTS story_links ( - id BIGSERIAL PRIMARY KEY, - story_id VARCHAR(128) NOT NULL, - link_type VARCHAR(64) NOT NULL, - link_value TEXT NOT NULL, - target_ref TEXT NULL, - description TEXT NULL, - metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, - created_by VARCHAR(256) NULL, - created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT fk_story_links_story - FOREIGN KEY (story_id) - REFERENCES story_records(story_id) - ON DELETE CASCADE - ) - """ - ) - ) - conn.execute( - text( - """ - CREATE TABLE IF NOT EXISTS session_artifacts ( - id BIGSERIAL PRIMARY KEY, - session_id VARCHAR(128) NOT NULL, - project_id VARCHAR(512) NOT NULL, - artifact_role VARCHAR(64) NOT NULL, - source_ref TEXT NULL, - doc_id TEXT NULL, - doc_version TEXT NULL, - path TEXT NULL, - section TEXT NULL, - chunk_id TEXT NULL, - change_type VARCHAR(32) NULL, - summary TEXT NULL, - created_by VARCHAR(256) NULL, - created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, - bound_story_id VARCHAR(128) NULL, - bound_at TIMESTAMPTZ NULL - ) - """ - ) - ) - - # Backward-compatible schema upgrades for existing installations. - conn.execute(text("ALTER TABLE story_records ADD COLUMN IF NOT EXISTS owner VARCHAR(256) NULL")) - conn.execute(text("ALTER TABLE story_records ADD COLUMN IF NOT EXISTS metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb")) - conn.execute(text("ALTER TABLE story_records ADD COLUMN IF NOT EXISTS baseline_commit_sha VARCHAR(128) NULL")) - conn.execute(text("ALTER TABLE story_records ADD COLUMN IF NOT EXISTS snapshot_id VARCHAR(128) NULL")) - conn.execute(text("ALTER TABLE story_records ADD COLUMN IF NOT EXISTS created_by VARCHAR(256) NULL")) - conn.execute(text("ALTER TABLE story_records ADD COLUMN IF NOT EXISTS updated_by VARCHAR(256) NULL")) - - conn.execute(text("ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS artifact_role VARCHAR(64) NULL")) - conn.execute(text("ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS doc_id TEXT NULL")) - conn.execute(text("ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS doc_version TEXT NULL")) - conn.execute(text("ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS path TEXT NULL")) - conn.execute(text("ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS section TEXT NULL")) - conn.execute(text("ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS chunk_id TEXT NULL")) - conn.execute(text("ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS change_type VARCHAR(32) NULL")) - conn.execute(text("ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS summary TEXT NULL")) - conn.execute(text("ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS source_ref TEXT NULL")) - conn.execute(text("ALTER TABLE story_artifacts ADD COLUMN IF NOT EXISTS session_id VARCHAR(128) NULL")) - - conn.execute(text("ALTER TABLE story_links ADD COLUMN IF NOT EXISTS target_ref TEXT NULL")) - conn.execute(text("ALTER TABLE story_links ADD COLUMN IF NOT EXISTS description TEXT NULL")) - conn.execute(text("ALTER TABLE story_links ADD COLUMN IF NOT EXISTS metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb")) - conn.execute(text("ALTER TABLE story_links ADD COLUMN IF NOT EXISTS created_by VARCHAR(256) NULL")) - - conn.execute(text("ALTER TABLE session_artifacts ADD COLUMN IF NOT EXISTS bound_story_id VARCHAR(128) NULL")) - conn.execute(text("ALTER TABLE session_artifacts ADD COLUMN IF NOT EXISTS bound_at TIMESTAMPTZ NULL")) - - conn.execute(text("CREATE INDEX IF NOT EXISTS idx_story_records_project ON story_records(project_id, updated_at DESC)")) - conn.execute(text("CREATE INDEX IF NOT EXISTS idx_story_artifacts_story_type ON story_artifacts(story_id, artifact_type, revision DESC)")) - conn.execute(text("CREATE INDEX IF NOT EXISTS idx_story_links_story ON story_links(story_id, link_type)")) - conn.execute(text("CREATE INDEX IF NOT EXISTS idx_session_artifacts_session ON session_artifacts(session_id, created_at DESC)")) - conn.execute(text("CREATE INDEX IF NOT EXISTS idx_session_artifacts_project ON session_artifacts(project_id, created_at DESC)")) - conn.commit() - - -class StoryContextRepository: - def record_story_commit( - self, - *, - story_id: str, - project_id: str, - title: str, - commit_sha: str | None, - branch: str | None, - changed_files: list[str], - summary: str, - actor: str | None, - ) -> None: - with get_engine().connect() as conn: - self._upsert_story_conn( - conn, - story_id=story_id, - project_id=project_id, - title=title, - status="in_progress", - metadata={"source": "repo_webhook"}, - baseline_commit_sha=commit_sha, - updated_by=actor, - ) - if commit_sha: - self._insert_story_link( - conn, - story_id=story_id, - link_type="commit", - target_ref=commit_sha, - description="Webhook commit", - metadata={"project_id": project_id}, - created_by=actor, - ) - if branch: - self._insert_story_link( - conn, - story_id=story_id, - link_type="external", - target_ref=branch, - description="Webhook branch", - metadata={"kind": "branch"}, - created_by=actor, - ) - for path in changed_files: - self._insert_story_link( - conn, - story_id=story_id, - link_type="doc", - target_ref=path, - description="Changed file in commit", - metadata={"commit_sha": commit_sha}, - created_by=actor, - ) - revision = self._next_revision(conn, story_id=story_id, artifact_type="commit") - conn.execute( - text( - """ - INSERT INTO story_artifacts ( - story_id, - artifact_type, - revision, - content, - content_hash, - rag_session_id, - created_by, - artifact_role, - change_type, - summary, - source_ref - ) VALUES ( - :story_id, - :artifact_type, - :revision, - :content, - NULL, - NULL, - :created_by, - :artifact_role, - :change_type, - :summary, - :source_ref - ) - """ - ), - { - "story_id": story_id, - "artifact_type": "commit", - "revision": revision, - "content": summary[:4000] or "commit", - "created_by": actor, - "artifact_role": "doc_change", - "change_type": "linked", - "summary": summary[:4000] or "commit", - "source_ref": commit_sha or branch or "webhook", - }, - ) - conn.commit() - - def upsert_story( - self, - *, - story_id: str, - project_id: str, - title: str, - status: str = "draft", - owner: str | None = None, - metadata: dict | None = None, - baseline_commit_sha: str | None = None, - snapshot_id: str | None = None, - created_by: str | None = None, - updated_by: str | None = None, - ) -> None: - with get_engine().connect() as conn: - conn.execute( - text( - """ - INSERT INTO story_records ( - story_id, - project_id, - title, - status, - owner, - metadata_json, - baseline_commit_sha, - snapshot_id, - created_by, - updated_by - ) - VALUES ( - :story_id, - :project_id, - :title, - :status, - :owner, - CAST(:metadata_json AS JSONB), - :baseline_commit_sha, - :snapshot_id, - :created_by, - :updated_by - ) - ON CONFLICT (story_id) DO UPDATE SET - project_id = EXCLUDED.project_id, - title = EXCLUDED.title, - status = EXCLUDED.status, - owner = EXCLUDED.owner, - metadata_json = EXCLUDED.metadata_json, - baseline_commit_sha = COALESCE(EXCLUDED.baseline_commit_sha, story_records.baseline_commit_sha), - snapshot_id = COALESCE(EXCLUDED.snapshot_id, story_records.snapshot_id), - updated_by = COALESCE(EXCLUDED.updated_by, story_records.updated_by), - updated_at = CURRENT_TIMESTAMP - """ - ), - { - "story_id": story_id, - "project_id": project_id, - "title": title, - "status": status, - "owner": owner, - "metadata_json": json.dumps(metadata or {}, ensure_ascii=False), - "baseline_commit_sha": baseline_commit_sha, - "snapshot_id": snapshot_id, - "created_by": created_by, - "updated_by": updated_by, - }, - ) - conn.commit() - - def add_session_artifact( - self, - *, - session_id: str, - project_id: str, - artifact_role: str, - summary: str, - change_type: str | None = None, - source_ref: str | None = None, - doc_id: str | None = None, - doc_version: str | None = None, - path: str | None = None, - section: str | None = None, - chunk_id: str | None = None, - created_by: str | None = None, - ) -> None: - with get_engine().connect() as conn: - conn.execute( - text( - """ - INSERT INTO session_artifacts ( - session_id, - project_id, - artifact_role, - source_ref, - doc_id, - doc_version, - path, - section, - chunk_id, - change_type, - summary, - created_by - ) VALUES ( - :session_id, - :project_id, - :artifact_role, - :source_ref, - :doc_id, - :doc_version, - :path, - :section, - :chunk_id, - :change_type, - :summary, - :created_by - ) - """ - ), - { - "session_id": session_id, - "project_id": project_id, - "artifact_role": artifact_role, - "source_ref": source_ref, - "doc_id": doc_id, - "doc_version": doc_version, - "path": path, - "section": section, - "chunk_id": chunk_id, - "change_type": change_type, - "summary": summary, - "created_by": created_by, - }, - ) - conn.commit() - - def bind_session_to_story( - self, - *, - session_id: str, - story_id: str, - project_id: str, - title: str, - commit_sha: str | None = None, - branch: str | None = None, - changed_files: list[str] | None = None, - actor: str | None = None, - ) -> dict: - with get_engine().connect() as conn: - self._upsert_story_conn( - conn, - story_id=story_id, - project_id=project_id, - title=title, - status="in_progress", - metadata={"bound_session_id": session_id}, - baseline_commit_sha=commit_sha, - updated_by=actor, - ) - - if commit_sha: - self._insert_story_link( - conn, - story_id=story_id, - link_type="commit", - target_ref=commit_sha, - description=f"Bound from session {session_id}", - metadata={"session_id": session_id}, - created_by=actor, - ) - if branch: - self._insert_story_link( - conn, - story_id=story_id, - link_type="external", - target_ref=branch, - description="Source branch", - metadata={"kind": "branch"}, - created_by=actor, - ) - for path in changed_files or []: - self._insert_story_link( - conn, - story_id=story_id, - link_type="doc", - target_ref=path, - description="Changed file from commit", - metadata={"session_id": session_id, "commit_sha": commit_sha}, - created_by=actor, - ) - - rows = conn.execute( - text( - """ - SELECT id, artifact_role, source_ref, doc_id, doc_version, path, section, chunk_id, change_type, summary, created_by, project_id - FROM session_artifacts - WHERE session_id = :session_id AND bound_story_id IS NULL - ORDER BY id ASC - """ - ), - {"session_id": session_id}, - ).mappings().fetchall() - - revisions = self._load_revisions(conn, story_id) - migrated = 0 - for row in rows: - role = str(row["artifact_role"]) - revisions[role] += 1 - summary = str(row["summary"] or "") - content = summary or "n/a" - conn.execute( - text( - """ - INSERT INTO story_artifacts ( - story_id, - artifact_type, - revision, - content, - content_hash, - rag_session_id, - created_by, - artifact_role, - doc_id, - doc_version, - path, - section, - chunk_id, - change_type, - summary, - source_ref, - session_id - ) VALUES ( - :story_id, - :artifact_type, - :revision, - :content, - NULL, - :rag_session_id, - :created_by, - :artifact_role, - :doc_id, - :doc_version, - :path, - :section, - :chunk_id, - :change_type, - :summary, - :source_ref, - :session_id - ) - """ - ), - { - "story_id": story_id, - "artifact_type": role, - "revision": revisions[role], - "content": content, - "rag_session_id": str(row["project_id"]), - "created_by": actor or row["created_by"], - "artifact_role": role, - "doc_id": row["doc_id"], - "doc_version": row["doc_version"], - "path": row["path"], - "section": row["section"], - "chunk_id": row["chunk_id"], - "change_type": row["change_type"], - "summary": summary, - "source_ref": row["source_ref"], - "session_id": session_id, - }, - ) - conn.execute( - text( - """ - UPDATE session_artifacts - SET bound_story_id = :story_id, bound_at = CURRENT_TIMESTAMP - WHERE id = :id - """ - ), - {"story_id": story_id, "id": int(row["id"])}, - ) - migrated += 1 - - conn.commit() - return {"story_id": story_id, "session_id": session_id, "migrated_artifacts": migrated} - - def add_artifact( - self, - *, - story_id: str, - artifact_type: str, - revision: int, - content: str, - content_hash: str | None = None, - rag_session_id: str | None = None, - created_by: str | None = None, - ) -> None: - with get_engine().connect() as conn: - conn.execute( - text( - """ - INSERT INTO story_artifacts ( - story_id, - artifact_type, - revision, - content, - content_hash, - rag_session_id, - created_by, - artifact_role, - summary - ) VALUES ( - :story_id, - :artifact_type, - :revision, - :content, - :content_hash, - :rag_session_id, - :created_by, - :artifact_role, - :summary - ) - ON CONFLICT (story_id, artifact_type, revision) DO UPDATE SET - content = EXCLUDED.content, - content_hash = EXCLUDED.content_hash, - rag_session_id = EXCLUDED.rag_session_id, - created_by = EXCLUDED.created_by, - artifact_role = EXCLUDED.artifact_role, - summary = EXCLUDED.summary - """ - ), - { - "story_id": story_id, - "artifact_type": artifact_type, - "revision": int(revision), - "content": content, - "content_hash": content_hash, - "rag_session_id": rag_session_id, - "created_by": created_by, - "artifact_role": artifact_type, - "summary": content, - }, - ) - conn.commit() - - def get_story_context(self, story_id: str) -> dict | None: - with get_engine().connect() as conn: - story = conn.execute( - text( - """ - SELECT story_id, project_id, title, status, owner, metadata_json, baseline_commit_sha, snapshot_id, created_by, updated_by, created_at, updated_at - FROM story_records - WHERE story_id = :story_id - """ - ), - {"story_id": story_id}, - ).mappings().fetchone() - if not story: - return None - - artifacts = conn.execute( - text( - """ - SELECT artifact_type, artifact_role, revision, content, summary, path, section, chunk_id, change_type, doc_id, doc_version, - source_ref, session_id, content_hash, rag_session_id, created_by, created_at - FROM story_artifacts - WHERE story_id = :story_id - ORDER BY artifact_type ASC, revision DESC - """ - ), - {"story_id": story_id}, - ).mappings().fetchall() - - links = conn.execute( - text( - """ - SELECT link_type, - COALESCE(target_ref, link_value) AS target_ref, - description, - metadata_json, - created_by, - created_at - FROM story_links - WHERE story_id = :story_id - ORDER BY id ASC - """ - ), - {"story_id": story_id}, - ).mappings().fetchall() - - return { - "story": dict(story), - "artifacts": [dict(item) for item in artifacts], - "links": [dict(item) for item in links], - } - - def _upsert_story_conn( - self, - conn, - *, - story_id: str, - project_id: str, - title: str, - status: str, - metadata: dict, - baseline_commit_sha: str | None, - updated_by: str | None, - ) -> None: - conn.execute( - text( - """ - INSERT INTO story_records (story_id, project_id, title, status, metadata_json, baseline_commit_sha, updated_by) - VALUES (:story_id, :project_id, :title, :status, CAST(:metadata_json AS JSONB), :baseline_commit_sha, :updated_by) - ON CONFLICT (story_id) DO UPDATE SET - project_id = EXCLUDED.project_id, - title = EXCLUDED.title, - status = EXCLUDED.status, - metadata_json = EXCLUDED.metadata_json, - baseline_commit_sha = COALESCE(EXCLUDED.baseline_commit_sha, story_records.baseline_commit_sha), - updated_by = COALESCE(EXCLUDED.updated_by, story_records.updated_by), - updated_at = CURRENT_TIMESTAMP - """ - ), - { - "story_id": story_id, - "project_id": project_id, - "title": title, - "status": status, - "metadata_json": json.dumps(metadata, ensure_ascii=False), - "baseline_commit_sha": baseline_commit_sha, - "updated_by": updated_by, - }, - ) - - def _insert_story_link( - self, - conn, - *, - story_id: str, - link_type: str, - target_ref: str, - description: str, - metadata: dict, - created_by: str | None, - ) -> None: - conn.execute( - text( - """ - INSERT INTO story_links (story_id, link_type, link_value, target_ref, description, metadata_json, created_by) - VALUES ( - :story_id, - :link_type, - :link_value, - :target_ref, - :description, - CAST(:metadata_json AS JSONB), - :created_by - ) - """ - ), - { - "story_id": story_id, - "link_type": link_type, - "link_value": target_ref, - "target_ref": target_ref, - "description": description, - "metadata_json": json.dumps(metadata, ensure_ascii=False), - "created_by": created_by, - }, - ) - - def _load_revisions(self, conn, story_id: str) -> defaultdict[str, int]: - rows = conn.execute( - text( - """ - SELECT artifact_type, COALESCE(MAX(revision), 0) AS max_revision - FROM story_artifacts - WHERE story_id = :story_id - GROUP BY artifact_type - """ - ), - {"story_id": story_id}, - ).mappings().fetchall() - revision_map: defaultdict[str, int] = defaultdict(int) - for row in rows: - revision_map[str(row["artifact_type"])] = int(row["max_revision"]) - return revision_map - - def _next_revision(self, conn, *, story_id: str, artifact_type: str) -> int: - row = conn.execute( - text( - """ - SELECT COALESCE(MAX(revision), 0) AS max_revision - FROM story_artifacts - WHERE story_id = :story_id AND artifact_type = :artifact_type - """ - ), - {"story_id": story_id, "artifact_type": artifact_type}, - ).mappings().fetchone() - return int(row["max_revision"]) + 1 if row else 1 diff --git a/src/app/modules/agent/task_runtime/__init__.py b/src/app/modules/agent/task_runtime/__init__.py deleted file mode 100644 index 105525c..0000000 --- a/src/app/modules/agent/task_runtime/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from app.modules.agent.task_runtime.context import TaskRuntimeContextBuilder -from app.modules.agent.task_runtime.dispatcher import TaskWorkflowDispatcher -from app.modules.agent.task_runtime.enrichment import ContextEnrichmentService -from app.modules.agent.task_runtime.facade import AgentTaskRuntimeFacade -from app.modules.agent.task_runtime.templates import DocumentationTemplateRegistry - -__all__ = [ - "AgentTaskRuntimeFacade", - "ContextEnrichmentService", - "DocumentationTemplateRegistry", - "TaskRuntimeContextBuilder", - "TaskWorkflowDispatcher", -] diff --git a/src/app/modules/agent/task_runtime/context.py b/src/app/modules/agent/task_runtime/context.py deleted file mode 100644 index 082fe2e..0000000 --- a/src/app/modules/agent/task_runtime/context.py +++ /dev/null @@ -1,47 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.intent_router_v2 import ConversationState -from app.modules.agent.runtime.steps.retrieval import RuntimeRepoContextFactory - -from app.modules.agent.task_runtime.models import TaskRuntimeContext - - -class TaskRuntimeContextBuilder: - def __init__(self, repo_context_factory: RuntimeRepoContextFactory | None = None) -> None: - self._repo_context_factory = repo_context_factory or RuntimeRepoContextFactory() - - def build( - self, - *, - task_id: str, - dialog_session_id: str, - rag_session_id: str, - mode: str, - message: str, - attachments: list[dict], - files: list[dict], - progress_cb, - trace=None, - ) -> TaskRuntimeContext: - files_map = self._files_to_map(files) - return TaskRuntimeContext( - task_id=task_id, - dialog_session_id=dialog_session_id, - rag_session_id=rag_session_id, - mode=mode, - message=message, - attachments=list(attachments or []), - files=list(files or []), - files_map=files_map, - progress_cb=progress_cb, - trace=trace, - repo_context=self._repo_context_factory.build(files_map), - conversation_state=ConversationState(), - ) - - def _files_to_map(self, files: list[dict]) -> dict[str, dict]: - out: dict[str, dict] = {} - for item in files or []: - if isinstance(item, dict) and item.get("path"): - out[str(item["path"])] = dict(item) - return out diff --git a/src/app/modules/agent/task_runtime/dispatcher.py b/src/app/modules/agent/task_runtime/dispatcher.py deleted file mode 100644 index d891875..0000000 --- a/src/app/modules/agent/task_runtime/dispatcher.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.task_runtime.models import TaskRuntimeContext, WorkflowExecutionResult -from app.modules.agent.task_runtime.workflows.base import TaskWorkflow - - -class TaskWorkflowDispatcher: - def __init__( - self, - *, - docs_qa: TaskWorkflow, - general_qa: TaskWorkflow, - docs_generation: TaskWorkflow, - openapi: TaskWorkflow, - fallback: TaskWorkflow, - ) -> None: - self._docs_qa = docs_qa - self._general_qa = general_qa - self._docs_generation = docs_generation - self._openapi = openapi - self._fallback = fallback - - def dispatch(self, ctx: TaskRuntimeContext) -> WorkflowExecutionResult: - workflow = self._select(getattr(ctx.route_result, "intent", "FALLBACK")) - return workflow.run(ctx) - - def _select(self, intent: str) -> TaskWorkflow: - normalized = (intent or "FALLBACK").upper() - if normalized == "DOCUMENTATION_EXPLAIN": - return self._docs_qa - if normalized == "GENERAL_QA": - return self._general_qa - if normalized == "OPENAPI_GENERATION": - return self._openapi - if normalized == "GENERATE_DOCS_FROM_CODE": - return self._docs_generation - return self._fallback diff --git a/src/app/modules/agent/task_runtime/enrichment.py b/src/app/modules/agent/task_runtime/enrichment.py deleted file mode 100644 index 7f191f6..0000000 --- a/src/app/modules/agent/task_runtime/enrichment.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.task_runtime.models import TaskRuntimeContext - - -class AttachmentContextProvider: - def build(self, ctx: TaskRuntimeContext) -> dict[str, object]: - return {"attachments": list(ctx.attachments)} - - -class ConfluenceContextProvider: - def build(self, ctx: TaskRuntimeContext) -> dict[str, object]: - urls = [ - str(item.get("url")) - for item in ctx.attachments - if str(item.get("type") or "").lower() == "confluence_url" and item.get("url") - ] - return {"confluence_urls": urls} - - -class ContextEnrichmentService: - def __init__( - self, - attachment_provider: AttachmentContextProvider | None = None, - confluence_provider: ConfluenceContextProvider | None = None, - ) -> None: - self._attachment_provider = attachment_provider or AttachmentContextProvider() - self._confluence_provider = confluence_provider or ConfluenceContextProvider() - - def enrich(self, ctx: TaskRuntimeContext) -> dict[str, object]: - enriched: dict[str, object] = {} - enriched.update(self._attachment_provider.build(ctx)) - enriched.update(self._confluence_provider.build(ctx)) - enriched["files"] = list(ctx.files) - return enriched diff --git a/src/app/modules/agent/task_runtime/facade.py b/src/app/modules/agent/task_runtime/facade.py deleted file mode 100644 index dedd56c..0000000 --- a/src/app/modules/agent/task_runtime/facade.py +++ /dev/null @@ -1,92 +0,0 @@ -from __future__ import annotations - -import asyncio -from types import SimpleNamespace - -from app.modules.agent.intent_router_v2 import IntentRouterV2 -from app.modules.agent.task_runtime.context import TaskRuntimeContextBuilder -from app.modules.agent.task_runtime.dispatcher import TaskWorkflowDispatcher -from app.modules.agent.task_runtime.enrichment import ContextEnrichmentService -from app.modules.agent.task_runtime.status_events import emit_status_block - - -class AgentTaskRuntimeFacade: - def __init__( - self, - *, - router: IntentRouterV2, - context_builder: TaskRuntimeContextBuilder, - enrichment: ContextEnrichmentService, - dispatcher: TaskWorkflowDispatcher, - ) -> None: - self._router = router - self._context_builder = context_builder - self._enrichment = enrichment - self._dispatcher = dispatcher - - async def run( - self, - *, - task_id: str, - dialog_session_id: str, - rag_session_id: str, - mode: str, - message: str, - attachments: list[dict], - files: list[dict], - progress_cb=None, - ): - ctx = self._context_builder.build( - task_id=task_id, - dialog_session_id=dialog_session_id, - rag_session_id=rag_session_id, - mode=mode, - message=message, - attachments=attachments, - files=files, - progress_cb=progress_cb, - ) - self._notify(progress_cb, "runtime.router", "Маршрутизирую запрос по task workflows.", {"mode": mode}) - ctx.route_result = self._router.route(message, ctx.conversation_state, ctx.repo_context) - emit_status_block( - ctx, - block_id="intent_router", - title="Intent Router", - lines=[ - f"intent: {ctx.route_result.intent}", - f"sub_intent: {ctx.route_result.query_plan.sub_intent}", - f"conversation_mode: {ctx.route_result.conversation_mode}", - f"matched_source: {ctx.route_result.matched_intent_source}", - ], - ) - self._notify(progress_cb, "runtime.context", "Собираю контекст для выбранного workflow.", {"intent": ctx.route_result.intent}) - ctx.enriched_context = self._enrichment.enrich(ctx) - loop = asyncio.get_running_loop() - self._notify(progress_cb, "runtime.workflow", "Запускаю целевой task workflow.", {"intent": ctx.route_result.intent}) - emit_status_block( - ctx, - block_id="workflow", - title="Task Workflow", - lines=[ - f"intent: {ctx.route_result.intent}", - f"sub_intent: {ctx.route_result.query_plan.sub_intent}", - "dispatcher: task_workflow_dispatcher", - ], - ) - result = await loop.run_in_executor(None, lambda: self._dispatcher.dispatch(ctx)) - return SimpleNamespace( - result_type=result.result_type, - answer=result.answer, - artifacts=result.artifacts, - changeset=[], - meta={ - "task_id": task_id, - "intent": ctx.route_result.intent, - "workflow_meta": result.meta, - "route": ctx.route_result.model_dump(mode="json"), - }, - ) - - def _notify(self, progress_cb, stage: str, message: str, meta: dict) -> None: - if progress_cb is not None: - progress_cb(stage, message, "task_progress", meta) diff --git a/src/app/modules/agent/task_runtime/models.py b/src/app/modules/agent/task_runtime/models.py deleted file mode 100644 index e2ad651..0000000 --- a/src/app/modules/agent/task_runtime/models.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass, field -from typing import Any, Callable - -from app.schemas.chat import TaskArtifact, TaskResultType - - -ProgressCallback = Callable[[str, str, str, dict | None], Any] - - -@dataclass(slots=True) -class TaskRuntimeContext: - task_id: str - dialog_session_id: str - rag_session_id: str - mode: str - message: str - attachments: list[dict[str, Any]] = field(default_factory=list) - files: list[dict[str, Any]] = field(default_factory=list) - files_map: dict[str, dict[str, Any]] = field(default_factory=dict) - progress_cb: ProgressCallback | None = None - trace: Any = None - repo_context: Any = None - conversation_state: Any = None - route_result: Any = None - enriched_context: dict[str, Any] = field(default_factory=dict) - - -@dataclass(slots=True) -class WorkflowExecutionResult: - result_type: TaskResultType - answer: str = "" - artifacts: list[TaskArtifact] = field(default_factory=list) - meta: dict[str, Any] = field(default_factory=dict) diff --git a/src/app/modules/agent/task_runtime/status_events.py b/src/app/modules/agent/task_runtime/status_events.py deleted file mode 100644 index 34fb961..0000000 --- a/src/app/modules/agent/task_runtime/status_events.py +++ /dev/null @@ -1,28 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.task_runtime.models import TaskRuntimeContext - - -def emit_status_block( - ctx: TaskRuntimeContext, - *, - block_id: str, - title: str, - lines: list[str], - append: bool = False, -) -> None: - if ctx.progress_cb is None: - return - ctx.progress_cb( - f"status.{block_id}", - title, - "task_progress", - { - "status_block": { - "id": block_id, - "title": title, - "lines": [line for line in lines if str(line).strip()], - "append": append, - } - }, - ) diff --git a/src/app/modules/agent/task_runtime/templates.py b/src/app/modules/agent/task_runtime/templates.py deleted file mode 100644 index 2c2e46a..0000000 --- a/src/app/modules/agent/task_runtime/templates.py +++ /dev/null @@ -1,31 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass - - -@dataclass(frozen=True, slots=True) -class DocumentationTemplate: - template_id: str - title: str - sections: tuple[str, ...] - - -class DocumentationTemplateRegistry: - def __init__(self) -> None: - self._templates = { - "system_analytics_v1": DocumentationTemplate( - template_id="system_analytics_v1", - title="Документация по системной аналитике", - sections=( - "Назначение", - "Контекст и границы", - "Основные сущности", - "Сценарии и workflow", - "Интеграции", - "Открытые вопросы и допущения", - ), - ) - } - - def default(self) -> DocumentationTemplate: - return self._templates["system_analytics_v1"] diff --git a/src/app/modules/agent/task_runtime/workflows/__init__.py b/src/app/modules/agent/task_runtime/workflows/__init__.py deleted file mode 100644 index cfd0380..0000000 --- a/src/app/modules/agent/task_runtime/workflows/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -from app.modules.agent.task_runtime.workflows.docs_generation import DocumentationGenerationWorkflow -from app.modules.agent.task_runtime.workflows.docs_qa import DocsQaWorkflow -from app.modules.agent.task_runtime.workflows.fallback import FallbackWorkflow -from app.modules.agent.task_runtime.workflows.openapi import OpenApiWorkflow - -__all__ = [ - "DocsQaWorkflow", - "DocumentationGenerationWorkflow", - "FallbackWorkflow", - "OpenApiWorkflow", -] diff --git a/src/app/modules/agent/task_runtime/workflows/base.py b/src/app/modules/agent/task_runtime/workflows/base.py deleted file mode 100644 index 625eed6..0000000 --- a/src/app/modules/agent/task_runtime/workflows/base.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import annotations - -from typing import Protocol - -from app.modules.agent.task_runtime.models import TaskRuntimeContext, WorkflowExecutionResult - - -class TaskWorkflow(Protocol): - workflow_id: str - - def run(self, ctx: TaskRuntimeContext) -> WorkflowExecutionResult: ... diff --git a/src/app/modules/agent/task_runtime/workflows/docs_generation.py b/src/app/modules/agent/task_runtime/workflows/docs_generation.py deleted file mode 100644 index 2d03522..0000000 --- a/src/app/modules/agent/task_runtime/workflows/docs_generation.py +++ /dev/null @@ -1,82 +0,0 @@ -from __future__ import annotations - -import json - -from app.modules.agent.llm import AgentLlmService -from app.modules.agent.task_runtime.models import TaskRuntimeContext, WorkflowExecutionResult -from app.modules.agent.task_runtime.status_events import emit_status_block -from app.modules.agent.task_runtime.templates import DocumentationTemplateRegistry -from app.schemas.chat import TaskArtifact, TaskResultType - - -class DocumentationGenerationWorkflow: - workflow_id = "docs_generation" - - def __init__( - self, - llm: AgentLlmService | None, - templates: DocumentationTemplateRegistry | None = None, - ) -> None: - self._llm = llm - self._templates = templates or DocumentationTemplateRegistry() - - def run(self, ctx: TaskRuntimeContext) -> WorkflowExecutionResult: - template = self._templates.default() - emit_status_block( - ctx, - block_id="rag_retrieval", - title="RAG Retrieval", - lines=["not used in docs_generation workflow"], - ) - answer = self._generate(ctx, template) - emit_status_block( - ctx, - block_id="workflow", - title="Task Workflow", - lines=[ - f"workflow_id: {self.workflow_id}", - f"template_id: {template.template_id}", - ], - ) - emit_status_block( - ctx, - block_id="evidence_gate", - title="Evidence Gate", - lines=["not applied in docs_generation workflow"], - ) - artifact = TaskArtifact( - artifact_type=TaskResultType.DOCUMENTATION, - title=template.title, - content=answer, - format="markdown", - template_id=template.template_id, - source_refs=list(ctx.enriched_context.get("confluence_urls") or []), - ) - return WorkflowExecutionResult( - result_type=TaskResultType.DOCUMENTATION, - answer=answer, - artifacts=[artifact], - meta={"workflow_id": self.workflow_id, "intent": getattr(ctx.route_result, "intent", "")}, - ) - - def _generate(self, ctx: TaskRuntimeContext, template) -> str: - if self._llm is None: - return self._fallback(template) - payload = json.dumps( - { - "question": ctx.message, - "template_id": template.template_id, - "title": template.title, - "sections": list(template.sections), - "attachments": list(ctx.attachments), - "files": list(ctx.files), - "context": dict(ctx.enriched_context), - }, - ensure_ascii=False, - indent=2, - ) - return self._llm.generate("docs_template_generation", payload, log_context="agent.workflow.docs_generation").strip() - - def _fallback(self, template) -> str: - sections = "\n".join(f"## {name}\n\nTBD" for name in template.sections) - return f"# {template.title}\n\n{sections}\n" diff --git a/src/app/modules/agent/task_runtime/workflows/docs_qa.py b/src/app/modules/agent/task_runtime/workflows/docs_qa.py deleted file mode 100644 index 2f55323..0000000 --- a/src/app/modules/agent/task_runtime/workflows/docs_qa.py +++ /dev/null @@ -1,93 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.runtime.docs_qa_pipeline import DocsQAPipelineRunner -from app.modules.agent.task_runtime.models import TaskRuntimeContext, WorkflowExecutionResult -from app.modules.agent.task_runtime.status_events import emit_status_block -from app.schemas.chat import TaskResultType - - -class DocsQaWorkflow: - workflow_id = "docs_qa" - - def __init__(self, runner: DocsQAPipelineRunner) -> None: - self._runner = runner - - def run(self, ctx: TaskRuntimeContext) -> WorkflowExecutionResult: - if ctx.trace is not None: - ctx.trace.module("task_workflow").log( - "started", - {"workflow_id": self.workflow_id, "message": ctx.message}, - ) - result = self._runner.run( - ctx.message, - ctx.rag_session_id, - conversation_state=ctx.conversation_state, - mode="full", - trace=ctx.trace, - ) - diagnostics = result.diagnostics.model_dump(mode="json") - emit_status_block( - ctx, - block_id="rag_retrieval", - title="RAG Retrieval", - lines=_retrieval_lines(diagnostics), - ) - emit_status_block( - ctx, - block_id="workflow", - title="Task Workflow", - lines=[ - f"workflow_id: {self.workflow_id}", - f"prompt: {result.prompt_name}", - f"answer_mode: {result.answer_mode}", - ], - ) - emit_status_block( - ctx, - block_id="evidence_gate", - title="Evidence Gate", - lines=_gate_lines(diagnostics), - ) - result_payload = WorkflowExecutionResult( - result_type=TaskResultType.ANSWER, - answer=result.answer, - meta={ - "workflow_id": self.workflow_id, - "intent": result.router_result.intent, - "diagnostics": diagnostics, - "llm_request": result.llm_request, - }, - ) - if ctx.trace is not None: - ctx.trace.module("task_workflow").log( - "completed", - {"workflow_id": self.workflow_id, "answer_length": len(result.answer or "")}, - ) - return result_payload - - -def _retrieval_lines(diagnostics: dict) -> list[str]: - lines = [ - f"planned_layers: {', '.join(diagnostics.get('planned_layers') or []) or '-'}", - f"executed_layers: {', '.join(diagnostics.get('executed_layers') or []) or '-'}", - ] - layer_diagnostics = dict(diagnostics.get("layer_diagnostics") or {}) - for layer_id in diagnostics.get("executed_layers") or []: - info = dict(layer_diagnostics.get(layer_id) or {}) - hits = info.get("hits", 0) - lines.append(f"{layer_id}: {hits} hits") - return lines - - -def _gate_lines(diagnostics: dict) -> list[str]: - lines = [ - f"decision: {diagnostics.get('gate_decision') or '-'}", - f"reason: {diagnostics.get('gate_decision_reason') or '-'}", - ] - missing = list(diagnostics.get("gate_missing_requirements") or []) - satisfied = list(diagnostics.get("gate_satisfied_requirements") or []) - if missing: - lines.append(f"missing: {', '.join(missing)}") - if satisfied: - lines.append(f"satisfied: {', '.join(satisfied)}") - return lines diff --git a/src/app/modules/agent/task_runtime/workflows/fallback.py b/src/app/modules/agent/task_runtime/workflows/fallback.py deleted file mode 100644 index cb5c3b7..0000000 --- a/src/app/modules/agent/task_runtime/workflows/fallback.py +++ /dev/null @@ -1,69 +0,0 @@ -from __future__ import annotations - -import json - -from app.modules.agent.llm import AgentLlmService -from app.modules.agent.task_runtime.models import TaskRuntimeContext, WorkflowExecutionResult -from app.modules.agent.task_runtime.status_events import emit_status_block -from app.schemas.chat import TaskResultType - - -class FallbackWorkflow: - workflow_id = "fallback" - - def __init__(self, llm: AgentLlmService | None) -> None: - self._llm = llm - - def run(self, ctx: TaskRuntimeContext) -> WorkflowExecutionResult: - if ctx.trace is not None: - ctx.trace.module("task_workflow").log( - "started", - {"workflow_id": self.workflow_id, "message": ctx.message}, - ) - emit_status_block( - ctx, - block_id="rag_retrieval", - title="RAG Retrieval", - lines=["not used in fallback workflow"], - ) - if self._llm is None: - answer = "Пока не удалось подобрать специализированный workflow для этого запроса." - else: - payload = json.dumps( - { - "question": ctx.message, - "attachments": list(ctx.attachments), - "confluence_urls": list(ctx.enriched_context.get("confluence_urls") or []), - }, - ensure_ascii=False, - indent=2, - ) - answer = self._llm.generate( - "fallback_answer", - payload, - log_context="agent.workflow.fallback", - trace=ctx.trace.module("llm") if ctx.trace is not None else None, - ).strip() - emit_status_block( - ctx, - block_id="workflow", - title="Task Workflow", - lines=[f"workflow_id: {self.workflow_id}"], - ) - emit_status_block( - ctx, - block_id="evidence_gate", - title="Evidence Gate", - lines=["not applied in fallback workflow"], - ) - result = WorkflowExecutionResult( - result_type=TaskResultType.ANSWER, - answer=answer, - meta={"workflow_id": self.workflow_id, "intent": getattr(ctx.route_result, "intent", "")}, - ) - if ctx.trace is not None: - ctx.trace.module("task_workflow").log( - "completed", - {"workflow_id": self.workflow_id, "answer_length": len(answer)}, - ) - return result diff --git a/src/app/modules/agent/task_runtime/workflows/general_qa.py b/src/app/modules/agent/task_runtime/workflows/general_qa.py deleted file mode 100644 index 9991eb3..0000000 --- a/src/app/modules/agent/task_runtime/workflows/general_qa.py +++ /dev/null @@ -1,67 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.runtime.docs_qa_pipeline import DocsQAPipelineRunner -from app.modules.agent.task_runtime.models import TaskRuntimeContext, WorkflowExecutionResult -from app.modules.agent.task_runtime.status_events import emit_status_block -from app.modules.agent.task_runtime.workflows.docs_qa import _gate_lines, _retrieval_lines -from app.schemas.chat import TaskResultType - - -class GeneralQaWorkflow: - workflow_id = "general_qa" - - def __init__(self, runner: DocsQAPipelineRunner) -> None: - self._runner = runner - - def run(self, ctx: TaskRuntimeContext) -> WorkflowExecutionResult: - if ctx.trace is not None: - ctx.trace.module("task_workflow").log( - "started", - {"workflow_id": self.workflow_id, "message": ctx.message}, - ) - result = self._runner.run( - ctx.message, - ctx.rag_session_id, - conversation_state=ctx.conversation_state, - mode="full", - trace=ctx.trace, - ) - diagnostics = result.diagnostics.model_dump(mode="json") - emit_status_block( - ctx, - block_id="rag_retrieval", - title="RAG Retrieval", - lines=_retrieval_lines(diagnostics), - ) - emit_status_block( - ctx, - block_id="workflow", - title="Task Workflow", - lines=[ - f"workflow_id: {self.workflow_id}", - f"prompt: {result.prompt_name}", - f"answer_mode: {result.answer_mode}", - ], - ) - emit_status_block( - ctx, - block_id="evidence_gate", - title="Evidence Gate", - lines=_gate_lines(diagnostics), - ) - result_payload = WorkflowExecutionResult( - result_type=TaskResultType.ANSWER, - answer=result.answer, - meta={ - "workflow_id": self.workflow_id, - "intent": result.router_result.intent, - "diagnostics": diagnostics, - "llm_request": result.llm_request, - }, - ) - if ctx.trace is not None: - ctx.trace.module("task_workflow").log( - "completed", - {"workflow_id": self.workflow_id, "answer_length": len(result.answer or "")}, - ) - return result_payload diff --git a/src/app/modules/agent/task_runtime/workflows/openapi.py b/src/app/modules/agent/task_runtime/workflows/openapi.py deleted file mode 100644 index fb6d95b..0000000 --- a/src/app/modules/agent/task_runtime/workflows/openapi.py +++ /dev/null @@ -1,76 +0,0 @@ -from __future__ import annotations - -from app.modules.agent.runtime.docs_qa_pipeline import DocsQAPipelineRunner -from app.modules.agent.task_runtime.models import TaskRuntimeContext, WorkflowExecutionResult -from app.modules.agent.task_runtime.status_events import emit_status_block -from app.schemas.chat import TaskArtifact, TaskResultType -from app.modules.agent.task_runtime.workflows.docs_qa import _gate_lines, _retrieval_lines - - -class OpenApiWorkflow: - workflow_id = "openapi_generation" - - def __init__(self, runner: DocsQAPipelineRunner) -> None: - self._runner = runner - - def run(self, ctx: TaskRuntimeContext) -> WorkflowExecutionResult: - if ctx.trace is not None: - ctx.trace.module("task_workflow").log( - "started", - {"workflow_id": self.workflow_id, "message": ctx.message}, - ) - result = self._runner.run( - ctx.message, - ctx.rag_session_id, - conversation_state=ctx.conversation_state, - mode="full", - trace=ctx.trace, - ) - diagnostics = result.diagnostics.model_dump(mode="json") - emit_status_block( - ctx, - block_id="rag_retrieval", - title="RAG Retrieval", - lines=_retrieval_lines(diagnostics), - ) - emit_status_block( - ctx, - block_id="workflow", - title="Task Workflow", - lines=[ - f"workflow_id: {self.workflow_id}", - f"prompt: {result.prompt_name}", - f"answer_mode: {result.answer_mode}", - ], - ) - emit_status_block( - ctx, - block_id="evidence_gate", - title="Evidence Gate", - lines=_gate_lines(diagnostics), - ) - content = (result.openapi_result.raw_yaml if result.openapi_result else "") or result.answer - artifact = TaskArtifact( - artifact_type=TaskResultType.OPENAPI, - title="OpenAPI Specification", - content=content, - format="yaml", - source_refs=list(result.diagnostics.doc_paths), - ) - result_payload = WorkflowExecutionResult( - result_type=TaskResultType.OPENAPI, - answer=content, - artifacts=[artifact], - meta={ - "workflow_id": self.workflow_id, - "intent": result.router_result.intent, - "diagnostics": diagnostics, - "llm_request": result.llm_request, - }, - ) - if ctx.trace is not None: - ctx.trace.module("task_workflow").log( - "completed", - {"workflow_id": self.workflow_id, "answer_length": len(content or "")}, - ) - return result_payload diff --git a/src/app/modules/api/application/session_service.py b/src/app/modules/api/application/session_service.py deleted file mode 100644 index 1dfeeab..0000000 --- a/src/app/modules/api/application/session_service.py +++ /dev/null @@ -1,45 +0,0 @@ -from __future__ import annotations - -from datetime import datetime, timezone - -from app.core.exceptions import AppError -from app.modules.api.domain.models.agent_session import AgentSession -from app.modules.api.infrastructure.ids.session_id_factory import SessionIdFactory -from app.modules.api.infrastructure.stores.in_memory_session_store import InMemorySessionStore -from app.schemas.common import ModuleName - - -class SessionService: - def __init__( - self, - store: InMemorySessionStore, - ids: SessionIdFactory, - rag_session_exists, - ) -> None: - self._store = store - self._ids = ids - self._rag_session_exists = rag_session_exists - - def create(self) -> AgentSession: - session = AgentSession.create(self._ids.create()) - return self._store.save(session) - - def get(self, session_id: str) -> AgentSession: - session = self._store.get(session_id) - if session is None: - raise AppError("session_not_found", f"Agent session not found: {session_id}", ModuleName.BACKEND) - return session - - def bind_rag_session(self, session_id: str, rag_session_id: str) -> AgentSession: - if not self._rag_session_exists(rag_session_id): - raise AppError("rag_session_not_found", f"RAG session not found: {rag_session_id}", ModuleName.RAG) - session = self.get(session_id) - session.active_rag_session_id = rag_session_id - session.updated_at = datetime.now(timezone.utc) - return self._store.save(session) - - def reset(self, session_id: str) -> AgentSession: - session = self.get(session_id) - session.active_rag_session_id = None - session.updated_at = datetime.now(timezone.utc) - return self._store.save(session) diff --git a/src/app/modules/api/controllers/session_controller.py b/src/app/modules/api/controllers/session_controller.py deleted file mode 100644 index 996de49..0000000 --- a/src/app/modules/api/controllers/session_controller.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -from app.schemas.agent_api import ( - BindRagSessionRequest, - BindRagSessionResponse, - CreateAgentSessionResponse, - ResetAgentSessionResponse, -) -from app.modules.api.application.session_service import SessionService - - -class SessionController: - def __init__(self, service: SessionService) -> None: - self._service = service - - def create_session(self) -> CreateAgentSessionResponse: - session = self._service.create() - return CreateAgentSessionResponse( - session_id=session.session_id, - active_rag_session_id=session.active_rag_session_id, - created_at=session.created_at, - ) - - def bind_rag_session(self, session_id: str, request: BindRagSessionRequest) -> BindRagSessionResponse: - session = self._service.bind_rag_session(session_id, request.rag_session_id) - return BindRagSessionResponse( - session_id=session.session_id, - active_rag_session_id=session.active_rag_session_id, - updated_at=session.updated_at, - ) - - def reset_session(self, session_id: str) -> ResetAgentSessionResponse: - session = self._service.reset(session_id) - return ResetAgentSessionResponse( - session_id=session.session_id, - active_rag_session_id=session.active_rag_session_id, - status="reset", - updated_at=session.updated_at, - ) diff --git a/src/app/modules/api/controllers/stream_controller.py b/src/app/modules/api/controllers/stream_controller.py deleted file mode 100644 index 1026e9d..0000000 --- a/src/app/modules/api/controllers/stream_controller.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import annotations - -from fastapi.responses import StreamingResponse - -from app.modules.api.application.stream_service import StreamService - - -class StreamController: - def __init__(self, service: StreamService) -> None: - self._service = service - - async def stream(self, request_id: str) -> StreamingResponse: - queue = await self._service.subscribe(request_id) - - async def event_stream(): - import asyncio - - heartbeat = 10 - try: - while True: - try: - event = await asyncio.wait_for(queue.get(), timeout=heartbeat) - yield self._service.encode(event) - except asyncio.TimeoutError: - yield ": keepalive\n\n" - finally: - await self._service.unsubscribe(request_id, queue) - - return StreamingResponse( - event_stream(), - media_type="text/event-stream", - headers={ - "Cache-Control": "no-cache, no-transform", - "Connection": "keep-alive", - "X-Accel-Buffering": "no", - }, - ) diff --git a/src/app/modules/api/domain/models/agent_session.py b/src/app/modules/api/domain/models/agent_session.py deleted file mode 100644 index 25414f0..0000000 --- a/src/app/modules/api/domain/models/agent_session.py +++ /dev/null @@ -1,22 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass -from datetime import datetime, timezone - - -@dataclass(slots=True) -class AgentSession: - session_id: str - active_rag_session_id: str | None - created_at: datetime - updated_at: datetime - - @classmethod - def create(cls, session_id: str) -> "AgentSession": - now = datetime.now(timezone.utc) - return cls( - session_id=session_id, - active_rag_session_id=None, - created_at=now, - updated_at=now, - ) diff --git a/src/app/modules/api/infrastructure/logging/trace_file_path_builder.py b/src/app/modules/api/infrastructure/logging/trace_file_path_builder.py deleted file mode 100644 index 8bc9fd0..0000000 --- a/src/app/modules/api/infrastructure/logging/trace_file_path_builder.py +++ /dev/null @@ -1,15 +0,0 @@ -from __future__ import annotations - -from datetime import datetime, timezone -from pathlib import Path - - -class TraceFilePathBuilder: - def __init__(self, root: Path) -> None: - self._root = root - - def build(self, request_id: str) -> Path: - stamp = datetime.now(timezone.utc).strftime("%Y%m%d") - directory = self._root / stamp - directory.mkdir(parents=True, exist_ok=True) - return directory / f"{request_id}.md" diff --git a/src/app/modules/api/module.py b/src/app/modules/api/module.py deleted file mode 100644 index 9085af9..0000000 --- a/src/app/modules/api/module.py +++ /dev/null @@ -1,30 +0,0 @@ -from __future__ import annotations - -from fastapi import APIRouter - -from app.modules.api.application.request_service import RequestService -from app.modules.api.application.session_service import SessionService -from app.modules.api.application.stream_service import StreamService -from app.modules.api.controllers.request_controller import RequestController -from app.modules.api.controllers.session_controller import SessionController -from app.modules.api.controllers.stream_controller import StreamController -from app.modules.api.public_router import build_public_router - - -class ApiModule: - def __init__( - self, - sessions: SessionService, - requests: RequestService, - streams: StreamService, - ) -> None: - self._sessions = SessionController(sessions) - self._requests = RequestController(requests) - self._streams = StreamController(streams) - - def public_router(self) -> APIRouter: - return build_public_router( - sessions=self._sessions, - requests=self._requests, - streams=self._streams, - ) diff --git a/src/app/modules/application.py b/src/app/modules/application.py deleted file mode 100644 index 4d3f035..0000000 --- a/src/app/modules/application.py +++ /dev/null @@ -1,148 +0,0 @@ -from pathlib import Path - -from app.modules.agent.llm import AgentLlmService -from app.modules.agent.llm.prompt_loader import PromptLoader -from app.modules.agent.intent_router_v2 import IntentRouterV2 -from app.modules.agent.runtime import DocsQAPipelineRunner -from app.modules.agent.runtime.steps.retrieval import RuntimeRepoContextFactory, RuntimeRetrievalAdapter -from app.modules.agent.task_runtime import ContextEnrichmentService, DocumentationTemplateRegistry, TaskRuntimeContextBuilder -from app.modules.agent.task_runtime.workflows import ( - DocumentationGenerationWorkflow, - DocsQaWorkflow, - FallbackWorkflow, - OpenApiWorkflow, -) -from app.modules.agent.task_runtime.workflows.general_qa import GeneralQaWorkflow -from app.modules.api.module import ApiModule -from app.modules.api.application.request_service import RequestService -from app.modules.api.application.session_service import SessionService -from app.modules.api.application.stream_service import StreamService -from app.modules.api.infrastructure.ids.request_id_factory import RequestIdFactory -from app.modules.api.infrastructure.ids.session_id_factory import SessionIdFactory -from app.modules.api.infrastructure.logging.request_trace_logger import RequestTraceLogger -from app.modules.api.infrastructure.stores.in_memory_request_store import InMemoryRequestStore -from app.modules.api.infrastructure.stores.in_memory_session_store import InMemorySessionStore -from app.modules.api.infrastructure.streaming.sse_event_channel import SseEventChannel -from app.modules.agent.orchestration.facade import OrchestrationFacade -from app.modules.agent.orchestration.adapters.intent_router_adapter import IntentRouterAdapter -from app.modules.agent.orchestration.adapters.llm_chat_adapter import LlmChatAdapter -from app.modules.agent.orchestration.messaging.client_message_publisher import ClientMessagePublisher -from app.modules.agent.orchestration.processes.registry import ProcessRegistry -from app.modules.agent.orchestration.processes.v1.process import V1Process -from app.modules.agent.orchestration.processes.v1.prompt_payload_builder import V1PromptPayloadBuilder -from app.modules.agent.orchestration.processes.v1.simple_llm_workflow import SimpleLlmWorkflow -from app.modules.agent.orchestration.processes.v1.steps.bootstrap_step import BootstrapStep -from app.modules.agent.orchestration.processes.v1.steps.execute_llm_workflow_step import ExecuteLlmWorkflowStep -from app.modules.agent.orchestration.processes.v1.steps.finalize_step import FinalizeStep -from app.modules.agent.orchestration.processes.v2.prompt_payload_builder import V2PromptPayloadBuilder -from app.modules.agent.orchestration.processes.v2.prompt_selector import V2PromptSelector -from app.modules.agent.orchestration.processes.v2.process import V2Process -from app.modules.agent.orchestration.processes.v2.steps.execute_documentation_workflow_step import ExecuteDocumentationWorkflowStep -from app.modules.agent.orchestration.processes.v2.steps.execute_fallback_workflow_step import ExecuteFallbackWorkflowStep -from app.modules.agent.orchestration.processes.v2.steps.execute_general_qa_workflow_step import ExecuteGeneralQaWorkflowStep -from app.modules.agent.orchestration.processes.v2.steps.execute_openapi_workflow_step import ExecuteOpenApiWorkflowStep -from app.modules.agent.orchestration.processes.v2.steps.route_intent_step import RouteIntentStep -from app.modules.agent.orchestration.runtime.process_runner import ProcessRunner -from app.modules.rag.persistence.repository import RagRepository -from app.modules.agent.runtime.story_context_repository import StoryContextRepository, StoryContextSchemaRepository -from app.modules.rag.module import RagModule, RagRepoModule -from app.modules.shared.bootstrap import bootstrap_database -from app.modules.shared.event_bus import EventBus -from app.modules.shared.retry_executor import RetryExecutor - - -class ModularApplication: - def __init__(self) -> None: - self.events = EventBus() - self.retry = RetryExecutor() - self.rag_repository = RagRepository() - self.story_context_schema_repository = StoryContextSchemaRepository() - self.story_context_repository = StoryContextRepository() - - self.rag = RagModule(event_bus=self.events, retry=self.retry, repository=self.rag_repository) - self.rag_repo = RagRepoModule( - story_context_repository=self.story_context_repository, - rag_repository=self.rag_repository, - ) - from app.modules.shared.gigachat.client import GigaChatClient - from app.modules.shared.gigachat.settings import GigaChatSettings - from app.modules.shared.gigachat.token_provider import GigaChatTokenProvider - - _giga_settings = GigaChatSettings.from_env() - _giga_client = GigaChatClient(_giga_settings, GigaChatTokenProvider(_giga_settings)) - _v1_prompt_loader = PromptLoader(Path(__file__).resolve().parent / "agent/orchestration/processes/v1/prompts.yml") - _v2_prompt_loader = PromptLoader(Path(__file__).resolve().parent / "agent/orchestration/processes/v2/prompts.yml") - self._agent_llm_v1 = AgentLlmService(client=_giga_client, prompts=_v1_prompt_loader) - self._agent_llm_v2 = AgentLlmService(client=_giga_client, prompts=_v2_prompt_loader) - _router = IntentRouterV2() - _retrieval = RuntimeRetrievalAdapter(self.rag_repository) - _repo_context_factory = RuntimeRepoContextFactory() - _docs_runner = DocsQAPipelineRunner( - router=_router, - retrieval_adapter=_retrieval, - repo_context=_repo_context_factory.build(), - llm=self._agent_llm_v2, - prompt_selector=V2PromptSelector(), - prompt_payload_builder=V2PromptPayloadBuilder(), - ) - _task_context_builder = TaskRuntimeContextBuilder(_repo_context_factory) - _context_enrichment = ContextEnrichmentService() - _docs_workflow = DocsQaWorkflow(_docs_runner) - _openapi_workflow = OpenApiWorkflow(_docs_runner) - _general_qa_workflow = GeneralQaWorkflow(_docs_runner) - _fallback_workflow = FallbackWorkflow(self._agent_llm_v2) - _docs_generation_workflow = DocumentationGenerationWorkflow(self._agent_llm_v2, DocumentationTemplateRegistry()) - self._docs_generation_workflow = _docs_generation_workflow - - self.agent_sessions = InMemorySessionStore() - self.agent_requests = InMemoryRequestStore() - self.agent_events = SseEventChannel() - self.agent_trace_logger = RequestTraceLogger(Path("runtime_traces/agent_requests")) - _publisher = ClientMessagePublisher(self.agent_events, self.agent_trace_logger) - _v1_workflow = SimpleLlmWorkflow( - LlmChatAdapter(self._agent_llm_v1, prompt_name="simple_llm_answer"), - V1PromptPayloadBuilder(), - ) - _process_registry = ProcessRegistry( - V1Process([BootstrapStep(), ExecuteLlmWorkflowStep(_v1_workflow), FinalizeStep()]), - V2Process( - [ - BootstrapStep(), - RouteIntentStep(IntentRouterAdapter(_router), _task_context_builder, _context_enrichment), - ExecuteDocumentationWorkflowStep(_docs_workflow, "workflow_documentation_explain"), - ExecuteOpenApiWorkflowStep(_openapi_workflow, "workflow_openapi_generation"), - ExecuteGeneralQaWorkflowStep(_general_qa_workflow, "workflow_general_qa"), - ExecuteFallbackWorkflowStep(_fallback_workflow, "workflow_fallback"), - FinalizeStep(), - ] - ), - ) - _orchestration = OrchestrationFacade( - request_store=self.agent_requests, - process_registry=_process_registry, - process_runner=ProcessRunner(), - publisher=_publisher, - trace_logger=self.agent_trace_logger, - ) - _session_service = SessionService( - store=self.agent_sessions, - ids=SessionIdFactory(), - rag_session_exists=lambda rag_session_id: self.rag.sessions.get(rag_session_id) is not None, - ) - _request_service = RequestService( - request_store=self.agent_requests, - request_ids=RequestIdFactory(), - sessions=_session_service, - orchestration=_orchestration, - ) - self.api = ApiModule( - sessions=_session_service, - requests=_request_service, - streams=StreamService(self.agent_events, request_exists=lambda request_id: self.agent_requests.get(request_id) is not None), - ) - - def startup(self) -> None: - bootstrap_database( - self.rag_repository, - self.story_context_schema_repository, - ) diff --git a/src/app/modules/rag/contracts/__init__.py b/src/app/modules/rag/contracts/__init__.py deleted file mode 100644 index cdb52d6..0000000 --- a/src/app/modules/rag/contracts/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -from app.modules.rag.contracts.documents import RagDocument, RagSource, RagSpan -from app.modules.rag.contracts.enums import DocKind, EvidenceType, RagLayer, RetrievalMode -from app.modules.rag.contracts.evidence import EvidenceLink -from app.modules.rag.contracts.retrieval import RetrievalItem, RetrievalQuery - -__all__ = [ - "DocKind", - "EvidenceLink", - "EvidenceType", - "RagDocument", - "RagLayer", - "RagSource", - "RagSpan", - "RetrievalItem", - "RetrievalMode", - "RetrievalQuery", -] diff --git a/src/app/modules/rag/indexing/code/roles/__init__.py b/src/app/modules/rag/indexing/code/roles/__init__.py deleted file mode 100644 index f4c5b12..0000000 --- a/src/app/modules/rag/indexing/code/roles/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from app.modules.rag.indexing.code.roles.builder import SemanticRoleBuilder -from app.modules.rag.indexing.code.roles.document_builder import SemanticRoleDocumentBuilder -from app.modules.rag.indexing.code.roles.models import SemanticRoleRecord - -__all__ = [ - "SemanticRoleBuilder", - "SemanticRoleDocumentBuilder", - "SemanticRoleRecord", -] diff --git a/src/app/modules/rag/indexing/docs/content_parser.py b/src/app/modules/rag/indexing/docs/content_parser.py deleted file mode 100644 index f5506db..0000000 --- a/src/app/modules/rag/indexing/docs/content_parser.py +++ /dev/null @@ -1,58 +0,0 @@ -from __future__ import annotations - -from app.modules.rag.indexing.docs.models import ParsedDocument, ParsedSubsection, ParsedTopLevelSection - - -class DocsContentParser: - def parse(self, frontmatter: dict, body: str, *, fallback_title: str) -> ParsedDocument: - top_sections = self._top_level_sections(body) - summary = self._section_text(top_sections, "Summary") - details = self._section_text(top_sections, "Details") - title = str(frontmatter.get("title") or "").strip() or fallback_title - detail_sections = self._subsections(details) - return ParsedDocument( - frontmatter=frontmatter, - title=title, - summary=summary, - details=details, - body=body.strip(), - detail_sections=detail_sections, - ) - - def _top_level_sections(self, body: str) -> list[ParsedTopLevelSection]: - sections: list[ParsedTopLevelSection] = [] - current_title = "" - current_lines: list[str] = [] - for line in body.splitlines(): - if line.startswith("# "): - if current_title: - sections.append(ParsedTopLevelSection(current_title, "\n".join(current_lines).strip())) - current_title = line[2:].strip() - current_lines = [] - continue - current_lines.append(line) - if current_title: - sections.append(ParsedTopLevelSection(current_title, "\n".join(current_lines).strip())) - return sections - - def _section_text(self, sections: list[ParsedTopLevelSection], title: str) -> str: - for section in sections: - if section.title.strip().lower() == title.lower(): - return section.content.strip() - return "" - - def _subsections(self, text: str) -> list[ParsedSubsection]: - sections: list[ParsedSubsection] = [] - current_title = "" - current_lines: list[str] = [] - for line in text.splitlines(): - if line.startswith("## "): - if current_title: - sections.append(ParsedSubsection(current_title, "\n".join(current_lines).strip())) - current_title = line[3:].strip() - current_lines = [] - continue - current_lines.append(line) - if current_title: - sections.append(ParsedSubsection(current_title, "\n".join(current_lines).strip())) - return sections diff --git a/src/app/modules/rag/indexing/docs/document_builder.py b/src/app/modules/rag/indexing/docs/document_builder.py deleted file mode 100644 index 80445bd..0000000 --- a/src/app/modules/rag/indexing/docs/document_builder.py +++ /dev/null @@ -1,153 +0,0 @@ -from __future__ import annotations - -from hashlib import sha256 - -from app.modules.rag.contracts import EvidenceLink, EvidenceType, RagDocument, RagLayer, RagSource -from app.modules.rag.indexing.docs.chunkers.markdown_chunker import SectionChunk -from app.modules.rag.indexing.docs.models import RelationEdge, WorkflowScenario - - -class DocsDocumentBuilder: - def build_document_catalog(self, source: RagSource, frontmatter: dict, summary_text: str, doc_kind: str, *, fallback_title: str) -> RagDocument: - document_id = str(frontmatter.get("id") or source.path).strip() - metadata = { - "document_id": document_id, - "type": str(frontmatter.get("type") or "").strip(), - "name": str(frontmatter.get("name") or "").strip(), - "title": str(frontmatter.get("title") or "").strip() or fallback_title, - "module": str(frontmatter.get("module") or frontmatter.get("domain") or "").strip(), - "layer": str(frontmatter.get("layer") or "").strip(), - "status": frontmatter.get("status"), - "updated_at": frontmatter.get("updated_at"), - "tags": frontmatter.get("tags") or [], - "entities": frontmatter.get("entities") or [], - "parent": frontmatter.get("parent"), - "children": frontmatter.get("children") or [], - "links": frontmatter.get("links") or [], - "source_path": source.path, - "summary_text": summary_text[:4000], - "doc_kind": doc_kind, - } - return RagDocument( - layer=RagLayer.DOCS_DOCUMENT_CATALOG, - source=source, - title=metadata["title"] or document_id, - text=summary_text[:4000] or metadata["title"] or document_id, - metadata=metadata, - ) - - def build_doc_chunk(self, source: RagSource, chunk: SectionChunk, frontmatter: dict, doc_kind: str) -> RagDocument: - document_id = str(frontmatter.get("id") or source.path) - metadata = { - "document_id": document_id, - "type": frontmatter.get("type"), - "module": frontmatter.get("module") or frontmatter.get("domain"), - "tags": frontmatter.get("tags") or [], - "section_path": chunk.section_path, - "section_title": chunk.section_title, - "order": chunk.order, - "doc_kind": doc_kind, - "source_path": source.path, - "artifact_type": "DOCS", - } - return RagDocument( - layer=RagLayer.DOCS_DOC_CHUNKS, - source=source, - title=f"{document_id}:{chunk.section_title}", - text=chunk.content, - metadata=metadata, - links=[EvidenceLink(type=EvidenceType.DOC_SECTION, target_id=document_id, path=source.path, note=chunk.section_path)], - ) - - def build_entity_record(self, source: RagSource, frontmatter: dict, entity: str) -> RagDocument: - document_id = str(frontmatter.get("id") or source.path) - metadata = { - "entity_name": entity, - "document_id": document_id, - "document_type": frontmatter.get("type"), - "module": frontmatter.get("module") or frontmatter.get("domain"), - "tags": frontmatter.get("tags") or [], - "source_path": source.path, - } - return RagDocument( - layer=RagLayer.DOCS_ENTITY_CATALOG, - source=source, - title=entity, - text=entity, - metadata=metadata, - ) - - def build_fact( - self, - source: RagSource, - *, - subject_id: str, - predicate: str, - obj: str, - object_ref: str | None, - anchor: str, - tags: list[str] | None = None, - ) -> RagDocument: - fact_id = sha256(f"{subject_id}|{predicate}|{obj}|{source.path}|{anchor}".encode("utf-8")).hexdigest() - metadata = { - "fact_id": fact_id, - "subject_id": subject_id, - "predicate": predicate, - "object": obj, - "object_ref": object_ref, - "anchor": anchor, - "tags": tags or [], - "source_path": source.path, - } - return RagDocument( - layer=RagLayer.DOCS_FACT_INDEX, - source=source, - title=f"{subject_id}:{predicate}", - text=f"{subject_id} {predicate} {obj}".strip(), - metadata=metadata, - links=[EvidenceLink(type=EvidenceType.DOC_FACT, target_id=fact_id, path=source.path, note=anchor)], - ) - - def build_workflow_record(self, source: RagSource, frontmatter: dict, workflow: WorkflowScenario) -> RagDocument: - document_id = str(frontmatter.get("id") or source.path) - workflow_id = sha256(f"{document_id}|workflow|{workflow.name}|{workflow.anchor}".encode("utf-8")).hexdigest() - metadata = { - "workflow_id": workflow_id, - "document_id": document_id, - "workflow_name": workflow.name, - "preconditions": workflow.preconditions, - "trigger": workflow.trigger, - "main_flow": workflow.main_flow, - "alternative_flow": workflow.alternative_flow, - "error_handling": workflow.error_handling, - "postconditions": workflow.postconditions, - "source_path": source.path, - } - text = "\n".join( - [workflow.name, *workflow.preconditions, *workflow.trigger, *workflow.main_flow, *workflow.alternative_flow] - ).strip() - return RagDocument( - layer=RagLayer.DOCS_WORKFLOW_INDEX, - source=source, - title=workflow.name, - text=text[:4000], - metadata=metadata, - ) - - def build_relation_record(self, source: RagSource, edge: RelationEdge) -> RagDocument: - relation_id = sha256(f"{edge.source_id}|{edge.relation_type}|{edge.target_id}|{source.path}|{edge.anchor}".encode("utf-8")).hexdigest() - metadata = { - "relation_id": relation_id, - "source_id": edge.source_id, - "relation_type": edge.relation_type, - "target_id": edge.target_id, - "anchor": edge.anchor, - "source_path": source.path, - } - return RagDocument( - layer=RagLayer.DOCS_RELATION_GRAPH, - source=source, - title=f"{edge.source_id}:{edge.relation_type}", - text=f"{edge.source_id} {edge.relation_type} {edge.target_id}", - metadata=metadata, - ) diff --git a/src/app/modules/rag/indexing/docs/relation_extractor.py b/src/app/modules/rag/indexing/docs/relation_extractor.py deleted file mode 100644 index 9d90853..0000000 --- a/src/app/modules/rag/indexing/docs/relation_extractor.py +++ /dev/null @@ -1,23 +0,0 @@ -from __future__ import annotations - -from app.modules.rag.indexing.docs.models import RelationEdge - - -class DocsRelationExtractor: - def extract(self, frontmatter: dict, *, source_id: str) -> list[RelationEdge]: - edges: list[RelationEdge] = [] - parent = str(frontmatter.get("parent") or "").strip() - if parent: - edges.append(RelationEdge(source_id=source_id, relation_type="parent", target_id=parent, anchor="frontmatter.parent")) - for child in frontmatter.get("children") or []: - target = str(child or "").strip() - if target: - edges.append(RelationEdge(source_id=source_id, relation_type="child", target_id=target, anchor="frontmatter.children")) - for item in frontmatter.get("links") or []: - if not isinstance(item, dict): - continue - relation_type = str(item.get("type") or "").strip() - target = str(item.get("target") or "").strip() - if relation_type and target: - edges.append(RelationEdge(source_id=source_id, relation_type=relation_type, target_id=target, anchor="frontmatter.links")) - return edges diff --git a/src/app/modules/rag/module.py b/src/app/modules/rag/module.py deleted file mode 100644 index 541ab9e..0000000 --- a/src/app/modules/rag/module.py +++ /dev/null @@ -1,294 +0,0 @@ -"""Публичный модуль RAG: сессии, индексация, API и webhook репозиториев.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from fastapi import APIRouter, Request -from fastapi.responses import JSONResponse, StreamingResponse - -from app.core.exceptions import AppError -from app.modules.rag.embedding.gigachat_embedder import GigaChatEmbedder -from app.modules.rag.indexing_service import IndexingOrchestrator -from app.modules.rag.job_store import IndexJobStore -from app.modules.rag.persistence.repository import RagRepository -from app.modules.rag.retrieval.chunker import TextChunker -from app.modules.rag.session_store import RagSessionStore -from app.modules.rag.services.rag_service import RagService -from app.modules.rag.webhook_service import RepoWebhookService -from app.modules.shared.event_bus import EventBus -from app.modules.shared.gigachat.client import GigaChatClient -from app.modules.shared.gigachat.settings import GigaChatSettings -from app.modules.shared.gigachat.token_provider import GigaChatTokenProvider -from app.modules.shared.retry_executor import RetryExecutor -from app.schemas.common import ModuleName -from app.schemas.indexing import ( - IndexChangesRequest, - IndexJobQueuedResponse, - IndexJobResponse, - IndexSnapshotRequest, -) -from app.schemas.rag_sessions import ( - RagSessionChangesRequest, - RagSessionCreateRequest, - RagSessionCreateResponse, - RagSessionJobResponse, -) - -if TYPE_CHECKING: - from app.modules.agent.runtime.story_context_repository import StoryContextRepository - - -class RagModule: - def __init__(self, event_bus: EventBus, retry: RetryExecutor, repository: RagRepository) -> None: - self._events = event_bus - self.repository = repository - settings = GigaChatSettings.from_env() - token_provider = GigaChatTokenProvider(settings) - client = GigaChatClient(settings, token_provider) - embedder = GigaChatEmbedder(client) - self.embedder = embedder - self.rag = RagService(embedder=embedder, repository=repository, chunker=TextChunker()) - self.sessions = RagSessionStore(repository) - self.jobs = IndexJobStore(repository) - self.indexing = IndexingOrchestrator( - store=self.jobs, - rag=self.rag, - events=event_bus, - retry=retry, - ) - - def public_router(self) -> APIRouter: - router = APIRouter(tags=["rag"]) - - @router.post("/api/rag/sessions", response_model=RagSessionCreateResponse) - async def create_rag_session(request: RagSessionCreateRequest) -> RagSessionCreateResponse: - session = self.sessions.create(request.project_id) - job = await self.indexing.enqueue_snapshot( - rag_session_id=session.rag_session_id, - files=[x.model_dump() for x in request.files], - ) - return RagSessionCreateResponse( - rag_session_id=session.rag_session_id, - index_job_id=job.index_job_id, - status=job.status, - ) - - @router.post("/api/rag/sessions/{rag_session_id}/changes", response_model=IndexJobQueuedResponse) - async def rag_session_changes( - rag_session_id: str, - request: RagSessionChangesRequest, - ) -> IndexJobQueuedResponse: - session = self.sessions.get(rag_session_id) - if not session: - raise AppError("not_found", f"RAG session not found: {rag_session_id}", ModuleName.RAG) - job = await self.indexing.enqueue_changes( - rag_session_id=rag_session_id, - changed_files=[x.model_dump() for x in request.changed_files], - ) - return IndexJobQueuedResponse(index_job_id=job.index_job_id, status=job.status.value) - - @router.get("/api/rag/sessions/{rag_session_id}/jobs/{index_job_id}", response_model=RagSessionJobResponse) - async def rag_session_job(rag_session_id: str, index_job_id: str) -> RagSessionJobResponse: - job = self.jobs.get(index_job_id) - if not job or job.rag_session_id != rag_session_id: - raise AppError("not_found", f"Index job not found: {index_job_id}", ModuleName.RAG) - return RagSessionJobResponse( - rag_session_id=rag_session_id, - index_job_id=job.index_job_id, - status=job.status, - indexed_files=job.indexed_files, - failed_files=job.failed_files, - cache_hit_files=job.cache_hit_files, - cache_miss_files=job.cache_miss_files, - error=job.error.model_dump(mode="json") if job.error else None, - ) - - @router.get("/api/rag/sessions/{rag_session_id}/jobs/{index_job_id}/events") - async def rag_session_job_events(rag_session_id: str, index_job_id: str) -> StreamingResponse: - job = self.jobs.get(index_job_id) - if not job or job.rag_session_id != rag_session_id: - raise AppError("not_found", f"Index job not found: {index_job_id}", ModuleName.RAG) - queue = await self._events.subscribe(index_job_id, replay=True) - - async def event_stream(): - import asyncio - - heartbeat = 10 - try: - while True: - try: - event = await asyncio.wait_for(queue.get(), timeout=heartbeat) - yield EventBus.as_sse(event) - if event.name == "terminal": - break - except asyncio.TimeoutError: - yield ": keepalive\n\n" - finally: - await self._events.unsubscribe(index_job_id, queue) - - return StreamingResponse( - event_stream(), - media_type="text/event-stream", - headers={ - "Cache-Control": "no-cache, no-transform", - "Connection": "keep-alive", - "X-Accel-Buffering": "no", - }, - ) - - # Legacy compatibility endpoints. - legacy = APIRouter(prefix="/api/index", tags=["index"]) - - @legacy.post("/snapshot", response_model=IndexJobQueuedResponse) - async def index_snapshot(request: IndexSnapshotRequest) -> IndexJobQueuedResponse: - session = self.sessions.put( - rag_session_id=request.project_id, - project_id=request.project_id, - ) - job = await self.indexing.enqueue_snapshot( - rag_session_id=session.rag_session_id, - files=[x.model_dump() for x in request.files], - ) - return IndexJobQueuedResponse(index_job_id=job.index_job_id, status=job.status.value) - - @legacy.post("/changes", response_model=IndexJobQueuedResponse) - async def index_changes(request: IndexChangesRequest) -> IndexJobQueuedResponse: - rag_session_id = request.project_id - if not self.sessions.get(rag_session_id): - self.sessions.put(rag_session_id=rag_session_id, project_id=rag_session_id) - job = await self.indexing.enqueue_changes( - rag_session_id=rag_session_id, - changed_files=[x.model_dump() for x in request.changed_files], - ) - return IndexJobQueuedResponse(index_job_id=job.index_job_id, status=job.status.value) - - @legacy.get("/jobs/{index_job_id}", response_model=IndexJobResponse) - async def get_index_job(index_job_id: str) -> IndexJobResponse: - job = self.jobs.get(index_job_id) - if not job: - raise AppError("not_found", f"Index job not found: {index_job_id}", ModuleName.RAG) - return IndexJobResponse( - index_job_id=job.index_job_id, - status=job.status, - indexed_files=job.indexed_files, - failed_files=job.failed_files, - cache_hit_files=job.cache_hit_files, - cache_miss_files=job.cache_miss_files, - error=job.error, - ) - - @legacy.get("/jobs/{index_job_id}/events") - async def get_index_job_events(index_job_id: str) -> StreamingResponse: - job = self.jobs.get(index_job_id) - if not job: - raise AppError("not_found", f"Index job not found: {index_job_id}", ModuleName.RAG) - queue = await self._events.subscribe(index_job_id, replay=True) - - async def event_stream(): - import asyncio - - heartbeat = 10 - try: - while True: - try: - event = await asyncio.wait_for(queue.get(), timeout=heartbeat) - yield EventBus.as_sse(event) - if event.name == "terminal": - break - except asyncio.TimeoutError: - yield ": keepalive\n\n" - finally: - await self._events.unsubscribe(index_job_id, queue) - - return StreamingResponse( - event_stream(), - media_type="text/event-stream", - headers={ - "Cache-Control": "no-cache, no-transform", - "Connection": "keep-alive", - "X-Accel-Buffering": "no", - }, - ) - - router.include_router(legacy) - return router - - def internal_router(self) -> APIRouter: - router = APIRouter(prefix="/internal/rag", tags=["internal-rag"]) - - @router.post("/index/snapshot") - async def index_snapshot(request: IndexSnapshotRequest) -> dict: - rag_session_id = request.project_id - if not self.sessions.get(rag_session_id): - self.sessions.put(rag_session_id=rag_session_id, project_id=rag_session_id) - indexed, failed, cache_hits, cache_misses = await self.rag.index_snapshot( - rag_session_id=rag_session_id, - files=[x.model_dump() for x in request.files], - ) - return { - "indexed_files": indexed, - "failed_files": failed, - "cache_hit_files": cache_hits, - "cache_miss_files": cache_misses, - } - - @router.post("/index/changes") - async def index_changes(request: IndexChangesRequest) -> dict: - rag_session_id = request.project_id - indexed, failed, cache_hits, cache_misses = await self.rag.index_changes( - rag_session_id=rag_session_id, - changed_files=[x.model_dump() for x in request.changed_files], - ) - return { - "indexed_files": indexed, - "failed_files": failed, - "cache_hit_files": cache_hits, - "cache_miss_files": cache_misses, - } - - @router.get("/index/jobs/{index_job_id}") - async def get_job(index_job_id: str) -> dict: - job = self.jobs.get(index_job_id) - if not job: - return {"status": "not_found"} - return { - "index_job_id": job.index_job_id, - "status": job.status.value, - "indexed_files": job.indexed_files, - "failed_files": job.failed_files, - "cache_hit_files": job.cache_hit_files, - "cache_miss_files": job.cache_miss_files, - "error": job.error.model_dump(mode="json") if job.error else None, - } - - @router.post("/retrieve") - async def retrieve() -> JSONResponse: - return JSONResponse( - status_code=410, - content={ - "error": "deprecated", - "message": "POST /internal/rag/retrieve is deprecated.", - }, - ) - - return router - - -class RagRepoModule: - """Модуль webhook репозиториев (Gitea/Bitbucket).""" - - def __init__(self, story_context_repository: "StoryContextRepository", rag_repository: RagRepository) -> None: - self._webhook = RepoWebhookService(story_context_repository, rag_repository) - - def internal_router(self) -> APIRouter: - router = APIRouter(prefix="/internal/rag-repo", tags=["internal-rag-repo"]) - - @router.post("/webhook") - async def process_repo_webhook(request: Request, payload: dict) -> dict: - return self._webhook.process( - payload=payload, - headers={k: v for k, v in request.headers.items()}, - ) - - return router diff --git a/src/app/modules/rag/webhook_service.py b/src/app/modules/rag/webhook_service.py deleted file mode 100644 index 77766d0..0000000 --- a/src/app/modules/rag/webhook_service.py +++ /dev/null @@ -1,219 +0,0 @@ -"""Обработка webhook от репозиториев (Gitea, Bitbucket) для привязки коммитов к историям.""" - -from __future__ import annotations - -import re -from typing import Protocol - - -_STORY_ID_RE = re.compile(r"\b[A-Z][A-Z0-9_]*-\d+\b") - - -class StoryCommitWriter(Protocol): - def record_story_commit( - self, - *, - story_id: str, - project_id: str, - title: str, - commit_sha: str | None, - branch: str | None, - changed_files: list[str], - summary: str, - actor: str | None, - ) -> None: ... - - -class RepoCacheWriter(Protocol): - def record_repo_cache( - self, - *, - project_id: str, - commit_sha: str | None, - changed_files: list[str], - summary: str, - ) -> None: ... - - -class RepoWebhookService: - def __init__(self, story_writer: StoryCommitWriter, cache_writer: RepoCacheWriter | None = None) -> None: - self._story_writer = story_writer - self._cache_writer = cache_writer - - def process(self, *, payload: dict, provider: str | None = None, headers: dict | None = None) -> dict: - resolved_provider = self._resolve_provider(provider=provider, payload=payload, headers=headers or {}) - normalized = self._normalize(provider=resolved_provider, payload=payload) - if not normalized: - return {"accepted": False, "reason": "unsupported_or_invalid_payload"} - - cache_recorded = False - if self._cache_writer is not None: - self._cache_writer.record_repo_cache( - project_id=normalized["project_id"], - commit_sha=normalized["commit_sha"], - changed_files=normalized["changed_files"], - summary=normalized["summary"], - ) - cache_recorded = True - - story_id = self._extract_story_id(normalized["messages"]) - if not story_id: - return { - "accepted": True, - "indexed": False, - "story_bound": False, - "cache_recorded": cache_recorded, - "reason": "story_id_not_found", - } - - self._story_writer.record_story_commit( - story_id=story_id, - project_id=normalized["project_id"], - title=f"Story {story_id}", - commit_sha=normalized["commit_sha"], - branch=normalized["branch"], - changed_files=normalized["changed_files"], - summary=normalized["summary"], - actor=normalized["actor"], - ) - return { - "accepted": True, - "indexed": False, - "story_bound": True, - "cache_recorded": cache_recorded, - "story_id": story_id, - "project_id": normalized["project_id"], - "commit_sha": normalized["commit_sha"], - "changed_files": normalized["changed_files"], - } - - def _resolve_provider(self, *, provider: str | None, payload: dict, headers: dict[str, str]) -> str: - value = (provider or "").strip().lower() - if value in {"gitea", "bitbucket"}: - return value - - lowered = {str(k).lower(): str(v) for k, v in headers.items()} - if "x-gitea-event" in lowered: - return "gitea" - if "x-event-key" in lowered: - return "bitbucket" - - if isinstance(payload.get("commits"), list) and ("ref" in payload or "pusher" in payload): - return "gitea" - push = payload.get("push") - if isinstance(push, dict) and isinstance(push.get("changes"), list): - return "bitbucket" - return "" - - def _normalize(self, *, provider: str, payload: dict) -> dict | None: - key = provider.lower().strip() - if key == "gitea": - return self._normalize_gitea(payload) - if key == "bitbucket": - return self._normalize_bitbucket(payload) - return None - - def _normalize_gitea(self, payload: dict) -> dict: - repo = payload.get("repository") or {} - commits = payload.get("commits") or [] - project_id = str(repo.get("full_name") or repo.get("name") or "unknown_repo") - ref = str(payload.get("ref") or "") - branch = ref.replace("refs/heads/", "") if ref.startswith("refs/heads/") else ref or None - actor = str((payload.get("pusher") or {}).get("username") or "") or None - - messages: list[str] = [] - changed_files: set[str] = set() - commit_sha: str | None = None - for commit in commits: - if not isinstance(commit, dict): - continue - cid = str(commit.get("id") or "").strip() - if cid: - commit_sha = cid - msg = str(commit.get("message") or "").strip() - if msg: - messages.append(msg) - for key in ("added", "modified", "removed"): - for path in commit.get(key) or []: - path_value = str(path).strip() - if path_value: - changed_files.add(path_value) - - summary = messages[-1] if messages else "Webhook commit without message" - return { - "project_id": project_id, - "branch": branch, - "commit_sha": commit_sha, - "changed_files": sorted(changed_files), - "messages": messages, - "summary": summary, - "actor": actor, - } - - def _normalize_bitbucket(self, payload: dict) -> dict: - repo = payload.get("repository") or {} - project_id = str(repo.get("full_name") or repo.get("name") or "unknown_repo") - - changes = (((payload.get("push") or {}).get("changes")) or []) - messages: list[str] = [] - changed_files: set[str] = set() - commit_sha: str | None = None - branch: str | None = None - actor = None - - actor_raw = payload.get("actor") or {} - if isinstance(actor_raw, dict): - actor = str(actor_raw.get("display_name") or actor_raw.get("username") or "") or None - - for change in changes: - if not isinstance(change, dict): - continue - new_ref = change.get("new") or {} - if isinstance(new_ref, dict): - branch_name = str(new_ref.get("name") or "").strip() - if branch_name: - branch = branch_name - target = new_ref.get("target") or {} - if isinstance(target, dict): - h = str(target.get("hash") or "").strip() - if h: - commit_sha = h - msg = str(target.get("message") or "").strip() - if msg: - messages.append(msg) - - for commit in change.get("commits") or []: - if not isinstance(commit, dict): - continue - h = str(commit.get("hash") or "").strip() - if h: - commit_sha = h - msg = str(commit.get("message") or "").strip() - if msg: - messages.append(msg) - for key in ("added", "modified", "removed"): - for item in commit.get(key) or []: - if isinstance(item, dict): - path_value = str(item.get("path") or "").strip() - else: - path_value = str(item).strip() - if path_value: - changed_files.add(path_value) - - summary = messages[-1] if messages else "Webhook commit without message" - return { - "project_id": project_id, - "branch": branch, - "commit_sha": commit_sha, - "changed_files": sorted(changed_files), - "messages": messages, - "summary": summary, - "actor": actor, - } - - def _extract_story_id(self, messages: list[str]) -> str | None: - for msg in messages: - match = _STORY_ID_RE.search(msg) - if match: - return match.group(0) - return None diff --git a/src/app/modules/shared/gigachat/__init__.py b/src/app/modules/shared/gigachat/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/app/schemas/agent_api.py b/src/app/schemas/agent_api.py index a125282..20dbb87 100644 --- a/src/app/schemas/agent_api.py +++ b/src/app/schemas/agent_api.py @@ -4,30 +4,21 @@ from datetime import datetime from pydantic import BaseModel, Field +from app.schemas.indexing import FileSnapshot, IndexJobStatus from app.schemas.common import ErrorPayload +class CreateAgentSessionRequest(BaseModel): + project_id: str = Field(min_length=1) + files: list[FileSnapshot] + + class CreateAgentSessionResponse(BaseModel): session_id: str - active_rag_session_id: str | None = None - created_at: datetime - - -class BindRagSessionRequest(BaseModel): rag_session_id: str = Field(min_length=1) - - -class BindRagSessionResponse(BaseModel): - session_id: str - active_rag_session_id: str | None = None - updated_at: datetime - - -class ResetAgentSessionResponse(BaseModel): - session_id: str - active_rag_session_id: str | None = None - status: str - updated_at: datetime + index_job_id: str = Field(min_length=1) + status: IndexJobStatus + created_at: datetime class AgentRequestCreateRequest(BaseModel): diff --git a/src/app/schemas/rag_sessions.py b/src/app/schemas/rag_sessions.py index 3643150..62b2aa6 100644 --- a/src/app/schemas/rag_sessions.py +++ b/src/app/schemas/rag_sessions.py @@ -1,21 +1,6 @@ -from pydantic import BaseModel, Field +from pydantic import BaseModel -from app.schemas.indexing import ChangedFile, FileSnapshot, IndexJobStatus - - -class RagSessionCreateRequest(BaseModel): - project_id: str = Field(min_length=1) - files: list[FileSnapshot] - - -class RagSessionCreateResponse(BaseModel): - rag_session_id: str - index_job_id: str - status: IndexJobStatus - - -class RagSessionChangesRequest(BaseModel): - changed_files: list[ChangedFile] +from app.schemas.indexing import IndexJobStatus class RagSessionJobResponse(BaseModel): diff --git a/tests/__pycache__/conftest.cpython-312-pytest-9.0.2.pyc b/tests/__pycache__/conftest.cpython-312-pytest-9.0.2.pyc index 57094cab64e8918fc3a6e19d9c1b52b72faa4708..16a4b916c03dc40443fe46f231c2a98165998c8f 100644 GIT binary patch delta 20 acmaFK_L7bJG%qg~0}$xeoZrYD#|!{Hzy)pq delta 20 acmaFK_L7bJG%qg~0}!bG-?WiCju`+z2?fjm diff --git a/tests/docs_qa_eval/fixture_adapter.py b/tests/docs_qa_eval/fixture_adapter.py index e98ccaf..177495d 100644 --- a/tests/docs_qa_eval/fixture_adapter.py +++ b/tests/docs_qa_eval/fixture_adapter.py @@ -2,11 +2,12 @@ from __future__ import annotations class InMemoryDocsRetrievalAdapter: - def __init__(self, rows: list[dict]) -> None: + def __init__(self, rows: list[dict], materialized_rows: list[dict] | None = None) -> None: self._rows = list(rows) + self._materialized_rows = list(materialized_rows or []) self._report: dict = {} - def retrieve_with_plan(self, rag_session_id: str, query: str, retrieval_spec, retrieval_constraints=None, *, query_plan=None) -> list[dict]: + def retrieve_with_plan(self, rag_session_id: str, query: str, retrieval_spec, retrieval_constraints=None, *, query_plan=None, trace=None) -> list[dict]: planned_layers = [str(item.layer_id) for item in retrieval_spec.layer_queries] query_sub_intent = str(getattr(query_plan, "sub_intent", "") or "") relation_rows = [row for row in self._rows if str(row.get("layer") or "") == "D5_RELATION_GRAPH"] @@ -60,6 +61,25 @@ class InMemoryDocsRetrievalAdapter: def retrieve_exact_files(self, rag_session_id: str, *, repo_id=None, paths: list[str], layers=None, limit: int = 200, query: str = "", ranking_profile: str = "") -> list[dict]: return [] + def materialize_document_ids(self, rag_session_id: str, *, document_ids: list[str], layers=None, limit: int = 200) -> list[dict]: + allowed_ids = {str(item).strip() for item in document_ids if str(item).strip()} + if not allowed_ids: + return [] + allowed_layers = {str(item).strip() for item in list(layers or []) if str(item).strip()} + result = [] + for row in [*self._rows, *self._materialized_rows]: + if allowed_layers and str(row.get("layer") or "") not in allowed_layers: + continue + metadata = dict(row.get("metadata") or {}) + candidates = { + str(metadata.get("document_id") or "").strip(), + str(metadata.get("doc_id") or "").strip(), + str(metadata.get("subject_id") or "").strip(), + } + if candidates & allowed_ids: + result.append(row) + return self._dedupe(result)[: max(1, int(limit))] + def hydrate_resolved_symbol_sources(self, rag_session_id: str, base_query: str, rag_rows: list[dict], symbol_resolution: dict, retrieval_spec, retrieval_constraints=None) -> list[dict]: return list(rag_rows) diff --git a/tests/docs_qa_eval/runner.py b/tests/docs_qa_eval/runner.py index 0fbc650..14cd9dd 100644 --- a/tests/docs_qa_eval/runner.py +++ b/tests/docs_qa_eval/runner.py @@ -2,8 +2,8 @@ from __future__ import annotations from dataclasses import dataclass -from app.modules.agent.intent_router_v2 import IntentRouterV2 -from app.modules.agent.runtime.docs_qa_pipeline import DocsQAPipelineRunner +from app.core.agent.intent_router import IntentRouterV2 +from app.core.agent.runtime.docs_qa_pipeline import DocsQAPipelineRunner from tests.docs_qa_eval.config import DocsEvalConfig from tests.docs_qa_eval.fixture_adapter import InMemoryDocsRetrievalAdapter from tests.docs_qa_eval.golden_loader import DocsGoldenCase, load_cases diff --git a/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml b/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml new file mode 100644 index 0000000..a9b1e8c --- /dev/null +++ b/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml @@ -0,0 +1,421 @@ +defaults: + runner: process_v2 + mode: full_chain + input: + rag_session_id: "fdf3ff03-81f0-4772-b68e-250147960243" + +cases: + - id: v2-general-01-what-is-service + query: "Что это за сервис?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + pipeline: + answer_mode: grounded_summary + llm: + non_empty: true + contains_all: ["Telegram", "сервис"] + + - id: v2-general-02-purpose + query: "Для чего нужен test_echo_app?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + pipeline: + answer_mode: grounded_summary + llm: + non_empty: true + contains_all: ["test_echo_app"] + + - id: v2-general-03-problem + query: "Какую задачу решает это приложение?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + pipeline: + answer_mode: grounded_summary + llm: + non_empty: true + contains_all: ["Telegram"] + + - id: v2-general-04-docs-contents + query: "Что входит в документацию этого проекта?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + llm: + non_empty: true + contains_all: ["документац", "архитект"] + + - id: v2-general-05-main-parts + query: "Какие основные части есть у системы?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + llm: + non_empty: true + contains_all: ["систем", "Telegram"] + + - id: v2-general-06-high-level-architecture + query: "Как в целом устроено приложение?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + llm: + non_empty: true + contains_all: ["приложен"] + + - id: v2-general-07-besides-api + query: "Что тут есть кроме API?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + llm: + non_empty: true + contains_all: ["API"] + + - id: v2-general-08-components + query: "Из чего состоит Telegram Notify App?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + llm: + non_empty: true + contains_all: ["Telegram Notify App"] + + - id: v2-general-09-reading-order + query: "Какие документы стоит читать сначала?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + llm: + non_empty: true + contains_all: ["README", "архитект"] + + - id: v2-general-10-short-summary + query: "Дай короткое summary по проектной документации" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + llm: + non_empty: true + contains_all: ["документац"] + + - id: v2-docs-summary-01-health + query: "Кратко объясни по документации, как работает `/health`" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + retrieval: + non_empty: true + layers_include: ["D1_DOCUMENT_CATALOG", "D3_ENTITY_CATALOG", "D0_DOC_CHUNKS"] + doc_scope_contains: ["docs/README.md", "docs/architecture/telegram-notify-app-overview.md"] + llm: + non_empty: true + contains_all: ["/health", "status", "components"] + pipeline: + answer_mode: grounded_summary + + - id: v2-docs-summary-02-send + query: "Что делает endpoint `/send`?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + retrieval: + non_empty: true + layers_include: ["D1_DOCUMENT_CATALOG", "D3_ENTITY_CATALOG", "D0_DOC_CHUNKS"] + doc_scope_contains: ["docs/api/send-message-endpoint.md"] + llm: + non_empty: true + contains_all: ["/send", "message", "Telegram"] + + - id: v2-docs-summary-03-actions + query: "Объясни назначение `/actions/{action}`" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + retrieval: + non_empty: true + doc_scope_contains: ["docs/api/control-actions-endpoint.md"] + llm: + non_empty: true + contains_all: ["/actions/{action}"] + + - id: v2-docs-summary-04-runtime-health + query: "Что такое runtime health в этой документации?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + retrieval: + non_empty: true + doc_scope_contains: ["docs/domains/runtime-health-entity.md"] + llm: + non_empty: true + contains_all: ["runtime health"] + + - id: v2-docs-summary-05-notification-loop + query: "Кратко опиши цикл отправки уведомлений" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + retrieval: + non_empty: true + doc_scope_contains: ["docs/logic/telegram-notification-loop.md"] + llm: + non_empty: true + contains_all: ["worker", "interval", "degraded"] + + - id: v2-docs-summary-06-architecture + query: "Как устроена архитектура Telegram Notify App?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + retrieval: + non_empty: true + doc_scope_contains: ["docs/architecture/telegram-notify-app-overview.md"] + llm: + non_empty: true + contains_all: ["RuntimeManager", "TelegramControlChannel"] + + - id: v2-docs-summary-07-worker + query: "Что делает worker в этом приложении?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + retrieval: + non_empty: true + doc_scope_contains: ["docs/logic/telegram-notification-loop.md", "docs/architecture/telegram-notify-app-overview.md"] + llm: + non_empty: true + contains_all: ["worker", "Telegram"] + + - id: v2-docs-summary-08-health-statuses + query: "Какие статусы здоровья есть у runtime?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + retrieval: + non_empty: true + doc_scope_contains: ["docs/domains/runtime-health-entity.md", "docs/api/health-endpoint.md"] + llm: + non_empty: true + contains_all: ["ok", "degraded", "unhealthy", "unknown"] + + - id: v2-docs-summary-09-manual-send + query: "Как в приложении устроена ручная отправка сообщения?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + retrieval: + non_empty: true + doc_scope_contains: ["docs/api/send-message-endpoint.md"] + llm: + non_empty: true + contains_all: ["/send", "message", "TelegramSendService"] + + - id: v2-docs-summary-10-telegram-integration + query: "Как сервис взаимодействует с Telegram в целом?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + retrieval: + non_empty: true + min_rows: 2 + doc_scope_contains: ["docs/architecture/telegram-notify-app-overview.md", "docs/api/send-message-endpoint.md"] + llm: + non_empty: true + contains_all: ["Telegram", "worker", "/send"] + + - id: v2-find-files-01-health + query: "В каком файле описан `/health`?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + retrieval: + non_empty: true + pipeline: + answer_mode: deterministic + llm: + non_empty: true + contains_all: ["docs/api/health-endpoint.md"] + + - id: v2-find-files-02-send + query: "Покажи файл с описанием endpoint `/send`" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + retrieval: + non_empty: true + pipeline: + answer_mode: deterministic + llm: + non_empty: true + contains_all: ["docs/api/send-message-endpoint.md"] + + - id: v2-find-files-03-actions + query: "Где находится документация по `/actions/{action}`?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + retrieval: + non_empty: true + pipeline: + answer_mode: deterministic + llm: + non_empty: true + contains_all: ["docs/api/control-actions-endpoint.md"] + + - id: v2-find-files-04-runtime-health + query: "В каком документе описан runtime health?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + retrieval: + non_empty: true + pipeline: + answer_mode: deterministic + llm: + non_empty: true + contains_all: ["docs/domains/runtime-health-entity.md"] + + - id: v2-find-files-05-loop + query: "Найди файл с логикой цикла отправки уведомлений" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + retrieval: + non_empty: true + pipeline: + answer_mode: deterministic + llm: + non_empty: true + contains_all: ["docs/logic/telegram-notification-loop.md"] + + - id: v2-find-files-06-architecture + query: "Где описана архитектура приложения?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + retrieval: + non_empty: true + pipeline: + answer_mode: deterministic + llm: + non_empty: true + contains_all: ["docs/architecture/telegram-notify-app-overview.md"] + + - id: v2-find-files-07-errors-catalog + query: "В каком файле лежит каталог ошибок?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + retrieval: + non_empty: true + pipeline: + answer_mode: deterministic + llm: + non_empty: true + contains_all: ["docs/errors/catalog.yaml"] + + - id: v2-find-files-08-docs-index + query: "Покажи файл-индекс документации проекта" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + retrieval: + non_empty: true + pipeline: + answer_mode: deterministic + llm: + non_empty: true + contains_all: ["docs/README.md"] + + - id: v2-find-files-09-telegram-bot-api + query: "Какие файлы относятся к Telegram Bot API интеграции?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + retrieval: + non_empty: true + min_rows: 2 + pipeline: + answer_mode: deterministic + llm: + non_empty: true + contains_all: + ["docs/architecture/telegram-notify-app-overview.md", "docs/api/send-message-endpoint.md", "docs/logic/telegram-notification-loop.md"] + + - id: v2-find-files-10-telegram-notify-worker + query: "В каких файлах описан worker `telegram_notify`?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + retrieval: + non_empty: true + min_rows: 2 + pipeline: + answer_mode: deterministic + llm: + non_empty: true + contains_all: + ["docs/architecture/telegram-notify-app-overview.md", "docs/logic/telegram-notification-loop.md", "docs/domains/runtime-health-entity.md"] diff --git a/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml b/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml new file mode 100644 index 0000000..358fb82 --- /dev/null +++ b/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml @@ -0,0 +1,244 @@ +defaults: + runner: process_v2 + mode: router_only + +cases: + - id: v2-router-general-01-what-is-service + query: "Что это за сервис?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-general-02-purpose + query: "Для чего нужен test_echo_app?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-general-03-problem + query: "Какую задачу решает это приложение?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-general-04-docs-contents + query: "Что входит в документацию этого проекта?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-general-05-main-parts + query: "Какие основные части есть у системы?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-general-06-high-level-architecture + query: "Как в целом устроено приложение?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-general-07-besides-api + query: "Что тут есть кроме API?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-general-08-components + query: "Из чего состоит Telegram Notify App?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-general-09-reading-order + query: "Какие документы стоит читать сначала?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-general-10-short-summary + query: "Дай короткое summary по проектной документации" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-docs-summary-01-health + query: "Кратко объясни по документации, как работает `/health`" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-docs-summary-02-send + query: "Что делает endpoint `/send`?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-docs-summary-03-actions + query: "Объясни назначение `/actions/{action}`" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-docs-summary-04-runtime-health + query: "Что такое runtime health в этой документации?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-docs-summary-05-notification-loop + query: "Кратко опиши цикл отправки уведомлений" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-docs-summary-06-architecture + query: "Как устроена архитектура Telegram Notify App?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-docs-summary-07-worker + query: "Что делает worker в этом приложении?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-docs-summary-08-health-statuses + query: "Какие статусы здоровья есть у runtime?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-docs-summary-09-manual-send + query: "Как в приложении устроена ручная отправка сообщения?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-docs-summary-10-telegram-integration + query: "Как сервис взаимодействует с Telegram в целом?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-find-files-01-health + query: "В каком файле описан `/health`?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v2-router-find-files-02-send + query: "Покажи файл с описанием endpoint `/send`" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v2-router-find-files-03-actions + query: "Где находится документация по `/actions/{action}`?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v2-router-find-files-04-runtime-health + query: "В каком документе описан runtime health?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v2-router-find-files-05-loop + query: "Найди файл с логикой цикла отправки уведомлений" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v2-router-find-files-06-architecture + query: "Где описана архитектура приложения?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v2-router-find-files-07-errors-catalog + query: "В каком файле лежит каталог ошибок?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v2-router-find-files-08-docs-index + query: "Покажи файл-индекс документации проекта" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v2-router-find-files-09-telegram-bot-api + query: "Какие файлы относятся к Telegram Bot API интеграции?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v2-router-find-files-10-telegram-notify-worker + query: "В каких файлах описан worker `telegram_notify`?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES diff --git a/tests/pipeline_setup_v3/cli/index_repo.py b/tests/pipeline_setup_v3/cli/index_repo.py index d199347..e3d9814 100644 --- a/tests/pipeline_setup_v3/cli/index_repo.py +++ b/tests/pipeline_setup_v3/cli/index_repo.py @@ -10,7 +10,7 @@ _src = _agent_root / "src" if _src.exists() and str(_src) not in sys.path: sys.path.insert(0, str(_src)) -from app.modules.rag.persistence.repository import RagRepository +from app.core.rag.persistence.repository import RagRepository from tests.pipeline_setup_v3.shared.env_loader import load_pipeline_setup_env from tests.pipeline_setup_v3.shared.rag_indexer import RagSessionIndexer diff --git a/tests/pipeline_setup_v3/core/case_loader.py b/tests/pipeline_setup_v3/core/case_loader.py index a349ee0..aac0b69 100644 --- a/tests/pipeline_setup_v3/core/case_loader.py +++ b/tests/pipeline_setup_v3/core/case_loader.py @@ -80,6 +80,7 @@ class CaseDirectoryLoader: pipeline = dict(raw.get("pipeline") or {}) return CaseExpectations( router=RouterExpectation( + domain=str(router.get("domain") or "").strip() or None, intent=str(router.get("intent") or "").strip() or None, sub_intent=str(router.get("sub_intent") or "").strip() or None, graph_id=str(router.get("graph_id") or "").strip() or None, @@ -114,4 +115,6 @@ class CaseDirectoryLoader: def _normalize_runner(self, value: str) -> str: if value in {"agent_runtime", "runtime", "code_qa_eval"}: return "agent_runtime" + if value in {"process_v2", "v2_process", "v2"}: + return "process_v2" return value diff --git a/tests/pipeline_setup_v3/core/models.py b/tests/pipeline_setup_v3/core/models.py index 5ecb506..444ef76 100644 --- a/tests/pipeline_setup_v3/core/models.py +++ b/tests/pipeline_setup_v3/core/models.py @@ -5,7 +5,7 @@ from pathlib import Path from typing import Literal -RunnerKind = Literal["agent_runtime"] +RunnerKind = Literal["agent_runtime", "process_v2"] ModeKind = Literal["router_only", "router_rag", "full_chain"] @@ -18,6 +18,7 @@ class CaseInput: @dataclass(slots=True, frozen=True) class RouterExpectation: + domain: str | None = None intent: str | None = None sub_intent: str | None = None graph_id: str | None = None diff --git a/tests/pipeline_setup_v3/core/runner.py b/tests/pipeline_setup_v3/core/runner.py index a5cdd7a..209dc6f 100644 --- a/tests/pipeline_setup_v3/core/runner.py +++ b/tests/pipeline_setup_v3/core/runner.py @@ -19,10 +19,12 @@ class V3Runner: *, pipeline_mode: str = "full", router_llm_mode: str = "deterministic", + workflow_llm_enabled: bool = True, ) -> None: self._cases_dir = cases_dir self._pipeline_mode = pipeline_mode self._router_llm_mode = router_llm_mode + self._workflow_llm_enabled = workflow_llm_enabled self._validator = CaseValidator() self._sessions = RagSessionProvider() self._agent_runtime = None @@ -50,9 +52,11 @@ class V3Runner: return results, self._writer.write_summary(results) def _execute(self, case, rag_session_id): - if case.runner != "agent_runtime": - raise ValueError(f"Unsupported runner: {case.runner}") - return self._agent_runtime_adapter().execute(case, rag_session_id) + if case.runner == "agent_runtime": + return self._agent_runtime_adapter().execute(case, rag_session_id) + if case.runner == "process_v2": + return self._v2_process_adapter().execute(case, rag_session_id) + raise ValueError(f"Unsupported runner: {case.runner}") def _agent_runtime_adapter(self): if self._agent_runtime is None: @@ -63,3 +67,10 @@ class V3Runner: router_llm_mode=self._router_llm_mode, ) return self._agent_runtime + + def _v2_process_adapter(self): + if not hasattr(self, "_v2_process"): + from tests.pipeline_setup_v3.runtime.v2_process_adapter import V2ProcessAdapter + + self._v2_process = V2ProcessAdapter(workflow_llm_enabled=self._workflow_llm_enabled) + return self._v2_process diff --git a/tests/pipeline_setup_v3/core/session_provider.py b/tests/pipeline_setup_v3/core/session_provider.py index 5b3c72b..6c11cf2 100644 --- a/tests/pipeline_setup_v3/core/session_provider.py +++ b/tests/pipeline_setup_v3/core/session_provider.py @@ -24,7 +24,7 @@ class RagSessionProvider: return self._cache[key] def _build_indexer(self): - from app.modules.rag.persistence.repository import RagRepository + from app.core.rag.persistence.repository import RagRepository from tests.pipeline_setup_v3.shared.rag_indexer import RagSessionIndexer if self._repository is None: diff --git a/tests/pipeline_setup_v3/core/validators.py b/tests/pipeline_setup_v3/core/validators.py index 82d69be..c207b0a 100644 --- a/tests/pipeline_setup_v3/core/validators.py +++ b/tests/pipeline_setup_v3/core/validators.py @@ -6,6 +6,7 @@ from tests.pipeline_setup_v3.core.models import V3Case class CaseValidator: def validate(self, case: V3Case, actual: dict, details: dict | None = None) -> list[str]: mismatches: list[str] = [] + self._check(case.expectations.router.domain, actual.get("domain"), "domain", mismatches) self._check(case.expectations.router.intent, actual.get("intent"), "intent", mismatches) self._check(case.expectations.router.sub_intent, actual.get("sub_intent"), "sub_intent", mismatches) self._check(case.expectations.router.graph_id, actual.get("graph_id"), "graph_id", mismatches) diff --git a/tests/pipeline_setup_v3/run.py b/tests/pipeline_setup_v3/run.py index 8e64e27..2f47601 100644 --- a/tests/pipeline_setup_v3/run.py +++ b/tests/pipeline_setup_v3/run.py @@ -21,6 +21,12 @@ def main(argv: list[str] | None = None) -> int: parser.add_argument("--run-name", default="manual_run", help="Output directory prefix") parser.add_argument("--results-dir", default=None, help="Override results root directory") parser.add_argument("--pipeline-mode", default="full", choices=["full", "pre_llm_only"], help="Pipeline execution mode") + parser.add_argument( + "--workflow-llm-enabled", + default="true", + choices=["true", "false"], + help="Enable or disable final workflow LLM calls where supported", + ) parser.add_argument( "--router-llm-mode", default="deterministic", @@ -39,6 +45,7 @@ def main(argv: list[str] | None = None) -> int: run_name=str(ns.run_name).strip() or "manual_run", pipeline_mode=str(ns.pipeline_mode).strip() or "full", router_llm_mode=str(ns.router_llm_mode).strip() or "deterministic", + workflow_llm_enabled=str(ns.workflow_llm_enabled).strip().lower() == "true", ) print(f"Cases dir: {cases_dir}") print(f"Run dir: {runner.run_dir}") diff --git a/tests/pipeline_setup_v3/runtime/__init__.py b/tests/pipeline_setup_v3/runtime/__init__.py index 275f5d9..7ab0434 100644 --- a/tests/pipeline_setup_v3/runtime/__init__.py +++ b/tests/pipeline_setup_v3/runtime/__init__.py @@ -1,3 +1,4 @@ -from tests.pipeline_setup_v3.runtime.agent_runtime_adapter import AgentRuntimeAdapter - -__all__ = ["AgentRuntimeAdapter"] +__all__ = [ + "agent_runtime_adapter", + "v2_process_adapter", +] diff --git a/tests/pipeline_setup_v3/runtime/agent_runtime_adapter.py b/tests/pipeline_setup_v3/runtime/agent_runtime_adapter.py index f635f66..8c9ff8d 100644 --- a/tests/pipeline_setup_v3/runtime/agent_runtime_adapter.py +++ b/tests/pipeline_setup_v3/runtime/agent_runtime_adapter.py @@ -2,20 +2,20 @@ from __future__ import annotations import math -from app.modules.agent.runtime import ( +from app.core.agent.runtime import ( AgentRuntimeExecutor, DocsQAPipelineRunner, RuntimeRepoContextFactory, RuntimeRetrievalAdapter, ) -from app.modules.agent.llm import AgentLlmService -from app.modules.agent.llm.prompt_loader import PromptLoader -from app.modules.agent.runtime.steps.context import build_retrieval_request, build_retrieval_result -from app.modules.agent.intent_router_v2 import ConversationState, IntentRouterV2 -from app.modules.agent.intent_router_v2.factory import GigaChatIntentRouterFactory -from app.modules.shared.gigachat.client import GigaChatClient -from app.modules.shared.gigachat.settings import GigaChatSettings -from app.modules.shared.gigachat.token_provider import GigaChatTokenProvider +from app.core.agent.llm import AgentLlmService +from app.core.agent.llm.prompt_loader import PromptLoader +from app.core.agent.runtime.steps.context import build_retrieval_request, build_retrieval_result +from app.core.agent.intent_router import ConversationState, IntentRouterV2 +from app.core.agent.intent_router.factory import GigaChatIntentRouterFactory +from app.core.shared.gigachat.client import GigaChatClient +from app.core.shared.gigachat.settings import GigaChatSettings +from app.core.shared.gigachat.token_provider import GigaChatTokenProvider from tests.pipeline_setup_v3.core.models import ExecutionPayload, V3Case @@ -190,6 +190,7 @@ class AgentRuntimeAdapter: ) -> dict: route_dump = route.model_dump(mode="json") if route else {} return { + "domain": route_dump.get("routing_domain") or route_dump.get("domain") or _infer_domain(route_dump.get("intent")), "intent": route_dump.get("intent"), "sub_intent": dict(route_dump.get("query_plan") or {}).get("sub_intent"), "graph_id": route_dump.get("graph_id"), @@ -262,6 +263,7 @@ class AgentRuntimeAdapter: entity_candidates = tuple(diagnostics.query_entity_candidates or self._docs_entity_candidates(result.raw_rows)) doc_scope = tuple(diagnostics.doc_ids or self._docs_scope(result.raw_rows)) return { + "domain": getattr(route, "routing_domain", None) or getattr(route, "domain", None) or _infer_domain(route.intent), "intent": route.intent, "sub_intent": route.query_plan.sub_intent, "graph_id": route.graph_id, @@ -287,6 +289,7 @@ class AgentRuntimeAdapter: def _stubbed_code_payload(self, case: V3Case, route) -> ExecutionPayload: actual = { + "domain": _infer_domain(route.intent), "intent": route.intent, "sub_intent": route.query_plan.sub_intent, "graph_id": route.graph_id, @@ -493,3 +496,12 @@ def _input_step(query: str) -> dict: "input": {"query": query}, "output": {"query": query}, } + + +def _infer_domain(intent: str | None) -> str | None: + value = str(intent or "").strip() + if value == "GENERAL_QA": + return "GENERAL" + if value in {"DOCUMENTATION_EXPLAIN", "DOC_EXPLAIN"}: + return "DOCS" + return None diff --git a/tests/pipeline_setup_v3/runtime/v2_process_adapter.py b/tests/pipeline_setup_v3/runtime/v2_process_adapter.py new file mode 100644 index 0000000..92c22fa --- /dev/null +++ b/tests/pipeline_setup_v3/runtime/v2_process_adapter.py @@ -0,0 +1,420 @@ +from __future__ import annotations + +import asyncio +from dataclasses import asdict, dataclass +from pathlib import Path + +from app.core.agent.processes.v2.anchor_signals import route_anchor_summary +from app.core.agent.processes.v2 import V2IntentRouter +from app.core.agent.processes.v2.evidence.assembler import DocsEvidenceAssembler +from app.core.agent.processes.v2.evidence.gate import DocsEvidenceGate +from app.core.agent.processes.v2.models import RetrievedFile, RetrievedSummary, V2Intent, V2Subintent +from app.core.agent.processes.v2.retrieval import DocsMetadataLookupIndex +from app.core.agent.processes.v2.retrieval.policy_resolver import V2RetrievalPolicyResolver +from app.core.agent.processes.v2.retrieval.v2_rag_adapter import V2RagRetrievalAdapter +from app.core.agent.processes.v2.workflows.docs_explain_find_files.context import DocsExplainFindFilesContext +from app.core.agent.processes.v2.workflows.docs_explain_find_files.graph import DocsExplainFindFilesGraph +from app.core.agent.processes.v2.workflows.docs_explain_summary.context import DocsExplainSummaryContext +from app.core.agent.processes.v2.workflows.docs_explain_summary.graph import DocsExplainSummaryGraph +from app.core.agent.processes.v2.workflows.general_summary.context import GeneralSummaryContext +from app.core.agent.processes.v2.workflows.general_summary.graph import GeneralSummaryGraph +from app.core.agent.utils.llm import AgentLlmService, PromptLoader +from app.core.rag.embedding.gigachat_embedder import GigaChatEmbedder +from app.core.rag.persistence import RagRepository +from app.core.rag.retrieval.session_retriever import RagSessionRetriever +from app.core.shared.gigachat.client import GigaChatClient +from app.core.shared.gigachat.settings import GigaChatSettings +from app.core.shared.gigachat.token_provider import GigaChatTokenProvider +from app.infra.observability.module_trace import RequestTraceContext +from tests.pipeline_setup_v3.core.models import ExecutionPayload, V3Case + + +class V2ProcessAdapter: + def __init__(self, *, workflow_llm_enabled: bool = True) -> None: + self._workflow_llm_enabled = workflow_llm_enabled + self._router = V2IntentRouter(llm=_build_v2_llm()) + self._policy = V2RetrievalPolicyResolver() + retriever = RagSessionRetriever(repository=RagRepository(), embedder=GigaChatEmbedder(_build_client())) + self._retrieval = V2RagRetrievalAdapter(retriever) + self._evidence = DocsEvidenceAssembler() + self._gate = DocsEvidenceGate() + self._summary_graph = DocsExplainSummaryGraph(_build_v2_llm()) + self._find_files_graph = DocsExplainFindFilesGraph() + self._general_graph = GeneralSummaryGraph(_build_v2_llm()) + + def execute(self, case: V3Case, rag_session_id: str | None) -> ExecutionPayload: + return asyncio.run(self._execute_async(case, rag_session_id)) + + async def _execute_async(self, case: V3Case, rag_session_id: str | None) -> ExecutionPayload: + runtime = _RuntimeStub(query=case.query) + route = self._router.route(case.query) + _log_pipeline_step( + runtime, + "router_resolved", + { + "domain": route.routing_domain, + "intent": route.intent, + "subintent": route.subintent, + "confidence": route.confidence, + }, + ) + _log_pipeline_step( + runtime, + "anchors_extracted", + { + "signal_types": route_anchor_summary(route)["signal_types"], + "endpoint_paths": route.anchors.endpoint_paths, + "target_doc_hints": route.anchors.target_doc_hints, + "matched_aliases": route.anchors.matched_aliases, + }, + ) + _log_pipeline_step( + runtime, + "alias_resolution", + { + "resolved_aliases": route.anchors.matched_aliases, + "target_doc_hints": route.anchors.target_doc_hints, + }, + ) + if case.mode == "router_only": + return ExecutionPayload( + actual=_actual_from_v2(route), + details=_details(case.query, route=route, pipeline_steps=_build_pipeline_steps(runtime.logs)), + ) + plan = self._policy.resolve(route) + _log_pipeline_step( + runtime, + "retrieval_profile_selected", + {"profile": plan.profile, "layers": plan.layers, "filters": plan.filters}, + ) + semantic_rows = await self._retrieve_rows(route, rag_session_id, plan) + seeded_rows = await self._seed_candidates_from_target_hints(route, rag_session_id, plan) + metadata_rows = self._metadata_lookup_candidates([*seeded_rows, *semantic_rows], route) + rows = self._merge_candidate_rows(seeded_rows, metadata_rows, semantic_rows) + _log_pipeline_step( + runtime, + "candidate_generation", + { + "resolved_aliases": route.anchors.matched_aliases, + "target_doc_hints": route.anchors.target_doc_hints, + "candidate_docs_before_ranking": [self._trace_row(row) for row in rows[:8]], + "sources": { + "seeded": [self._trace_row(row) for row in seeded_rows[:5]], + "metadata_lookup": [self._trace_row(row) for row in metadata_rows[:5]], + "semantic": [self._trace_row(row) for row in semantic_rows[:5]], + }, + }, + ) + _log_pipeline_step( + runtime, + "retrieval_executed", + { + "query": case.query, + "profile": plan.profile, + "row_count": len(rows), + "target_doc_hints": route.anchors.target_doc_hints, + "top_results": [self._trace_row(row) for row in rows[:5]], + }, + ) + if case.mode == "router_rag": + return ExecutionPayload( + actual=_actual_from_v2(route, rows=rows, plan=plan, answer_mode="partial"), + details=_details(case.query, route=route, plan=plan, rows=rows, pipeline_steps=_build_pipeline_steps(runtime.logs)), + ) + answer, evidence, gate = await self._run_workflow(runtime, route, rag_session_id, rows) + answer_mode = gate.answer_mode + _log_pipeline_step( + runtime, + "answer_generated", + {"answer_mode": answer_mode, "answer_length": len(answer)}, + ) + return ExecutionPayload( + actual=_actual_from_v2(route, rows=rows, plan=plan, answer=answer, answer_mode=answer_mode), + details=_details( + case.query, + route=route, + plan=plan, + rows=rows, + evidence=evidence, + answer=answer, + logs=runtime.logs, + pipeline_steps=_build_pipeline_steps(runtime.logs), + ), + ) + + async def _retrieve_rows(self, route, rag_session_id: str | None, plan) -> list[dict]: + if not rag_session_id: + if route.intent == V2Intent.GENERAL_QA: + return [] + raise ValueError("process_v2 cases with DOCS intent require rag_session_id") + return await self._retrieval.fetch_rows(rag_session_id, route.normalized_query, plan) + + async def _seed_candidates_from_target_hints(self, route, rag_session_id: str | None, plan) -> list[dict]: + if not rag_session_id or not route.anchors.target_doc_hints: + return [] + return await self._retrieval.fetch_exact_paths(rag_session_id, paths=route.anchors.target_doc_hints, layers=plan.layers) + + def _metadata_lookup_candidates(self, rows: list[dict], route) -> list[dict]: + return DocsMetadataLookupIndex(rows).lookup(route) + + def _merge_candidate_rows(self, *groups: list[dict]) -> list[dict]: + merged: list[dict] = [] + seen: set[tuple[str, str, str]] = set() + for rows in groups: + for row in rows: + key = ( + str(row.get("path") or ""), + str(row.get("layer") or ""), + str(dict(row.get("metadata") or {}).get("section_path") or ""), + ) + if key in seen: + continue + seen.add(key) + merged.append(row) + return merged + + async def _run_workflow( + self, + runtime: "_RuntimeStub", + route, + rag_session_id: str | None, + rows: list[dict], + ) -> tuple[str, dict, object]: + if route.intent == V2Intent.GENERAL_QA: + documents = self._evidence.assemble_summaries(rows, route) + gate = self._gate.check_summaries(route, documents) + _log_pipeline_step( + runtime, + "evidence_assembled", + {"mode": "summary", "primary_doc": documents[0].path if documents else None, "document_count": len(documents)}, + ) + self._log_ranking(runtime, documents) + _log_pipeline_step( + runtime, + "evidence_gate_checked", + {"passed": gate.passed, "reason": gate.reason, "answer_mode": gate.answer_mode}, + ) + context = GeneralSummaryContext(runtime=runtime, route=route, prompt_name="v2_general.summary_answer") + context.workflow_llm_enabled = self._workflow_llm_enabled + context.documents = documents + context.gate_decision = gate + final = await self._general_graph.run(context) + return final.answer, {"documents": [_serialize_summary(item) for item in documents], "files": []}, gate + if route.subintent == V2Subintent.FIND_FILES: + files = self._evidence.assemble_files(rows, route) + gate = self._gate.check_files(route, files) + _log_pipeline_step( + runtime, + "evidence_assembled", + {"mode": "find_files", "primary_file": files[0].path if files else None, "file_count": len(files)}, + ) + self._log_ranking(runtime, files) + _log_pipeline_step( + runtime, + "evidence_gate_checked", + {"passed": gate.passed, "reason": gate.reason, "answer_mode": gate.answer_mode}, + ) + context = DocsExplainFindFilesContext( + runtime=runtime, + route=route, + rag_session_id=rag_session_id or "", + files=files, + gate_decision=gate, + ) + final = await self._find_files_graph.run(context) + return final.answer, {"documents": [], "files": [_serialize_file(item) for item in files]}, gate + documents = self._evidence.assemble_summaries(rows, route) + gate = self._gate.check_summaries(route, documents) + _log_pipeline_step( + runtime, + "evidence_assembled", + {"mode": "summary", "primary_doc": documents[0].path if documents else None, "document_count": len(documents)}, + ) + self._log_ranking(runtime, documents) + _log_pipeline_step( + runtime, + "evidence_gate_checked", + {"passed": gate.passed, "reason": gate.reason, "answer_mode": gate.answer_mode}, + ) + context = DocsExplainSummaryContext( + runtime=runtime, + route=route, + rag_session_id=rag_session_id or "", + prompt_name="v2_docs_explain.summary_answer", + workflow_llm_enabled=self._workflow_llm_enabled, + documents=documents, + gate_decision=gate, + ) + final = await self._summary_graph.run(context) + return final.answer, {"documents": [_serialize_summary(item) for item in documents], "files": []}, gate + + def _trace_row(self, row: dict) -> dict[str, object]: + metadata = dict(row.get("metadata") or {}) + return { + "path": str(row.get("path") or ""), + "layer": str(row.get("layer") or ""), + "title": str(row.get("title") or ""), + "document_id": str(metadata.get("document_id") or metadata.get("doc_id") or ""), + } + + def _log_ranking(self, runtime: "_RuntimeStub", items: list) -> None: + top_docs: list[dict[str, object]] = [] + for item in items[:4]: + top_docs.append( + { + "doc": getattr(item, "path", ""), + "score": getattr(item, "score", 0), + "match_reason": getattr(item, "match_reason", ""), + } + ) + _log_pipeline_step( + runtime, + "ranking_explained", + { + "doc": getattr(item, "path", ""), + "score": getattr(item, "score", 0), + "score_breakdown": getattr(item, "score_breakdown", {}), + "match_reason": getattr(item, "match_reason", ""), + }, + ) + _log_pipeline_step( + runtime, + "ranking_explained", + { + "top_docs_after_ranking": top_docs, + "ranking_score_breakdown": [ + { + "doc": getattr(item, "path", ""), + "score_breakdown": getattr(item, "score_breakdown", {}), + } + for item in items[:4] + ], + }, + ) + + +@dataclass(slots=True) +class _RequestStub: + request_id: str + message: str + + +@dataclass(slots=True) +class _SessionStub: + active_rag_session_id: str | None = None + + +class _PublisherStub: + async def publish_status(self, request_id: str, source: str, message: str, payload: dict | None = None) -> None: + return None + + +class _TraceLoggerStub: + def __init__(self, store: list[dict]) -> None: + self._store = store + + def log_module(self, request_id: str, module: str, title: str, payload: dict | None = None) -> None: + self._store.append( + {"request_id": request_id, "module": module, "event": title, "payload": dict(payload or {})} + ) + + +class _RuntimeStub: + def __init__(self, *, query: str) -> None: + self.logs: list[dict] = [] + self.request = _RequestStub(request_id="pipeline_setup_v3", message=query) + self.session = _SessionStub() + self.publisher = _PublisherStub() + self.trace = RequestTraceContext(request_id=self.request.request_id, logger=_TraceLoggerStub(self.logs)) + + +def _build_client() -> GigaChatClient: + settings = GigaChatSettings.from_env() + return GigaChatClient(settings, GigaChatTokenProvider(settings)) + + +def _build_v2_llm() -> AgentLlmService: + prompt_paths = [ + Path(__file__).resolve().parents[3] / "src/app/core/agent/processes/v2/prompts.yml", + Path(__file__).resolve().parents[3] / "src/app/core/agent/processes/v2/general_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)) + + +def _actual_from_v2(route, *, rows: list[dict] | None = None, plan=None, answer: str = "", answer_mode: str = "partial") -> dict: + return { + "domain": route.routing_domain, + "intent": route.intent, + "sub_intent": route.subintent, + "rag_count": len(rows or []), + "llm_answer": answer, + "answer_mode": answer_mode, + "path_scope": tuple(), + "symbol_candidates": tuple(), + "entity_candidates": tuple(_entity_candidates(rows or [])), + "doc_scope": tuple(_doc_scope(rows or [])), + "layers": tuple(getattr(plan, "layers", []) or []), + "filters": dict(getattr(plan, "filters", {}) or {}), + } + + +def _details(query: str, **payload) -> dict: + details = {"query": query} + for key, value in payload.items(): + if key == "route": + details["router_result"] = asdict(value) + elif key == "plan": + details["retrieval_plan"] = asdict(value) + else: + details[key] = value + return details + + +def _doc_scope(rows: list[dict]) -> list[str]: + values: list[str] = [] + for row in rows: + metadata = dict(row.get("metadata") or {}) + for candidate in (metadata.get("document_id"), metadata.get("doc_id"), row.get("path")): + value = str(candidate or "").strip() + if value and value not in values: + values.append(value) + return values + + +def _entity_candidates(rows: list[dict]) -> list[str]: + values: list[str] = [] + for row in rows: + metadata = dict(row.get("metadata") or {}) + value = str(metadata.get("entity_name") or row.get("title") or "").strip() + if value and value not in values and str(row.get("layer") or "") == "D3_ENTITY_CATALOG": + values.append(value) + return values + + +def _serialize_summary(item: RetrievedSummary) -> dict: + return asdict(item) + + +def _serialize_file(item: RetrievedFile) -> dict: + return asdict(item) + + +def _build_pipeline_steps(logs: list[dict]) -> list[dict]: + steps: list[dict] = [] + for item in logs: + if item.get("module") != "process.v2.pipeline": + continue + steps.append({"step": item.get("event"), "output": item.get("payload") or {}}) + return steps + + +def _log_pipeline_step(runtime: _RuntimeStub, step: str, payload: dict[str, object]) -> None: + runtime.logs.append( + { + "request_id": runtime.request.request_id, + "module": "process.v2.pipeline", + "event": step, + "payload": payload, + } + ) diff --git a/tests/pipeline_setup_v3/shared/env_loader.py b/tests/pipeline_setup_v3/shared/env_loader.py index cc289f9..36b45c0 100644 --- a/tests/pipeline_setup_v3/shared/env_loader.py +++ b/tests/pipeline_setup_v3/shared/env_loader.py @@ -3,7 +3,7 @@ from __future__ import annotations import os from pathlib import Path -from app.modules.shared.env_loader import load_workspace_env +from app.core.shared.config import load_workspace_env def load_pipeline_setup_env(start_dir: str | Path | None = None) -> list[Path]: diff --git a/tests/pipeline_setup_v3/shared/rag_indexer.py b/tests/pipeline_setup_v3/shared/rag_indexer.py index f1f4712..6a0d104 100644 --- a/tests/pipeline_setup_v3/shared/rag_indexer.py +++ b/tests/pipeline_setup_v3/shared/rag_indexer.py @@ -8,7 +8,7 @@ from typing import TYPE_CHECKING from uuid import uuid4 if TYPE_CHECKING: - from app.modules.rag.persistence.repository import RagRepository + from app.core.rag.persistence.repository import RagRepository class LocalRepoFileCollector: @@ -77,7 +77,7 @@ class DeterministicEmbedder: class RagSessionIndexer: def __init__(self, repository: "RagRepository") -> None: - from app.modules.rag.services.rag_service import RagService + from app.core.rag.indexing.service import RagService self._repository = repository self._rag = RagService(embedder=DeterministicEmbedder(), repository=repository) @@ -90,7 +90,7 @@ class RagSessionIndexer: files = LocalRepoFileCollector(repo_path).collect() if not files: raise ValueError(f"No indexable text files found under: {repo_path}") - logger = logging.getLogger("app.modules.rag.services.rag_service") + logger = logging.getLogger("app.core.rag.indexing.service") previous_level = logger.level logger.setLevel(logging.ERROR) try: diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json new file mode 100644 index 0000000..a32f7e3 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json @@ -0,0 +1,43 @@ +{ + "meta": { + "case_id": "v2-docs-summary-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'status'", + "llm: expected answer to contain 'components'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 12, + "llm_answer": "Информация о том, как именно работает `/health`, не представлена в предоставленных SUMMARY-блоках. \n\nФайлы, на которые я опирался:\n- docs/architecture/telegram-notify-app-overview.md", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "RuntimeManager", + "TelegramSendService", + "TelegramControlChannel" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md new file mode 100644 index 0000000..23cb454 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md @@ -0,0 +1,51 @@ +# v2-docs-summary-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Кратко объясни по документации, как работает `/health` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 12, + "llm_answer": "Информация о том, как именно работает `/health`, не представлена в предоставленных SUMMARY-блоках. \n\nФайлы, на которые я опирался:\n- docs/architecture/telegram-notify-app-overview.md", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "RuntimeManager", + "TelegramSendService", + "TelegramControlChannel" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'status' +- llm: expected answer to contain 'components' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json new file mode 100644 index 0000000..7f77475 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json @@ -0,0 +1,43 @@ +{ + "meta": { + "case_id": "v2-docs-summary-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain 'message'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 12, + "llm_answer": "На основе представленного SUMMARY-блока, документация о том, что именно делает endpoint `/send`, отсутствует. В контексте указано, что он связан с отправкой сообщений, но подробностей его работы не приведено.\n\nФайлы, на которые опирался ответ:\n- docs/architecture/telegram-notify-app-overview.md", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService", + "TelegramNotifyModule", + "TelegramControlChannel", + "TelegramNotifyWorker", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md new file mode 100644 index 0000000..4338230 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md @@ -0,0 +1,51 @@ +# v2-docs-summary-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что делает endpoint `/send`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 12, + "llm_answer": "На основе представленного SUMMARY-блока, документация о том, что именно делает endpoint `/send`, отсутствует. В контексте указано, что он связан с отправкой сообщений, но подробностей его работы не приведено.\n\nФайлы, на которые опирался ответ:\n- docs/architecture/telegram-notify-app-overview.md", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService", + "TelegramNotifyModule", + "TelegramControlChannel", + "TelegramNotifyWorker", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain 'message' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json new file mode 100644 index 0000000..5940c38 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json @@ -0,0 +1,30 @@ +{ + "meta": { + "case_id": "v2-docs-summary-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA", + "retrieval: expected non-empty rag, got 0 rows", + "doc_scope should contain 'docs/api/control-actions-endpoint.md', got []" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "`/actions/{action}` обычно используется в API для выполнения конкретных действий или операций, где `{action}` заменяется названием нужного действия. Это позволяет организовывать и вызывать различные функции через единый интерфейс.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md new file mode 100644 index 0000000..654ade3 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md @@ -0,0 +1,38 @@ +# v2-docs-summary-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Объясни назначение `/actions/{action}` + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "`/actions/{action}` обычно используется в API для выполнения конкретных действий или операций, где `{action}` заменяется названием нужного действия. Это позволяет организовывать и вызывать различные функции через единый интерфейс.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA +- retrieval: expected non-empty rag, got 0 rows +- doc_scope should contain 'docs/api/control-actions-endpoint.md', got [] \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json new file mode 100644 index 0000000..d367b96 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json @@ -0,0 +1,30 @@ +{ + "meta": { + "case_id": "v2-docs-summary-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA", + "retrieval: expected non-empty rag, got 0 rows", + "doc_scope should contain 'docs/domains/runtime-health-entity.md', got []" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Runtime health — это процесс мониторинга и обеспечения стабильности работы системы или приложения во время их выполнения (runtime), позволяющий своевременно обнаруживать и устранять возникающие проблемы.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md new file mode 100644 index 0000000..b834bc1 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md @@ -0,0 +1,38 @@ +# v2-docs-summary-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что такое runtime health в этой документации? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Runtime health — это процесс мониторинга и обеспечения стабильности работы системы или приложения во время их выполнения (runtime), позволяющий своевременно обнаруживать и устранять возникающие проблемы.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA +- retrieval: expected non-empty rag, got 0 rows +- doc_scope should contain 'docs/domains/runtime-health-entity.md', got [] \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json new file mode 100644 index 0000000..554b88a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json @@ -0,0 +1,33 @@ +{ + "meta": { + "case_id": "v2-docs-summary-05-notification-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA", + "retrieval: expected non-empty rag, got 0 rows", + "doc_scope should contain 'docs/logic/telegram-notification-loop.md', got []", + "llm: expected answer to contain 'worker'", + "llm: expected answer to contain 'interval'", + "llm: expected answer to contain 'degraded'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Цикл отправки уведомлений включает следующие шаги: отлавливание события, обработка данных, выбор получателей, формирование сообщения и его отправка выбранным пользователям.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md new file mode 100644 index 0000000..b600c8e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md @@ -0,0 +1,41 @@ +# v2-docs-summary-05-notification-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Кратко опиши цикл отправки уведомлений + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Цикл отправки уведомлений включает следующие шаги: отлавливание события, обработка данных, выбор получателей, формирование сообщения и его отправка выбранным пользователям.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA +- retrieval: expected non-empty rag, got 0 rows +- doc_scope should contain 'docs/logic/telegram-notification-loop.md', got [] +- llm: expected answer to contain 'worker' +- llm: expected answer to contain 'interval' +- llm: expected answer to contain 'degraded' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json new file mode 100644 index 0000000..708a5c2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json @@ -0,0 +1,32 @@ +{ + "meta": { + "case_id": "v2-docs-summary-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA", + "retrieval: expected non-empty rag, got 0 rows", + "doc_scope should contain 'docs/architecture/telegram-notify-app-overview.md', got []", + "llm: expected answer to contain 'RuntimeManager'", + "llm: expected answer to contain 'TelegramControlChannel'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Архитектура Telegram Notify App основана на клиент-серверной модели, где серверное приложение обрабатывает входящие данные и отправляет уведомления через Telegram API. Клиентское приложение взаимодействует с сервером для отправки уведомлений. Пользователь настраивает параметры уведомлений в приложении, а сервер передает их в виде сообщений в указанный Telegram-канал или пользователю.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md new file mode 100644 index 0000000..101ae89 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md @@ -0,0 +1,40 @@ +# v2-docs-summary-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как устроена архитектура Telegram Notify App? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Архитектура Telegram Notify App основана на клиент-серверной модели, где серверное приложение обрабатывает входящие данные и отправляет уведомления через Telegram API. Клиентское приложение взаимодействует с сервером для отправки уведомлений. Пользователь настраивает параметры уведомлений в приложении, а сервер передает их в виде сообщений в указанный Telegram-канал или пользователю.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA +- retrieval: expected non-empty rag, got 0 rows +- doc_scope should contain 'docs/architecture/telegram-notify-app-overview.md', got [] +- llm: expected answer to contain 'RuntimeManager' +- llm: expected answer to contain 'TelegramControlChannel' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json new file mode 100644 index 0000000..e9fe557 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json @@ -0,0 +1,32 @@ +{ + "meta": { + "case_id": "v2-docs-summary-07-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA", + "retrieval: expected non-empty rag, got 0 rows", + "doc_scope should contain 'docs/logic/telegram-notification-loop.md', got []", + "doc_scope should contain 'docs/architecture/telegram-notify-app-overview.md', got []", + "llm: expected answer to contain 'Telegram'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Worker в этом приложении выполняет фоновые задачи или процессы, позволяя основному приложению работать быстро и плавно. Это может включать обработку данных, отправку уведомлений, загрузку файлов и другие ресурсоемкие операции.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md new file mode 100644 index 0000000..3851457 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md @@ -0,0 +1,40 @@ +# v2-docs-summary-07-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что делает worker в этом приложении? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Worker в этом приложении выполняет фоновые задачи или процессы, позволяя основному приложению работать быстро и плавно. Это может включать обработку данных, отправку уведомлений, загрузку файлов и другие ресурсоемкие операции.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA +- retrieval: expected non-empty rag, got 0 rows +- doc_scope should contain 'docs/logic/telegram-notification-loop.md', got [] +- doc_scope should contain 'docs/architecture/telegram-notify-app-overview.md', got [] +- llm: expected answer to contain 'Telegram' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json new file mode 100644 index 0000000..13f4365 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json @@ -0,0 +1,47 @@ +{ + "meta": { + "case_id": "v2-docs-summary-08-health-statuses", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain 'ok'", + "llm: expected answer to contain 'degraded'", + "llm: expected answer to contain 'unhealthy'", + "llm: expected answer to contain 'unknown'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 12, + "llm_answer": "На основе представленного SUMMARY-блока конкретной информации о статусах здоровья runtime нет. Файл, связанный с доменом \"runtime health\" (../domains/runtime-health-entity.md), вероятно, содержит эту информацию, но она не включена в текущий контекст.\n\nФайлы, на которые опирался ответ:\n- docs/architecture/telegram-notify-app-overview.md", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramNotifyWorker", + "TelegramSendService", + "TelegramNotifyModule", + "TelegramControlChannel" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md new file mode 100644 index 0000000..7014fc0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md @@ -0,0 +1,55 @@ +# v2-docs-summary-08-health-statuses + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие статусы здоровья есть у runtime? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 12, + "llm_answer": "На основе представленного SUMMARY-блока конкретной информации о статусах здоровья runtime нет. Файл, связанный с доменом \"runtime health\" (../domains/runtime-health-entity.md), вероятно, содержит эту информацию, но она не включена в текущий контекст.\n\nФайлы, на которые опирался ответ:\n- docs/architecture/telegram-notify-app-overview.md", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramNotifyWorker", + "TelegramSendService", + "TelegramNotifyModule", + "TelegramControlChannel" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain 'ok' +- llm: expected answer to contain 'degraded' +- llm: expected answer to contain 'unhealthy' +- llm: expected answer to contain 'unknown' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json new file mode 100644 index 0000000..460127a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json @@ -0,0 +1,33 @@ +{ + "meta": { + "case_id": "v2-docs-summary-09-manual-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA", + "retrieval: expected non-empty rag, got 0 rows", + "doc_scope should contain 'docs/api/send-message-endpoint.md', got []", + "llm: expected answer to contain '/send'", + "llm: expected answer to contain 'message'", + "llm: expected answer to contain 'TelegramSendService'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Ручная отправка сообщения в приложении обычно осуществляется нажатием кнопки \"Отправить\" или аналогичного элемента интерфейса после того, как пользователь введет текст сообщения.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md new file mode 100644 index 0000000..d843338 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md @@ -0,0 +1,41 @@ +# v2-docs-summary-09-manual-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как в приложении устроена ручная отправка сообщения? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Ручная отправка сообщения в приложении обычно осуществляется нажатием кнопки \"Отправить\" или аналогичного элемента интерфейса после того, как пользователь введет текст сообщения.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA +- retrieval: expected non-empty rag, got 0 rows +- doc_scope should contain 'docs/api/send-message-endpoint.md', got [] +- llm: expected answer to contain '/send' +- llm: expected answer to contain 'message' +- llm: expected answer to contain 'TelegramSendService' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json new file mode 100644 index 0000000..f9f85df --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json @@ -0,0 +1,34 @@ +{ + "meta": { + "case_id": "v2-docs-summary-10-telegram-integration", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA", + "retrieval: expected non-empty rag, got 0 rows", + "retrieval: expected at least 2 rows, got 0", + "doc_scope should contain 'docs/architecture/telegram-notify-app-overview.md', got []", + "doc_scope should contain 'docs/api/send-message-endpoint.md', got []", + "llm: expected answer to contain 'worker'", + "llm: expected answer to contain '/send'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Сервис может отправлять и получать сообщения, реагировать на команды и запросы пользователей через Telegram-бота. Взаимодействие происходит посредством отправки запросов и получения ответов от бота в чате.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md new file mode 100644 index 0000000..229fb96 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md @@ -0,0 +1,42 @@ +# v2-docs-summary-10-telegram-integration + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как сервис взаимодействует с Telegram в целом? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Сервис может отправлять и получать сообщения, реагировать на команды и запросы пользователей через Telegram-бота. Взаимодействие происходит посредством отправки запросов и получения ответов от бота в чате.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA +- retrieval: expected non-empty rag, got 0 rows +- retrieval: expected at least 2 rows, got 0 +- doc_scope should contain 'docs/architecture/telegram-notify-app-overview.md', got [] +- doc_scope should contain 'docs/api/send-message-endpoint.md', got [] +- llm: expected answer to contain 'worker' +- llm: expected answer to contain '/send' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-01-health.json new file mode 100644 index 0000000..b951146 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-01-health.json @@ -0,0 +1,42 @@ +{ + "meta": { + "case_id": "v2-find-files-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/health-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/README.md`\n- `docs/architecture/telegram-notify-app-overview.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "RuntimeManager", + "TelegramControlChannel", + "TelegramNotifyWorker", + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-01-health.md new file mode 100644 index 0000000..28203f3 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-01-health.md @@ -0,0 +1,50 @@ +# v2-find-files-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком файле описан `/health`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/README.md`\n- `docs/architecture/telegram-notify-app-overview.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "RuntimeManager", + "TelegramControlChannel", + "TelegramNotifyWorker", + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/health-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-02-send.json new file mode 100644 index 0000000..a7d3c2d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-02-send.json @@ -0,0 +1,42 @@ +{ + "meta": { + "case_id": "v2-find-files-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/send-message-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/README.md`\n- `docs/architecture/telegram-notify-app-overview.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService", + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramControlChannel", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-02-send.md new file mode 100644 index 0000000..263c1b6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-02-send.md @@ -0,0 +1,50 @@ +# v2-find-files-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Покажи файл с описанием endpoint `/send` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/README.md`\n- `docs/architecture/telegram-notify-app-overview.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService", + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramControlChannel", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/send-message-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-03-actions.json new file mode 100644 index 0000000..d4a94dc --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-03-actions.json @@ -0,0 +1,42 @@ +{ + "meta": { + "case_id": "v2-find-files-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/control-actions-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/README.md`\n- `docs/architecture/telegram-notify-app-overview.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramNotifyModule", + "TelegramControlChannel", + "TelegramNotifyWorker", + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-03-actions.md new file mode 100644 index 0000000..e0b6625 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-03-actions.md @@ -0,0 +1,50 @@ +# v2-find-files-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Где находится документация по `/actions/{action}`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/README.md`\n- `docs/architecture/telegram-notify-app-overview.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramNotifyModule", + "TelegramControlChannel", + "TelegramNotifyWorker", + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/control-actions-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json new file mode 100644 index 0000000..2fa11f9 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json @@ -0,0 +1,42 @@ +{ + "meta": { + "case_id": "v2-find-files-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/domains/runtime-health-entity.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/architecture/telegram-notify-app-overview.md`\n- `docs/README.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramNotifyWorker", + "TelegramNotifyModule", + "TelegramControlChannel", + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md new file mode 100644 index 0000000..f1d4543 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md @@ -0,0 +1,50 @@ +# v2-find-files-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком документе описан runtime health? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/architecture/telegram-notify-app-overview.md`\n- `docs/README.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramNotifyWorker", + "TelegramNotifyModule", + "TelegramControlChannel", + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/domains/runtime-health-entity.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-05-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-05-loop.json new file mode 100644 index 0000000..3c55d0f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-05-loop.json @@ -0,0 +1,42 @@ +{ + "meta": { + "case_id": "v2-find-files-05-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/README.md`\n- `docs/architecture/telegram-notify-app-overview.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramSendService", + "RuntimeManager", + "TelegramControlChannel" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-05-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-05-loop.md new file mode 100644 index 0000000..51f00e3 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-05-loop.md @@ -0,0 +1,50 @@ +# v2-find-files-05-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Найди файл с логикой цикла отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/README.md`\n- `docs/architecture/telegram-notify-app-overview.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramSendService", + "RuntimeManager", + "TelegramControlChannel" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json new file mode 100644 index 0000000..27afb1d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json @@ -0,0 +1,40 @@ +{ + "meta": { + "case_id": "v2-find-files-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/README.md`\n- `docs/architecture/telegram-notify-app-overview.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramSendService", + "TelegramNotifyModule", + "TelegramControlChannel", + "TelegramNotifyWorker" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md new file mode 100644 index 0000000..12e65d4 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md @@ -0,0 +1,50 @@ +# v2-find-files-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Где описана архитектура приложения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/README.md`\n- `docs/architecture/telegram-notify-app-overview.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramSendService", + "TelegramNotifyModule", + "TelegramControlChannel", + "TelegramNotifyWorker" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json new file mode 100644 index 0000000..c5c3b87 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json @@ -0,0 +1,42 @@ +{ + "meta": { + "case_id": "v2-find-files-07-errors-catalog", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/errors/catalog.yaml'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/README.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramControlChannel", + "TelegramNotifyModule", + "TelegramSendService", + "TelegramNotifyWorker" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md new file mode 100644 index 0000000..44eb963 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md @@ -0,0 +1,50 @@ +# v2-find-files-07-errors-catalog + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком файле лежит каталог ошибок? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/README.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramControlChannel", + "TelegramNotifyModule", + "TelegramSendService", + "TelegramNotifyWorker" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/errors/catalog.yaml' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json new file mode 100644 index 0000000..4246968 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json @@ -0,0 +1,40 @@ +{ + "meta": { + "case_id": "v2-find-files-08-docs-index", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/README.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramControlChannel", + "RuntimeManager", + "TelegramSendService" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md new file mode 100644 index 0000000..832f39b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md @@ -0,0 +1,50 @@ +# v2-find-files-08-docs-index + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Покажи файл-индекс документации проекта + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/README.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramControlChannel", + "RuntimeManager", + "TelegramSendService" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json new file mode 100644 index 0000000..e52b292 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json @@ -0,0 +1,43 @@ +{ + "meta": { + "case_id": "v2-find-files-09-telegram-bot-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/send-message-endpoint.md'", + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/README.md`\n- `docs/architecture/telegram-notify-app-overview.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramSendService", + "TelegramControlChannel", + "TelegramNotifyWorker", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md new file mode 100644 index 0000000..5b527b0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md @@ -0,0 +1,51 @@ +# v2-find-files-09-telegram-bot-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие файлы относятся к Telegram Bot API интеграции? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/README.md`\n- `docs/architecture/telegram-notify-app-overview.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramSendService", + "TelegramControlChannel", + "TelegramNotifyWorker", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/send-message-endpoint.md' +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json new file mode 100644 index 0000000..7169076 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json @@ -0,0 +1,43 @@ +{ + "meta": { + "case_id": "v2-find-files-10-telegram-notify-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'", + "llm: expected answer to contain 'docs/domains/runtime-health-entity.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/architecture/telegram-notify-app-overview.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker", + "TelegramNotifyModule", + "TelegramSendService", + "TelegramControlChannel", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md new file mode 100644 index 0000000..c674b3a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md @@ -0,0 +1,51 @@ +# v2-find-files-10-telegram-notify-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каких файлах описан worker `telegram_notify`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 20, + "llm_answer": "Нашёл релевантные файлы документации:\n- `docs/architecture/telegram-notify-app-overview.md`", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker", + "TelegramNotifyModule", + "TelegramSendService", + "TelegramControlChannel", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D3_ENTITY_CATALOG", + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- llm: expected answer to contain 'docs/domains/runtime-health-entity.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json new file mode 100644 index 0000000..b718226 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json @@ -0,0 +1,27 @@ +{ + "meta": { + "case_id": "v2-general-01-what-is-service", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'Telegram'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Это зависит от контекста. Уточни, пожалуйста, о каком именно сервисе идет речь.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md new file mode 100644 index 0000000..1d5f9f6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md @@ -0,0 +1,35 @@ +# v2-general-01-what-is-service + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что это за сервис? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Это зависит от контекста. Уточни, пожалуйста, о каком именно сервисе идет речь.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'Telegram' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-02-purpose.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-02-purpose.json new file mode 100644 index 0000000..81dee19 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-02-purpose.json @@ -0,0 +1,25 @@ +{ + "meta": { + "case_id": "v2-general-02-purpose", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Test_echo_app нужен для тестирования и отладки приложений и систем, повторяя входящий запрос в качестве ответа, чтобы убедиться в правильной работе связи и функциональности.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-02-purpose.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-02-purpose.md new file mode 100644 index 0000000..ed9376c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-02-purpose.md @@ -0,0 +1,35 @@ +# v2-general-02-purpose + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Для чего нужен test_echo_app? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Test_echo_app нужен для тестирования и отладки приложений и систем, повторяя входящий запрос в качестве ответа, чтобы убедиться в правильной работе связи и функциональности.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-03-problem.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-03-problem.json new file mode 100644 index 0000000..4664e67 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-03-problem.json @@ -0,0 +1,27 @@ +{ + "meta": { + "case_id": "v2-general-03-problem", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'Telegram'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Приложение решает задачу (указать конкретную задачу, например, управления контактами, планирования задач, учета финансов и т.д.) для пользователей путем предоставления удобного и интуитивно понятного интерфейса.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-03-problem.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-03-problem.md new file mode 100644 index 0000000..fc0d6ea --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-03-problem.md @@ -0,0 +1,35 @@ +# v2-general-03-problem + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какую задачу решает это приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Приложение решает задачу (указать конкретную задачу, например, управления контактами, планирования задач, учета финансов и т.д.) для пользователей путем предоставления удобного и интуитивно понятного интерфейса.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'Telegram' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json new file mode 100644 index 0000000..5615b14 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json @@ -0,0 +1,43 @@ +{ + "meta": { + "case_id": "v2-general-04-docs-contents", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected GENERAL, got DOCS", + "intent: expected GENERAL_QA, got DOC_EXPLAIN" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 12, + "llm_answer": "Документация проекта включает следующие компоненты:\n\n- Архитектура приложения `test_echo_app`\n- Описание HTTP API (control plane)\n- Цикл отправки уведомлений\n- Health-модель\n- Каталог ошибок\n\nСтруктура документации канонически разделена на несколько секций: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`. Основная родительская документация — \"Архитектура Telegram Notify App\" (находится по пути ./architecture/telegram-notify-app-overview.md). Документы взаимосвязаны с помощью ссылок `related_docs`, `parent`/`children` и обычных markdown-ссылок без повторения одной и той же информации.\n\nФайлы, использованные для ответа: docs/README.md", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramControlChannel", + "TelegramNotifyModule", + "TelegramSendService", + "TelegramNotifyWorker", + "RuntimeManager" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md new file mode 100644 index 0000000..226c40b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md @@ -0,0 +1,51 @@ +# v2-general-04-docs-contents + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что входит в документацию этого проекта? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 12, + "llm_answer": "Документация проекта включает следующие компоненты:\n\n- Архитектура приложения `test_echo_app`\n- Описание HTTP API (control plane)\n- Цикл отправки уведомлений\n- Health-модель\n- Каталог ошибок\n\nСтруктура документации канонически разделена на несколько секций: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`. Основная родительская документация — \"Архитектура Telegram Notify App\" (находится по пути ./architecture/telegram-notify-app-overview.md). Документы взаимосвязаны с помощью ссылок `related_docs`, `parent`/`children` и обычных markdown-ссылок без повторения одной и той же информации.\n\nФайлы, использованные для ответа: docs/README.md", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramControlChannel", + "TelegramNotifyModule", + "TelegramSendService", + "TelegramNotifyWorker", + "RuntimeManager" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- domain: expected GENERAL, got DOCS +- intent: expected GENERAL_QA, got DOC_EXPLAIN \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-05-main-parts.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-05-main-parts.json new file mode 100644 index 0000000..03d8590 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-05-main-parts.json @@ -0,0 +1,27 @@ +{ + "meta": { + "case_id": "v2-general-05-main-parts", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'Telegram'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Основные части любой системы включают вход, процессоры (обработчики), память и выход.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-05-main-parts.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-05-main-parts.md new file mode 100644 index 0000000..e83b3a0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-05-main-parts.md @@ -0,0 +1,35 @@ +# v2-general-05-main-parts + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие основные части есть у системы? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Основные части любой системы включают вход, процессоры (обработчики), память и выход.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'Telegram' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json new file mode 100644 index 0000000..be43495 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json @@ -0,0 +1,25 @@ +{ + "meta": { + "case_id": "v2-general-06-high-level-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Приложение обычно состоит из пользовательского интерфейса (то, что видит и с чем взаимодействует пользователь), логики приложения (код, который обрабатывает действия пользователя) и базы данных (место хранения информации). Все эти части связаны между собой для обеспечения удобной работы пользователя.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md new file mode 100644 index 0000000..7c7b4b5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md @@ -0,0 +1,35 @@ +# v2-general-06-high-level-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Как в целом устроено приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Приложение обычно состоит из пользовательского интерфейса (то, что видит и с чем взаимодействует пользователь), логики приложения (код, который обрабатывает действия пользователя) и базы данных (место хранения информации). Все эти части связаны между собой для обеспечения удобной работы пользователя.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-07-besides-api.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-07-besides-api.json new file mode 100644 index 0000000..66911fe --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-07-besides-api.json @@ -0,0 +1,25 @@ +{ + "meta": { + "case_id": "v2-general-07-besides-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Кроме API, здесь есть дружелюбная атмосфера, готовность помочь и интересные беседы на различные темы.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-07-besides-api.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-07-besides-api.md new file mode 100644 index 0000000..f1f0cf8 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-07-besides-api.md @@ -0,0 +1,35 @@ +# v2-general-07-besides-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что тут есть кроме API? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Кроме API, здесь есть дружелюбная атмосфера, готовность помочь и интересные беседы на различные темы.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-08-components.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-08-components.json new file mode 100644 index 0000000..3548b3f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-08-components.json @@ -0,0 +1,25 @@ +{ + "meta": { + "case_id": "v2-general-08-components", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Telegram Notify App состоит из простого пользовательского интерфейса для отправки уведомлений, механизма обработки сообщений и интеграции с API Telegram, позволяющей отправлять сообщения в выбранные чаты или каналы.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-08-components.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-08-components.md new file mode 100644 index 0000000..2e5b1c0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-08-components.md @@ -0,0 +1,35 @@ +# v2-general-08-components + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Из чего состоит Telegram Notify App? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Telegram Notify App состоит из простого пользовательского интерфейса для отправки уведомлений, механизма обработки сообщений и интеграции с API Telegram, позволяющей отправлять сообщения в выбранные чаты или каналы.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-09-reading-order.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-09-reading-order.json new file mode 100644 index 0000000..6e5d7fe --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-09-reading-order.json @@ -0,0 +1,45 @@ +{ + "meta": { + "case_id": "v2-general-09-reading-order", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected GENERAL, got DOCS", + "intent: expected GENERAL_QA, got DOC_EXPLAIN", + "llm: expected answer to contain 'README'", + "llm: expected answer to contain 'архитект'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 12, + "llm_answer": "Не нашёл подходящих SUMMARY-блоков в документации по этому запросу.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramSendService", + "TelegramNotifyWorker", + "TelegramControlChannel", + "RuntimeManager" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-09-reading-order.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-09-reading-order.md new file mode 100644 index 0000000..2090b54 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-09-reading-order.md @@ -0,0 +1,53 @@ +# v2-general-09-reading-order + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие документы стоит читать сначала? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 12, + "llm_answer": "Не нашёл подходящих SUMMARY-блоков в документации по этому запросу.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramSendService", + "TelegramNotifyWorker", + "TelegramControlChannel", + "RuntimeManager" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- domain: expected GENERAL, got DOCS +- intent: expected GENERAL_QA, got DOC_EXPLAIN +- llm: expected answer to contain 'README' +- llm: expected answer to contain 'архитект' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-10-short-summary.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-10-short-summary.json new file mode 100644 index 0000000..7c84098 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-10-short-summary.json @@ -0,0 +1,25 @@ +{ + "meta": { + "case_id": "v2-general-10-short-summary", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Проектная документация включает описание целей, задач, методов, графика и бюджета проекта, а также список необходимых ресурсов и команду исполнителей.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-10-short-summary.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-10-short-summary.md new file mode 100644 index 0000000..d55ff45 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/full_chain_docs_v2_matrix_v2-general-10-short-summary.md @@ -0,0 +1,35 @@ +# v2-general-10-short-summary + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Дай короткое summary по проектной документации + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "Проектная документация включает описание целей, задач, методов, графика и бюджета проекта, а также список необходимых ресурсов и команду исполнителей.", + "answer_mode": "answered", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +- none + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/summary.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/summary.md new file mode 100644 index 0000000..871b698 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_194106/summary.md @@ -0,0 +1,153 @@ +# pipeline_setup_v3 summary + +Passed: 7/30 + +| File | Case | Mode | Query | Actual sub-intent | RAG layers | Tokens | Pass | +|------|------|------|-------|-------------------|------------|--------|------| +| full_chain_docs_v2_matrix.yaml | v2-general-01-what-is-service | full_chain | Что это за сервис? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-02-purpose | full_chain | Для чего нужен test_echo_app? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-03-problem | full_chain | Какую задачу решает это приложение? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-04-docs-contents | full_chain | Что входит в документацию этого проекта? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-05-main-parts | full_chain | Какие основные части есть у системы? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-06-high-level-architecture | full_chain | Как в целом устроено приложение? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-07-besides-api | full_chain | Что тут есть кроме API? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-08-components | full_chain | Из чего состоит Telegram Notify App? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-09-reading-order | full_chain | Какие документы стоит читать сначала? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-10-short-summary | full_chain | Дай короткое summary по проектной документации | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-01-health | full_chain | Кратко объясни по документации, как работает `/health` | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-02-send | full_chain | Что делает endpoint `/send`? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-03-actions | full_chain | Объясни назначение `/actions/{action}` | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-04-runtime-health | full_chain | Что такое runtime health в этой документации? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-05-notification-loop | full_chain | Кратко опиши цикл отправки уведомлений | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-06-architecture | full_chain | Как устроена архитектура Telegram Notify App? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-07-worker | full_chain | Что делает worker в этом приложении? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-08-health-statuses | full_chain | Какие статусы здоровья есть у runtime? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-09-manual-send | full_chain | Как в приложении устроена ручная отправка сообщения? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-10-telegram-integration | full_chain | Как сервис взаимодействует с Telegram в целом? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-01-health | full_chain | В каком файле описан `/health`? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-02-send | full_chain | Покажи файл с описанием endpoint `/send` | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-03-actions | full_chain | Где находится документация по `/actions/{action}`? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-04-runtime-health | full_chain | В каком документе описан runtime health? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-05-loop | full_chain | Найди файл с логикой цикла отправки уведомлений | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-06-architecture | full_chain | Где описана архитектура приложения? | FIND_FILES | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-07-errors-catalog | full_chain | В каком файле лежит каталог ошибок? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-08-docs-index | full_chain | Покажи файл-индекс документации проекта | FIND_FILES | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-09-telegram-bot-api | full_chain | Какие файлы относятся к Telegram Bot API интеграции? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-10-telegram-notify-worker | full_chain | В каких файлах описан worker `telegram_notify`? | FIND_FILES | — | — | ✗ | + +## Failures +- **v2-general-01-what-is-service**: llm: expected answer to contain 'Telegram' +- **v2-general-03-problem**: llm: expected answer to contain 'Telegram' +- **v2-general-04-docs-contents**: domain: expected GENERAL, got DOCS; intent: expected GENERAL_QA, got DOC_EXPLAIN +- **v2-general-05-main-parts**: llm: expected answer to contain 'Telegram' +- **v2-general-09-reading-order**: domain: expected GENERAL, got DOCS; intent: expected GENERAL_QA, got DOC_EXPLAIN; llm: expected answer to contain 'README'; llm: expected answer to contain 'архитект' +- **v2-docs-summary-01-health**: llm: expected answer to contain 'status'; llm: expected answer to contain 'components' +- **v2-docs-summary-02-send**: doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain 'message' +- **v2-docs-summary-03-actions**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA; retrieval: expected non-empty rag, got 0 rows; doc_scope should contain 'docs/api/control-actions-endpoint.md', got [] +- **v2-docs-summary-04-runtime-health**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA; retrieval: expected non-empty rag, got 0 rows; doc_scope should contain 'docs/domains/runtime-health-entity.md', got [] +- **v2-docs-summary-05-notification-loop**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA; retrieval: expected non-empty rag, got 0 rows; doc_scope should contain 'docs/logic/telegram-notification-loop.md', got []; llm: expected answer to contain 'worker'; llm: expected answer to contain 'interval'; llm: expected answer to contain 'degraded' +- **v2-docs-summary-06-architecture**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA; retrieval: expected non-empty rag, got 0 rows; doc_scope should contain 'docs/architecture/telegram-notify-app-overview.md', got []; llm: expected answer to contain 'RuntimeManager'; llm: expected answer to contain 'TelegramControlChannel' +- **v2-docs-summary-07-worker**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA; retrieval: expected non-empty rag, got 0 rows; doc_scope should contain 'docs/logic/telegram-notification-loop.md', got []; doc_scope should contain 'docs/architecture/telegram-notify-app-overview.md', got []; llm: expected answer to contain 'Telegram' +- **v2-docs-summary-08-health-statuses**: doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain 'ok'; llm: expected answer to contain 'degraded'; llm: expected answer to contain 'unhealthy'; llm: expected answer to contain 'unknown' +- **v2-docs-summary-09-manual-send**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA; retrieval: expected non-empty rag, got 0 rows; doc_scope should contain 'docs/api/send-message-endpoint.md', got []; llm: expected answer to contain '/send'; llm: expected answer to contain 'message'; llm: expected answer to contain 'TelegramSendService' +- **v2-docs-summary-10-telegram-integration**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA; retrieval: expected non-empty rag, got 0 rows; retrieval: expected at least 2 rows, got 0; doc_scope should contain 'docs/architecture/telegram-notify-app-overview.md', got []; doc_scope should contain 'docs/api/send-message-endpoint.md', got []; llm: expected answer to contain 'worker'; llm: expected answer to contain '/send' +- **v2-find-files-01-health**: llm: expected answer to contain 'docs/api/health-endpoint.md' +- **v2-find-files-02-send**: llm: expected answer to contain 'docs/api/send-message-endpoint.md' +- **v2-find-files-03-actions**: llm: expected answer to contain 'docs/api/control-actions-endpoint.md' +- **v2-find-files-04-runtime-health**: llm: expected answer to contain 'docs/domains/runtime-health-entity.md' +- **v2-find-files-05-loop**: llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- **v2-find-files-07-errors-catalog**: llm: expected answer to contain 'docs/errors/catalog.yaml' +- **v2-find-files-09-telegram-bot-api**: llm: expected answer to contain 'docs/api/send-message-endpoint.md'; llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- **v2-find-files-10-telegram-notify-worker**: llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'; llm: expected answer to contain 'docs/domains/runtime-health-entity.md' + +## LLM Answers +- **v2-general-01-what-is-service** + Query: Что это за сервис? + > Это зависит от контекста. Уточни, пожалуйста, о каком именно сервисе идет речь. +- **v2-general-02-purpose** + Query: Для чего нужен test_echo_app? + > Test\_echo\_app нужен для тестирования и отладки приложений и систем, повторяя входящий запрос в качестве ответа, чтобы убедиться в правильной работе связи и функциональности. +- **v2-general-03-problem** + Query: Какую задачу решает это приложение? + > Приложение решает задачу \(указать конкретную задачу, например, управления контактами, планирования задач, учета финансов и т.д.\) для пользователей путем предоставления удобного и интуитивно понятного интерфейса. +- **v2-general-04-docs-contents** + Query: Что входит в документацию этого проекта? + > Документация проекта включает следующие компоненты: \- Архитектура приложения \`test\_echo\_app\` \- Описание HTTP API \(control plane\) \- Цикл отправки уведомлений \- Health\-модель \- Каталог ошибок Структура документации канонически разделена на несколько секций: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. Основная родительская документация — "Архитектура Telegram Notify App" \(находится по пути ./architecture/telegram\-notify\-app\-overview.md\). Документы взаимосвязаны с помощью ссылок \`related\_docs\`, \`parent\`/\`children\` и обычных markdown\-ссылок без повторения одной и той же информации. Файлы, использованные для ответа: docs/README.md +- **v2-general-05-main-parts** + Query: Какие основные части есть у системы? + > Основные части любой системы включают вход, процессоры \(обработчики\), память и выход. +- **v2-general-06-high-level-architecture** + Query: Как в целом устроено приложение? + > Приложение обычно состоит из пользовательского интерфейса \(то, что видит и с чем взаимодействует пользователь\), логики приложения \(код, который обрабатывает действия пользователя\) и базы данных \(место хранения информации\). Все эти части связаны между собой для обеспечения удобной работы пользователя. +- **v2-general-07-besides-api** + Query: Что тут есть кроме API? + > Кроме API, здесь есть дружелюбная атмосфера, готовность помочь и интересные беседы на различные темы. +- **v2-general-08-components** + Query: Из чего состоит Telegram Notify App? + > Telegram Notify App состоит из простого пользовательского интерфейса для отправки уведомлений, механизма обработки сообщений и интеграции с API Telegram, позволяющей отправлять сообщения в выбранные чаты или каналы. +- **v2-general-09-reading-order** + Query: Какие документы стоит читать сначала? + > Не нашёл подходящих SUMMARY\-блоков в документации по этому запросу. +- **v2-general-10-short-summary** + Query: Дай короткое summary по проектной документации + > Проектная документация включает описание целей, задач, методов, графика и бюджета проекта, а также список необходимых ресурсов и команду исполнителей. +- **v2-docs-summary-01-health** + Query: Кратко объясни по документации, как работает `/health` + > Информация о том, как именно работает \`/health\`, не представлена в предоставленных SUMMARY\-блоках. Файлы, на которые я опирался: \- docs/architecture/telegram\-notify\-app\-overview.md +- **v2-docs-summary-02-send** + Query: Что делает endpoint `/send`? + > На основе представленного SUMMARY\-блока, документация о том, что именно делает endpoint \`/send\`, отсутствует. В контексте указано, что он связан с отправкой сообщений, но подробностей его работы не приведено. Файлы, на которые опирался ответ: \- docs/architecture/telegram\-notify\-app\-overview.md +- **v2-docs-summary-03-actions** + Query: Объясни назначение `/actions/{action}` + > \`/actions/\{action\}\` обычно используется в API для выполнения конкретных действий или операций, где \`\{action\}\` заменяется названием нужного действия. Это позволяет организовывать и вызывать различные функции через единый интерфейс. +- **v2-docs-summary-04-runtime-health** + Query: Что такое runtime health в этой документации? + > Runtime health — это процесс мониторинга и обеспечения стабильности работы системы или приложения во время их выполнения \(runtime\), позволяющий своевременно обнаруживать и устранять возникающие проблемы. +- **v2-docs-summary-05-notification-loop** + Query: Кратко опиши цикл отправки уведомлений + > Цикл отправки уведомлений включает следующие шаги: отлавливание события, обработка данных, выбор получателей, формирование сообщения и его отправка выбранным пользователям. +- **v2-docs-summary-06-architecture** + Query: Как устроена архитектура Telegram Notify App? + > Архитектура Telegram Notify App основана на клиент\-серверной модели, где серверное приложение обрабатывает входящие данные и отправляет уведомления через Telegram API. Клиентское приложение взаимодействует с сервером для отправки уведомлений. Пользователь настраивает параметры уведомлений в приложении, а сервер передает их в виде сообщений в указанный Telegram\-канал или пользователю. +- **v2-docs-summary-07-worker** + Query: Что делает worker в этом приложении? + > Worker в этом приложении выполняет фоновые задачи или процессы, позволяя основному приложению работать быстро и плавно. Это может включать обработку данных, отправку уведомлений, загрузку файлов и другие ресурсоемкие операции. +- **v2-docs-summary-08-health-statuses** + Query: Какие статусы здоровья есть у runtime? + > На основе представленного SUMMARY\-блока конкретной информации о статусах здоровья runtime нет. Файл, связанный с доменом "runtime health" \(../domains/runtime\-health\-entity.md\), вероятно, содержит эту информацию, но она не включена в текущий контекст. Файлы, на которые опирался ответ: \- docs/architecture/telegram\-notify\-app\-overview.md +- **v2-docs-summary-09-manual-send** + Query: Как в приложении устроена ручная отправка сообщения? + > Ручная отправка сообщения в приложении обычно осуществляется нажатием кнопки "Отправить" или аналогичного элемента интерфейса после того, как пользователь введет текст сообщения. +- **v2-docs-summary-10-telegram-integration** + Query: Как сервис взаимодействует с Telegram в целом? + > Сервис может отправлять и получать сообщения, реагировать на команды и запросы пользователей через Telegram\-бота. Взаимодействие происходит посредством отправки запросов и получения ответов от бота в чате. +- **v2-find-files-01-health** + Query: В каком файле описан `/health`? + > Нашёл релевантные файлы документации: \- \`docs/README.md\` \- \`docs/architecture/telegram\-notify\-app\-overview.md\` +- **v2-find-files-02-send** + Query: Покажи файл с описанием endpoint `/send` + > Нашёл релевантные файлы документации: \- \`docs/README.md\` \- \`docs/architecture/telegram\-notify\-app\-overview.md\` +- **v2-find-files-03-actions** + Query: Где находится документация по `/actions/{action}`? + > Нашёл релевантные файлы документации: \- \`docs/README.md\` \- \`docs/architecture/telegram\-notify\-app\-overview.md\` +- **v2-find-files-04-runtime-health** + Query: В каком документе описан runtime health? + > Нашёл релевантные файлы документации: \- \`docs/architecture/telegram\-notify\-app\-overview.md\` \- \`docs/README.md\` +- **v2-find-files-05-loop** + Query: Найди файл с логикой цикла отправки уведомлений + > Нашёл релевантные файлы документации: \- \`docs/README.md\` \- \`docs/architecture/telegram\-notify\-app\-overview.md\` +- **v2-find-files-06-architecture** + Query: Где описана архитектура приложения? + > Нашёл релевантные файлы документации: \- \`docs/README.md\` \- \`docs/architecture/telegram\-notify\-app\-overview.md\` +- **v2-find-files-07-errors-catalog** + Query: В каком файле лежит каталог ошибок? + > Нашёл релевантные файлы документации: \- \`docs/README.md\` +- **v2-find-files-08-docs-index** + Query: Покажи файл-индекс документации проекта + > Нашёл релевантные файлы документации: \- \`docs/README.md\` +- **v2-find-files-09-telegram-bot-api** + Query: Какие файлы относятся к Telegram Bot API интеграции? + > Нашёл релевантные файлы документации: \- \`docs/README.md\` \- \`docs/architecture/telegram\-notify\-app\-overview.md\` +- **v2-find-files-10-telegram-notify-worker** + Query: В каких файлах описан worker `telegram_notify`? + > Нашёл релевантные файлы документации: \- \`docs/architecture/telegram\-notify\-app\-overview.md\` \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json new file mode 100644 index 0000000..f750d75 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json @@ -0,0 +1,153 @@ +{ + "meta": { + "case_id": "v2-docs-summary-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected grounded_summary, got insufficient_evidence", + "llm: expected answer to contain '/health'", + "llm: expected answer to contain 'status'", + "llm: expected answer to contain 'components'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 8, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "RuntimeManager", + "TelegramSendService", + "TelegramControlChannel" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_summary_api_endpoint", + "row_count": 8, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md new file mode 100644 index 0000000..72de4ec --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md @@ -0,0 +1,186 @@ +# v2-docs-summary-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Кратко объясни по документации, как работает `/health` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 8, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "RuntimeManager", + "TelegramSendService", + "TelegramControlChannel" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "row_count": 8, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected grounded_summary, got insufficient_evidence +- llm: expected answer to contain '/health' +- llm: expected answer to contain 'status' +- llm: expected answer to contain 'components' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json new file mode 100644 index 0000000..1c3c7bf --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json @@ -0,0 +1,152 @@ +{ + "meta": { + "case_id": "v2-docs-summary-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/send'", + "llm: expected answer to contain 'message'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 8, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService", + "TelegramNotifyModule", + "TelegramControlChannel", + "TelegramNotifyWorker", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_summary_api_endpoint", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md new file mode 100644 index 0000000..010899d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md @@ -0,0 +1,185 @@ +# v2-docs-summary-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что делает endpoint `/send`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 8, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService", + "TelegramNotifyModule", + "TelegramControlChannel", + "TelegramNotifyWorker", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/send' +- llm: expected answer to contain 'message' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json new file mode 100644 index 0000000..f91e458 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json @@ -0,0 +1,153 @@ +{ + "meta": { + "case_id": "v2-docs-summary-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/actions/{action}'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 8, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramControlChannel", + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_summary_api_endpoint", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md new file mode 100644 index 0000000..677f559 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md @@ -0,0 +1,186 @@ +# v2-docs-summary-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Объясни назначение `/actions/{action}` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 8, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramControlChannel", + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/actions/{action}' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json new file mode 100644 index 0000000..15376d0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json @@ -0,0 +1,139 @@ +{ + "meta": { + "case_id": "v2-docs-summary-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "llm: expected answer to contain 'runtime health'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 8, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramSendService", + "TelegramControlChannel" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_summary_domain_entity", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md new file mode 100644 index 0000000..e8a24ab --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md @@ -0,0 +1,172 @@ +# v2-docs-summary-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что такое runtime health в этой документации? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 8, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramSendService", + "TelegramControlChannel" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- llm: expected answer to contain 'runtime health' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json new file mode 100644 index 0000000..c159648 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json @@ -0,0 +1,143 @@ +{ + "meta": { + "case_id": "v2-docs-summary-05-notification-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain 'worker'", + "llm: expected answer to contain 'interval'", + "llm: expected answer to contain 'degraded'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 8, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md, docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramSendService", + "TelegramControlChannel", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_summary_logic_flow", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 147 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md new file mode 100644 index 0000000..b5fee52 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md @@ -0,0 +1,176 @@ +# v2-docs-summary-05-notification-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Кратко опиши цикл отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 8, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md, docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramSendService", + "TelegramControlChannel", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_logic_flow", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 147 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain 'worker' +- llm: expected answer to contain 'interval' +- llm: expected answer to contain 'degraded' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json new file mode 100644 index 0000000..24b90d1 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json @@ -0,0 +1,124 @@ +{ + "meta": { + "case_id": "v2-docs-summary-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramSendService", + "TelegramControlChannel", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_summary_architecture", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md new file mode 100644 index 0000000..7a22ca8 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md @@ -0,0 +1,159 @@ +# v2-docs-summary-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Как устроена архитектура Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramSendService", + "TelegramControlChannel", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_architecture", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json new file mode 100644 index 0000000..87eef02 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json @@ -0,0 +1,129 @@ +{ + "meta": { + "case_id": "v2-docs-summary-07-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain 'worker'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 8, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker", + "RuntimeManager", + "TelegramNotifyModule", + "TelegramSendService", + "TelegramControlChannel" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_summary_logic_flow", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md new file mode 100644 index 0000000..1e5bd47 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md @@ -0,0 +1,162 @@ +# v2-docs-summary-07-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что делает worker в этом приложении? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 8, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker", + "RuntimeManager", + "TelegramNotifyModule", + "TelegramSendService", + "TelegramControlChannel" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_logic_flow", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain 'worker' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json new file mode 100644 index 0000000..0f7c40a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json @@ -0,0 +1,143 @@ +{ + "meta": { + "case_id": "v2-docs-summary-08-health-statuses", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "llm: expected answer to contain 'ok'", + "llm: expected answer to contain 'degraded'", + "llm: expected answer to contain 'unhealthy'", + "llm: expected answer to contain 'unknown'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 8, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramNotifyWorker", + "TelegramSendService", + "TelegramNotifyModule", + "TelegramControlChannel" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_summary_domain_entity", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md new file mode 100644 index 0000000..8afa3cb --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md @@ -0,0 +1,176 @@ +# v2-docs-summary-08-health-statuses + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие статусы здоровья есть у runtime? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 8, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramNotifyWorker", + "TelegramSendService", + "TelegramNotifyModule", + "TelegramControlChannel" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- llm: expected answer to contain 'ok' +- llm: expected answer to contain 'degraded' +- llm: expected answer to contain 'unhealthy' +- llm: expected answer to contain 'unknown' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json new file mode 100644 index 0000000..11bf82f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json @@ -0,0 +1,151 @@ +{ + "meta": { + "case_id": "v2-docs-summary-09-manual-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/send'", + "llm: expected answer to contain 'message'", + "llm: expected answer to contain 'TelegramSendService'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 8, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService", + "TelegramNotifyWorker", + "RuntimeManager", + "TelegramNotifyModule", + "TelegramControlChannel" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_summary_api_endpoint", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md new file mode 100644 index 0000000..851ead9 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md @@ -0,0 +1,184 @@ +# v2-docs-summary-09-manual-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как в приложении устроена ручная отправка сообщения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 8, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService", + "TelegramNotifyWorker", + "RuntimeManager", + "TelegramNotifyModule", + "TelegramControlChannel" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/send' +- llm: expected answer to contain 'message' +- llm: expected answer to contain 'TelegramSendService' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json new file mode 100644 index 0000000..a185ba1 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json @@ -0,0 +1,127 @@ +{ + "meta": { + "case_id": "v2-docs-summary-10-telegram-integration", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA", + "anchor_type: expected API_ENDPOINT, got None", + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": null, + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": null, + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md new file mode 100644 index 0000000..8fa8c48 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md @@ -0,0 +1,160 @@ +# v2-docs-summary-10-telegram-integration + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как сервис взаимодействует с Telegram в целом? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": null, + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": null, + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA +- anchor_type: expected API_ENDPOINT, got None +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-01-health.json new file mode 100644 index 0000000..13b57c3 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-01-health.json @@ -0,0 +1,137 @@ +{ + "meta": { + "case_id": "v2-find-files-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected deterministic, got deterministic_file_list", + "llm: expected answer to contain 'docs/api/health-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "RuntimeManager", + "TelegramControlChannel", + "TelegramNotifyWorker", + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_find_files_catalog", + "row_count": 12, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic_file_list" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-01-health.md new file mode 100644 index 0000000..a31fc92 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-01-health.md @@ -0,0 +1,170 @@ +# v2-find-files-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком файле описан `/health`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "RuntimeManager", + "TelegramControlChannel", + "TelegramNotifyWorker", + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "row_count": 12, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic_file_list" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected deterministic, got deterministic_file_list +- llm: expected answer to contain 'docs/api/health-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-02-send.json new file mode 100644 index 0000000..479930f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-02-send.json @@ -0,0 +1,137 @@ +{ + "meta": { + "case_id": "v2-find-files-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected deterministic, got deterministic_file_list", + "llm: expected answer to contain 'docs/api/send-message-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService", + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramControlChannel", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_find_files_catalog", + "row_count": 12, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic_file_list" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-02-send.md new file mode 100644 index 0000000..03887d8 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-02-send.md @@ -0,0 +1,170 @@ +# v2-find-files-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Покажи файл с описанием endpoint `/send` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService", + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramControlChannel", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "row_count": 12, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic_file_list" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected deterministic, got deterministic_file_list +- llm: expected answer to contain 'docs/api/send-message-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-03-actions.json new file mode 100644 index 0000000..57d42de --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-03-actions.json @@ -0,0 +1,139 @@ +{ + "meta": { + "case_id": "v2-find-files-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected deterministic, got deterministic_file_list", + "llm: expected answer to contain 'docs/api/control-actions-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramNotifyModule", + "TelegramControlChannel", + "TelegramNotifyWorker", + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_find_files_catalog", + "row_count": 12, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic_file_list" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-03-actions.md new file mode 100644 index 0000000..91dd829 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-03-actions.md @@ -0,0 +1,172 @@ +# v2-find-files-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Где находится документация по `/actions/{action}`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramNotifyModule", + "TelegramControlChannel", + "TelegramNotifyWorker", + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "row_count": 12, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic_file_list" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected deterministic, got deterministic_file_list +- llm: expected answer to contain 'docs/api/control-actions-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json new file mode 100644 index 0000000..14d17fd --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json @@ -0,0 +1,141 @@ +{ + "meta": { + "case_id": "v2-find-files-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "sub_intent: expected FIND_FILES, got SUMMARY", + "anchor_type: expected FIND_FILES, got DOMAIN_ENTITY", + "answer_mode: expected deterministic, got insufficient_evidence", + "llm: expected answer to contain 'docs/domains/runtime-health-entity.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 8, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramNotifyWorker", + "TelegramNotifyModule", + "TelegramControlChannel", + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_summary_domain_entity", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md new file mode 100644 index 0000000..dbc9ebb --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md @@ -0,0 +1,174 @@ +# v2-find-files-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком документе описан runtime health? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 8, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramNotifyWorker", + "TelegramNotifyModule", + "TelegramControlChannel", + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- sub_intent: expected FIND_FILES, got SUMMARY +- anchor_type: expected FIND_FILES, got DOMAIN_ENTITY +- answer_mode: expected deterministic, got insufficient_evidence +- llm: expected answer to contain 'docs/domains/runtime-health-entity.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-05-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-05-loop.json new file mode 100644 index 0000000..56ac770 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-05-loop.json @@ -0,0 +1,125 @@ +{ + "meta": { + "case_id": "v2-find-files-05-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected deterministic, got deterministic_file_list", + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramSendService", + "RuntimeManager", + "TelegramControlChannel" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_find_files_catalog", + "row_count": 12, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-05-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-05-loop.md new file mode 100644 index 0000000..04c174a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-05-loop.md @@ -0,0 +1,158 @@ +# v2-find-files-05-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Найди файл с логикой цикла отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramSendService", + "RuntimeManager", + "TelegramControlChannel" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "row_count": 12, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected deterministic, got deterministic_file_list +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json new file mode 100644 index 0000000..c075007 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json @@ -0,0 +1,134 @@ +{ + "meta": { + "case_id": "v2-find-files-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected deterministic, got deterministic_file_list" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramSendService", + "TelegramNotifyModule", + "TelegramControlChannel", + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_find_files_catalog", + "row_count": 12, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 1 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic_file_list" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 49 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md new file mode 100644 index 0000000..0f8f3ab --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md @@ -0,0 +1,167 @@ +# v2-find-files-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Где описана архитектура приложения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramSendService", + "TelegramNotifyModule", + "TelegramControlChannel", + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "row_count": 12, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 1 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic_file_list" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 49 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected deterministic, got deterministic_file_list \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json new file mode 100644 index 0000000..dfcb041 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json @@ -0,0 +1,125 @@ +{ + "meta": { + "case_id": "v2-find-files-07-errors-catalog", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected deterministic, got deterministic_file_list", + "llm: expected answer to contain 'docs/errors/catalog.yaml'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramControlChannel", + "TelegramNotifyModule", + "TelegramSendService", + "TelegramNotifyWorker" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_find_files_catalog", + "row_count": 12, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md new file mode 100644 index 0000000..7afdd0b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md @@ -0,0 +1,158 @@ +# v2-find-files-07-errors-catalog + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком файле лежит каталог ошибок? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramControlChannel", + "TelegramNotifyModule", + "TelegramSendService", + "TelegramNotifyWorker" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "row_count": 12, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected deterministic, got deterministic_file_list +- llm: expected answer to contain 'docs/errors/catalog.yaml' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json new file mode 100644 index 0000000..7e8aae0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json @@ -0,0 +1,124 @@ +{ + "meta": { + "case_id": "v2-find-files-08-docs-index", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected deterministic, got deterministic_file_list" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramControlChannel", + "RuntimeManager", + "TelegramSendService" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_find_files_catalog", + "row_count": 12, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md new file mode 100644 index 0000000..42f891a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md @@ -0,0 +1,157 @@ +# v2-find-files-08-docs-index + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Покажи файл-индекс документации проекта + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramControlChannel", + "RuntimeManager", + "TelegramSendService" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "row_count": 12, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected deterministic, got deterministic_file_list \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json new file mode 100644 index 0000000..3954aae --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json @@ -0,0 +1,126 @@ +{ + "meta": { + "case_id": "v2-find-files-09-telegram-bot-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected deterministic, got deterministic_file_list", + "llm: expected answer to contain 'docs/api/send-message-endpoint.md'", + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramSendService", + "TelegramControlChannel", + "TelegramNotifyWorker", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_find_files_catalog", + "row_count": 12, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md new file mode 100644 index 0000000..01125b6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md @@ -0,0 +1,159 @@ +# v2-find-files-09-telegram-bot-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие файлы относятся к Telegram Bot API интеграции? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramSendService", + "TelegramControlChannel", + "TelegramNotifyWorker", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "row_count": 12, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected deterministic, got deterministic_file_list +- llm: expected answer to contain 'docs/api/send-message-endpoint.md' +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json new file mode 100644 index 0000000..fe24022 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json @@ -0,0 +1,126 @@ +{ + "meta": { + "case_id": "v2-find-files-10-telegram-notify-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected deterministic, got deterministic_file_list", + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'", + "llm: expected answer to contain 'docs/domains/runtime-health-entity.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker", + "TelegramNotifyModule", + "TelegramSendService", + "TelegramControlChannel", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_find_files_catalog", + "row_count": 12, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md new file mode 100644 index 0000000..7a65427 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md @@ -0,0 +1,159 @@ +# v2-find-files-10-telegram-notify-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каких файлах описан worker `telegram_notify`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker", + "TelegramNotifyModule", + "TelegramSendService", + "TelegramControlChannel", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "row_count": 12, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected deterministic, got deterministic_file_list +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- llm: expected answer to contain 'docs/domains/runtime-health-entity.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json new file mode 100644 index 0000000..c39257c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json @@ -0,0 +1,122 @@ +{ + "meta": { + "case_id": "v2-general-01-what-is-service", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md new file mode 100644 index 0000000..ae8cdd9 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md @@ -0,0 +1,157 @@ +# v2-general-01-what-is-service + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что это за сервис? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-02-purpose.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-02-purpose.json new file mode 100644 index 0000000..64cabe6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-02-purpose.json @@ -0,0 +1,122 @@ +{ + "meta": { + "case_id": "v2-general-02-purpose", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-02-purpose.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-02-purpose.md new file mode 100644 index 0000000..2825dc5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-02-purpose.md @@ -0,0 +1,157 @@ +# v2-general-02-purpose + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Для чего нужен test_echo_app? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-03-problem.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-03-problem.json new file mode 100644 index 0000000..89fa183 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-03-problem.json @@ -0,0 +1,122 @@ +{ + "meta": { + "case_id": "v2-general-03-problem", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-03-problem.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-03-problem.md new file mode 100644 index 0000000..4fa7105 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-03-problem.md @@ -0,0 +1,157 @@ +# v2-general-03-problem + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Какую задачу решает это приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json new file mode 100644 index 0000000..66f480a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json @@ -0,0 +1,122 @@ +{ + "meta": { + "case_id": "v2-general-04-docs-contents", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md new file mode 100644 index 0000000..6e8808c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md @@ -0,0 +1,157 @@ +# v2-general-04-docs-contents + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что входит в документацию этого проекта? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-05-main-parts.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-05-main-parts.json new file mode 100644 index 0000000..5536124 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-05-main-parts.json @@ -0,0 +1,124 @@ +{ + "meta": { + "case_id": "v2-general-05-main-parts", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'систем'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-05-main-parts.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-05-main-parts.md new file mode 100644 index 0000000..d784f18 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-05-main-parts.md @@ -0,0 +1,157 @@ +# v2-general-05-main-parts + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие основные части есть у системы? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'систем' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json new file mode 100644 index 0000000..6542c3b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json @@ -0,0 +1,124 @@ +{ + "meta": { + "case_id": "v2-general-06-high-level-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'приложен'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md new file mode 100644 index 0000000..dbe6f5b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md @@ -0,0 +1,157 @@ +# v2-general-06-high-level-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как в целом устроено приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'приложен' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-07-besides-api.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-07-besides-api.json new file mode 100644 index 0000000..585af0c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-07-besides-api.json @@ -0,0 +1,122 @@ +{ + "meta": { + "case_id": "v2-general-07-besides-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-07-besides-api.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-07-besides-api.md new file mode 100644 index 0000000..0288a32 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-07-besides-api.md @@ -0,0 +1,157 @@ +# v2-general-07-besides-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что тут есть кроме API? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-08-components.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-08-components.json new file mode 100644 index 0000000..6120517 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-08-components.json @@ -0,0 +1,129 @@ +{ + "meta": { + "case_id": "v2-general-08-components", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected GENERAL, got DOCS", + "intent: expected GENERAL_QA, got DOC_EXPLAIN", + "anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE", + "llm: expected answer to contain 'Telegram Notify App'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramSendService", + "TelegramControlChannel", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "docs_summary_architecture", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-08-components.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-08-components.md new file mode 100644 index 0000000..1d26982 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-08-components.md @@ -0,0 +1,162 @@ +# v2-general-08-components + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Из чего состоит Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramSendService", + "TelegramControlChannel", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_architecture", + "row_count": 8, + "top_files": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected GENERAL, got DOCS +- intent: expected GENERAL_QA, got DOC_EXPLAIN +- anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE +- llm: expected answer to contain 'Telegram Notify App' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-09-reading-order.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-09-reading-order.json new file mode 100644 index 0000000..de9d221 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-09-reading-order.json @@ -0,0 +1,124 @@ +{ + "meta": { + "case_id": "v2-general-09-reading-order", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'README'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/README.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-09-reading-order.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-09-reading-order.md new file mode 100644 index 0000000..4cdbe42 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-09-reading-order.md @@ -0,0 +1,157 @@ +# v2-general-09-reading-order + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие документы стоит читать сначала? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/README.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'README' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-10-short-summary.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-10-short-summary.json new file mode 100644 index 0000000..20b7626 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-10-short-summary.json @@ -0,0 +1,122 @@ +{ + "meta": { + "case_id": "v2-general-10-short-summary", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-10-short-summary.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-10-short-summary.md new file mode 100644 index 0000000..6f07a1a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/full_chain_docs_v2_matrix_v2-general-10-short-summary.md @@ -0,0 +1,157 @@ +# v2-general-10-short-summary + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Дай короткое summary по проектной документации + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "row_count": 8, + "top_files": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/summary.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/summary.md new file mode 100644 index 0000000..a47c9df --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_201415/summary.md @@ -0,0 +1,153 @@ +# pipeline_setup_v3 summary + +Passed: 7/30 + +| File | Case | Mode | Query | Actual sub-intent | RAG layers | Tokens | Pass | +|------|------|------|-------|-------------------|------------|--------|------| +| full_chain_docs_v2_matrix.yaml | v2-general-01-what-is-service | full_chain | Что это за сервис? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-02-purpose | full_chain | Для чего нужен test_echo_app? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-03-problem | full_chain | Какую задачу решает это приложение? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-04-docs-contents | full_chain | Что входит в документацию этого проекта? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-05-main-parts | full_chain | Какие основные части есть у системы? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-06-high-level-architecture | full_chain | Как в целом устроено приложение? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-07-besides-api | full_chain | Что тут есть кроме API? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-08-components | full_chain | Из чего состоит Telegram Notify App? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-09-reading-order | full_chain | Какие документы стоит читать сначала? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-10-short-summary | full_chain | Дай короткое summary по проектной документации | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-01-health | full_chain | Кратко объясни по документации, как работает `/health` | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-02-send | full_chain | Что делает endpoint `/send`? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-03-actions | full_chain | Объясни назначение `/actions/{action}` | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-04-runtime-health | full_chain | Что такое runtime health в этой документации? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-05-notification-loop | full_chain | Кратко опиши цикл отправки уведомлений | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-06-architecture | full_chain | Как устроена архитектура Telegram Notify App? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-07-worker | full_chain | Что делает worker в этом приложении? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-08-health-statuses | full_chain | Какие статусы здоровья есть у runtime? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-09-manual-send | full_chain | Как в приложении устроена ручная отправка сообщения? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-10-telegram-integration | full_chain | Как сервис взаимодействует с Telegram в целом? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-01-health | full_chain | В каком файле описан `/health`? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-02-send | full_chain | Покажи файл с описанием endpoint `/send` | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-03-actions | full_chain | Где находится документация по `/actions/{action}`? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-04-runtime-health | full_chain | В каком документе описан runtime health? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-05-loop | full_chain | Найди файл с логикой цикла отправки уведомлений | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-06-architecture | full_chain | Где описана архитектура приложения? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-07-errors-catalog | full_chain | В каком файле лежит каталог ошибок? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-08-docs-index | full_chain | Покажи файл-индекс документации проекта | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-09-telegram-bot-api | full_chain | Какие файлы относятся к Telegram Bot API интеграции? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-10-telegram-notify-worker | full_chain | В каких файлах описан worker `telegram_notify`? | FIND_FILES | — | — | ✗ | + +## Failures +- **v2-general-05-main-parts**: llm: expected answer to contain 'систем' +- **v2-general-06-high-level-architecture**: llm: expected answer to contain 'приложен' +- **v2-general-08-components**: domain: expected GENERAL, got DOCS; intent: expected GENERAL_QA, got DOC_EXPLAIN; anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE; llm: expected answer to contain 'Telegram Notify App' +- **v2-general-09-reading-order**: llm: expected answer to contain 'README' +- **v2-docs-summary-01-health**: answer_mode: expected grounded_summary, got insufficient_evidence; llm: expected answer to contain '/health'; llm: expected answer to contain 'status'; llm: expected answer to contain 'components' +- **v2-docs-summary-02-send**: doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/send'; llm: expected answer to contain 'message' +- **v2-docs-summary-03-actions**: doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/actions/{action}' +- **v2-docs-summary-04-runtime-health**: doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; llm: expected answer to contain 'runtime health' +- **v2-docs-summary-05-notification-loop**: doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain 'worker'; llm: expected answer to contain 'interval'; llm: expected answer to contain 'degraded' +- **v2-docs-summary-07-worker**: doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain 'worker' +- **v2-docs-summary-08-health-statuses**: doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; llm: expected answer to contain 'ok'; llm: expected answer to contain 'degraded'; llm: expected answer to contain 'unhealthy'; llm: expected answer to contain 'unknown' +- **v2-docs-summary-09-manual-send**: doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/send'; llm: expected answer to contain 'message'; llm: expected answer to contain 'TelegramSendService' +- **v2-docs-summary-10-telegram-integration**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA; anchor_type: expected API_ENDPOINT, got None; doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- **v2-find-files-01-health**: answer_mode: expected deterministic, got deterministic_file_list; llm: expected answer to contain 'docs/api/health-endpoint.md' +- **v2-find-files-02-send**: answer_mode: expected deterministic, got deterministic_file_list; llm: expected answer to contain 'docs/api/send-message-endpoint.md' +- **v2-find-files-03-actions**: answer_mode: expected deterministic, got deterministic_file_list; llm: expected answer to contain 'docs/api/control-actions-endpoint.md' +- **v2-find-files-04-runtime-health**: sub_intent: expected FIND_FILES, got SUMMARY; anchor_type: expected FIND_FILES, got DOMAIN_ENTITY; answer_mode: expected deterministic, got insufficient_evidence; llm: expected answer to contain 'docs/domains/runtime-health-entity.md' +- **v2-find-files-05-loop**: answer_mode: expected deterministic, got deterministic_file_list; llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- **v2-find-files-06-architecture**: answer_mode: expected deterministic, got deterministic_file_list +- **v2-find-files-07-errors-catalog**: answer_mode: expected deterministic, got deterministic_file_list; llm: expected answer to contain 'docs/errors/catalog.yaml' +- **v2-find-files-08-docs-index**: answer_mode: expected deterministic, got deterministic_file_list +- **v2-find-files-09-telegram-bot-api**: answer_mode: expected deterministic, got deterministic_file_list; llm: expected answer to contain 'docs/api/send-message-endpoint.md'; llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- **v2-find-files-10-telegram-notify-worker**: answer_mode: expected deterministic, got deterministic_file_list; llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'; llm: expected answer to contain 'docs/domains/runtime-health-entity.md' + +## LLM Answers +- **v2-general-01-what-is-service** + Query: Что это за сервис? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-02-purpose** + Query: Для чего нужен test_echo_app? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-03-problem** + Query: Какую задачу решает это приложение? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-04-docs-contents** + Query: Что входит в документацию этого проекта? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-05-main-parts** + Query: Какие основные части есть у системы? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-06-high-level-architecture** + Query: Как в целом устроено приложение? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-07-besides-api** + Query: Что тут есть кроме API? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-08-components** + Query: Из чего состоит Telegram Notify App? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). Файлы\-источники: \- docs/architecture/telegram\-notify\-app\-overview.md \- docs/README.md +- **v2-general-09-reading-order** + Query: Какие документы стоит читать сначала? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-10-short-summary** + Query: Дай короткое summary по проектной документации + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-docs-summary-01-health** + Query: Кратко объясни по документации, как работает `/health` + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-02-send** + Query: Что делает endpoint `/send`? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-03-actions** + Query: Объясни назначение `/actions/{action}` + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-04-runtime-health** + Query: Что такое runtime health в этой документации? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-05-notification-loop** + Query: Кратко опиши цикл отправки уведомлений + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md, docs/README.md. +- **v2-docs-summary-06-architecture** + Query: Как устроена архитектура Telegram Notify App? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). Файлы\-источники: \- docs/architecture/telegram\-notify\-app\-overview.md \- docs/README.md +- **v2-docs-summary-07-worker** + Query: Что делает worker в этом приложении? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-08-health-statuses** + Query: Какие статусы здоровья есть у runtime? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-09-manual-send** + Query: Как в приложении устроена ручная отправка сообщения? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-10-telegram-integration** + Query: Как сервис взаимодействует с Telegram в целом? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-find-files-01-health** + Query: В каком файле описан `/health`? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-02-send** + Query: Покажи файл с описанием endpoint `/send` + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-03-actions** + Query: Где находится документация по `/actions/{action}`? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-04-runtime-health** + Query: В каком документе описан runtime health? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-find-files-05-loop** + Query: Найди файл с логикой цикла отправки уведомлений + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-06-architecture** + Query: Где описана архитектура приложения? + > docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-07-errors-catalog** + Query: В каком файле лежит каталог ошибок? + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-08-docs-index** + Query: Покажи файл-индекс документации проекта + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-09-telegram-bot-api** + Query: Какие файлы относятся к Telegram Bot API интеграции? + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-10-telegram-notify-worker** + Query: В каких файлах описан worker `telegram_notify`? + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json new file mode 100644 index 0000000..275d186 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json @@ -0,0 +1,189 @@ +{ + "meta": { + "case_id": "v2-docs-summary-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected grounded_summary, got insufficient_evidence", + "llm: expected answer to contain '/health'", + "llm: expected answer to contain 'status'", + "llm: expected answer to contain 'components'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Кратко объясни по документации, как работает `/health`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 96 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md new file mode 100644 index 0000000..210e5d1 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md @@ -0,0 +1,226 @@ +# v2-docs-summary-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Кратко объясни по документации, как работает `/health` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Кратко объясни по документации, как работает `/health`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 96 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected grounded_summary, got insufficient_evidence +- llm: expected answer to contain '/health' +- llm: expected answer to contain 'status' +- llm: expected answer to contain 'components' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json new file mode 100644 index 0000000..973244c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json @@ -0,0 +1,172 @@ +{ + "meta": { + "case_id": "v2-docs-summary-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/send'", + "llm: expected answer to contain 'message'", + "llm: expected answer to contain 'Telegram'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что делает endpoint `/send`?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md new file mode 100644 index 0000000..44c8469 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md @@ -0,0 +1,205 @@ +# v2-docs-summary-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что делает endpoint `/send`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что делает endpoint `/send`?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/send' +- llm: expected answer to contain 'message' +- llm: expected answer to contain 'Telegram' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json new file mode 100644 index 0000000..20081c5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json @@ -0,0 +1,189 @@ +{ + "meta": { + "case_id": "v2-docs-summary-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/actions/{action}'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Объясни назначение `/actions/{action}`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md new file mode 100644 index 0000000..72853a7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md @@ -0,0 +1,226 @@ +# v2-docs-summary-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Объясни назначение `/actions/{action}` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Объясни назначение `/actions/{action}`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/actions/{action}' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json new file mode 100644 index 0000000..3d93acc --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json @@ -0,0 +1,175 @@ +{ + "meta": { + "case_id": "v2-docs-summary-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "llm: expected answer to contain 'runtime health'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что такое runtime health в этой документации?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md new file mode 100644 index 0000000..5b5e82d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md @@ -0,0 +1,212 @@ +# v2-docs-summary-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что такое runtime health в этой документации? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что такое runtime health в этой документации?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- llm: expected answer to contain 'runtime health' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json new file mode 100644 index 0000000..c35f318 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json @@ -0,0 +1,196 @@ +{ + "meta": { + "case_id": "v2-docs-summary-05-notification-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain 'worker'", + "llm: expected answer to contain 'interval'", + "llm: expected answer to contain 'degraded'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md, docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Кратко опиши цикл отправки уведомлений", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 147 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md new file mode 100644 index 0000000..82952e7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md @@ -0,0 +1,237 @@ +# v2-docs-summary-05-notification-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Кратко опиши цикл отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md, docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Кратко опиши цикл отправки уведомлений", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 147 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain 'worker' +- llm: expected answer to contain 'interval' +- llm: expected answer to contain 'degraded' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json new file mode 100644 index 0000000..d72cbe2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json @@ -0,0 +1,195 @@ +{ + "meta": { + "case_id": "v2-docs-summary-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 16, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как устроена архитектура Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 16, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 600, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md new file mode 100644 index 0000000..070f32c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md @@ -0,0 +1,238 @@ +# v2-docs-summary-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Как устроена архитектура Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 16, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как устроена архитектура Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 16, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 600, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json new file mode 100644 index 0000000..148d944 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json @@ -0,0 +1,175 @@ +{ + "meta": { + "case_id": "v2-docs-summary-07-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain 'worker'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что делает worker в этом приложении?", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md new file mode 100644 index 0000000..1b985e8 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md @@ -0,0 +1,212 @@ +# v2-docs-summary-07-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что делает worker в этом приложении? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что делает worker в этом приложении?", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain 'worker' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json new file mode 100644 index 0000000..d007838 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json @@ -0,0 +1,179 @@ +{ + "meta": { + "case_id": "v2-docs-summary-08-health-statuses", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "llm: expected answer to contain 'ok'", + "llm: expected answer to contain 'degraded'", + "llm: expected answer to contain 'unhealthy'", + "llm: expected answer to contain 'unknown'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие статусы здоровья есть у runtime?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md new file mode 100644 index 0000000..3ff017e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md @@ -0,0 +1,216 @@ +# v2-docs-summary-08-health-statuses + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие статусы здоровья есть у runtime? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие статусы здоровья есть у runtime?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- llm: expected answer to contain 'ok' +- llm: expected answer to contain 'degraded' +- llm: expected answer to contain 'unhealthy' +- llm: expected answer to contain 'unknown' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json new file mode 100644 index 0000000..b4f3f03 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json @@ -0,0 +1,187 @@ +{ + "meta": { + "case_id": "v2-docs-summary-09-manual-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/send'", + "llm: expected answer to contain 'message'", + "llm: expected answer to contain 'TelegramSendService'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как в приложении устроена ручная отправка сообщения?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md new file mode 100644 index 0000000..7e707c3 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md @@ -0,0 +1,224 @@ +# v2-docs-summary-09-manual-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как в приложении устроена ручная отправка сообщения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как в приложении устроена ручная отправка сообщения?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/send' +- llm: expected answer to contain 'message' +- llm: expected answer to contain 'TelegramSendService' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json new file mode 100644 index 0000000..9a43a17 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json @@ -0,0 +1,188 @@ +{ + "meta": { + "case_id": "v2-docs-summary-10-telegram-integration", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA", + "anchor_type: expected API_ENDPOINT, got None", + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": null, + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": null, + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как сервис взаимодействует с Telegram в целом?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md new file mode 100644 index 0000000..01f40f6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md @@ -0,0 +1,229 @@ +# v2-docs-summary-10-telegram-integration + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как сервис взаимодействует с Telegram в целом? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": null, + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": null, + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как сервис взаимодействует с Telegram в целом?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA +- anchor_type: expected API_ENDPOINT, got None +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-01-health.json new file mode 100644 index 0000000..bcee94d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-01-health.json @@ -0,0 +1,196 @@ +{ + "meta": { + "case_id": "v2-find-files-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected deterministic, got deterministic_file_list", + "llm: expected answer to contain 'docs/api/health-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 8, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком файле описан `/health`?", + "profile": "docs_find_files_catalog", + "row_count": 8, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-01-health.md new file mode 100644 index 0000000..6ae4e4d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-01-health.md @@ -0,0 +1,237 @@ +# v2-find-files-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком файле описан `/health`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 8, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком файле описан `/health`?", + "profile": "docs_find_files_catalog", + "row_count": 8, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected deterministic, got deterministic_file_list +- llm: expected answer to contain 'docs/api/health-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-02-send.json new file mode 100644 index 0000000..dfb8fe5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-02-send.json @@ -0,0 +1,196 @@ +{ + "meta": { + "case_id": "v2-find-files-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected deterministic, got deterministic_file_list", + "llm: expected answer to contain 'docs/api/send-message-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 8, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Покажи файл с описанием endpoint `/send`", + "profile": "docs_find_files_catalog", + "row_count": 8, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-02-send.md new file mode 100644 index 0000000..e09680e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-02-send.md @@ -0,0 +1,237 @@ +# v2-find-files-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Покажи файл с описанием endpoint `/send` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 8, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Покажи файл с описанием endpoint `/send`", + "profile": "docs_find_files_catalog", + "row_count": 8, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected deterministic, got deterministic_file_list +- llm: expected answer to contain 'docs/api/send-message-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-03-actions.json new file mode 100644 index 0000000..906d1f7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-03-actions.json @@ -0,0 +1,198 @@ +{ + "meta": { + "case_id": "v2-find-files-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected deterministic, got deterministic_file_list", + "llm: expected answer to contain 'docs/api/control-actions-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 8, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Где находится документация по `/actions/{action}`?", + "profile": "docs_find_files_catalog", + "row_count": 8, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-03-actions.md new file mode 100644 index 0000000..7793bbf --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-03-actions.md @@ -0,0 +1,239 @@ +# v2-find-files-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Где находится документация по `/actions/{action}`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 8, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Где находится документация по `/actions/{action}`?", + "profile": "docs_find_files_catalog", + "row_count": 8, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected deterministic, got deterministic_file_list +- llm: expected answer to contain 'docs/api/control-actions-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json new file mode 100644 index 0000000..7e5e8fd --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json @@ -0,0 +1,177 @@ +{ + "meta": { + "case_id": "v2-find-files-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "sub_intent: expected FIND_FILES, got SUMMARY", + "anchor_type: expected FIND_FILES, got DOMAIN_ENTITY", + "answer_mode: expected deterministic, got insufficient_evidence", + "llm: expected answer to contain 'docs/domains/runtime-health-entity.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком документе описан runtime health?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md new file mode 100644 index 0000000..2e9fef0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md @@ -0,0 +1,214 @@ +# v2-find-files-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком документе описан runtime health? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком документе описан runtime health?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- sub_intent: expected FIND_FILES, got SUMMARY +- anchor_type: expected FIND_FILES, got DOMAIN_ENTITY +- answer_mode: expected deterministic, got insufficient_evidence +- llm: expected answer to contain 'docs/domains/runtime-health-entity.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-05-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-05-loop.json new file mode 100644 index 0000000..f844491 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-05-loop.json @@ -0,0 +1,194 @@ +{ + "meta": { + "case_id": "v2-find-files-05-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected deterministic, got deterministic_file_list", + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 8, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Найди файл с логикой цикла отправки уведомлений", + "profile": "docs_find_files_catalog", + "row_count": 8, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-05-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-05-loop.md new file mode 100644 index 0000000..8ec030c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-05-loop.md @@ -0,0 +1,235 @@ +# v2-find-files-05-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Найди файл с логикой цикла отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 8, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Найди файл с логикой цикла отправки уведомлений", + "profile": "docs_find_files_catalog", + "row_count": 8, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected deterministic, got deterministic_file_list +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json new file mode 100644 index 0000000..277b986 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json @@ -0,0 +1,176 @@ +{ + "meta": { + "case_id": "v2-find-files-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected deterministic, got deterministic_file_list" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 15, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Где описана архитектура приложения?", + "profile": "docs_find_files_catalog", + "row_count": 15, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic_file_list" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 49 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md new file mode 100644 index 0000000..a251b50 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md @@ -0,0 +1,213 @@ +# v2-find-files-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Где описана архитектура приложения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 15, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Где описана архитектура приложения?", + "profile": "docs_find_files_catalog", + "row_count": 15, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic_file_list" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 49 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected deterministic, got deterministic_file_list \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json new file mode 100644 index 0000000..7573b67 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json @@ -0,0 +1,186 @@ +{ + "meta": { + "case_id": "v2-find-files-07-errors-catalog", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected deterministic, got deterministic_file_list", + "llm: expected answer to contain 'docs/errors/catalog.yaml'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramControlChannel", + "TelegramNotifyModule", + "TelegramSendService", + "TelegramNotifyWorker" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком файле лежит каталог ошибок?", + "profile": "docs_find_files_catalog", + "row_count": 12, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md new file mode 100644 index 0000000..d686b1a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md @@ -0,0 +1,227 @@ +# v2-find-files-07-errors-catalog + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком файле лежит каталог ошибок? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager", + "TelegramControlChannel", + "TelegramNotifyModule", + "TelegramSendService", + "TelegramNotifyWorker" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком файле лежит каталог ошибок?", + "profile": "docs_find_files_catalog", + "row_count": 12, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected deterministic, got deterministic_file_list +- llm: expected answer to contain 'docs/errors/catalog.yaml' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json new file mode 100644 index 0000000..e8caa7d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json @@ -0,0 +1,185 @@ +{ + "meta": { + "case_id": "v2-find-files-08-docs-index", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected deterministic, got deterministic_file_list" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramControlChannel", + "RuntimeManager", + "TelegramSendService" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Покажи файл-индекс документации проекта", + "profile": "docs_find_files_catalog", + "row_count": 12, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md new file mode 100644 index 0000000..1575d61 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md @@ -0,0 +1,226 @@ +# v2-find-files-08-docs-index + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Покажи файл-индекс документации проекта + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramNotifyWorker", + "TelegramControlChannel", + "RuntimeManager", + "TelegramSendService" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Покажи файл-индекс документации проекта", + "profile": "docs_find_files_catalog", + "row_count": 12, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected deterministic, got deterministic_file_list \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json new file mode 100644 index 0000000..b91d7b4 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json @@ -0,0 +1,187 @@ +{ + "meta": { + "case_id": "v2-find-files-09-telegram-bot-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected deterministic, got deterministic_file_list", + "llm: expected answer to contain 'docs/api/send-message-endpoint.md'", + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramSendService", + "TelegramControlChannel", + "TelegramNotifyWorker", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "profile": "docs_find_files_catalog", + "row_count": 12, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md new file mode 100644 index 0000000..c7696c6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md @@ -0,0 +1,228 @@ +# v2-find-files-09-telegram-bot-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие файлы относятся к Telegram Bot API интеграции? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule", + "TelegramSendService", + "TelegramControlChannel", + "TelegramNotifyWorker", + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "profile": "docs_find_files_catalog", + "row_count": 12, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic_file_list" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected deterministic, got deterministic_file_list +- llm: expected answer to contain 'docs/api/send-message-endpoint.md' +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json new file mode 100644 index 0000000..1c96539 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json @@ -0,0 +1,195 @@ +{ + "meta": { + "case_id": "v2-find-files-10-telegram-notify-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected deterministic, got deterministic_file_list", + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'", + "llm: expected answer to contain 'docs/domains/runtime-health-entity.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 8, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каких файлах описан worker `telegram_notify`?", + "profile": "docs_find_files_catalog", + "row_count": 8, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic_file_list" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md new file mode 100644 index 0000000..6ec5ba4 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md @@ -0,0 +1,236 @@ +# v2-find-files-10-telegram-notify-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каких файлах описан worker `telegram_notify`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 8, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic_file_list", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_find_files_catalog", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каких файлах описан worker `telegram_notify`?", + "profile": "docs_find_files_catalog", + "row_count": 8, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic_file_list" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic_file_list", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected deterministic, got deterministic_file_list +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- llm: expected answer to contain 'docs/domains/runtime-health-entity.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json new file mode 100644 index 0000000..c0f2d12 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json @@ -0,0 +1,183 @@ +{ + "meta": { + "case_id": "v2-general-01-what-is-service", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что это за сервис?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md new file mode 100644 index 0000000..2557e94 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md @@ -0,0 +1,226 @@ +# v2-general-01-what-is-service + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что это за сервис? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что это за сервис?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-02-purpose.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-02-purpose.json new file mode 100644 index 0000000..0c35f52 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-02-purpose.json @@ -0,0 +1,183 @@ +{ + "meta": { + "case_id": "v2-general-02-purpose", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Для чего нужен test_echo_app?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-02-purpose.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-02-purpose.md new file mode 100644 index 0000000..5b2db3b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-02-purpose.md @@ -0,0 +1,226 @@ +# v2-general-02-purpose + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Для чего нужен test_echo_app? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Для чего нужен test_echo_app?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-03-problem.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-03-problem.json new file mode 100644 index 0000000..8165769 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-03-problem.json @@ -0,0 +1,183 @@ +{ + "meta": { + "case_id": "v2-general-03-problem", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какую задачу решает это приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-03-problem.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-03-problem.md new file mode 100644 index 0000000..c2c0dae --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-03-problem.md @@ -0,0 +1,226 @@ +# v2-general-03-problem + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Какую задачу решает это приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какую задачу решает это приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json new file mode 100644 index 0000000..0a85bfa --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json @@ -0,0 +1,183 @@ +{ + "meta": { + "case_id": "v2-general-04-docs-contents", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что входит в документацию этого проекта?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md new file mode 100644 index 0000000..a90db6c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md @@ -0,0 +1,226 @@ +# v2-general-04-docs-contents + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что входит в документацию этого проекта? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что входит в документацию этого проекта?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-05-main-parts.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-05-main-parts.json new file mode 100644 index 0000000..d70594f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-05-main-parts.json @@ -0,0 +1,185 @@ +{ + "meta": { + "case_id": "v2-general-05-main-parts", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'систем'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие основные части есть у системы?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-05-main-parts.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-05-main-parts.md new file mode 100644 index 0000000..4be3f10 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-05-main-parts.md @@ -0,0 +1,226 @@ +# v2-general-05-main-parts + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие основные части есть у системы? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие основные части есть у системы?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'систем' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json new file mode 100644 index 0000000..e08008d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json @@ -0,0 +1,185 @@ +{ + "meta": { + "case_id": "v2-general-06-high-level-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'приложен'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как в целом устроено приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md new file mode 100644 index 0000000..a94d31c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md @@ -0,0 +1,226 @@ +# v2-general-06-high-level-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как в целом устроено приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как в целом устроено приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'приложен' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-07-besides-api.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-07-besides-api.json new file mode 100644 index 0000000..5d1196a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-07-besides-api.json @@ -0,0 +1,183 @@ +{ + "meta": { + "case_id": "v2-general-07-besides-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что тут есть кроме API?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-07-besides-api.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-07-besides-api.md new file mode 100644 index 0000000..fd459c4 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-07-besides-api.md @@ -0,0 +1,226 @@ +# v2-general-07-besides-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что тут есть кроме API? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что тут есть кроме API?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-08-components.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-08-components.json new file mode 100644 index 0000000..dbbe189 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-08-components.json @@ -0,0 +1,198 @@ +{ + "meta": { + "case_id": "v2-general-08-components", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected GENERAL, got DOCS", + "intent: expected GENERAL_QA, got DOC_EXPLAIN", + "anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE", + "llm: expected answer to contain 'Telegram Notify App'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 16, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Из чего состоит Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 16, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 60, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-08-components.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-08-components.md new file mode 100644 index 0000000..4b3e4fe --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-08-components.md @@ -0,0 +1,239 @@ +# v2-general-08-components + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Из чего состоит Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 16, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Из чего состоит Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 16, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 60, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected GENERAL, got DOCS +- intent: expected GENERAL_QA, got DOC_EXPLAIN +- anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE +- llm: expected answer to contain 'Telegram Notify App' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-09-reading-order.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-09-reading-order.json new file mode 100644 index 0000000..fd086ce --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-09-reading-order.json @@ -0,0 +1,185 @@ +{ + "meta": { + "case_id": "v2-general-09-reading-order", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'README'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие документы стоит читать сначала?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-09-reading-order.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-09-reading-order.md new file mode 100644 index 0000000..7f9590a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-09-reading-order.md @@ -0,0 +1,226 @@ +# v2-general-09-reading-order + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие документы стоит читать сначала? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие документы стоит читать сначала?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'README' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-10-short-summary.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-10-short-summary.json new file mode 100644 index 0000000..0a0505c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-10-short-summary.json @@ -0,0 +1,183 @@ +{ + "meta": { + "case_id": "v2-general-10-short-summary", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Дай короткое summary по проектной документации", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-10-short-summary.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-10-short-summary.md new file mode 100644 index 0000000..a80bdf3 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/full_chain_docs_v2_matrix_v2-general-10-short-summary.md @@ -0,0 +1,226 @@ +# v2-general-10-short-summary + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Дай короткое summary по проектной документации + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Дай короткое summary по проектной документации", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/summary.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/summary.md new file mode 100644 index 0000000..0265d4c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_202730/summary.md @@ -0,0 +1,153 @@ +# pipeline_setup_v3 summary + +Passed: 7/30 + +| File | Case | Mode | Query | Actual sub-intent | RAG layers | Tokens | Pass | +|------|------|------|-------|-------------------|------------|--------|------| +| full_chain_docs_v2_matrix.yaml | v2-general-01-what-is-service | full_chain | Что это за сервис? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-02-purpose | full_chain | Для чего нужен test_echo_app? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-03-problem | full_chain | Какую задачу решает это приложение? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-04-docs-contents | full_chain | Что входит в документацию этого проекта? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-05-main-parts | full_chain | Какие основные части есть у системы? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-06-high-level-architecture | full_chain | Как в целом устроено приложение? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-07-besides-api | full_chain | Что тут есть кроме API? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-08-components | full_chain | Из чего состоит Telegram Notify App? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-09-reading-order | full_chain | Какие документы стоит читать сначала? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-10-short-summary | full_chain | Дай короткое summary по проектной документации | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-01-health | full_chain | Кратко объясни по документации, как работает `/health` | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-02-send | full_chain | Что делает endpoint `/send`? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-03-actions | full_chain | Объясни назначение `/actions/{action}` | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-04-runtime-health | full_chain | Что такое runtime health в этой документации? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-05-notification-loop | full_chain | Кратко опиши цикл отправки уведомлений | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-06-architecture | full_chain | Как устроена архитектура Telegram Notify App? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-07-worker | full_chain | Что делает worker в этом приложении? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-08-health-statuses | full_chain | Какие статусы здоровья есть у runtime? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-09-manual-send | full_chain | Как в приложении устроена ручная отправка сообщения? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-10-telegram-integration | full_chain | Как сервис взаимодействует с Telegram в целом? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-01-health | full_chain | В каком файле описан `/health`? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-02-send | full_chain | Покажи файл с описанием endpoint `/send` | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-03-actions | full_chain | Где находится документация по `/actions/{action}`? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-04-runtime-health | full_chain | В каком документе описан runtime health? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-05-loop | full_chain | Найди файл с логикой цикла отправки уведомлений | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-06-architecture | full_chain | Где описана архитектура приложения? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-07-errors-catalog | full_chain | В каком файле лежит каталог ошибок? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-08-docs-index | full_chain | Покажи файл-индекс документации проекта | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-09-telegram-bot-api | full_chain | Какие файлы относятся к Telegram Bot API интеграции? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-10-telegram-notify-worker | full_chain | В каких файлах описан worker `telegram_notify`? | FIND_FILES | — | — | ✗ | + +## Failures +- **v2-general-05-main-parts**: llm: expected answer to contain 'систем' +- **v2-general-06-high-level-architecture**: llm: expected answer to contain 'приложен' +- **v2-general-08-components**: domain: expected GENERAL, got DOCS; intent: expected GENERAL_QA, got DOC_EXPLAIN; anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE; llm: expected answer to contain 'Telegram Notify App' +- **v2-general-09-reading-order**: llm: expected answer to contain 'README' +- **v2-docs-summary-01-health**: answer_mode: expected grounded_summary, got insufficient_evidence; llm: expected answer to contain '/health'; llm: expected answer to contain 'status'; llm: expected answer to contain 'components' +- **v2-docs-summary-02-send**: doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/send'; llm: expected answer to contain 'message'; llm: expected answer to contain 'Telegram' +- **v2-docs-summary-03-actions**: doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/actions/{action}' +- **v2-docs-summary-04-runtime-health**: doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; llm: expected answer to contain 'runtime health' +- **v2-docs-summary-05-notification-loop**: doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain 'worker'; llm: expected answer to contain 'interval'; llm: expected answer to contain 'degraded' +- **v2-docs-summary-07-worker**: doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain 'worker' +- **v2-docs-summary-08-health-statuses**: doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; llm: expected answer to contain 'ok'; llm: expected answer to contain 'degraded'; llm: expected answer to contain 'unhealthy'; llm: expected answer to contain 'unknown' +- **v2-docs-summary-09-manual-send**: doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/send'; llm: expected answer to contain 'message'; llm: expected answer to contain 'TelegramSendService' +- **v2-docs-summary-10-telegram-integration**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA; anchor_type: expected API_ENDPOINT, got None; doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- **v2-find-files-01-health**: answer_mode: expected deterministic, got deterministic_file_list; llm: expected answer to contain 'docs/api/health-endpoint.md' +- **v2-find-files-02-send**: answer_mode: expected deterministic, got deterministic_file_list; llm: expected answer to contain 'docs/api/send-message-endpoint.md' +- **v2-find-files-03-actions**: answer_mode: expected deterministic, got deterministic_file_list; llm: expected answer to contain 'docs/api/control-actions-endpoint.md' +- **v2-find-files-04-runtime-health**: sub_intent: expected FIND_FILES, got SUMMARY; anchor_type: expected FIND_FILES, got DOMAIN_ENTITY; answer_mode: expected deterministic, got insufficient_evidence; llm: expected answer to contain 'docs/domains/runtime-health-entity.md' +- **v2-find-files-05-loop**: answer_mode: expected deterministic, got deterministic_file_list; llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- **v2-find-files-06-architecture**: answer_mode: expected deterministic, got deterministic_file_list +- **v2-find-files-07-errors-catalog**: answer_mode: expected deterministic, got deterministic_file_list; llm: expected answer to contain 'docs/errors/catalog.yaml' +- **v2-find-files-08-docs-index**: answer_mode: expected deterministic, got deterministic_file_list +- **v2-find-files-09-telegram-bot-api**: answer_mode: expected deterministic, got deterministic_file_list; llm: expected answer to contain 'docs/api/send-message-endpoint.md'; llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- **v2-find-files-10-telegram-notify-worker**: answer_mode: expected deterministic, got deterministic_file_list; llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'; llm: expected answer to contain 'docs/domains/runtime-health-entity.md' + +## LLM Answers +- **v2-general-01-what-is-service** + Query: Что это за сервис? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-02-purpose** + Query: Для чего нужен test_echo_app? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/arc… +- **v2-general-03-problem** + Query: Какую задачу решает это приложение? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-04-docs-contents** + Query: Что входит в документацию этого проекта? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-05-main-parts** + Query: Какие основные части есть у системы? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-06-high-level-architecture** + Query: Как в целом устроено приложение? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-07-besides-api** + Query: Что тут есть кроме API? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-08-components** + Query: Из чего состоит Telegram Notify App? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). Файлы\-источники: \- docs/architecture/telegram\-notify\-app\-overview.md \- docs/README.md +- **v2-general-09-reading-order** + Query: Какие документы стоит читать сначала? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-10-short-summary** + Query: Дай короткое summary по проектной документации + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-docs-summary-01-health** + Query: Кратко объясни по документации, как работает `/health` + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/README.md. +- **v2-docs-summary-02-send** + Query: Что делает endpoint `/send`? + > В поднятом контексте не найден целевой документ по запросу. +- **v2-docs-summary-03-actions** + Query: Объясни назначение `/actions/{action}` + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-04-runtime-health** + Query: Что такое runtime health в этой документации? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-05-notification-loop** + Query: Кратко опиши цикл отправки уведомлений + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md, docs/README.md. +- **v2-docs-summary-06-architecture** + Query: Как устроена архитектура Telegram Notify App? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). Файлы\-источники: \- docs/architecture/telegram\-notify\-app\-overview.md \- docs/README.md +- **v2-docs-summary-07-worker** + Query: Что делает worker в этом приложении? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-08-health-statuses** + Query: Какие статусы здоровья есть у runtime? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-09-manual-send** + Query: Как в приложении устроена ручная отправка сообщения? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-10-telegram-integration** + Query: Как сервис взаимодействует с Telegram в целом? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/arc… +- **v2-find-files-01-health** + Query: В каком файле описан `/health`? + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-02-send** + Query: Покажи файл с описанием endpoint `/send` + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-03-actions** + Query: Где находится документация по `/actions/{action}`? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-04-runtime-health** + Query: В каком документе описан runtime health? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-find-files-05-loop** + Query: Найди файл с логикой цикла отправки уведомлений + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-06-architecture** + Query: Где описана архитектура приложения? + > docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-07-errors-catalog** + Query: В каком файле лежит каталог ошибок? + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-08-docs-index** + Query: Покажи файл-индекс документации проекта + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-09-telegram-bot-api** + Query: Какие файлы относятся к Telegram Bot API интеграции? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-10-telegram-notify-worker** + Query: В каких файлах описан worker `telegram_notify`? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json new file mode 100644 index 0000000..1c20004 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json @@ -0,0 +1,295 @@ +{ + "meta": { + "case_id": "v2-docs-summary-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected grounded_summary, got insufficient_evidence", + "llm: expected answer to contain '/health'", + "llm: expected answer to contain 'status'", + "llm: expected answer to contain 'components'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Кратко объясни по документации, как работает `/health`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 96 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md new file mode 100644 index 0000000..b358832 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md @@ -0,0 +1,344 @@ +# v2-docs-summary-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Кратко объясни по документации, как работает `/health` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Кратко объясни по документации, как работает `/health`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 96 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected grounded_summary, got insufficient_evidence +- llm: expected answer to contain '/health' +- llm: expected answer to contain 'status' +- llm: expected answer to contain 'components' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json new file mode 100644 index 0000000..75c76f5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json @@ -0,0 +1,259 @@ +{ + "meta": { + "case_id": "v2-docs-summary-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/send'", + "llm: expected answer to contain 'message'", + "llm: expected answer to contain 'Telegram'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что делает endpoint `/send`?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md new file mode 100644 index 0000000..b31c739 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md @@ -0,0 +1,304 @@ +# v2-docs-summary-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что делает endpoint `/send`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что делает endpoint `/send`?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/send' +- llm: expected answer to contain 'message' +- llm: expected answer to contain 'Telegram' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json new file mode 100644 index 0000000..6196dff --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json @@ -0,0 +1,299 @@ +{ + "meta": { + "case_id": "v2-docs-summary-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/actions/{action}'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Объясни назначение `/actions/{action}`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md new file mode 100644 index 0000000..65c69a1 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md @@ -0,0 +1,348 @@ +# v2-docs-summary-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Объясни назначение `/actions/{action}` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Объясни назначение `/actions/{action}`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/actions/{action}' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json new file mode 100644 index 0000000..deb6ae2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json @@ -0,0 +1,285 @@ +{ + "meta": { + "case_id": "v2-docs-summary-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "llm: expected answer to contain 'runtime health'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что такое runtime health в этой документации?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md new file mode 100644 index 0000000..3ccb80d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md @@ -0,0 +1,334 @@ +# v2-docs-summary-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что такое runtime health в этой документации? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что такое runtime health в этой документации?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- llm: expected answer to contain 'runtime health' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json new file mode 100644 index 0000000..f23f2b3 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json @@ -0,0 +1,330 @@ +{ + "meta": { + "case_id": "v2-docs-summary-05-notification-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain 'worker'", + "llm: expected answer to contain 'interval'", + "llm: expected answer to contain 'degraded'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md, docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Кратко опиши цикл отправки уведомлений", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 147 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md new file mode 100644 index 0000000..963fd2f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md @@ -0,0 +1,383 @@ +# v2-docs-summary-05-notification-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Кратко опиши цикл отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md, docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Кратко опиши цикл отправки уведомлений", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 147 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain 'worker' +- llm: expected answer to contain 'interval' +- llm: expected answer to contain 'degraded' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json new file mode 100644 index 0000000..7e842f1 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json @@ -0,0 +1,390 @@ +{ + "meta": { + "case_id": "v2-docs-summary-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 16, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как устроена архитектура Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 16, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 600, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 600, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md new file mode 100644 index 0000000..257f09f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md @@ -0,0 +1,445 @@ +# v2-docs-summary-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Как устроена архитектура Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 16, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как устроена архитектура Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 16, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 600, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 600, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json new file mode 100644 index 0000000..fefba8a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json @@ -0,0 +1,281 @@ +{ + "meta": { + "case_id": "v2-docs-summary-07-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain 'worker'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что делает worker в этом приложении?", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md new file mode 100644 index 0000000..36f453c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md @@ -0,0 +1,330 @@ +# v2-docs-summary-07-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что делает worker в этом приложении? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что делает worker в этом приложении?", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain 'worker' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json new file mode 100644 index 0000000..0cdb688 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json @@ -0,0 +1,289 @@ +{ + "meta": { + "case_id": "v2-docs-summary-08-health-statuses", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "llm: expected answer to contain 'ok'", + "llm: expected answer to contain 'degraded'", + "llm: expected answer to contain 'unhealthy'", + "llm: expected answer to contain 'unknown'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие статусы здоровья есть у runtime?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md new file mode 100644 index 0000000..b9ceaa5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md @@ -0,0 +1,338 @@ +# v2-docs-summary-08-health-statuses + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие статусы здоровья есть у runtime? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие статусы здоровья есть у runtime?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- llm: expected answer to contain 'ok' +- llm: expected answer to contain 'degraded' +- llm: expected answer to contain 'unhealthy' +- llm: expected answer to contain 'unknown' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json new file mode 100644 index 0000000..17ded9c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json @@ -0,0 +1,297 @@ +{ + "meta": { + "case_id": "v2-docs-summary-09-manual-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/send'", + "llm: expected answer to contain 'message'", + "llm: expected answer to contain 'TelegramSendService'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как в приложении устроена ручная отправка сообщения?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md new file mode 100644 index 0000000..94c1b16 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md @@ -0,0 +1,346 @@ +# v2-docs-summary-09-manual-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как в приложении устроена ручная отправка сообщения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как в приложении устроена ручная отправка сообщения?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/send' +- llm: expected answer to contain 'message' +- llm: expected answer to contain 'TelegramSendService' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json new file mode 100644 index 0000000..1e0b5f0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json @@ -0,0 +1,338 @@ +{ + "meta": { + "case_id": "v2-docs-summary-10-telegram-integration", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA", + "anchor_type: expected API_ENDPOINT, got None", + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": null, + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": null, + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как сервис взаимодействует с Telegram в целом?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md new file mode 100644 index 0000000..7e1df31 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md @@ -0,0 +1,391 @@ +# v2-docs-summary-10-telegram-integration + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как сервис взаимодействует с Telegram в целом? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": null, + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": null, + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как сервис взаимодействует с Telegram в целом?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA +- anchor_type: expected API_ENDPOINT, got None +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-01-health.json new file mode 100644 index 0000000..78d41ba --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-01-health.json @@ -0,0 +1,298 @@ +{ + "meta": { + "case_id": "v2-find-files-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/health-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком файле описан `/health`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-01-health.md new file mode 100644 index 0000000..5207ae9 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-01-health.md @@ -0,0 +1,351 @@ +# v2-find-files-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком файле описан `/health`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком файле описан `/health`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/health-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-02-send.json new file mode 100644 index 0000000..863b971 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-02-send.json @@ -0,0 +1,298 @@ +{ + "meta": { + "case_id": "v2-find-files-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/send-message-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Покажи файл с описанием endpoint `/send`", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-02-send.md new file mode 100644 index 0000000..396c5d9 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-02-send.md @@ -0,0 +1,351 @@ +# v2-find-files-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Покажи файл с описанием endpoint `/send` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Покажи файл с описанием endpoint `/send`", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/send-message-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-03-actions.json new file mode 100644 index 0000000..3be1e4a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-03-actions.json @@ -0,0 +1,304 @@ +{ + "meta": { + "case_id": "v2-find-files-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/control-actions-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Где находится документация по `/actions/{action}`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-03-actions.md new file mode 100644 index 0000000..ce31457 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-03-actions.md @@ -0,0 +1,357 @@ +# v2-find-files-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Где находится документация по `/actions/{action}`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Где находится документация по `/actions/{action}`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/control-actions-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json new file mode 100644 index 0000000..9f88ec2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json @@ -0,0 +1,302 @@ +{ + "meta": { + "case_id": "v2-find-files-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/domains/runtime-health-entity.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком документе описан runtime health?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md new file mode 100644 index 0000000..e759ee7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md @@ -0,0 +1,355 @@ +# v2-find-files-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком документе описан runtime health? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком документе описан runtime health?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/domains/runtime-health-entity.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-05-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-05-loop.json new file mode 100644 index 0000000..672c6d5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-05-loop.json @@ -0,0 +1,296 @@ +{ + "meta": { + "case_id": "v2-find-files-05-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Найди файл с логикой цикла отправки уведомлений", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-05-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-05-loop.md new file mode 100644 index 0000000..e33bff1 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-05-loop.md @@ -0,0 +1,349 @@ +# v2-find-files-05-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Найди файл с логикой цикла отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Найди файл с логикой цикла отправки уведомлений", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json new file mode 100644 index 0000000..ba2f015 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json @@ -0,0 +1,344 @@ +{ + "meta": { + "case_id": "v2-find-files-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Где описана архитектура приложения?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 670, + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 670, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md new file mode 100644 index 0000000..7fc62c3 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md @@ -0,0 +1,399 @@ +# v2-find-files-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Где описана архитектура приложения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Где описана архитектура приложения?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 670, + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 670, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json new file mode 100644 index 0000000..238cb6e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json @@ -0,0 +1,302 @@ +{ + "meta": { + "case_id": "v2-find-files-07-errors-catalog", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/errors/catalog.yaml'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком файле лежит каталог ошибок?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 150, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 150, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md new file mode 100644 index 0000000..348b8b0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md @@ -0,0 +1,355 @@ +# v2-find-files-07-errors-catalog + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком файле лежит каталог ошибок? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком файле лежит каталог ошибок?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 150, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 150, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/errors/catalog.yaml' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json new file mode 100644 index 0000000..09e5785 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json @@ -0,0 +1,314 @@ +{ + "meta": { + "case_id": "v2-find-files-08-docs-index", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Покажи файл-индекс документации проекта", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/README.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 2140, + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md new file mode 100644 index 0000000..08bb57d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md @@ -0,0 +1,369 @@ +# v2-find-files-08-docs-index + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Покажи файл-индекс документации проекта + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Покажи файл-индекс документации проекта", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/README.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 2140, + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json new file mode 100644 index 0000000..67047e6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json @@ -0,0 +1,288 @@ +{ + "meta": { + "case_id": "v2-find-files-09-telegram-bot-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/send-message-endpoint.md'", + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md new file mode 100644 index 0000000..c4d79a7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md @@ -0,0 +1,341 @@ +# v2-find-files-09-telegram-bot-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие файлы относятся к Telegram Bot API интеграции? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/send-message-endpoint.md' +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json new file mode 100644 index 0000000..52da710 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json @@ -0,0 +1,304 @@ +{ + "meta": { + "case_id": "v2-find-files-10-telegram-notify-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'", + "llm: expected answer to contain 'docs/domains/runtime-health-entity.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каких файлах описан worker `telegram_notify`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md new file mode 100644 index 0000000..28d4704 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md @@ -0,0 +1,357 @@ +# v2-find-files-10-telegram-notify-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каких файлах описан worker `telegram_notify`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каких файлах описан worker `telegram_notify`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- llm: expected answer to contain 'docs/domains/runtime-health-entity.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json new file mode 100644 index 0000000..0cf24da --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json @@ -0,0 +1,326 @@ +{ + "meta": { + "case_id": "v2-general-01-what-is-service", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что это за сервис?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md new file mode 100644 index 0000000..302917b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md @@ -0,0 +1,381 @@ +# v2-general-01-what-is-service + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что это за сервис? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что это за сервис?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-02-purpose.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-02-purpose.json new file mode 100644 index 0000000..f047edf --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-02-purpose.json @@ -0,0 +1,339 @@ +{ + "meta": { + "case_id": "v2-general-02-purpose", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Для чего нужен test_echo_app?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-02-purpose.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-02-purpose.md new file mode 100644 index 0000000..8e52fc6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-02-purpose.md @@ -0,0 +1,394 @@ +# v2-general-02-purpose + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Для чего нужен test_echo_app? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Для чего нужен test_echo_app?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-03-problem.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-03-problem.json new file mode 100644 index 0000000..3583e60 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-03-problem.json @@ -0,0 +1,326 @@ +{ + "meta": { + "case_id": "v2-general-03-problem", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какую задачу решает это приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-03-problem.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-03-problem.md new file mode 100644 index 0000000..475e3e0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-03-problem.md @@ -0,0 +1,381 @@ +# v2-general-03-problem + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Какую задачу решает это приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какую задачу решает это приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json new file mode 100644 index 0000000..ad7cafc --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json @@ -0,0 +1,326 @@ +{ + "meta": { + "case_id": "v2-general-04-docs-contents", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что входит в документацию этого проекта?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md new file mode 100644 index 0000000..2de2e31 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md @@ -0,0 +1,381 @@ +# v2-general-04-docs-contents + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что входит в документацию этого проекта? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что входит в документацию этого проекта?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-05-main-parts.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-05-main-parts.json new file mode 100644 index 0000000..63a6a58 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-05-main-parts.json @@ -0,0 +1,328 @@ +{ + "meta": { + "case_id": "v2-general-05-main-parts", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'систем'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие основные части есть у системы?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-05-main-parts.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-05-main-parts.md new file mode 100644 index 0000000..cf79327 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-05-main-parts.md @@ -0,0 +1,381 @@ +# v2-general-05-main-parts + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие основные части есть у системы? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие основные части есть у системы?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'систем' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json new file mode 100644 index 0000000..46bf39b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json @@ -0,0 +1,328 @@ +{ + "meta": { + "case_id": "v2-general-06-high-level-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'приложен'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как в целом устроено приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md new file mode 100644 index 0000000..c2b9b4d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md @@ -0,0 +1,381 @@ +# v2-general-06-high-level-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как в целом устроено приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как в целом устроено приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'приложен' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-07-besides-api.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-07-besides-api.json new file mode 100644 index 0000000..750d6bb --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-07-besides-api.json @@ -0,0 +1,326 @@ +{ + "meta": { + "case_id": "v2-general-07-besides-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что тут есть кроме API?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-07-besides-api.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-07-besides-api.md new file mode 100644 index 0000000..493a888 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-07-besides-api.md @@ -0,0 +1,381 @@ +# v2-general-07-besides-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что тут есть кроме API? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что тут есть кроме API?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-08-components.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-08-components.json new file mode 100644 index 0000000..d2f8d32 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-08-components.json @@ -0,0 +1,389 @@ +{ + "meta": { + "case_id": "v2-general-08-components", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected GENERAL, got DOCS", + "intent: expected GENERAL_QA, got DOC_EXPLAIN", + "anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE", + "llm: expected answer to contain 'Telegram Notify App'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 16, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Из чего состоит Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 16, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 60, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 60, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-08-components.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-08-components.md new file mode 100644 index 0000000..11ee6e7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-08-components.md @@ -0,0 +1,442 @@ +# v2-general-08-components + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Из чего состоит Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 16, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Из чего состоит Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 16, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 60, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 60, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected GENERAL, got DOCS +- intent: expected GENERAL_QA, got DOC_EXPLAIN +- anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE +- llm: expected answer to contain 'Telegram Notify App' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-09-reading-order.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-09-reading-order.json new file mode 100644 index 0000000..194372a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-09-reading-order.json @@ -0,0 +1,328 @@ +{ + "meta": { + "case_id": "v2-general-09-reading-order", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'README'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие документы стоит читать сначала?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-09-reading-order.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-09-reading-order.md new file mode 100644 index 0000000..e9a5323 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-09-reading-order.md @@ -0,0 +1,381 @@ +# v2-general-09-reading-order + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие документы стоит читать сначала? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие документы стоит читать сначала?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'README' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-10-short-summary.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-10-short-summary.json new file mode 100644 index 0000000..2545ba8 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-10-short-summary.json @@ -0,0 +1,326 @@ +{ + "meta": { + "case_id": "v2-general-10-short-summary", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Дай короткое summary по проектной документации", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-10-short-summary.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-10-short-summary.md new file mode 100644 index 0000000..7e55ef2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/full_chain_docs_v2_matrix_v2-general-10-short-summary.md @@ -0,0 +1,381 @@ +# v2-general-10-short-summary + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Дай короткое summary по проектной документации + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Дай короткое summary по проектной документации", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/summary.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/summary.md new file mode 100644 index 0000000..632bd37 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_212743/summary.md @@ -0,0 +1,151 @@ +# pipeline_setup_v3 summary + +Passed: 9/30 + +| File | Case | Mode | Query | Actual sub-intent | RAG layers | Tokens | Pass | +|------|------|------|-------|-------------------|------------|--------|------| +| full_chain_docs_v2_matrix.yaml | v2-general-01-what-is-service | full_chain | Что это за сервис? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-02-purpose | full_chain | Для чего нужен test_echo_app? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-03-problem | full_chain | Какую задачу решает это приложение? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-04-docs-contents | full_chain | Что входит в документацию этого проекта? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-05-main-parts | full_chain | Какие основные части есть у системы? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-06-high-level-architecture | full_chain | Как в целом устроено приложение? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-07-besides-api | full_chain | Что тут есть кроме API? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-08-components | full_chain | Из чего состоит Telegram Notify App? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-09-reading-order | full_chain | Какие документы стоит читать сначала? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-10-short-summary | full_chain | Дай короткое summary по проектной документации | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-01-health | full_chain | Кратко объясни по документации, как работает `/health` | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-02-send | full_chain | Что делает endpoint `/send`? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-03-actions | full_chain | Объясни назначение `/actions/{action}` | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-04-runtime-health | full_chain | Что такое runtime health в этой документации? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-05-notification-loop | full_chain | Кратко опиши цикл отправки уведомлений | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-06-architecture | full_chain | Как устроена архитектура Telegram Notify App? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-07-worker | full_chain | Что делает worker в этом приложении? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-08-health-statuses | full_chain | Какие статусы здоровья есть у runtime? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-09-manual-send | full_chain | Как в приложении устроена ручная отправка сообщения? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-10-telegram-integration | full_chain | Как сервис взаимодействует с Telegram в целом? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-01-health | full_chain | В каком файле описан `/health`? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-02-send | full_chain | Покажи файл с описанием endpoint `/send` | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-03-actions | full_chain | Где находится документация по `/actions/{action}`? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-04-runtime-health | full_chain | В каком документе описан runtime health? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-05-loop | full_chain | Найди файл с логикой цикла отправки уведомлений | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-06-architecture | full_chain | Где описана архитектура приложения? | FIND_FILES | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-07-errors-catalog | full_chain | В каком файле лежит каталог ошибок? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-08-docs-index | full_chain | Покажи файл-индекс документации проекта | FIND_FILES | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-09-telegram-bot-api | full_chain | Какие файлы относятся к Telegram Bot API интеграции? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-10-telegram-notify-worker | full_chain | В каких файлах описан worker `telegram_notify`? | FIND_FILES | — | — | ✗ | + +## Failures +- **v2-general-05-main-parts**: llm: expected answer to contain 'систем' +- **v2-general-06-high-level-architecture**: llm: expected answer to contain 'приложен' +- **v2-general-08-components**: domain: expected GENERAL, got DOCS; intent: expected GENERAL_QA, got DOC_EXPLAIN; anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE; llm: expected answer to contain 'Telegram Notify App' +- **v2-general-09-reading-order**: llm: expected answer to contain 'README' +- **v2-docs-summary-01-health**: answer_mode: expected grounded_summary, got insufficient_evidence; llm: expected answer to contain '/health'; llm: expected answer to contain 'status'; llm: expected answer to contain 'components' +- **v2-docs-summary-02-send**: doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/send'; llm: expected answer to contain 'message'; llm: expected answer to contain 'Telegram' +- **v2-docs-summary-03-actions**: doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/actions/{action}' +- **v2-docs-summary-04-runtime-health**: doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; llm: expected answer to contain 'runtime health' +- **v2-docs-summary-05-notification-loop**: doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain 'worker'; llm: expected answer to contain 'interval'; llm: expected answer to contain 'degraded' +- **v2-docs-summary-07-worker**: doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain 'worker' +- **v2-docs-summary-08-health-statuses**: doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; llm: expected answer to contain 'ok'; llm: expected answer to contain 'degraded'; llm: expected answer to contain 'unhealthy'; llm: expected answer to contain 'unknown' +- **v2-docs-summary-09-manual-send**: doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/send'; llm: expected answer to contain 'message'; llm: expected answer to contain 'TelegramSendService' +- **v2-docs-summary-10-telegram-integration**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA; anchor_type: expected API_ENDPOINT, got None; doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- **v2-find-files-01-health**: llm: expected answer to contain 'docs/api/health-endpoint.md' +- **v2-find-files-02-send**: llm: expected answer to contain 'docs/api/send-message-endpoint.md' +- **v2-find-files-03-actions**: llm: expected answer to contain 'docs/api/control-actions-endpoint.md' +- **v2-find-files-04-runtime-health**: llm: expected answer to contain 'docs/domains/runtime-health-entity.md' +- **v2-find-files-05-loop**: llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- **v2-find-files-07-errors-catalog**: llm: expected answer to contain 'docs/errors/catalog.yaml' +- **v2-find-files-09-telegram-bot-api**: llm: expected answer to contain 'docs/api/send-message-endpoint.md'; llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- **v2-find-files-10-telegram-notify-worker**: llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'; llm: expected answer to contain 'docs/domains/runtime-health-entity.md' + +## LLM Answers +- **v2-general-01-what-is-service** + Query: Что это за сервис? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-02-purpose** + Query: Для чего нужен test_echo_app? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/arc… +- **v2-general-03-problem** + Query: Какую задачу решает это приложение? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-04-docs-contents** + Query: Что входит в документацию этого проекта? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-05-main-parts** + Query: Какие основные части есть у системы? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-06-high-level-architecture** + Query: Как в целом устроено приложение? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-07-besides-api** + Query: Что тут есть кроме API? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-08-components** + Query: Из чего состоит Telegram Notify App? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). Файлы\-источники: \- docs/architecture/telegram\-notify\-app\-overview.md \- docs/README.md +- **v2-general-09-reading-order** + Query: Какие документы стоит читать сначала? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-10-short-summary** + Query: Дай короткое summary по проектной документации + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-docs-summary-01-health** + Query: Кратко объясни по документации, как работает `/health` + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/README.md. +- **v2-docs-summary-02-send** + Query: Что делает endpoint `/send`? + > В поднятом контексте не найден целевой документ по запросу. +- **v2-docs-summary-03-actions** + Query: Объясни назначение `/actions/{action}` + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-04-runtime-health** + Query: Что такое runtime health в этой документации? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-05-notification-loop** + Query: Кратко опиши цикл отправки уведомлений + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md, docs/README.md. +- **v2-docs-summary-06-architecture** + Query: Как устроена архитектура Telegram Notify App? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). Файлы\-источники: \- docs/architecture/telegram\-notify\-app\-overview.md \- docs/README.md +- **v2-docs-summary-07-worker** + Query: Что делает worker в этом приложении? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-08-health-statuses** + Query: Какие статусы здоровья есть у runtime? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-09-manual-send** + Query: Как в приложении устроена ручная отправка сообщения? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-10-telegram-integration** + Query: Как сервис взаимодействует с Telegram в целом? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/arc… +- **v2-find-files-01-health** + Query: В каком файле описан `/health`? + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-02-send** + Query: Покажи файл с описанием endpoint `/send` + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-03-actions** + Query: Где находится документация по `/actions/{action}`? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-04-runtime-health** + Query: В каком документе описан runtime health? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-05-loop** + Query: Найди файл с логикой цикла отправки уведомлений + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-06-architecture** + Query: Где описана архитектура приложения? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-07-errors-catalog** + Query: В каком файле лежит каталог ошибок? + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-08-docs-index** + Query: Покажи файл-индекс документации проекта + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-09-telegram-bot-api** + Query: Какие файлы относятся к Telegram Bot API интеграции? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-10-telegram-notify-worker** + Query: В каких файлах описан worker `telegram_notify`? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json new file mode 100644 index 0000000..785a289 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json @@ -0,0 +1,306 @@ +{ + "meta": { + "case_id": "v2-docs-summary-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected grounded_summary, got insufficient_evidence", + "llm: expected answer to contain '/health'", + "llm: expected answer to contain 'status'", + "llm: expected answer to contain 'components'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Кратко объясни по документации, как работает `/health`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 96 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md new file mode 100644 index 0000000..79b08f7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md @@ -0,0 +1,355 @@ +# v2-docs-summary-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Кратко объясни по документации, как работает `/health` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Кратко объясни по документации, как работает `/health`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 96 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected grounded_summary, got insufficient_evidence +- llm: expected answer to contain '/health' +- llm: expected answer to contain 'status' +- llm: expected answer to contain 'components' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json new file mode 100644 index 0000000..9ef2146 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json @@ -0,0 +1,270 @@ +{ + "meta": { + "case_id": "v2-docs-summary-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/send'", + "llm: expected answer to contain 'message'", + "llm: expected answer to contain 'Telegram'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что делает endpoint `/send`?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md new file mode 100644 index 0000000..c882366 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md @@ -0,0 +1,315 @@ +# v2-docs-summary-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что делает endpoint `/send`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что делает endpoint `/send`?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/send' +- llm: expected answer to contain 'message' +- llm: expected answer to contain 'Telegram' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json new file mode 100644 index 0000000..4bdcbdd --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json @@ -0,0 +1,310 @@ +{ + "meta": { + "case_id": "v2-docs-summary-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/actions/{action}'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Объясни назначение `/actions/{action}`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md new file mode 100644 index 0000000..1be8ecb --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md @@ -0,0 +1,359 @@ +# v2-docs-summary-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Объясни назначение `/actions/{action}` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Объясни назначение `/actions/{action}`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/actions/{action}' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json new file mode 100644 index 0000000..c951544 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json @@ -0,0 +1,296 @@ +{ + "meta": { + "case_id": "v2-docs-summary-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "llm: expected answer to contain 'runtime health'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что такое runtime health в этой документации?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md new file mode 100644 index 0000000..2042605 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md @@ -0,0 +1,345 @@ +# v2-docs-summary-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что такое runtime health в этой документации? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что такое runtime health в этой документации?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- llm: expected answer to contain 'runtime health' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json new file mode 100644 index 0000000..f632b15 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json @@ -0,0 +1,341 @@ +{ + "meta": { + "case_id": "v2-docs-summary-05-notification-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain 'worker'", + "llm: expected answer to contain 'interval'", + "llm: expected answer to contain 'degraded'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md, docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Кратко опиши цикл отправки уведомлений", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 147 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md new file mode 100644 index 0000000..d70e3c5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md @@ -0,0 +1,394 @@ +# v2-docs-summary-05-notification-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Кратко опиши цикл отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md, docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Кратко опиши цикл отправки уведомлений", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 147 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain 'worker' +- llm: expected answer to contain 'interval' +- llm: expected answer to contain 'degraded' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json new file mode 100644 index 0000000..4f976de --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json @@ -0,0 +1,416 @@ +{ + "meta": { + "case_id": "v2-docs-summary-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 19, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ] + }, + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D2_FACT_INDEX", + "title": "architecture.telegram_notify_app:mentions_entity", + "document_id": "" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как устроена архитектура Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 19, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 600, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 600, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md new file mode 100644 index 0000000..db8eef6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md @@ -0,0 +1,471 @@ +# v2-docs-summary-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Как устроена архитектура Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 19, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ] + }, + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D2_FACT_INDEX", + "title": "architecture.telegram_notify_app:mentions_entity", + "document_id": "" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как устроена архитектура Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 19, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 600, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 600, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json new file mode 100644 index 0000000..4296d69 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json @@ -0,0 +1,292 @@ +{ + "meta": { + "case_id": "v2-docs-summary-07-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain 'worker'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что делает worker в этом приложении?", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md new file mode 100644 index 0000000..73e8540 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md @@ -0,0 +1,341 @@ +# v2-docs-summary-07-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что делает worker в этом приложении? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что делает worker в этом приложении?", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain 'worker' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json new file mode 100644 index 0000000..9fad7e4 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json @@ -0,0 +1,300 @@ +{ + "meta": { + "case_id": "v2-docs-summary-08-health-statuses", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "llm: expected answer to contain 'ok'", + "llm: expected answer to contain 'degraded'", + "llm: expected answer to contain 'unhealthy'", + "llm: expected answer to contain 'unknown'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие статусы здоровья есть у runtime?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md new file mode 100644 index 0000000..77f9c7c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md @@ -0,0 +1,349 @@ +# v2-docs-summary-08-health-statuses + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие статусы здоровья есть у runtime? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие статусы здоровья есть у runtime?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- llm: expected answer to contain 'ok' +- llm: expected answer to contain 'degraded' +- llm: expected answer to contain 'unhealthy' +- llm: expected answer to contain 'unknown' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json new file mode 100644 index 0000000..0973d8f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json @@ -0,0 +1,308 @@ +{ + "meta": { + "case_id": "v2-docs-summary-09-manual-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/send'", + "llm: expected answer to contain 'message'", + "llm: expected answer to contain 'TelegramSendService'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как в приложении устроена ручная отправка сообщения?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md new file mode 100644 index 0000000..fde410e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md @@ -0,0 +1,357 @@ +# v2-docs-summary-09-manual-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как в приложении устроена ручная отправка сообщения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как в приложении устроена ручная отправка сообщения?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/send' +- llm: expected answer to contain 'message' +- llm: expected answer to contain 'TelegramSendService' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json new file mode 100644 index 0000000..65bc22d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json @@ -0,0 +1,351 @@ +{ + "meta": { + "case_id": "v2-docs-summary-10-telegram-integration", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA", + "anchor_type: expected API_ENDPOINT, got None", + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": null, + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": null, + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как сервис взаимодействует с Telegram в целом?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md new file mode 100644 index 0000000..43a1035 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md @@ -0,0 +1,404 @@ +# v2-docs-summary-10-telegram-integration + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как сервис взаимодействует с Telegram в целом? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": null, + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": null, + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как сервис взаимодействует с Telegram в целом?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA +- anchor_type: expected API_ENDPOINT, got None +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-01-health.json new file mode 100644 index 0000000..99329b2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-01-health.json @@ -0,0 +1,308 @@ +{ + "meta": { + "case_id": "v2-find-files-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/health-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком файле описан `/health`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-01-health.md new file mode 100644 index 0000000..ae827c8 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-01-health.md @@ -0,0 +1,361 @@ +# v2-find-files-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком файле описан `/health`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком файле описан `/health`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/health-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-02-send.json new file mode 100644 index 0000000..d444a74 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-02-send.json @@ -0,0 +1,308 @@ +{ + "meta": { + "case_id": "v2-find-files-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/send-message-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Покажи файл с описанием endpoint `/send`", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-02-send.md new file mode 100644 index 0000000..71ef0b4 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-02-send.md @@ -0,0 +1,361 @@ +# v2-find-files-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Покажи файл с описанием endpoint `/send` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Покажи файл с описанием endpoint `/send`", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/send-message-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-03-actions.json new file mode 100644 index 0000000..22a26af --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-03-actions.json @@ -0,0 +1,314 @@ +{ + "meta": { + "case_id": "v2-find-files-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/control-actions-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Где находится документация по `/actions/{action}`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-03-actions.md new file mode 100644 index 0000000..7daa0f1 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-03-actions.md @@ -0,0 +1,367 @@ +# v2-find-files-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Где находится документация по `/actions/{action}`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Где находится документация по `/actions/{action}`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/control-actions-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json new file mode 100644 index 0000000..c509e60 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json @@ -0,0 +1,312 @@ +{ + "meta": { + "case_id": "v2-find-files-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/domains/runtime-health-entity.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком документе описан runtime health?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md new file mode 100644 index 0000000..79e0a20 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md @@ -0,0 +1,365 @@ +# v2-find-files-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком документе описан runtime health? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком документе описан runtime health?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/domains/runtime-health-entity.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-05-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-05-loop.json new file mode 100644 index 0000000..726a2fc --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-05-loop.json @@ -0,0 +1,306 @@ +{ + "meta": { + "case_id": "v2-find-files-05-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Найди файл с логикой цикла отправки уведомлений", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-05-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-05-loop.md new file mode 100644 index 0000000..3ec8e9c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-05-loop.md @@ -0,0 +1,359 @@ +# v2-find-files-05-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Найди файл с логикой цикла отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Найди файл с логикой цикла отправки уведомлений", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json new file mode 100644 index 0000000..01cb749 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json @@ -0,0 +1,412 @@ +{ + "meta": { + "case_id": "v2-find-files-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 19, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ] + }, + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D2_FACT_INDEX", + "title": "architecture.telegram_notify_app:mentions_entity", + "document_id": "" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Где описана архитектура приложения?", + "profile": "file_lookup", + "row_count": 19, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 670, + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 670, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md new file mode 100644 index 0000000..032440b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md @@ -0,0 +1,467 @@ +# v2-find-files-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Где описана архитектура приложения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 19, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ] + }, + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D2_FACT_INDEX", + "title": "architecture.telegram_notify_app:mentions_entity", + "document_id": "" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Где описана архитектура приложения?", + "profile": "file_lookup", + "row_count": 19, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 670, + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 670, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json new file mode 100644 index 0000000..a5feeeb --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json @@ -0,0 +1,312 @@ +{ + "meta": { + "case_id": "v2-find-files-07-errors-catalog", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/errors/catalog.yaml'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком файле лежит каталог ошибок?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 150, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 150, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md new file mode 100644 index 0000000..e61ad85 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md @@ -0,0 +1,365 @@ +# v2-find-files-07-errors-catalog + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком файле лежит каталог ошибок? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком файле лежит каталог ошибок?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 150, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 150, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/errors/catalog.yaml' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json new file mode 100644 index 0000000..f38ba3e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json @@ -0,0 +1,399 @@ +{ + "meta": { + "case_id": "v2-find-files-08-docs-index", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "docs/README.md", + "index.test_echo_app_docs", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/README.md" + ], + "candidates_before_ranking": [ + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + } + ], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Покажи файл-индекс документации проекта", + "profile": "file_lookup", + "row_count": 12, + "target_doc_hints": [ + "docs/README.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 2140, + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md new file mode 100644 index 0000000..5b563e4 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md @@ -0,0 +1,454 @@ +# v2-find-files-08-docs-index + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Покажи файл-индекс документации проекта + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "docs/README.md", + "index.test_echo_app_docs", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/README.md" + ], + "candidates_before_ranking": [ + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + } + ], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Покажи файл-индекс документации проекта", + "profile": "file_lookup", + "row_count": 12, + "target_doc_hints": [ + "docs/README.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 2140, + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json new file mode 100644 index 0000000..8f70615 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json @@ -0,0 +1,296 @@ +{ + "meta": { + "case_id": "v2-find-files-09-telegram-bot-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/send-message-endpoint.md'", + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md new file mode 100644 index 0000000..1f7c1c1 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md @@ -0,0 +1,349 @@ +# v2-find-files-09-telegram-bot-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие файлы относятся к Telegram Bot API интеграции? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/send-message-endpoint.md' +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json new file mode 100644 index 0000000..9506ba6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json @@ -0,0 +1,314 @@ +{ + "meta": { + "case_id": "v2-find-files-10-telegram-notify-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'", + "llm: expected answer to contain 'docs/domains/runtime-health-entity.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каких файлах описан worker `telegram_notify`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md new file mode 100644 index 0000000..b28dffc --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md @@ -0,0 +1,367 @@ +# v2-find-files-10-telegram-notify-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каких файлах описан worker `telegram_notify`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каких файлах описан worker `telegram_notify`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- llm: expected answer to contain 'docs/domains/runtime-health-entity.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json new file mode 100644 index 0000000..cefa3db --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json @@ -0,0 +1,339 @@ +{ + "meta": { + "case_id": "v2-general-01-what-is-service", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что это за сервис?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md new file mode 100644 index 0000000..a325ea4 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md @@ -0,0 +1,394 @@ +# v2-general-01-what-is-service + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что это за сервис? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что это за сервис?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-02-purpose.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-02-purpose.json new file mode 100644 index 0000000..0a60fbd --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-02-purpose.json @@ -0,0 +1,352 @@ +{ + "meta": { + "case_id": "v2-general-02-purpose", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Для чего нужен test_echo_app?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-02-purpose.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-02-purpose.md new file mode 100644 index 0000000..aff2f61 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-02-purpose.md @@ -0,0 +1,407 @@ +# v2-general-02-purpose + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Для чего нужен test_echo_app? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Для чего нужен test_echo_app?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-03-problem.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-03-problem.json new file mode 100644 index 0000000..94db832 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-03-problem.json @@ -0,0 +1,339 @@ +{ + "meta": { + "case_id": "v2-general-03-problem", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какую задачу решает это приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-03-problem.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-03-problem.md new file mode 100644 index 0000000..93bdada --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-03-problem.md @@ -0,0 +1,394 @@ +# v2-general-03-problem + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Какую задачу решает это приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какую задачу решает это приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json new file mode 100644 index 0000000..69746f9 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json @@ -0,0 +1,339 @@ +{ + "meta": { + "case_id": "v2-general-04-docs-contents", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что входит в документацию этого проекта?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md new file mode 100644 index 0000000..44ec97a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md @@ -0,0 +1,394 @@ +# v2-general-04-docs-contents + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что входит в документацию этого проекта? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что входит в документацию этого проекта?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-05-main-parts.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-05-main-parts.json new file mode 100644 index 0000000..84f10f3 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-05-main-parts.json @@ -0,0 +1,341 @@ +{ + "meta": { + "case_id": "v2-general-05-main-parts", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'систем'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие основные части есть у системы?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-05-main-parts.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-05-main-parts.md new file mode 100644 index 0000000..e98e7fe --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-05-main-parts.md @@ -0,0 +1,394 @@ +# v2-general-05-main-parts + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие основные части есть у системы? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие основные части есть у системы?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'систем' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json new file mode 100644 index 0000000..831b0fc --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json @@ -0,0 +1,341 @@ +{ + "meta": { + "case_id": "v2-general-06-high-level-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'приложен'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как в целом устроено приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md new file mode 100644 index 0000000..b6f0cde --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md @@ -0,0 +1,394 @@ +# v2-general-06-high-level-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как в целом устроено приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как в целом устроено приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'приложен' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-07-besides-api.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-07-besides-api.json new file mode 100644 index 0000000..1898d48 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-07-besides-api.json @@ -0,0 +1,339 @@ +{ + "meta": { + "case_id": "v2-general-07-besides-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что тут есть кроме API?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-07-besides-api.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-07-besides-api.md new file mode 100644 index 0000000..24c384d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-07-besides-api.md @@ -0,0 +1,394 @@ +# v2-general-07-besides-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что тут есть кроме API? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что тут есть кроме API?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-08-components.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-08-components.json new file mode 100644 index 0000000..b0b464c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-08-components.json @@ -0,0 +1,415 @@ +{ + "meta": { + "case_id": "v2-general-08-components", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected GENERAL, got DOCS", + "intent: expected GENERAL_QA, got DOC_EXPLAIN", + "anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE", + "llm: expected answer to contain 'Telegram Notify App'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 19, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D2_FACT_INDEX", + "title": "architecture.telegram_notify_app:mentions_entity", + "document_id": "" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Из чего состоит Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 19, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 60, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 60, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-08-components.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-08-components.md new file mode 100644 index 0000000..c363018 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-08-components.md @@ -0,0 +1,468 @@ +# v2-general-08-components + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Из чего состоит Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 19, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D2_FACT_INDEX", + "title": "architecture.telegram_notify_app:mentions_entity", + "document_id": "" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Из чего состоит Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 19, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 60, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 60, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected GENERAL, got DOCS +- intent: expected GENERAL_QA, got DOC_EXPLAIN +- anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE +- llm: expected answer to contain 'Telegram Notify App' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-09-reading-order.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-09-reading-order.json new file mode 100644 index 0000000..f07f33b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-09-reading-order.json @@ -0,0 +1,341 @@ +{ + "meta": { + "case_id": "v2-general-09-reading-order", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'README'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие документы стоит читать сначала?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-09-reading-order.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-09-reading-order.md new file mode 100644 index 0000000..60fa796 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-09-reading-order.md @@ -0,0 +1,394 @@ +# v2-general-09-reading-order + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие документы стоит читать сначала? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие документы стоит читать сначала?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'README' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-10-short-summary.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-10-short-summary.json new file mode 100644 index 0000000..e850984 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-10-short-summary.json @@ -0,0 +1,339 @@ +{ + "meta": { + "case_id": "v2-general-10-short-summary", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/README.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Дай короткое summary по проектной документации", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-10-short-summary.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-10-short-summary.md new file mode 100644 index 0000000..1de0242 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/full_chain_docs_v2_matrix_v2-general-10-short-summary.md @@ -0,0 +1,394 @@ +# v2-general-10-short-summary + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Дай короткое summary по проектной документации + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/README.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Дай короткое summary по проектной документации", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/summary.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/summary.md new file mode 100644 index 0000000..632bd37 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_215439/summary.md @@ -0,0 +1,151 @@ +# pipeline_setup_v3 summary + +Passed: 9/30 + +| File | Case | Mode | Query | Actual sub-intent | RAG layers | Tokens | Pass | +|------|------|------|-------|-------------------|------------|--------|------| +| full_chain_docs_v2_matrix.yaml | v2-general-01-what-is-service | full_chain | Что это за сервис? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-02-purpose | full_chain | Для чего нужен test_echo_app? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-03-problem | full_chain | Какую задачу решает это приложение? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-04-docs-contents | full_chain | Что входит в документацию этого проекта? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-05-main-parts | full_chain | Какие основные части есть у системы? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-06-high-level-architecture | full_chain | Как в целом устроено приложение? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-07-besides-api | full_chain | Что тут есть кроме API? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-08-components | full_chain | Из чего состоит Telegram Notify App? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-09-reading-order | full_chain | Какие документы стоит читать сначала? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-10-short-summary | full_chain | Дай короткое summary по проектной документации | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-01-health | full_chain | Кратко объясни по документации, как работает `/health` | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-02-send | full_chain | Что делает endpoint `/send`? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-03-actions | full_chain | Объясни назначение `/actions/{action}` | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-04-runtime-health | full_chain | Что такое runtime health в этой документации? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-05-notification-loop | full_chain | Кратко опиши цикл отправки уведомлений | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-06-architecture | full_chain | Как устроена архитектура Telegram Notify App? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-07-worker | full_chain | Что делает worker в этом приложении? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-08-health-statuses | full_chain | Какие статусы здоровья есть у runtime? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-09-manual-send | full_chain | Как в приложении устроена ручная отправка сообщения? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-10-telegram-integration | full_chain | Как сервис взаимодействует с Telegram в целом? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-01-health | full_chain | В каком файле описан `/health`? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-02-send | full_chain | Покажи файл с описанием endpoint `/send` | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-03-actions | full_chain | Где находится документация по `/actions/{action}`? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-04-runtime-health | full_chain | В каком документе описан runtime health? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-05-loop | full_chain | Найди файл с логикой цикла отправки уведомлений | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-06-architecture | full_chain | Где описана архитектура приложения? | FIND_FILES | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-07-errors-catalog | full_chain | В каком файле лежит каталог ошибок? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-08-docs-index | full_chain | Покажи файл-индекс документации проекта | FIND_FILES | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-09-telegram-bot-api | full_chain | Какие файлы относятся к Telegram Bot API интеграции? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-10-telegram-notify-worker | full_chain | В каких файлах описан worker `telegram_notify`? | FIND_FILES | — | — | ✗ | + +## Failures +- **v2-general-05-main-parts**: llm: expected answer to contain 'систем' +- **v2-general-06-high-level-architecture**: llm: expected answer to contain 'приложен' +- **v2-general-08-components**: domain: expected GENERAL, got DOCS; intent: expected GENERAL_QA, got DOC_EXPLAIN; anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE; llm: expected answer to contain 'Telegram Notify App' +- **v2-general-09-reading-order**: llm: expected answer to contain 'README' +- **v2-docs-summary-01-health**: answer_mode: expected grounded_summary, got insufficient_evidence; llm: expected answer to contain '/health'; llm: expected answer to contain 'status'; llm: expected answer to contain 'components' +- **v2-docs-summary-02-send**: doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/send'; llm: expected answer to contain 'message'; llm: expected answer to contain 'Telegram' +- **v2-docs-summary-03-actions**: doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/actions/{action}' +- **v2-docs-summary-04-runtime-health**: doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; llm: expected answer to contain 'runtime health' +- **v2-docs-summary-05-notification-loop**: doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain 'worker'; llm: expected answer to contain 'interval'; llm: expected answer to contain 'degraded' +- **v2-docs-summary-07-worker**: doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain 'worker' +- **v2-docs-summary-08-health-statuses**: doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; llm: expected answer to contain 'ok'; llm: expected answer to contain 'degraded'; llm: expected answer to contain 'unhealthy'; llm: expected answer to contain 'unknown' +- **v2-docs-summary-09-manual-send**: doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/send'; llm: expected answer to contain 'message'; llm: expected answer to contain 'TelegramSendService' +- **v2-docs-summary-10-telegram-integration**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA; anchor_type: expected API_ENDPOINT, got None; doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- **v2-find-files-01-health**: llm: expected answer to contain 'docs/api/health-endpoint.md' +- **v2-find-files-02-send**: llm: expected answer to contain 'docs/api/send-message-endpoint.md' +- **v2-find-files-03-actions**: llm: expected answer to contain 'docs/api/control-actions-endpoint.md' +- **v2-find-files-04-runtime-health**: llm: expected answer to contain 'docs/domains/runtime-health-entity.md' +- **v2-find-files-05-loop**: llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- **v2-find-files-07-errors-catalog**: llm: expected answer to contain 'docs/errors/catalog.yaml' +- **v2-find-files-09-telegram-bot-api**: llm: expected answer to contain 'docs/api/send-message-endpoint.md'; llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- **v2-find-files-10-telegram-notify-worker**: llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'; llm: expected answer to contain 'docs/domains/runtime-health-entity.md' + +## LLM Answers +- **v2-general-01-what-is-service** + Query: Что это за сервис? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-02-purpose** + Query: Для чего нужен test_echo_app? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/arc… +- **v2-general-03-problem** + Query: Какую задачу решает это приложение? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-04-docs-contents** + Query: Что входит в документацию этого проекта? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-05-main-parts** + Query: Какие основные части есть у системы? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-06-high-level-architecture** + Query: Как в целом устроено приложение? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-07-besides-api** + Query: Что тут есть кроме API? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-08-components** + Query: Из чего состоит Telegram Notify App? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). Файлы\-источники: \- docs/architecture/telegram\-notify\-app\-overview.md \- docs/README.md +- **v2-general-09-reading-order** + Query: Какие документы стоит читать сначала? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-10-short-summary** + Query: Дай короткое summary по проектной документации + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-docs-summary-01-health** + Query: Кратко объясни по документации, как работает `/health` + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/README.md. +- **v2-docs-summary-02-send** + Query: Что делает endpoint `/send`? + > В поднятом контексте не найден целевой документ по запросу. +- **v2-docs-summary-03-actions** + Query: Объясни назначение `/actions/{action}` + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-04-runtime-health** + Query: Что такое runtime health в этой документации? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-05-notification-loop** + Query: Кратко опиши цикл отправки уведомлений + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md, docs/README.md. +- **v2-docs-summary-06-architecture** + Query: Как устроена архитектура Telegram Notify App? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). Файлы\-источники: \- docs/architecture/telegram\-notify\-app\-overview.md \- docs/README.md +- **v2-docs-summary-07-worker** + Query: Что делает worker в этом приложении? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-08-health-statuses** + Query: Какие статусы здоровья есть у runtime? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-09-manual-send** + Query: Как в приложении устроена ручная отправка сообщения? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-10-telegram-integration** + Query: Как сервис взаимодействует с Telegram в целом? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/arc… +- **v2-find-files-01-health** + Query: В каком файле описан `/health`? + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-02-send** + Query: Покажи файл с описанием endpoint `/send` + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-03-actions** + Query: Где находится документация по `/actions/{action}`? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-04-runtime-health** + Query: В каком документе описан runtime health? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-05-loop** + Query: Найди файл с логикой цикла отправки уведомлений + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-06-architecture** + Query: Где описана архитектура приложения? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-07-errors-catalog** + Query: В каком файле лежит каталог ошибок? + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-08-docs-index** + Query: Покажи файл-индекс документации проекта + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-09-telegram-bot-api** + Query: Какие файлы относятся к Telegram Bot API интеграции? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-10-telegram-notify-worker** + Query: В каких файлах описан worker `telegram_notify`? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json new file mode 100644 index 0000000..1042ef3 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json @@ -0,0 +1,311 @@ +{ + "meta": { + "case_id": "v2-docs-summary-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected grounded_summary, got insufficient_evidence", + "llm: expected answer to contain '/health'", + "llm: expected answer to contain 'status'", + "llm: expected answer to contain 'components'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Кратко объясни по документации, как работает `/health`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 96 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md new file mode 100644 index 0000000..793386f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md @@ -0,0 +1,360 @@ +# v2-docs-summary-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Кратко объясни по документации, как работает `/health` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Кратко объясни по документации, как работает `/health`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 96 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected grounded_summary, got insufficient_evidence +- llm: expected answer to contain '/health' +- llm: expected answer to contain 'status' +- llm: expected answer to contain 'components' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json new file mode 100644 index 0000000..8022dce --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json @@ -0,0 +1,275 @@ +{ + "meta": { + "case_id": "v2-docs-summary-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/send'", + "llm: expected answer to contain 'message'", + "llm: expected answer to contain 'Telegram'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что делает endpoint `/send`?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md new file mode 100644 index 0000000..1b91e04 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md @@ -0,0 +1,320 @@ +# v2-docs-summary-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что делает endpoint `/send`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что делает endpoint `/send`?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/send' +- llm: expected answer to contain 'message' +- llm: expected answer to contain 'Telegram' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json new file mode 100644 index 0000000..75b1274 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json @@ -0,0 +1,315 @@ +{ + "meta": { + "case_id": "v2-docs-summary-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/actions/{action}'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Объясни назначение `/actions/{action}`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md new file mode 100644 index 0000000..f83393e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md @@ -0,0 +1,364 @@ +# v2-docs-summary-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Объясни назначение `/actions/{action}` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Объясни назначение `/actions/{action}`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/actions/{action}' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json new file mode 100644 index 0000000..fc36a71 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json @@ -0,0 +1,301 @@ +{ + "meta": { + "case_id": "v2-docs-summary-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "llm: expected answer to contain 'runtime health'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что такое runtime health в этой документации?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md new file mode 100644 index 0000000..d197223 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md @@ -0,0 +1,350 @@ +# v2-docs-summary-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что такое runtime health в этой документации? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что такое runtime health в этой документации?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- llm: expected answer to contain 'runtime health' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json new file mode 100644 index 0000000..3ee99db --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json @@ -0,0 +1,346 @@ +{ + "meta": { + "case_id": "v2-docs-summary-05-notification-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain 'worker'", + "llm: expected answer to contain 'interval'", + "llm: expected answer to contain 'degraded'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md, docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 1, + "semantic": 8 + } + }, + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Кратко опиши цикл отправки уведомлений", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 147 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md new file mode 100644 index 0000000..c73c55e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md @@ -0,0 +1,399 @@ +# v2-docs-summary-05-notification-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Кратко опиши цикл отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md, docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 1, + "semantic": 8 + } + }, + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Кратко опиши цикл отправки уведомлений", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 147 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain 'worker' +- llm: expected answer to contain 'interval' +- llm: expected answer to contain 'degraded' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json new file mode 100644 index 0000000..a6cdc81 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json @@ -0,0 +1,421 @@ +{ + "meta": { + "case_id": "v2-docs-summary-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 19, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ], + "candidate_sources": { + "seeded": 98, + "metadata_lookup": 2, + "semantic": 8 + } + }, + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D2_FACT_INDEX", + "title": "architecture.telegram_notify_app:mentions_entity", + "document_id": "" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как устроена архитектура Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 19, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 600, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 600, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md new file mode 100644 index 0000000..62f3d50 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md @@ -0,0 +1,476 @@ +# v2-docs-summary-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Как устроена архитектура Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 19, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ], + "candidate_sources": { + "seeded": 98, + "metadata_lookup": 2, + "semantic": 8 + } + }, + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D2_FACT_INDEX", + "title": "architecture.telegram_notify_app:mentions_entity", + "document_id": "" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как устроена архитектура Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 19, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 600, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 600, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json new file mode 100644 index 0000000..c26e843 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json @@ -0,0 +1,297 @@ +{ + "meta": { + "case_id": "v2-docs-summary-07-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain 'worker'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что делает worker в этом приложении?", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md new file mode 100644 index 0000000..01a2efd --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md @@ -0,0 +1,346 @@ +# v2-docs-summary-07-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что делает worker в этом приложении? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что делает worker в этом приложении?", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain 'worker' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json new file mode 100644 index 0000000..53550ad --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json @@ -0,0 +1,305 @@ +{ + "meta": { + "case_id": "v2-docs-summary-08-health-statuses", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "llm: expected answer to contain 'ok'", + "llm: expected answer to contain 'degraded'", + "llm: expected answer to contain 'unhealthy'", + "llm: expected answer to contain 'unknown'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие статусы здоровья есть у runtime?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md new file mode 100644 index 0000000..4e552d4 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md @@ -0,0 +1,354 @@ +# v2-docs-summary-08-health-statuses + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие статусы здоровья есть у runtime? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие статусы здоровья есть у runtime?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- llm: expected answer to contain 'ok' +- llm: expected answer to contain 'degraded' +- llm: expected answer to contain 'unhealthy' +- llm: expected answer to contain 'unknown' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json new file mode 100644 index 0000000..97ab490 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json @@ -0,0 +1,313 @@ +{ + "meta": { + "case_id": "v2-docs-summary-09-manual-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/send'", + "llm: expected answer to contain 'message'", + "llm: expected answer to contain 'TelegramSendService'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как в приложении устроена ручная отправка сообщения?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md new file mode 100644 index 0000000..f7de916 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md @@ -0,0 +1,362 @@ +# v2-docs-summary-09-manual-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как в приложении устроена ручная отправка сообщения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как в приложении устроена ручная отправка сообщения?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/send' +- llm: expected answer to contain 'message' +- llm: expected answer to contain 'TelegramSendService' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json new file mode 100644 index 0000000..5123e8e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json @@ -0,0 +1,356 @@ +{ + "meta": { + "case_id": "v2-docs-summary-10-telegram-integration", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA", + "anchor_type: expected API_ENDPOINT, got None", + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": null, + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": null, + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 1, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как сервис взаимодействует с Telegram в целом?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md new file mode 100644 index 0000000..db8e506 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md @@ -0,0 +1,409 @@ +# v2-docs-summary-10-telegram-integration + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как сервис взаимодействует с Telegram в целом? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": null, + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": null, + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 1, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как сервис взаимодействует с Telegram в целом?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA +- anchor_type: expected API_ENDPOINT, got None +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-01-health.json new file mode 100644 index 0000000..9b76f8f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-01-health.json @@ -0,0 +1,313 @@ +{ + "meta": { + "case_id": "v2-find-files-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/health-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 7 + } + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком файле описан `/health`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-01-health.md new file mode 100644 index 0000000..f96df8e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-01-health.md @@ -0,0 +1,366 @@ +# v2-find-files-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком файле описан `/health`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 7 + } + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком файле описан `/health`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/health-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-02-send.json new file mode 100644 index 0000000..d19f694 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-02-send.json @@ -0,0 +1,313 @@ +{ + "meta": { + "case_id": "v2-find-files-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/send-message-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 7 + } + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Покажи файл с описанием endpoint `/send`", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-02-send.md new file mode 100644 index 0000000..fba7504 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-02-send.md @@ -0,0 +1,366 @@ +# v2-find-files-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Покажи файл с описанием endpoint `/send` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 7 + } + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Покажи файл с описанием endpoint `/send`", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/send-message-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-03-actions.json new file mode 100644 index 0000000..d2336d8 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-03-actions.json @@ -0,0 +1,319 @@ +{ + "meta": { + "case_id": "v2-find-files-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/control-actions-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 7 + } + }, + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Где находится документация по `/actions/{action}`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-03-actions.md new file mode 100644 index 0000000..786907d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-03-actions.md @@ -0,0 +1,372 @@ +# v2-find-files-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Где находится документация по `/actions/{action}`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 7 + } + }, + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Где находится документация по `/actions/{action}`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/control-actions-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json new file mode 100644 index 0000000..a8e745b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json @@ -0,0 +1,317 @@ +{ + "meta": { + "case_id": "v2-find-files-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/domains/runtime-health-entity.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 7 + } + }, + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком документе описан runtime health?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md new file mode 100644 index 0000000..24f6838 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md @@ -0,0 +1,370 @@ +# v2-find-files-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком документе описан runtime health? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 7 + } + }, + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком документе описан runtime health?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/domains/runtime-health-entity.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-05-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-05-loop.json new file mode 100644 index 0000000..98487fd --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-05-loop.json @@ -0,0 +1,311 @@ +{ + "meta": { + "case_id": "v2-find-files-05-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 7 + } + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Найди файл с логикой цикла отправки уведомлений", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-05-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-05-loop.md new file mode 100644 index 0000000..2cca623 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-05-loop.md @@ -0,0 +1,364 @@ +# v2-find-files-05-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Найди файл с логикой цикла отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 7 + } + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Найди файл с логикой цикла отправки уведомлений", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json new file mode 100644 index 0000000..6e82a61 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json @@ -0,0 +1,417 @@ +{ + "meta": { + "case_id": "v2-find-files-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 19, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ], + "candidate_sources": { + "seeded": 98, + "metadata_lookup": 2, + "semantic": 7 + } + }, + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D2_FACT_INDEX", + "title": "architecture.telegram_notify_app:mentions_entity", + "document_id": "" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Где описана архитектура приложения?", + "profile": "file_lookup", + "row_count": 19, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 670, + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 670, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md new file mode 100644 index 0000000..37499d5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md @@ -0,0 +1,472 @@ +# v2-find-files-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Где описана архитектура приложения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 19, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ], + "candidate_sources": { + "seeded": 98, + "metadata_lookup": 2, + "semantic": 7 + } + }, + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D2_FACT_INDEX", + "title": "architecture.telegram_notify_app:mentions_entity", + "document_id": "" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Где описана архитектура приложения?", + "profile": "file_lookup", + "row_count": 19, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 670, + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 670, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json new file mode 100644 index 0000000..ca6dfd2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json @@ -0,0 +1,317 @@ +{ + "meta": { + "case_id": "v2-find-files-07-errors-catalog", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/errors/catalog.yaml'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 7 + } + }, + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком файле лежит каталог ошибок?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 150, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 150, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md new file mode 100644 index 0000000..4944887 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md @@ -0,0 +1,370 @@ +# v2-find-files-07-errors-catalog + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком файле лежит каталог ошибок? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 7 + } + }, + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком файле лежит каталог ошибок?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 150, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 150, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/errors/catalog.yaml' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json new file mode 100644 index 0000000..615e745 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json @@ -0,0 +1,404 @@ +{ + "meta": { + "case_id": "v2-find-files-08-docs-index", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "docs/README.md", + "index.test_echo_app_docs", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/README.md" + ], + "candidates_before_ranking": [ + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 42, + "metadata_lookup": 1, + "semantic": 7 + } + }, + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + } + ], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Покажи файл-индекс документации проекта", + "profile": "file_lookup", + "row_count": 12, + "target_doc_hints": [ + "docs/README.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 2140, + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md new file mode 100644 index 0000000..25d41fb --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md @@ -0,0 +1,459 @@ +# v2-find-files-08-docs-index + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Покажи файл-индекс документации проекта + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 12, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "docs/README.md", + "index.test_echo_app_docs", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/README.md" + ], + "candidates_before_ranking": [ + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 42, + "metadata_lookup": 1, + "semantic": 7 + } + }, + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + } + ], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Покажи файл-индекс документации проекта", + "profile": "file_lookup", + "row_count": 12, + "target_doc_hints": [ + "docs/README.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 2140, + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json new file mode 100644 index 0000000..8fa580c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json @@ -0,0 +1,301 @@ +{ + "meta": { + "case_id": "v2-find-files-09-telegram-bot-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/send-message-endpoint.md'", + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 1, + "semantic": 7 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md new file mode 100644 index 0000000..d01a16f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md @@ -0,0 +1,354 @@ +# v2-find-files-09-telegram-bot-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие файлы относятся к Telegram Bot API интеграции? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 1, + "semantic": 7 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/send-message-endpoint.md' +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json new file mode 100644 index 0000000..0c4ba6b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json @@ -0,0 +1,319 @@ +{ + "meta": { + "case_id": "v2-find-files-10-telegram-notify-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'", + "llm: expected answer to contain 'docs/domains/runtime-health-entity.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 1, + "semantic": 7 + } + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каких файлах описан worker `telegram_notify`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md new file mode 100644 index 0000000..d76060d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md @@ -0,0 +1,372 @@ +# v2-find-files-10-telegram-notify-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каких файлах описан worker `telegram_notify`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 1, + "semantic": 7 + } + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каких файлах описан worker `telegram_notify`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- llm: expected answer to contain 'docs/domains/runtime-health-entity.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json new file mode 100644 index 0000000..d96e69b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json @@ -0,0 +1,344 @@ +{ + "meta": { + "case_id": "v2-general-01-what-is-service", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что это за сервис?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md new file mode 100644 index 0000000..f325154 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md @@ -0,0 +1,399 @@ +# v2-general-01-what-is-service + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что это за сервис? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что это за сервис?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-02-purpose.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-02-purpose.json new file mode 100644 index 0000000..5e3a597 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-02-purpose.json @@ -0,0 +1,357 @@ +{ + "meta": { + "case_id": "v2-general-02-purpose", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 2, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Для чего нужен test_echo_app?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-02-purpose.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-02-purpose.md new file mode 100644 index 0000000..61f9fff --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-02-purpose.md @@ -0,0 +1,412 @@ +# v2-general-02-purpose + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Для чего нужен test_echo_app? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 2, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Для чего нужен test_echo_app?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-03-problem.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-03-problem.json new file mode 100644 index 0000000..b1d6ef2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-03-problem.json @@ -0,0 +1,344 @@ +{ + "meta": { + "case_id": "v2-general-03-problem", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какую задачу решает это приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-03-problem.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-03-problem.md new file mode 100644 index 0000000..e39e5f3 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-03-problem.md @@ -0,0 +1,399 @@ +# v2-general-03-problem + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Какую задачу решает это приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какую задачу решает это приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json new file mode 100644 index 0000000..1af8d41 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json @@ -0,0 +1,344 @@ +{ + "meta": { + "case_id": "v2-general-04-docs-contents", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что входит в документацию этого проекта?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md new file mode 100644 index 0000000..96d9488 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md @@ -0,0 +1,399 @@ +# v2-general-04-docs-contents + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что входит в документацию этого проекта? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что входит в документацию этого проекта?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-05-main-parts.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-05-main-parts.json new file mode 100644 index 0000000..9d1deca --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-05-main-parts.json @@ -0,0 +1,346 @@ +{ + "meta": { + "case_id": "v2-general-05-main-parts", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'систем'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие основные части есть у системы?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-05-main-parts.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-05-main-parts.md new file mode 100644 index 0000000..3af825e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-05-main-parts.md @@ -0,0 +1,399 @@ +# v2-general-05-main-parts + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие основные части есть у системы? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие основные части есть у системы?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'систем' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json new file mode 100644 index 0000000..103eed5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json @@ -0,0 +1,346 @@ +{ + "meta": { + "case_id": "v2-general-06-high-level-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'приложен'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как в целом устроено приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md new file mode 100644 index 0000000..e9ffca4 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md @@ -0,0 +1,399 @@ +# v2-general-06-high-level-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как в целом устроено приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как в целом устроено приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'приложен' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-07-besides-api.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-07-besides-api.json new file mode 100644 index 0000000..2c24326 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-07-besides-api.json @@ -0,0 +1,344 @@ +{ + "meta": { + "case_id": "v2-general-07-besides-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что тут есть кроме API?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-07-besides-api.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-07-besides-api.md new file mode 100644 index 0000000..099002f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-07-besides-api.md @@ -0,0 +1,399 @@ +# v2-general-07-besides-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что тут есть кроме API? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что тут есть кроме API?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-08-components.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-08-components.json new file mode 100644 index 0000000..219e609 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-08-components.json @@ -0,0 +1,420 @@ +{ + "meta": { + "case_id": "v2-general-08-components", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected GENERAL, got DOCS", + "intent: expected GENERAL_QA, got DOC_EXPLAIN", + "anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE", + "llm: expected answer to contain 'Telegram Notify App'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 19, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ], + "candidate_sources": { + "seeded": 98, + "metadata_lookup": 2, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D2_FACT_INDEX", + "title": "architecture.telegram_notify_app:mentions_entity", + "document_id": "" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Из чего состоит Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 19, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 60, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 60, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-08-components.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-08-components.md new file mode 100644 index 0000000..3e83cb0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-08-components.md @@ -0,0 +1,473 @@ +# v2-general-08-components + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Из чего состоит Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 19, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md" + ], + "candidate_sources": { + "seeded": 98, + "metadata_lookup": 2, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D2_FACT_INDEX", + "title": "architecture.telegram_notify_app:mentions_entity", + "document_id": "" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Из чего состоит Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 19, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 60, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 60, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected GENERAL, got DOCS +- intent: expected GENERAL_QA, got DOC_EXPLAIN +- anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE +- llm: expected answer to contain 'Telegram Notify App' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-09-reading-order.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-09-reading-order.json new file mode 100644 index 0000000..29876d1 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-09-reading-order.json @@ -0,0 +1,346 @@ +{ + "meta": { + "case_id": "v2-general-09-reading-order", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'README'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие документы стоит читать сначала?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-09-reading-order.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-09-reading-order.md new file mode 100644 index 0000000..b49f906 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-09-reading-order.md @@ -0,0 +1,399 @@ +# v2-general-09-reading-order + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие документы стоит читать сначала? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие документы стоит читать сначала?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'README' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-10-short-summary.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-10-short-summary.json new file mode 100644 index 0000000..dd8391a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-10-short-summary.json @@ -0,0 +1,344 @@ +{ + "meta": { + "case_id": "v2-general-10-short-summary", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/README.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Дай короткое summary по проектной документации", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-10-short-summary.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-10-short-summary.md new file mode 100644 index 0000000..ac3e1ff --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/full_chain_docs_v2_matrix_v2-general-10-short-summary.md @@ -0,0 +1,399 @@ +# v2-general-10-short-summary + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Дай короткое summary по проектной документации + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/architecture/telegram-notify-app-overview.md", + "docs/README.md", + "docs/README.md", + "docs/README.md" + ], + "candidate_sources": { + "seeded": 0, + "metadata_lookup": 0, + "semantic": 8 + } + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Дай короткое summary по проектной документации", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/summary.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/summary.md new file mode 100644 index 0000000..632bd37 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260406_222632/summary.md @@ -0,0 +1,151 @@ +# pipeline_setup_v3 summary + +Passed: 9/30 + +| File | Case | Mode | Query | Actual sub-intent | RAG layers | Tokens | Pass | +|------|------|------|-------|-------------------|------------|--------|------| +| full_chain_docs_v2_matrix.yaml | v2-general-01-what-is-service | full_chain | Что это за сервис? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-02-purpose | full_chain | Для чего нужен test_echo_app? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-03-problem | full_chain | Какую задачу решает это приложение? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-04-docs-contents | full_chain | Что входит в документацию этого проекта? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-05-main-parts | full_chain | Какие основные части есть у системы? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-06-high-level-architecture | full_chain | Как в целом устроено приложение? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-07-besides-api | full_chain | Что тут есть кроме API? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-08-components | full_chain | Из чего состоит Telegram Notify App? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-09-reading-order | full_chain | Какие документы стоит читать сначала? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-10-short-summary | full_chain | Дай короткое summary по проектной документации | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-01-health | full_chain | Кратко объясни по документации, как работает `/health` | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-02-send | full_chain | Что делает endpoint `/send`? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-03-actions | full_chain | Объясни назначение `/actions/{action}` | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-04-runtime-health | full_chain | Что такое runtime health в этой документации? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-05-notification-loop | full_chain | Кратко опиши цикл отправки уведомлений | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-06-architecture | full_chain | Как устроена архитектура Telegram Notify App? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-07-worker | full_chain | Что делает worker в этом приложении? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-08-health-statuses | full_chain | Какие статусы здоровья есть у runtime? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-09-manual-send | full_chain | Как в приложении устроена ручная отправка сообщения? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-10-telegram-integration | full_chain | Как сервис взаимодействует с Telegram в целом? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-01-health | full_chain | В каком файле описан `/health`? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-02-send | full_chain | Покажи файл с описанием endpoint `/send` | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-03-actions | full_chain | Где находится документация по `/actions/{action}`? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-04-runtime-health | full_chain | В каком документе описан runtime health? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-05-loop | full_chain | Найди файл с логикой цикла отправки уведомлений | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-06-architecture | full_chain | Где описана архитектура приложения? | FIND_FILES | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-07-errors-catalog | full_chain | В каком файле лежит каталог ошибок? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-08-docs-index | full_chain | Покажи файл-индекс документации проекта | FIND_FILES | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-09-telegram-bot-api | full_chain | Какие файлы относятся к Telegram Bot API интеграции? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-10-telegram-notify-worker | full_chain | В каких файлах описан worker `telegram_notify`? | FIND_FILES | — | — | ✗ | + +## Failures +- **v2-general-05-main-parts**: llm: expected answer to contain 'систем' +- **v2-general-06-high-level-architecture**: llm: expected answer to contain 'приложен' +- **v2-general-08-components**: domain: expected GENERAL, got DOCS; intent: expected GENERAL_QA, got DOC_EXPLAIN; anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE; llm: expected answer to contain 'Telegram Notify App' +- **v2-general-09-reading-order**: llm: expected answer to contain 'README' +- **v2-docs-summary-01-health**: answer_mode: expected grounded_summary, got insufficient_evidence; llm: expected answer to contain '/health'; llm: expected answer to contain 'status'; llm: expected answer to contain 'components' +- **v2-docs-summary-02-send**: doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/send'; llm: expected answer to contain 'message'; llm: expected answer to contain 'Telegram' +- **v2-docs-summary-03-actions**: doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/actions/{action}' +- **v2-docs-summary-04-runtime-health**: doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; llm: expected answer to contain 'runtime health' +- **v2-docs-summary-05-notification-loop**: doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain 'worker'; llm: expected answer to contain 'interval'; llm: expected answer to contain 'degraded' +- **v2-docs-summary-07-worker**: doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain 'worker' +- **v2-docs-summary-08-health-statuses**: doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; llm: expected answer to contain 'ok'; llm: expected answer to contain 'degraded'; llm: expected answer to contain 'unhealthy'; llm: expected answer to contain 'unknown' +- **v2-docs-summary-09-manual-send**: doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/send'; llm: expected answer to contain 'message'; llm: expected answer to contain 'TelegramSendService' +- **v2-docs-summary-10-telegram-integration**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA; anchor_type: expected API_ENDPOINT, got None; doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- **v2-find-files-01-health**: llm: expected answer to contain 'docs/api/health-endpoint.md' +- **v2-find-files-02-send**: llm: expected answer to contain 'docs/api/send-message-endpoint.md' +- **v2-find-files-03-actions**: llm: expected answer to contain 'docs/api/control-actions-endpoint.md' +- **v2-find-files-04-runtime-health**: llm: expected answer to contain 'docs/domains/runtime-health-entity.md' +- **v2-find-files-05-loop**: llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- **v2-find-files-07-errors-catalog**: llm: expected answer to contain 'docs/errors/catalog.yaml' +- **v2-find-files-09-telegram-bot-api**: llm: expected answer to contain 'docs/api/send-message-endpoint.md'; llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- **v2-find-files-10-telegram-notify-worker**: llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'; llm: expected answer to contain 'docs/domains/runtime-health-entity.md' + +## LLM Answers +- **v2-general-01-what-is-service** + Query: Что это за сервис? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-02-purpose** + Query: Для чего нужен test_echo_app? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/arc… +- **v2-general-03-problem** + Query: Какую задачу решает это приложение? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-04-docs-contents** + Query: Что входит в документацию этого проекта? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-05-main-parts** + Query: Какие основные части есть у системы? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-06-high-level-architecture** + Query: Как в целом устроено приложение? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-07-besides-api** + Query: Что тут есть кроме API? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-08-components** + Query: Из чего состоит Telegram Notify App? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). Файлы\-источники: \- docs/architecture/telegram\-notify\-app\-overview.md \- docs/README.md +- **v2-general-09-reading-order** + Query: Какие документы стоит читать сначала? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-10-short-summary** + Query: Дай короткое summary по проектной документации + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-docs-summary-01-health** + Query: Кратко объясни по документации, как работает `/health` + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/README.md. +- **v2-docs-summary-02-send** + Query: Что делает endpoint `/send`? + > В поднятом контексте не найден целевой документ по запросу. +- **v2-docs-summary-03-actions** + Query: Объясни назначение `/actions/{action}` + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-04-runtime-health** + Query: Что такое runtime health в этой документации? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-05-notification-loop** + Query: Кратко опиши цикл отправки уведомлений + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md, docs/README.md. +- **v2-docs-summary-06-architecture** + Query: Как устроена архитектура Telegram Notify App? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). Файлы\-источники: \- docs/architecture/telegram\-notify\-app\-overview.md \- docs/README.md +- **v2-docs-summary-07-worker** + Query: Что делает worker в этом приложении? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-08-health-statuses** + Query: Какие статусы здоровья есть у runtime? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-09-manual-send** + Query: Как в приложении устроена ручная отправка сообщения? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-10-telegram-integration** + Query: Как сервис взаимодействует с Telegram в целом? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/arc… +- **v2-find-files-01-health** + Query: В каком файле описан `/health`? + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-02-send** + Query: Покажи файл с описанием endpoint `/send` + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-03-actions** + Query: Где находится документация по `/actions/{action}`? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-04-runtime-health** + Query: В каком документе описан runtime health? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-05-loop** + Query: Найди файл с логикой цикла отправки уведомлений + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-06-architecture** + Query: Где описана архитектура приложения? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-07-errors-catalog** + Query: В каком файле лежит каталог ошибок? + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-08-docs-index** + Query: Покажи файл-индекс документации проекта + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-09-telegram-bot-api** + Query: Какие файлы относятся к Telegram Bot API интеграции? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-10-telegram-notify-worker** + Query: В каких файлах описан worker `telegram_notify`? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532.zip b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532.zip new file mode 100644 index 0000000000000000000000000000000000000000..87e20909d8e55e81f30f13a2eee86c68370fff0f GIT binary patch literal 143270 zcmd43Wl&_@madz)7Vhp=khnV(6z=Zs?(SB&yE_!_6otFHySo=&z@_#%J9_tbyE{(z z?tA-W#K^h+2Zc0PwdDDJy*fKv|d1nOA+ppHc2_vq1x(|6jA=e9We+D=jE2tEff~ z)cwoE|IxhtAM+aOp&Od&8R%U}OQ~ETs)Wh;fyQEiQ6k}j*b^fKK1N`NfkqP(3(8T5 z4Z;&0h${AkAz?~SOwLQvQVogEf2JCtmmHTIlaw*mGcve}+VFN1T3#0d$Voy$18hzC zRX$c+@Dcy=?Qj2bFGT*0dtu^iWu(iWE;spC`?i7h~jcGNzAz>6Awlp4NI zCY?hdf-U!WJ+3cR(q>qDIY6HXv4OWqfc_PmlSKfBK2%7Y zsCnfZXLye(F(1h{v5ojW;Tw}j!y9DZpST@39e8g-SEqw}uUF1DsyA#;3|_%-K0V@@ zkK9jU(Hhu%mAAh}`=?W6&YCd$rC26#gDM_rx@J|Ih9q9LClZoaxd)7cvcS9}t9;mDzl`1`VGHQ)aUWb0B3?sKe0P?l1d0F;&k zsy)3na$V`ysFKX|O0GoJi?ya2Z}vOEW>I-XQ> zuFgKl@r-=$f@80l1(rx}ro|pC)gCS*>z36zBm=~+z@%f6I+Dlh3l~q{#S0oIbSuAQ z1)7x(;pt1+2UkRdgWr6A5AGV1%}&vr7`y(Y;#kB>>L&6u0Cv_ zTKc9#nxAdO+%{16j?R4e^; zg4coi$zqmXx~uGoof*s?Bz<+8Pi%5xQ+;zNQn(U#B2&pP&kn;p$Vf1-d{DB&X1SKL z9Ee8~-J(=z(-)e?LOZ5|=rsb~eCI{L3j{H0F20C9{}FsOTwsI@VMCS*=g6|94B<_2 zmSkcp`|}2z_UzHBK8lm_3zahpCb@M*&)h<)xpMIrgP${FRjeuBrHQRw`qQcpB4I1+ z=Y=LD){XJm4jOhS@`uy~>VtQYF24+jK=hE)XanRoQh#A_Nr25uW!o)hk$GL?R z`O(-}=18pU&o|p;7KAGba?+pIGkTLdu)xMk3b+<%NmRxu4>`=B5g4*6H|zpz2}iu! z>?lfxU34nO87d0NQ5&nuFbX^y3d zD-g@DvdI>yw^pLZlw8J36k`Jje+TINs0E;+>;~)y*E5+D>CMD1PFGOJX(_~xA-X}_ z=!ViG?Ym-F2i?tI-Cc>?gy5MB#)G-iE>{V7+zH^o6mdaQ1ka+Mw|$G%;3++5@WigF zE<{LDXa{oYi@eXQLyYp4*QmRx)1RZNy=2dVRu>gjiPlektL zuvRhNanZx%`@DH$QLWPmQrT1on}Iy?uQa0Ar_-kraioC+!1Hli<_eph9W91bz|VDK z?!u~179-FHAhTfUq1Q>cQoy$ev(Cgm>WF?c1c+USZIv)ry7kCVsg))cHg?gkM~r-* zWW1bdzQb1#DdFxjPw^3G2j((aMJ3bv!6=%4*6VRwf#6gb`BFfmY$?pAE%Rd#@4+k# zDtt(#A!>wqASD{|7ZuN$YlQ)>YP5c*Cz3IM@`Y#+aX%E+Bg2JTT(_uTZe(C&O1C8Strcr&t zFR#pR7M~Y$Dchnaz3r>ZLCqZ(l16M8qi!QYa90m0&gU~k6QGf;kSo4d(PdFfk%-WS z4k$?4O!k)BzJvY2Qa)X@GB_jvAVBaRVM*>Eq52o3en9rWolyT1DE@0&^5vgFF)N*w zt*srhSYJW3JnL|y0j6sdmo#D%pL6CM~wqz9R~?cH-1r< z{3WSyp^X84Z+ftCQ0JL2vI#QN^gZC7&{?cq^?T?!2WJZ(md1n~$7GD~%~6Q)9gkdt z>mpZ=?Qdg6m>^D$sf>zhgtW^oe$2g-tqA3m+uUZ9TX6zd+^}NvjW<*nq5Cqp**6R+ zF`~y9z0cwlr`{v9Uu$3YYW1C1rjyKE0G>H<$2KFgh496ob(x<3#>**acc5hg#b2R zF>M%X?t~UUUdV4jB_{A+wHMngyIBOdyK7775e3!4HQ64}B^qqZ_n(1;jJQ!w`edce zCyxCgW5wb2n;cH#jy89ZL#D$Pb1KBn^|4!Fy}XqqG(Yc-Hg>-#rH&jLg=vXcCYK6WfqXTw~?p+mi_!&Wd#;Hq+{G;=}$7QEbVT z29v7@qhVIZthgfa``7sW!9wqO{`AUOK>dP(Y21>!hLXrg>rc(v?jmN|#X1npW*C#{ zgwWMC&%KRL0vCE5t+?p)wLCj;=nfA@royLU8c;BwsgU;)^tf^MB7OC(SUlYaln@Oq z4qIp;opY4&hx{k2`u=%dzy13J?In1zFF0m7xDzif;#E)M{_#0U!Zc z%iik`K_Cgff*r(IV2rM$DTHX7ylC6m6BF_adt)N=z!e-9WiH<;oI$B|781kN8*9%9j2ox_U`vfb((w6 zGe(N?R=1%3XpE*&UlJ6{qve`>Fmq*~lHt^?r~nZ-_e*6>NwAiSlI~nBW8C_jCBlS$ zJmv97mD&JiD>Y$u)?xejmfQqWTE3%)sJo!U<`NUG_Ux$Y*rg-rg^b#@wop^7jm=k! zil_d7KVz~PL&)S8M(wrj zmtHKIPYfO1-Kd|R{Q%e1At6Wfcs=ITSG#k5$J~1y^BlPCz-++EBy<3wifwV#PfZ1$ zsl%qJO6a#v_8-OV@+Ag=;$D(MzaZ+HFPqRcT|}Z785Ym#wD89Y43gJ77YWpNc7{g^ zae;l6{P{v#3J1-)Ld)YcVz`KC&n{+$H5?N6_5=RCh_4phY0kl?fd)%Eqq>f_0S!#z zxTlJU7DLySlAq{03|9`dEM9ErX*B>ziA7_2(OqK{AT(PvpArHiwRld`=8*+U_YQV| zjm+|=O*auaf=qkXX%lKnL-iIP&bwAj5fDr_NTWlp~~uMfpi zCaOBwvOCQtnP!>;@3GDT7rwueUmk|UVwPGy-~XBq6LSi5z)n~7@UU=$yeRY}A#P2x z@zp=MI?KG(|Mj)F{?(zNV(ioT%I^E$q+|Iw{}+M}MynD3BcuPyE7|`hM*kn6>kpp) zClG!87qu+ZRY;CRY;7-TDNM~lOZ{=k6@5p7-k5!s~#Gmn8eO(6kD_X~c zVx#~SJC?A5a`|P2faaWl8K6-f{ZsEnEw8?-X&bX;4U&S;93d;Fxu^17m90SjR6I+p zs#>S~mcUf4oYm0vm^vcFKa?;cq@3Fb!}8DExc zL~P6+@o4lD#7?_ zGiWtiqcoH`q8}WKt=VEWE|oP#yV=>s$y`0yQo_J8jHUhLv8!X~%$ps*4ID3KZ(dx$ zK_nPZ9IIa;$t^z(%(k?um`S?Zk9zrjs(BsY*H}s}MC!2`$q_A?M)^QIg)&_|!29b0 z@0E8z_Od}3bD&?*>9Oohk^$jhQT!KViU9!H!x!f@ioe?KIwS6iOz;Jce8bQPC^uOT zf$|zaVmh6pA$$4tw-Xo1lBW(OSAQcQ^}Hv*lD@FYBBN}gj4jiX$%?JDpOF@gYYlQT zz^!OfDMLasHP!2uDq4SW9UU6%V0q01y2}a{-EN*PQ%IOeghTJfsJA;nlmQ}=SHurj zEWOeYS>3Z{MomXkaCKH5L(TdNs{s)J%_SF|A;m-J+C=sHkT@c+swm?7^$rcNDjWeE zAK}FVEHT2`Sq<})k=e=p8%ccAqRK+^(fWYO?#AonjCS%RkwlY9GeNWztp&En!|nMU zJsb19+7-=$H&*p6n3(}kD)-LR2e3Th&F-ZmiB=-ae9-yzmXi))6RZ-p`N~1#VCT6k z!1M(a4zQjziZ(&M&zhoIt~Lc)q$spXrD(NKx`a?dXHateAiqEKD|+)Me{*l68-tYzz|BP{l=C@qevmV}8$l|o^otthaOMb%c~{7Q zxy6_C+Pr(Em0Sr8CHaIA1(vnaf#&j_^a)iP-Pgxt)++O;rb@wma?WhBQBLma9UFU8 zT$qq2PZs#Hw`=jZ9l@?*(auld_LM1YmhfUOKW4Sf!U1MoKY1@2VV&;NzPbldaHK)) zu=>ujW;Y%95J-vZoSf+&q(e$-^pei?S1|NjM#sme&lA|8HwPZElSNb;f{L>Qo_Uv) zIbA~i{xx?sDnF9SWD!rQD$EJ3J^s*wuh=D7szzeZ!auNBHlvOet@W7(wvS^+HRdf$ z=S~MJ-z!?)O-JmTWB^05dU5wq9$Clmez-K~k{;rgJfXW`X@aaG|EALN8fXcxGx}Zz{)bBOVfN2g%pzUD0>9dAJQ@r)?kL6^RffhdM z(zkvjtr4gj5Ha2;d~H;hqb{iJ6IGHW;ivcF?}$QHEWirJn8vEfVF#fEdm|3O=geeW z-|sm|QsNt1qY4sLCB!@aOOu_@+L*U;J&Wu)Q^UjWlgxZ#*^FA!$8h-bm(>?l%*L!m z)jlva%xjK;jtz~3XZrWqobmZS=7n>HE|I|(+>xG&{GEwbK)S-sA2S$GP)9)ET77>< zim9HrP!dqK+Tq|FWUyXe`;x#hPmjhYhzcuaQ`sdrmWG{C?yVrxc3W+hCnZVSa^yxKH3McHTfluq0X0X|(bKpd7TJMQ zLL!z4lFm4cT4Y>pFEO7IZs#$1dZt4__0x}DCA+}Ji)=zHsnFu3uKl>1~iGN zbd5o$aEMWH&2J!o#QV3XhTHg$#Go4Q9}|PWQd0h(NDTf; zz=J&^H!2A0!(4vW38e+||g4|2u%M65pSxEDplD`t&NpDT#ComL= zYtj~tIKdK;v|VvFz{M1UQ|wNF0-f*?$Rgb*iSH^yLRZ*O`2t^wv8|dSDawmTiv1fd z|YY?cVHH2rP znp^P^v>6c=X7U`T>eYXbTf(>Kmgv=K=LF}v+jVxtW|s%1x^M*X zfg3$n+YFv1@0J8qf!0;b_#=5}W!m`ru+Jo)3+j`Z)5(g{y}t#|oRf-`{sjLr8=74x zm;g8aqkuwa0}U(|406!y8gb1gPM{rd<*GwUnpimGmMaJu$y}6{VIQpY@XaAu`Q=H_ zr8Z)E5QruZxK9t`sE3u;jg5u0pe6_ABuP70DHyPb12quGbIF`H}w zwZW&n%@M|RpWTqA$8OyS4g`F1sA*f*qq~_~b2Y|g>>~aXAHIG%#;2tXBCId6gy(1H z2``#2nuvtHS(vTu;<0sY@2`n!@!=u@lm@bO-g!a59di)oNh^-syE1+TL7dt7z{Ys! z9DM({z{@Ri`ZYL z(D03g#d1Kl`cmk@n@mL_k#0z37|w{LyTEMJj7%7UJU(XABs$Jf&VDN~zZe!&uUgp| z0QJv9QK26~-Y{-UJ$}yza%}hjf)&2GK<@1(sOsf?ID0g7*uBhWCCxmH`BD;{+mktm zBnzKP8Zq4}9Xj<|6Y@m?FUDBrRK?s=Ku&fBI5%5t1E0zDWAPY$>vQ=z6$dr<`Y^Fm zFgOV{zrjz{yW~;)zBIpzh_uU9t)q1#ghR=DG>%m&dZ$tGX`uv!6pL#UZDYq30@)(k ztnEGmx-x{@=UOI!yr1dHUX{XX@V-k<6`i^Bf|zo;l49D8XuoeC;cn+n^YzR1XVc$Y zKHP5*m=lAY+q2&vy?;~t91^{v&TRG(#$J*#WkvZ$P3}6DOx@2v=GV!Oz3ADrkfr=k zSfBw+ZhXteM4ec}V{9?g7?OmC1s#!o=gaUDsn*qR(1y`#kB_TP4#17iJdmMi> z_BtrcJ33ol%=?B-xY7U4p@wbu zq+0=7Z3pokEZHAXX2qL>-b(d`WOHb-`B?!kWl(Z)5yl)j9Zq#Gh0N#JlW(%awCqcO zAk#IG2`wJpv-39=eA)sg7mliM^=?p_ud`)O61M^wsYf2M9AEBa`l`sh+jOJIDMu_-D*u$9itbvSb65D6XA|n% ziH&@k=0Ib~``_5ik{_Xo{=sI(eHvdR?D%3~VgYksS`5A8J!(bQxo>b4?D(HvdZI{1q%;9)|=P=|x z)24hG0N($_+qkvr!3%xCdCy(y&a#nf+NTgN7ay1_j>CA+ zJGz(g$kfqLtSN)VD9>Gv%yjrnz{Rjg=IFYDdp^Ff-YPOXW*p`R&pP{3+3@viTf@=% zin^|?wNIK0Pdd^+HiJ;qq~_RRj`&u>zqVQ~eGh^njnB zA@tF6qTAR~#NOOJrL6S}wGZ!TNjocmoN~Ao`viuzXz+>F1IQCAOdIsWFr+k7wD_m1XM!{{`p*3npP5loyd zeP1I?lrn~(Pi*)=JRr7*f3!9Dc(lpAf&1g5c7~VWvR~x~9bVLfqd#%{9&Hgb1%Zy}D^8=IzId?FKlXHwXm@>j|q{TQvdZ(^8mQTMS0=##< zyJ*=Y`S2>8iPFL`kqd4{SM|s#N=C(8y(G}N*wQ&tt3x=C$1+ieif%1a*MYhJ>RyV})zh{M*zXem*vc?Rcw-p4DAA~5zVi)cYZ>4;g^j$ zAr|?6(N}tW^Fd4GW_5#yBPr>72Ax+|Qw*@~kx>mnGJ#1{gCd1gqU&?_Wx-{qJ0?4lbG|o=?X+L%|7LrMnbGB|98^uVgO*Wh%=a?bz^Yi-yk!>F2~zp2 zp5!a%gOjS@738C5@hle9tGx4GG~io3*D~?)`#3mVmDyHRY0vvD(=p1|f9IeCq{E95 zpChOKHVfBYpxhP7eeC5R362$y~*M zLgxM#5%WJGbg%y6flK{Yar$9@yPD}c(V2fZ;>Hdx=7z@quHZHP!0F%P9DDRb@LpwC z6TxGdfwX5fVCuqlv&HAu?moxmn+49NYl&;#CTS})>0{L>vQWpeQBO(Aw%?y{An$NA z-NMZgI-5|37m9}~WaUHPVAl*~Eib!Yj+woO6pyQo6)@kf@bUC!$dHq+`30wKj9Y{* zOUc!*q<+6}DpTFBqe(lm&l*<}@;ZJLGA$gJ4)Hw60Hiou)U7|0oFc1oY%;GW6uQ>S zw3r$Qehw$Qp>yXEcJ9`&!Zz^=&oAP)ukTL6W--KYZYRUo3i zc37ERqsVe*dEzi&#V~3=m0u>REKYyy_QcifBT?n-zzCc$PVvG=e_qLoic+p@^-!I~ zUqy{BYyFUqBE4XK-L5!x&m3+sLv~~8cI6rQ0qxr(kxmZ;xDkkW;GgJa>G>>$gX?_7Y@-!@!^F>l( zvZYIU@1`}6ARK;81la|_H`dU!i1cS4D1Zzs01yz+f2WtAS_h_8kd_uzauC>FnoBQw zKZ?`!f9jJ7Q*1<+L7&rh_P{E$Dlx&%DHm2Xi*YR-#P{Sg?CEA^*%;muxq@_Z^skmp zqI>Datt3ws=QSy%5_T7A(!9f{(Zjh~6PgeBvKmrvs0#J<>H(f5@*ZTJBx;Kl?;d4A z#{Y;s^-QgG9&WFYpGAz{O;gf?`v=W8p$5{fyia;U&lo2_QKzy+a+FsZlGP#;D|HT%)|!>7TCeF7bN?VBJRB69*$Hr|RLc zhwZU@K0gQ1D?TMFxOACzjLw7}oRHXCfahRW@>CcNWq4(5W7~CP5%Y7;^jM`|SQTz8 zd+iXQ;~(Uih+`_)9)SyAbw?e&gIuJ3yQGL|WrQpE88doRzE##mhAhQp64S4eX8RMHDu8`(aD(;{p(lU$lgwusmSE!y`YYhQw zZBMrYEDcdY(y3EerGk-KW!%?9G?UTa6>{mA;Y`9@sW)}KMo)P>!bXl?PR@pJ`ckFj zV?S3BFimvDeH)eH{ox>HR_oBroGW^0B3er>m`5HRZxqpp-yN2F&(_SHaO8WlN<%?} z#Y&sp5|s#R2todH-?m?Y$uMfJwEVsH=Db8*MD>fLmZk~1q!=|mzG_YG6f|i=g-0r) zk1B*Szguu)PPqqto?Jix?U8UWB%Ioo&^5f@EFRb+h8AS+TV;ci_!(cRRB1)aN=r6H z_(;anom9_ALS+q?#7JUBK~D%Pszf}a@SUeBD0G|Q6{CdI;PU-CZGaI*u!O=SxROQ$ z;ncCh2yl4CyhwIK-{_lGZ);VHYMMp3))|h2uu>Vtm6cuM?3_?oJDr(Dp1(M!dYKM| z{TTJ#b)J^7l$K0Nfsf)jJI$5&61z}awbqH()!C*~=6h!T8}!C^if1)xHH4(zQj&~gGatZxSaD4(kh>V<)dvwHjtgVNtQa7pdh~jjMa*!?-XhnZ%Iu!r{B@RT59ccYN$IK`IwUwAqaG#(G z6*HQhcg!FPnPYjmte!YZ?znVVh3p`<%(sUxwOI*QY}MkPO&n9rWY(ZfhS->v+9$q@ zEuP_&lrZQ}s2WZlmRHt4qFvU1&@)#EdpDTaE0U5Xh{;w-Y?lXxAL>aZ6`1C1H<0U^ z)}hT6Ir?T%x?o88t;%-)yYbEHWd^Apz^PZ>;6h`)&GXX5Ls5 zY#kiw4E3G#t!z#I-Sp+}m3Du|bM^n_2u%K|wsWs-k4|V1(1GoBfd#8oEJT><`2?+z zzHUqxM5z%*Dx$WP1KLLJX!*yz$I5W;}(# zMZ6MJzv8U62}ZtMU!bx;YA9IN_KHJ{J)*Cd-01flU|^z9xp9icNraCnwR+wcGHoK0 zWc7LPLVA$1|mJ$gWcIk8uzF$GDgKFz&TUkH8kSKa6{ue=+ViPH-}m zR7Iq~)Z3+JoJIBNZ@hO9sCN5MtFTEx=HsJO23W3`;f(t@#SFDNSP~$5>P-&QnZ(7C zK*7GmJj2!y>3;36(GHWPv&Xi`#Uw*X?3$&IN4zB{($jXN8_{H zj*3>k=9rh!#+UcSfycZ4q9-K;#!hJUVM2%OMp}NM#i!KN^|tr*_GHKWe&n~Ocwv2M z6YshD&Bb(#u(0#SqFwrTgmpL78*44x3{ z%6*AoQJK~t;Bm=AfGVTPma+@q8Dc98p|m88zfTrf7tdv z2@+@pC#*-?#_nM!$+r05gikVFm#p4ebYG_M9-Nxi9mi>O!+J}VPBGBR2NaZ5D@Gn^ zY1GaoRE(!-+HTB47U4JN|Sd9zJ9PIUf%3$(ESo+M=2`=6d zl>l}G1M@|}XUMHn=&3=F+IY;kX&ze)?&*$j+pacUR@mHgPopn-^bw0oYW1gxbYzw> zjAe5XWHioVs>~4KJ4R>J`yU^RQZ{S2{&9Z~3Xdb}caW^??&7uj?-9W#?2(*7Te}U- z%wGmKhF&;1Tt&&2f^r1__U>O;ipz!QDp|CReOp46=Xg?%N#(GGX&nt4(*r(rM^`;k z;?WL{XexkgUYPR~b2FLfR8^Mm+m5Jc;E5Uc-pR?vVXG7?PYUO{;!P1nt5Q9z+xFiI z+rW)FrLu`6N+9Wi_Lujb_QZepEKBNMo~|eG z#eodla(p1!9($C|;AUe8ffT8>C z)*b7$m=(e*)Y8WsLn#f&1n!uET%Y z#Q)cY1nhLKwhorY4*xE)|J2?6J^mEP|80w1l@=VlLoGR>f$Bt3f5`@y#U;E?6bF33 zKsvgxGDXWJC6OEp5(UayRwN?Z0!HwxSSlPWGD~6&59qB&6 z+7TqAqp?8n7z1_6wo*6-Qo;vOrquk>B*K1&W&|k#1K&Vhggu2n-;2h7ECXBSrmgw5jjIk|x`j7$^%CqgExJ+L!R$h0&FG9nT&v@4# zFIKs~H#dhHb?3LUZ^%N9;LWm@KK4OoyvU`P3|7A zGhk63Jd5z9yk33e@j=cZ@1z)f{1wvoQG5*Fnb}tzPkE5gXL{UedM!!D`)yL}2G!^1 zKRPR8%Uwfhn~zIKDFd-h(@UfIB;B6iRzyvDUfdEDAQc}-Z}i-1c3 zLHwGU4A9wJ=VpfKuGIu+*Mkq2NFVmV06Xp4j=|nN>|OyHYuX}~8|||(BVoX31|_lk zo*!{O?y^u`pdQ$mf-=N{tsMB=#KFJ+~)IXUMU8Xn(eVAg;H0mQl7lVL8gaN8wX})0!Gww7M<)<{2K@~VlPr6utPEjYX=Bjz8wk)CBG4514c2M|Z#g6<9^>kx)4<@ary0Vg0vMmO~wBf5fP)4bV zLO5AD`dvU;r?3*h*e-BWAW!#%os+#Jqu=ltlcVoyhm#X8VXtWz@onF38Pd={(dB}4 zx)MZd^^vb!v=AGa=nPAT#(^JJ6o$nOUK7fcOz69cZwyD~Bq#dA?_?g)m`s!P75f{s zwn|enTbbcx-t3C#)OQEHpMXKGS*d_M@?RY^Y8|)?hYf=-0V8ul#TGSq$kapxiC=XS zlskpQya1?c5e((LOGbRBzb_N3pM4d7#Q8l~2T0C2iSzXRG!&#axuZl3wTlN)zy47~ZrZ8jY_vcfA;;&Q_=r6e8`6I@v1 zc0h5E0K>(ixM@%C0MK&PTzy(RF_6l%9Dmm4Ouwz+asw`Ld0?ZYM?b41XQOm+n6h)?zu;%9Q-Li)ltqoEm^en)7}h&VFGqe&0*w+(aezqUP;Bv^hYCh@-DSk< zZ~s;o1Ql`;;kOz>u0^Pf9kD`_;4wBws&EDWldYwRGWC?6`+g^W8nwgTHBRDt44;M% zk^V9i0ZAKl# z;N}Hx%ZyVE4|Zq5_MJ6#R=uNbK0VwyWhkOgx_c98Wy}ZqH+Bt6;foi=dfR3KPpK-5 za?zq#*E((X=Pn)Sp#I=ugTv1;?A5MpO*iJ~XK`A4_Y(&uhYML==|7GV$=-${V(J_n z11oGR*MHX5HfF(zuaG7~8=$L(^Tqcuw=?}-hvp9<>`~no|3&K&CVLrmh3}KK#b4d) zIt}(}9Yi@i7;!}x-hm(+c?9G08s$qb|5)i?Kq&Vt|EM!5ifC9V`Ut7&6?qX#C^uQK zpZ~f7h?kFRr8#m*>z~pE1v3e>6a=2jcjnYcE84L`neUy!>@hf7n<(<@oAE`Br1F<% z5h%8FSz2p=kq?@X(;O6-*xTcae8!C|Talo2AmqT;KcVKXaY-X8a$#F+ZW?Z!a5;RA zvW=iwtRhivVsE;X%G8>+9B#aHY3k_IUPoZg&N*{Ut-dC6x~AO~o|&|QHjWq&&{v?c zO8(S5K-wmWUYU6ws1mjM1HBSXQDIETy(Cy-4=A;DseyHAfr_|xmsK7OW`3!w-a$?QYi^Z8{~(&0UTc6wc~rd2XFlP_2D zwT`E5{F2mcS!YqLz)49_9oe9lzGs}SgogJPch1ha*pDnWDj^IN+;{rC_tM;&^0V7o zh;ufnpXYuYvV0-qied`3*f9P2l=eUiPm7t82E>vMORmb2NgH4=K9H9tTGpU~oMLTm z|4lq6ZY+}|hl1>WU~VIJ?R3Tydrq9%r-@8Aqrcp}ykXyJ*r&>AGx19Haf* zlBZ_ASFU;WQ zFa~y3iO(^Rv=-dSB#@|2DQl@p4k4g5yKtdx`)Z4>%tI;?El4l^s_1fCa%UG65@#v$ z??Jz^F6|@+Z*d)N?Z-sCzaSQTO|Ktt`O#jBZfomAbCnYlS#q=lE{#tDvrehV+jVB@(9 zsUo*_|A`a88IIb0do_8qc!Vwb`pt*^)UuELS+N9^H|TQDGYREbrxriG**ktG*W=DT z4?UTlXZ;=WXZ|lq-n*jg^vM3qyE!TO^!04iSIy}9!Hj&Cwg6euay%zm1SS?3@-@HP zn{lTd2@I3^^^PJssA8lT#RE3=k^&k8x0NV*irbJPEYCCrIU#~Wx7)z{>7Qf!5r4+Nwt5AOBd)=1_O~`L zwS8_WYw=ot+Q7sVw`1_$nLbVdWL64&_3vW1_AV@3jm^oQrXd9p*c$L0{`7(A-R3#2 zVnJ-Vy4D5!X#F|If+V0>TSHyA4b^@Srxcot6Gbu2q(UIa?HJXNZ6^1lAC$w!S|CMK zf)8xcY(?9gQO2vkjR-n|BmfPu!A4yOH^>}&O0=1TK(Gr!?h{3{nQP-dR<;e?PH3edg?q`REXX7~Rp8_do^_c(zY8jaJxB zk6-OP*+*-Z$pW2rYaFIIQ5n}7_4UE!0OJe`6Y_3y;OM|LhOokxS4x~~qXgpVZK3y* zhwo{(NmDFLH7Po4JG5vVx}~D*fX#V0E=)iyQ(la~@)JfqhN2EsoCq>{Lr7Gli^T}A z6c}32KlLu(LJpfs2FOI&C$bVPl zv<+~6;JQE=qSZCa@z&ZBxTIhZe(*M&*6@)YO=X^z zLHLw>Y%%OSo#yf}ctvXl45$^s2YgCFy3t6|H-78P9~>T;MUZudL^B*rvWb!M3grT$ zxo|#)wzijP$s|#%!2G4>x8bs0*bsrB#dU{wb+U*!y_XJbQQI3%s9jmyH4SD@;aM^ck+ zlS~-Dz||_H2j7X|)RUgZ(A3z69fIw5WbxHL52<7WrR1uqh(t$p639koD1FH;6ZjL@ zhuhxZW_;6r9(NA--@a8po62>=!9}~vD(LCWEwhxM%zUs!`?qw=TWa4BEVti?> zLT@Wc36;<@|L6k~-?pp>v5VLqxc^j#2Mb}cxQ8|?tO@ea{N~tqyS5V!=s4><;g_8d zyI>@9#;(%=xx4`;fT_#i;|Nh$&A(!2D@e@?GSE~3%QmI^7S5(wi#8VZpVNalg-3qc zqrTgg+em)2fsxgm$N#B$rdGVsXs)3pKP3=RQUX95a2XR0orIiYR8|-2zeuuWqtLdsS@aw7AkdTb}^N5 z5#B0>_4pc$B{S*~xkaU?HMZ7#T}760e`TTnLjQeKa-aA|412z?F2OeoR<6=Am6Y&^ zns$LUl~DXnO{9vQfM5n9pIRlP*^aL=)KMi-8Q#>5^N#LCL`e=JGQhA4rcqv;?PUL2 zbL%pPU`K9!13l=_FE~D};y(tpsV%i*U{34;R^E z2wE@o7wKO8cG##)vyZAU*|jL2xJS)G(@^xA_4oD0^gE91*uTw*O%mK+%*WfXVjDN) zq|`}dHOpQ-&ZSuV+>pjPe1cd}WxQ2VtDMtg1u2VxFM)ybSas?8iQpDmf1k7tN8y8u z-kTfv@smDjl{}FKQD@Ux5L|_bj8m9;&!y>7QShK+I8H@ctIn;rE28^b*)3qq0H>o8 zWQEZ0c&h!Xf9y8_`qlKroQ)BPvN{ttHfe-(CrK>z=DbGN_V0+s(yAph^_ z^*?z3dz@?N+OD!8`CgVFfuebTGdx5L&!ZQfDiro(!(TvKokFK2&9Vlfl*J_)l0r}M zpWgpJ%)Mi9W&zf<9ox2(j-7Puq+{E*-Lb8XZQC|Fwr$%^zVtk(XQrN+dgq<`YTl~* zuJil+IeYE3_qsO6nHhc_JXMUd#UtvTO+7KGTC9=8*Q^|L1pv}=gz;hHrb*!eXFsAOd>SkE0Cj3j=?#I}LRKa$lb>f16vvtZv8e;BlQ18fesW)ll}#R?&G zj|ol)5N@Dh^)hQ~Nn=Lj?zID5B%f~4i??{q9b9w9 zlsu3h2eEk;2(a*VA=dKHOUZ<|3OCOSO$D7g0ls(Y3N&Tpt_7-SA1rzK6K4CSJ@`w= zhhO*b;~f0?Cc*+GHY#o%zq6yQqbVy+$x+lkk<*>>+QkWgu@$RyRcUf+6~Z1i;?j?+JySl<1j2$!+uG%`=vdf*sv2^-$t4?knwO z^yQs<_#Mc^yCim(v0>KX1zC{6LS{ckSf;5YfOf8~Z?rU77^_%b9Yfr9S$0ow^pLx` z+PHlBtZnctb-I71F02J#+4}L4OzD(5|CLLS;myz<{m4wcSH1}=Askyw z*=xpRMWhoBIQUC?joc6{>MOnG&-q0ONDRtnn_CD9EcIWG1G!{`Z?a{~BCkI%A22Ir$EKk2u+1>KHGfcaNxKCOBINJ#a)FmU4jv8aU ze=zBhRX-FIxyGR)*WIT(+u% zn%6Hd*RG)))+yJ`C^D1^x3PVar=85mZ0Q(&kMoSzHGzm_1!uHAjDJSmsv1g1GW?>? zz~xYpAc#F9?sl+;)3k6O0^J-Kv-StNzCk=|m2V+`UwLRp%ZRJZAyY~;2Pi_Ud$x8d z69<#A(+5vdj7nKopGTDQao2P+H9wn%s*_PcXXdo2J6M^MZ46T$@E*9_>G~RouU<2m zym5JPdxZj<>~3Dq);(Fh@p$bLymQa!^nVg`M3$4)J0Mz(uWt(VtS z)WZ?t0`hADK8frH?i%Z^8_<>%)eV}u_7(vwXq)%DZk!Hr=vM`pH%Ibq)zzcr+YIJs z82)Der*3DLV>QTIaNeZtQAV8R9EVI{x$BM7HP@Vne(X-On~ckTM;=-Z`+$g-@Kus@ zjsC;oGzD$E620g}L`X{)JluO>d1^aAHsb@TU_zZgsA3e^BsO}hPQx?HaQ=X~kiBv* z6yi(#^??TGW3M_TI=tDzZ!3omCT>Z%>$9JKf^6s0-?a9Oi;nL1MAo%UFjvMIr}=u# z0FZ;KIE;e!IH>ZZr(;Lk1PSAN^gQzk_0D8_JA^BhQ3D~A zdNx9OqFPe1jxFYN%J__7v@7Zpg4is0=2w$Nmlz3O|fx2a((@S<%E$g|kA_n%y(ToR zvp*`#liU;$idLSA&FvNs@$P}tN)&(XlzzX2Gpqry1Dk&e00Y&-F(+`RGjq(aep zjV~)m5r%SFX4;1QgNGyP1HD7wy6;Hojh-h=Tlm{GqPaq_GpOA(7W~o#0E_46C03Ie zD4`uCIBLLwqK{&Mp@Z-BppnM zt8z3n4va^s?s#ND8`b%Oyt_r75gEkH02(~Y2@UrS8!cJpTAqNO;kqeF_wf#NC6(8jO`7A zL4%TYFdQ!arzUg~{$_q=hnR4d+FUhYzKiO26cXJvU^41=t?!>^@Mk^?e0RvQc5mc7 zVV@P9-hvqguNL@KYdxpq4_boe{v0IPtmc(f)VXw=_jshzQ>R={*~(?eS)`jvTYOZd z2P@twDz_m83yJr@x4ZOTV@DM!-Lt?Dy1>nPdSi9S z?UK)wRoaKeI`qOt(rIpqsdjY>qK3eQRO(oQ0{X4^5Tce$BMxw2Gh;=#C5$(EJ=(X^wYos*g>syl0XDejSA3hW^rlB(fU`7v>$7!B2&3e$->mrKOKnJ z#s>w{j(s>4K*3X(M{Z{!I;zDT?@o}I2u%}?sOg^xUI;(PK9tW#viG?HrC)!Yh>bd% z5~spzkt-)JhYihvQTA}9XAwCs0BeaCW@Rh9D~;YFQ1tNenQF~jqcqwSP3iFpwodZ| z7QP0WH|WhEucu~Z3na1fA27MMDlYi(CTDmNf{+$W9ia6RDvY8&_dPebm}NCLtL(k) zv?|FKi|+Tz?7G=8HPQVX6^izX(k?qEID?&6zIv*d>+znKlSaa-X7HkNy2|5emSw+h zd#d3;W-KaWybV{o&b>n}o%&VQy));LUluvR6 ztlMZASUp4YRz%}=SkzFITn>Hy)aYrBDLz2jf<sj{0Fu6iRO;DpP4or5yr274)L zO_A7fY8-93vo%fhC+T?%OEO<<+l6bcl71E_;=5n}c!Ay2i4KA|PcyJBzbII@GWm@l zW|L#67YFV&S)T036!*r zb@Mjt8%AH^sWUOBozl1F7ej3=VUKt~#e=I5iQw+lNEp+oV+B#`HBD|y2ik;mX!dwb zMzNmn*k8m`8Y8p^J*985p;dCj!l5nPKI!~?ZQ>S=S*iyg`WG+d^6hV9C2tS&hXCt0BdGT^QanHk`>tlof1?RnWq$Q;ft~@YLPZYV2&~M>R@h<18)Ziox*y1WhLzhK@xI3oE7@ zX+N~^2<}w@$x>V(cH^#!#<$z=o`EDMx#7rrT0Ye*cIy%r4#Ai{?Ez$Q2gh?To@Kl5 zU)k^F&);KNpWiqC!YJsu@f5&^_?pR3{7>2Tw~FOof&c#Bh?jqdRr9w?B>!}(@~?+a ztTcM|2Bv0?Mh1>f_C|jPRPaZrng6F?J6B)-0u`WjW)%_OfGmNQr`W9(R@k5cudZTf zaB90pG>QVj(M&Uylgdem8^FT=OU;~X=kr0IjT51}H^A$Huq@ck?4jm=UlEkY65G9g z`yJjmEUXY7%*A!c*+p`QcCt}}V=W;elKDeuvUIZ{q?(gD-x&i^y+l>?Msx`UpFXKF zdnGepU?D^z+QOnf9Jr^;w*<-Mat=Z;N>}TI7zqS|oHe1g5W?ytxFKdlb^!=YHtG3G zvxxv+&@NhjX|`dAhyMF$+g51?t`JT1Roq^W@_+!svtP2+yXMiZv>{|fn??Gd`xd%W zyKoSxRe?D^qGB1Sb0~<#j;ClZ7DB>RNW9ULI}-6+Qh48FVr_Q6U;liQ@Ce$e+gshc zycWIz0i*T3LkTe{7Smcm>lf7EG6d(IgYe@uvxe;sYfgxR5`cz#)SV1Ot*>_Wc5=~^ zi)7#h0hnQE|CoP3kBp=djGgA07;bY1SI*qCTd zArQr0<(iSWJVIQ&r@!7uL^Tf#Y$Qgsg)}9J-gTJT20gmN7_i}=&ElU8e_{c!&E(>L zOdYo}bl^o<6ZVzx2-|^<_W(!s_Wjf*ncPV_3JDjaM42T58ANCUk+w+{nEgi&U8tM6-`ZK4PA=1-a$!>1FD3mh&)LHdv_+K>rq#Of3G~qqm&J{l`Mqcb>u3$OG;^ z^WavJd^mGUoAPY%3iV*5?`QRR?>XufzkCWd(L}R-OWh{$(dW7J%Q}qC``_$Rt3)GB z3YaQs6X;`QRCE%-8GxS>4iftvex@xG=-zN2*A;gY8^ zZUzK&M{~^@XdAh>gTQ!1hZM(&?iEGLpd70fXQf^hLE)$@t&gP0CmK*V z+(z2Xxc|L!(5epVFQS}umo2jAS4pEc=ZLiSv zbB3vP+B)b^(^*;HAWj4w0}^Z#v_7m4?uzu2*1C)Z`FiXbzTP1k5Nikl1AbDMwz-me z^$Hu3M=2|PFN6|(JNwd}fRbYu<4LLl3&U&1eGAw7)NHRFlnf5slU4KI@(r0MU;--j ztU-bOcWfvzONDbLK!CM>gd2PlHlx-EmK#PJaEV{DWCM@zMBY>Ud6q$bGlu^U$|h-0 zxr1*^Blfq}8!8I2rf;T6&87T`9pub0v>7YkW(G#^9VJoSQ+CYhm87a z)uPsQMXC`B07a51@Z zOgQ;sBW{R0p{0%?elj0F+jfim0xv*f`oVy?+F3v)gFaZC;iBtsd`EW_=e_X4B_hrs zi-2Wfnl-t7mT~Og14?-xLhRVtm^bD~^X%W^N)B33FA#cC#^XB#q&mTeJBMx?Dom&=1dFFzTo*Pd;5=I8-3P8@fb>vYaOpH z<;e5;E~i#hRnhk)*rJ~Z>v)?7UeC}ztEk=1pPOOEs$X9=)q9e~lx{(;IaM02N^dH| zH?BDS-*!Uq6gX2KdXH>Q3S_E><+Cw7wyTa4Pt7R6LrbkRV^*k4H}psk%2MyznUI^PwCtFCl=B1V1Y&cOHU5-S zYi4hY&oY3{-poL{EqGzcj`r~Y>;BQp&ABk}zDcuGiga`$1a}v{Q*5!s4t$WBozmR` zHKj>4m0bk$m?$7{FXo&Zg`;TASc`pP7!#{pHaXCko;@FO|`> ze9SxFI~Lg|VfRti2+T;zgiO{`q1PS$XIr`lR&q@RcAE^3Hf^}?0*2YEE}-$~$gr7k zv=yTn-lfri0MFy`e{h_c8~JRuzv7_$ezq2-|~{3 z#@U?8D_8QrZ@&DMJ@yp@{W^f;x%hPeDWcwoR(b}gLK~{bIWD(m_lpfB z3LLgkkRRDH3fn@ZK@Zapr;aZA>yF__u(L;uy1(VK_avHwq(Qx+LtV^Toq#W^{4Zpv zG25U_;d812vio9!a^_DfFRf5FLMk*#DyxnKGL)2 zQjRL7*|R_Z#}K+m>W?|r6CqqsUJQwVuLwj5tago?#Ws6gv_Ili{=T zTxIK>g|q~L*{2-NhS%6q5L7Jzw0)My*>9Ac3c)?q78c7*e`Jr1BK6Q4Ba@%+jOr*4sSghi9L>dP=SQhq26-pRSj9fZLjn=D7* zoHA!#_DK_ndW2}|P0BGM7rjHLrycoSLCSIam3!$YNEaLmTF2m_E?}FtKWQ{7#QKK+ z5vT`_PeAJpZDBSw*x}-6mn&(#wHt-Ae1;XYSut25lW+6u(e;}L)-OjKJA#YewNLyS7G)7 z*nnSZ3O9GDNZndHR+KAn>lAGdNiS2VGtQ|bw#_Qz#;k0gVs}v0KdX46>*?C2sT9%U zfBCF%Y{henoVyjkQPN|3Euz-zPB)Ibv?KKo@n0eml)nKlQDRO*;ymE|mgYYKw_UC& zoJTGYYr2fFzH7x{(ws&qD^}99f+DDeg&LYtYEBX6fmBzew4Ln=ewvXc5@cd$0C#<}XXdXT)0bt9;aTafXhGLnXE0pgn zv)hBYWa4O)4?N5&=XlMi-QH5&(q3Qdi*AnHfc?E{pon^+jH2Dv(_w$`UI>WfygOux z>C}TC+o$oj!n?DxnLS@&<2&+B3+B61Q!>(Ex>c!RubQ^_+8RJ(i_nCo<(a0sDxXjs z7?j(ZpQC9yn8ItIXNG~ws|vU}d@-G#AsV3CmLzrYUb)n{K!fPrY@lf|y zENIo0&nVougu+{-2C@0&6t`YY*inLY7Mw4~OWmo3YqJSKk{$+ zX~`8q>ZOuPaTI?6C4lBB>@IAUE5uL)U3vO3)lEMSjYW=^A4!UOvkD9jntH_-?mF5| zJgMR$R$yLpP&>wl$Hz^una4!d0J@r&E-@3pN$@8KYN49>zeP8h`a_3-UN`16kMk)c zbkIuOyh5aZ8(POA0Or5;!--}Z0ASGih^p74n^yfLV#jtnAzoaTm@md&4|E}o43S6s z`^1eBOTSnE{f5Z-ti6JP?{$EoRVMIdU<}*EUnS3ET0+a~p-f-l_nsI3vOs+a}!mU4A~TZ|SAd{l$=v9|^F>(K$1JS) zPNpA=E{;j++x1TCp7&FEdDjZ<_x<;qj`O)&oX3wT43A#jo=Vce)EKl=A6@&rlNuk? zIcBSl-m2Wc>xLk!UOBjxsrXJQC!D!rLAWLE~NQoQG1nIw~$SX3 zUr=MR%PDzVl0#dwCq?z?^iW>-e*X^VebQ8REz>j1XltOLL#i{WBUR>$hC6fD4IV`b z?fweN-FPN?n@kE#+Mlc;jNtN;QC!6g)%>9X5N%}h*bERCFvEdSaz`g`L{<1f?bzy9Z{>*i}B zD4mlEA)s;CRf}R0z?~El?fC^Yf*EWD0rU|Cb!`f#bXaB`;S3~jV&t8oW;Wv4@twYD zjv9kv=_)ZB#fK63342-<^>&0Pem$lp2XCH-CKKuJ5~&N--G`AZR`^}lNfV^>dRqbp zwhha`*j(1EDqW@z!d08hdH}|8?ru6y*{{Cfk^9Ng9KJ=sr%=ctjSVzCaWvMw)eUgK z2W}Jaq6EuZ=HbxeSN#B%k!_VhoE)Odxv(gQO&&3wmMy)Y3QOH2PrjpISq-90%dvps z#${P`0Z|yvz+Xh$Ea)`MC~1kYoz8DTRK(UPB|+M{c?|iQBB>W@Q8{xHYz3UONk|Y; zwBJed2Lpuw-SA1Q*Ay(8%~Kar!35FIK?HXj*MMbiaiv@=@!8Fj`W~nIu1GwPGXuSY zcdyp>gNQn^Z1*9^zkjRjM(wK+MO8c#F{!JY?@Tcb)aZRcEMG%=ZOk|y(G52GW^H3* zS>Mz-+1OI?h#UP(jDCY-y?$=F{@!}42BjsYW19dv1h~I1efI((=ed2? zWc~#?^~L%mJ&qbDoCt6ete!3JgHvPVSO72O`ft9mWU}xPD=-)p@_x*0cno8ou;ow= zh7wCFrxjDqqma)O;VHje&``k*U#1?e0+AYl{b}XHILG?7(~46Id7w z2=^yg=4p=q;3WtXQJ(RzWkMxemL5f^%0$kN9Rog21|9;+_C2-U`eGWHBiv?>>Zu-6r^=Rav<;~3O20*>72ycIJ76ZjQaEg; z|4Z}X4A6u-g1=l5OajV!W0t8@z(|X{3}(PERSEZGKKKNRL5mow_H;g!Js~$=IUSvG zvZo}xOq09CUiGZzq?)OE0Qmr=8dWT3Ur4MGSZfgYz|LJ|sRQYadn*WZK%=amlf{M@ zR1Zv+R-K1D=?2vTD9;@0aHUD7K1kpfmzW-%g7blG za9d)Y1JB}#L0Y{6`6OB#s{#`bg8IZ~=b*D5aaazQdNDwka8MhjpcKuN=8f0`lUt>O z@F90vjxE!VoTC(=sCIJ1pSdo6U^1s9A`T$PO)7nq$<1Gn+}@aD!g@;@KStNilI^~v zovO9K+7ivSs(4NKtxpG0IjnQ`=vUA*YgA@2pGS~RbnonQhd1F`VW0 zWvqGT_V%&QM3iS0yH26W&q>UitiT?+lbbxGTV{@#>fhW&uj_olcjD zT>5uvJilczY(ymh(&BRJNXG*v#>6Vp!GxMiYFHd+*@|m7%+F?n7Pc?{L_W(DAF)^r z6W7XJ;(Gc^43=m35$*B|hlz~&kES;N%D(NtSeyP|S+$Y>XZLOY58nHKHx~X><3HxY zpXa%%jt%k;1n=CaN}zOio@NNFb5St!0y319hBg)(5u_u`tukt! zLXJ-KP4#}>!l`g0=1K33fG6y7S4O8p$wa85FAJIJH5ija?pC&y9>*2k| z__&4+bC)z4Xt@*(9pfrp3L+uSh-M48??!$^P z{HWH9Bq7(R zvvKKzTeXKYxIKmR9Ha`>k;hzi#`rsW1un0tSAZ7H0ZsX zlAs46JE31BCbtGLQVUS{x21w2oUKUz<;Vq(XoPgF$PiewajI{+KYklZ4>N%yM8vNm9#P z6*p*;rmZY5M9V!vHBhjR$gjo+8-tQiS5oX9h)4{#7su(o^CH8qx+4u)t2@yTxFE3PH!9 zDK;=noxjwqVdArGK#D>OdsN2Hsc1$=)*nT6^+U71>C2iK-3tsJxIB)r;q`GMI4ncI znE{&}iX`y7LAhpKp`9F#{r*43<0UcagR`L9e0mhsOCNGg~Gl^ZWeUKm$Coy-` z3NZ+b#WO-#arUrIv!@xj9wtTvRp=??CWkaCg!~Qw_#aHd?Lv+&Owit<$%D(9AbGQ9UfTI*G)gdJ> zkU2BI9I$u^Feu)ienIAbd%EY#kgk%3-j+v^Wo!=uvP@k+gsF89xaC$}h(-t}2A)K0 zBp711XF`==jZmFQ)_ZB^zXv2t?yk4jbdTb{W*q?2h=UL98N15r>mDw-KV+`yl-%L+ zdawyS^ZvTnm>Moz*L6JYvwZFTA%iWS0;8~qp>$J!H9-{l?{^1f( zK0>V$2ezSI^Oz;46_8mK{_q8&Hro1Z==ZKk#31E=coDcKPN^dnk0o%Q#tfC^-Fi`R z&s$1^i=W(i>?mZTar+h5*}2 zGrLg0-Z;2my=*+&&b{L;!OH{J3KH}hJZ!D#+#IjI+(X=lV`F^jbTnL8e@XeCOMghE z)v4^W${Nt>(NYYhwp)JghGZf2XY(St#)&r01Wc_2i7=gmpDqoKM=3o3uZ9b~jW}uCKOm3XTo&(VU*)*zAJVC{{)OGwf4MCEI~wG_4ZmRhFU9yjFERcdxBjnksu~(L zt3#+>k5w21@E2Hx8Bz-^Y<$r3a!9~6yA2&}G`)fSqR8P8!cZjp{ibLk=Y`9xt4^z0 z*}~JK626_3YE)FKH8z{v(>TG(hr?@U`{BsQGQ%|M*?SafQ#fy`wWUwjW^pSTS8B!0 zQsX`o@F?q!CC9yO^SxI3rW$k3TYBqmLQ-#jeX&KzGN=#V-j6(kJ~PGf{i66b`wI2q zDOsexODL7?#Iw>RoTOTu${07+w*oTRXv?z}i&>4!(t4G1Rhm`ia)t?>OLh3Q-+}vp zUv_;&Es}oVF9$#7EfRe+Edx?0(Q7agkUI_>ZcHrSCLq?r~Ur!(2@AryGcrr)cDELZu-i}ozvmpgnK!3Y9F@k&S}EID_0#UUxRUw z9xr^S{W|Fz;;Gt<>q>A{5iaR!^NZSa=EfVm%aaP?&`)Hi?dp~ABa>;_K^zy05_UXs zYK$bJmPi|&zy(IJ9gI?^7utt^bQ8>v0|W$C=gkHJ${U*yvTAih zh>QhgymHPl$**=*teCM^u9IM#RpX(F50^MD{O0N1XQ%YWhr=y_BWz)6_RbBQeDzoY zF%i=YgfFIdM1KNA3)p7?JCP#rXtN#v^#qn`+34%1s#OHGUfsZ<)~NZujYhFod9;X{ zX0EipCQIEWe$KBOK@s^G8$b>U$07L(g9NdG2862IVWRc+T6myDt+5P(my{uy<`Q55 z83d9FiW!&a0jLS=DV*v%r_C%AX? za4qqWbdDX?vhaG}#|G7JmZtuFH6A7QB$kj`J4nqUH7TZ+*D(-V%51ehziNP?9@>2m z1jK@a+FT{gb;dZThpJ)%z?7{PHlDzDz*eEd<;^QPok#)QEOO^r$9oPbjn8goh77@} zum_>~AG0IeiX7TM2v^w$gkJMhnByb$Rh11eoHu>hpRoGJLpbiDAb|Hd!KM~X<+_== zlUNOQX$S)826`ZhyJ80{2Hq6I0hlHU%#Y}++=kXbr@Z9DJ=Brylzv(+N0U6L=4#~{ z;p5mCNjsBtHrLbifV6z=!8zJyrJ06IbowHE$C-jyi}u?)MQ}@r zDIJPbp$qsWMh}VPGenz=$V}#L7f|PsGdlKk`3&)~0f7PJeFP<0I|kjE9b4GL72gYx zMjdeJ^WlV<3%7*T0XA+Z_vVa${wtdnpBC@L81(}ap|HTczYAjWx54mcuEh@xMAc*~ zSGzSAd(owef&H`sjc}K63-;;6or90a1N1^~|7L`MoT1)$!VBMv=2vXcgyV}#PEGZL zhZiw~@>^|nwE95<*iZ?aP}g9N0SFKz=D}GApf>2<&;bnv)%)nN?#`pGV3grU2U`!y=PHjDvvx%1QLD@GWiIm z7BIUO?m_i|0PQonv?UR3`Ax&po+HD!3=cZQZk+gpP!pHexLXL~eW zb+X(okz10#oP@_5b)wx)FQ~o5EbJ7Ui2$L3!pwPBNy*RLlnDd#q!ZM z8JpKj&uL^n5;1YhV0cI@4)rxv(jTxk-9}i9?E|bo$%5n`XKQQFn3{*LiQ9BieuE@P z!XaTYQJue3ogX@Kiryp+fa;uy3kv_5daad|M`U zDdQ*Ay71K2eD|n%0=-mK)oQM5*49-0v}|w%Iu5R_Ckd{psFKW8r$Mu(MRhkAestPM znhB}?4vq8EE3v@HdtRY=@0vbXs9;aA9E?NzE`a z-SAhI?t>yLkc#XB|Jz`;z>oY?C;$}hz<2+n`^~wwDNNr`c=4fLE zigF3oeMVdOoI34LL`=LLK@jNZky=w64sv$|rrP=nB6Qs{g?{|Asf^J#OJ&-cz$gA< zTQG+;;uBA`ZR$~DZVtpdrh2Q?^yv!ANc@xq113)e z15^wq;48EO5_!Ls3MfAn?s6sKIKHEwP1UMUE$Rn*aZa7HuP%D~g4gpO>zD&-eIZx* zY4WTTQ|uI{IZF32(_LXzK4u=lv|x(!wlZu5YhSc<8e~({2oNN z3|!ra?hcWHg|)3@EE@c|i&MO>)&SFwq2ww*N^ZY(DTnIEt90E|0|X!xO$9D6SkvyA ze23b8dKC-cUz#J?2 zA;j8Mdn(Y$J(MO&Rm+DQkWW0<$dp{sIT;xEoa`sGRbQ|xrv>PR>uvhdrA%@IPU+7< z4Up-+(5I2C0!G*NXFOX*B=p{r(ul#d*QFMznKbxHRXm%6+#)f;4QciFbQmonRH@5k zJvL(&sWqfpRU)Jx2wpoI`!B#N4pUS)&`V>=sel+TqJ~lR5OF@xgE46Spo15|;iW^Y zY6#5XC)~43NS)r0yS<&R)u)uv&`He5JBDeT3%aGC6QcrBOj71T-n)M4wWU)2BVNyb z*O>35_3Q)?ewcVC*ist(AX`Jr;c6c}vA_p2(;9h&=k{FAs-o4lHqQ$?Rt@#?s$Imt zHTLCzdQtMQSc(_rN2x7SAdRxk*(hXrQxCqlBmhe3V8uGZtzq*@{&zAw5QTWZtj~mF zBKlv1j*M$?0W?0yAh*j{7k3wTqWkVKD+O`o#hDp-Z!bduYESB0yV*ud<%2%Ew-nhuD<^!S(C0V z!YC$2SqPC8Gp`L}7C96Gx7s!`DK)n^8q~JwXUTC*aXzdedVjW+s&xuNfd}&CWC#+3 zq#jOT1ET~RK2r_F4wSQDoZ3t`G}~p?X$}h zx%&zyKYnwVHfG{z=KjU>Paeli_>4or-BkF31Q^(d1vR?6$Z+hK_$$%bj@dN;9CSQ` z28!DEAw(@q9AwD+#1N8oHCh*#Nv5}3m`~uzt9>JOLQnSXbLB!LxgQRc-Ymtn--OmN zt(zYxxJ#%KUZ>-cau90RH|%jquYn!<>ed`_Nv9o#$E<~#w0?wM0h%qP*tAEG82k1xu}(@{Cbfj2y_dEpZJfz5Re$2g8)SN~+V^8OPnw8Uim zbq5Uq5GVUTz0SYwElB@ybM=4LX8b#vq`%$$`ZGNJr!YW&z3|2IAN(J)FCe~|jWvy> zjg9T!CG7qe%J0wfTun!2O$5PvvZz`*%oQ+-#A^OV#J927R|qg(1W}#lVQn34_4J|= zUK)Y|(j2=4{{2?*ULl*jJ^lS?)V}*fc-d%e<=E7a0uPrIC z8GYKLf^jKG0oD>|_i@srSiY;v9_3g^o9`5LI6bXf8q5&X@k<0o3eYQCWraW`hD^GE z&12w1{DFYS8)oKxh6+KFfGMv5B&YSg%15pJ7qSP)R&;QP(Ud(8#_n?t3edtwuLSjW z%QK1xc7w?oX5yrP2}q92>T?M((k4jXt2qheu9hOU$uFex$APO2gM%v#me*8@M^a~$ zS+q8cS=|l=G-RuAhSerhQX5w^)uM}vt2vK~Dg*%Qj*;{e?;u2Azx@`!MW#Et7~ks0 z+yI?6s>Zg+((eRzujA+kIfGkll^g?u!l$OAuAn_#))0f3Vp_aEpjm>p#kZwC8P!5a z+)43o(>(J@PSpjyMa2?X7h7Ok;RH`F2~w*~NCy+XEaBvhEcxQcy%-S<>BUhJhhu^-VpCuLIcD0B>uo!*`Vn`8bB{BjK7HA|NAjX^ddxdmv^&%L zL3f+T?hZJ24KV4&dRgC?mJiwMf!T=A2;(o5J&JQ>HDnB~=(K|~6*KrX-n2{XC!~rm&(L!xbqM^Sm{KhonF4Tc81A z*WA+D-pG%J&WeU0_cKAl1wvez6%Q75;<&-^I&HkcW^r_t5WdW{>)ld{AUn{+3{H%< zj+R3}YLL$*2+ljh6gAoBeY(B0`x}u9 zgi{JFJuPL`f+}QcY4TO-DT9v3IxY}D3@TO-Y_RZsafn+wuHNAZ84 zcwyuz{-AitF(91b2uwZI*_Te~n;f+l_oN98)tm$ya|S>W_}_64ny6U6P`soH^yG(> z0_pzO;N7gxj|*E%uq+V~2VM;H9K;IJEs6oKyUFN|z9h6`y|t_d)vfAIUc{Jno&8|8 z+aDt_$gtd6j)N6Htw_uV{%uRRzacjI8Jou<-Qu>tI71gTAO^#C7jmjF=CY?be<(W-XcfZnOUfqpq*9VG zx$!H=11O*ts_t{Gf=~x*f{Di!W1Brx%9fT_sSe4A)~MNOA!F6V#x4S_*!*Cz=^A)(@`CkO3BNHmg`$i+b17Pw%0Iyj{A~E@o#|`Qb#p4PH{{UAasuBCG*?PM%ftumsSGL$ce<1RIQb?u6a-SC0QZ+;0D(2S98! zJ&EXbcXAZz9iK=Bgrp${Aw0h=uz}9;#|=X#NhK-Po6r zItgaoUk620f@lzmQiJk-8w8~Av|uAYge9~!p;8#OY+_y|F-#j0lZKlZj`XOW{lD;Q z-=7{Sp7}(0cL!aDH-|O+Hb2E^Md<9diP_KcC)nOrYOLMl#)MAGg@5C4OqA_W#bnB ziiKkge8}K&ABhH~CZsSD0v<7t53+Mmws$Z!hZA;4_anI#HdxiV@?g`dkuC60H!H_Qas79Zx}J*(A@`#Q%~bz?VzWREk7Y z=#HQ^Yli=QjK@)3oDAeMt7$^3k!$28gDaGPxw%%dK1`0dw1=Dlpv%eC^=XYf#TX?? z&l1tg`GU(&qwcchvk0k@b$=#5EzJSC4(_|FxN{5qOx;~W!u%N9Tuxtqf0+XEu>R-~f+k!B|$^5qbwH*La5Ve~-CTZwtwJ|yRHuD;{+{N};M8!vF zWrtc^0laH(4&;zBmETjdodO|eM=W~=&sX=`w6`tPPR?%0d$EDOt-bmP(J=w6G==M+ z_Pd1fZCRlq?Zp|S_j=25`Y^O6BKV@wILkx%+$vD*5qqV1`zW4DebJ4+B|0m-*~hpg zT4`qlF!gQxtMhBGGT|;)S6z4eO=DJxyHszqMb=x2hvbL&2HE8gy5S?G8|OP{TFnTr zJ{dYK;FlCF zk0RhwS9zl5`ud2iVn!YQf6TpOaHS2t?wzD#+w9o3ZQHipv2D9!JL%ZA)3I%Mh@Ro!)eU2A>0{<^N8(D8_+|L8uBj{UF8e6*u|s8egF)AE_qnTS1@ z5qlv8{J4p5$!gdFda|D_dZ?LIW}DJ{W$Yz1=8w*SokcQCCCIF}J0COiLr=JSfM@h! zF;;JBm}x_fk|Sc2wLeXt&d?T(t-KNx9^&jEb=H3PypBv_Xw|V`Gw)HGczr4RDeg>S zr_Ie@Ah5bSl-K)F_~l88!&f}958rEBfs+g>T1YVQu;CQxpPK8MpAA#bZRNX^ci^tLFDF7O8TomO>YCKL>JQcj zxRcE~G@1!SPZ5*XzlEAHZ$W5=0Vi0h|e9!&jTgpJB4EcOAnWqPel zju=kE*P^9@G8`Y3LG6Tv7BYnQB>4`2`&Aqss|>YSoy$EIe(sN+dA1aA8!k+7UzMc{ zBO9b2DYe`=h{_UPjCQ7nt%{#jMUnHMbwlxKf$f3l$>=M5F>BJtEsnb_}mT6s9|Ea^$2Z~Ze$}JsyQSRW2t;O`Tm>pAIYVzVM2UDqaBYVaL zGj1g96HeJ$K-^i2%XztnGRiQEDR(JVgn3q0)7lCy>v87lj}@U%y#PIZ=Y(x3eMEA9 zp3s_w_*G_{+jF14_{%j8O>!YV#hLXVGJpRlO|pMNoc|4#`cL%ve>{>F`B&BWABzx% zPhzi)(LZhNe_tZ~?KxMM{cP=#yABm2RRpxul4Bp_Xi$LW^FR?nVljoy7?x~ZizB(K zhICwlViEHiL$DR@=PhMBMC9}0d5Ls;UZS2&tg5Zs2RGnn1s#3wC)?dVHm5Epa5wP_ z_W8OsDEH8_uQLXaWEjtaKaY~8nk5^;n}u*tpFEq{45G!D?*tb?bSYDCq#v=(u^Jd< zj-!VXfzEwtkRTNts^ok>WBRe+#xbk%tjeg40p-0gAT!ivVPa9z7B!qxhd5UZt-*}* zORYU0h+G4Nhra9Lb7RDU-Htaso8_Pc@=$@|=NvMIv@&e1BM7?^==V~KE{Q{|((7YE ztU3U^`}WC?dwp+XfktbvC0Fw*b;B@~M&DRf)81T}o_`5DH;ad#g!Ib|ap)!)R~Fq$ z;4?|ah&V81i$&)hi(Bt+{gupKmksQfdoCsA@DsRuCa#aIYEyl6geWJ5zBb;u^?G-G zwLD{Wxe*f1Or);9siDFB(z|g&>n=q$AkI|5=>CFaeMzUw!_?7(mGDMAMuUNgD*3i( zW(nVm;Wf&Jn+sCDqa~1H}HobaglqEPwP|+T+}hgea<<{;`p;F@&arx}uAtJowiXYclY@93$;Hmi z)pz}3D%d!t(0v?JQ!cz#bV($lxA73Ud9xid;Ec=~rxs@QWnD6Rlvj8rOXSn!=1FD# zMJ@U9O#Z-@V}GE7NBrsU#a>+6mF`J3kZ-&TI6+RWYuY1oBT;uBVI;Q3)ujOKQV+oK zcXd@9y1_>(Cjs#W0O~f4cI!|928on*6{sTyROP{S!FolTFSF+)!!-gnG&Crcx~VpX z4 zEhMLyrI%k^l<4#XTyGMg7(xp zN#4y1;=oZ{Yl$z1CP{0u0TiK;(+9)e)za2%LwrN&K<8z|d0}_Cl6CI$$t}g>%|fi6 zo{{$8idlS^Y?&j4g2_s3=t{yZ0o-ZF%j2DCPq{V|yt86_2SJ-0?Ao3)Wc-yFl6J%{ z!)ZE$LC$o_+*x9EdCQZUu6^AgTsn;6YhCmXHt;;(M3@>82}uqoSS^*)t-gZ(TW=jS)8e!kO+j z=jNVP^QwWhyp%0^1wf(vA|>u9nc9aCLRpAHtM!Yy`NOurtCt)j=k)T?5Hz+1%KA-?xMj0Y! z7j#&JSvLI0ALsCEHt|4wwIoYYg4}N!bC^JT+d^y^Ckji=Yg(+?v~yck)4ka)sfXXU z$bVwNM!Rj!h#R9WW`T9V*3~95=qs(;G~8Ib=Ue>*R@Nz2A@S>+OsB+?iY^5%E~uQ^ z%5wYUBI^Q+t@h@U#Da|&-i`7RQWZ4@z?>IG3rl?gUS5$^So=>@zqy62Rcbgde*&{@ zM|}An<0&19y>(5*(Ubh$N;-v_%mctj<0B_H_Fx2zp;^etb1HqrK~#puJ%IUczc-=h z_}x{z8Y%ii-@!O4q<*Qb^ZUt_3Fn=SNofb|>MelnQ!hEH#1`Whg>yd*4ZWc29)-Ru z+n8OdY3OZ}{kVZtg~G1|APVG894q_mLs@OCwk|e4Jj``skMuB%@rc|uBg0hf8b3lv zRbtywS0k11nTrOFYt46q&;zYnPY^|cV5PxkVpDv`kt1LPG^vU_Z;0L zb^H6Ch#7EVI)#%-q1l7;!LA`Xxr87%3(?Q1e72jGa7N3NgC%iu_7qnDg}DV<;C6ON zUcOmcCe+Qbsf(w8R9)qcn0-;YVi%Og8}LD5w7I3?F)kT|7{yQ0>7NoO*yFOS;{j(q zYq}y#V~os>@zxubQHdWMcE|k?-{};6=N-n+-(=pF+^h{8b1M0okWg-A`c>97{dlN* zaLLJKX)PKW0>b5>^y+NyqKf!cJjn%7MkG4n&hRf%T=r`lpRR}Qd9 z(+CS4n67MYhTJD%8J@19C)s0Z-hq#quLHDHWy8gGwf(fDUt4BXPDW|sp$J!1!l&uJ zJY5Wux{?s@=;M%ly*#u80@0344Ew^(2`0DUR7MNgR&*!wVBE$|u;KjR`_TRN263Ij zNUKFN){)uzc;mF4E5{8!Qr{kgh!O_86+dbOTBlh_6Z@=>9BK8lDy|;Q*r1 z`eitOrTdZ}IXO$!i)$VSegr|@OJJOfu*5OJd$G2sDb&T-tl9sRORY|`TP^H+Cc=Cwe%ozH(&6aHe z0O@_mv3o~HJAkDy8tW=6{Ayrq!<5pP_OMP{E>S8L_suv%nmVq)!C7mocj0U4bgQ>M z^EA;|KWbVm-7OJa)3D!{0`^J`kOS;e_=o=k@n zKEf%A3&bVXWR7f1U8M&JVLYjUY9mm3c@xZT7S$)H0pWbOao!$n^2a>Ayn@kAuPE~- zHE;?3)E51zM4qkFow=o9rh|PnSmSMh9$tO`YUV2WW~$eNVCyB#IV? zyWjOg$%F9Bo}43vDtcHU4xm`NesP1rc86PBvg!)^E~543=+eV{PbvzB{>WE3X399t zN)zDVN5+iCC9s8^VCp8yo-Vi?2pM>p-eDypek3I=b9Ac6g+406XxSc!7+HP)5vy(c zGH2k!p{m@2pSEuI+%U50d|F14l`kWHfuAOlAdyyltEug_k(!#6+?(_Z0KX+i{}))5 z-RpChS`_9=uO;5OxAXpvYG(xHII??P;Z*wMY^#&6)u6Z-RRTDP=QckGI|i}xbo|U> zRU$_wKB}D|M?eqp&<>!@WiW6EB}U7)LKY9gesJmuczR~XiusICIQ{e%pNJ|9$4SSx zst9vuEwmbjro?w-eYOTW22q`e$t3lZ8YPqO1gfUl1XGiIeGG(9NY9Z{Owi8DW~nB| zL~rcrxIqKm6{3AO=D z^~ZaSe>vyn@5elB)PMOO%x#Q}zx|Vi#6Mh)f6{|Lb6z@6RjI7@Ow?}(`L{CkIK$*u z#SOu%XF#DlIFr#Y<24;rll9QW(s`=59~Qb|1r^!M6W)V<@}9(&dx@_k5p$ZSKYTS~ z$9Cv+i|-RIZ`0s4S?j?=Q|fSQy8zexX%Fn)ps}v-HIW5gdc6iS23hQ94$U2=<}`69 zvTP45@^KXlSv~ehYd7`D3#x*ZTv;xJ^%g%N07^;ll&2jASROvO*Q~bXl9HcANh}Co z`l-=yF&Y=FcFLzHv(0?nhQBt$SGR4Evt)`}62pvuiu8+R% zZ9iarVbWVlVH;s&*wy8sX*eru{hWYs-$hgm@y;t%DEWu96$0jlGUHAwZmw3A|NL#k z1twz2Zcp8zXWs;Ck_#Af^jAr~x#sEQ`Eo~unq6<4b5%6$SZ&ba;drrJG$M@-6J>Bd z_ee$*I?nIgb2);E)RC#WywP#@9fW?#Icxf`!g#}Cp~)a`2%p3wCpKiW&Ea~|%;_Ky zqJcQ`7rpAXxB)^7X_Si89F~k5OaE3J2HW3ANt(76)Vc=yA0<(2dkJXnD zqk8A1l@1@)Wn;^zt)t0pRdNDtkO0ci6!wV2XT)gvWs&@6-qZd01hIC#PFz|PH7ysQ zbhyP`kYub|}>PaZm)tUMoj=#vZl0G+*Y!jj?ek0gkR zc5Pep-?`jwlpt`2Kz6-L-tNxUwgyZ4F8kpP^%XJL?2i&fCg+!WAR4!Z#sO_CpGO@W z!C?!lFxakv!ue=p=V48NmDau+Dqz|`tzCma+DK)B3~(Kw-{@QX;M{^gVaSpfT|Th~ zB}=ChEKM`W2m%zetM`?X@@lE9K5{M{Myx^ROKEL2Iywm?9tcXKW-?ls)JL@sVuP3) zr$gLG0@Oj>!8n+q%f>w#kdswS$Gu1Z;+fLPeMkJ#PckinPA`<+4YA-B>tyoLqacu` zDL1CIQ@B+ZFA%+@CWaq>gEY8`lq?Qq_?hSnB_Ja#iN`<}FO;0#gPknlmu*bfuvkbM zICGNrt81j4b)@fnePMg@&CB6Y|Foy$m8xRb9ym>Kw~pr+p}W7>vLenz&_5!c{n=1x zDmSDhgHE)bRD(-5{p;y?aSA<~p&tjtWWS+U%adXZ7Q|JebNngn$^=RaI+d5AqVQ4C44_d-K256$z?%a}aqF?tO{o8=h#bO`uXD~BP*@YzWeu_@!*b#xZJ zb4TsBaN0U_=}t+E?3P-y6x#}`cJfnh)rE{-1P+0Uve@>c5h?X|uXVHIEA*{?h8lKk zoi3DwW=fgvv51Qq81y!6#ECyM*d^B3xDW-*(J9L@$kC$6ThcV=o%Bix{;25ti$)vFaL&y`$?a2dy=EOHC#zVJFTxX8KOl=8m7M4F?xtSzRqXMt)r^{l#gGSSCQMQ8J&xbKg)+pobs; z{?Yr3_hh_k>QM5`5nE2V0R`^K#l-Y*m$jZTLw&YW$ILE8@&I{s5pq=;6*-WCjApfW zr$x(;j5ZOq*m?U3lH3|VI4QNyRRXGA+UuBmPbJ6f#XStdKyv1QM!!?m*TB9|Ld^Gz zze2Zijzs5G3!#<_3YXT zJ~fz9LM~Lgs#qNus^)i?a1syw5mO2KHh~3WaFU71_%?!+EUi1!OM52~_pYOlJk}Y4 zV;rIN4R0r8oJZKsg$iX#@U(>02?Pd14{CTeMFK`v)D$$;@+Q-pW~wy+Xl#ul*Ye=J zUg>nXMV92`vhqy~M90b^QuFESUsscykEp7b>l&{Mbm9v+$!I6%i}&HXKgb+^vZOSZ z^Qj0Ndq6^qV7bfYBhh{3IC(?Q60W|NCHkGymU@TmjUzV)Z>|Jd!c z4Uh)&j~s=7M%WR%*# z%?6)4|L0bQ1;9+E&Zir-CW!noMf=TulxHfgPsk?fDx}fecjLhl)63 zHh01EM6PPx)>#r}G4gFHWqy#+FkO~M8Z~BP4~^>rmjLhFU*HTqyPL=e-C;sH0vinB z-9ZUB=WE>k(w$xak40=F=z9^0kZ%!cS7HH-u#n~Sq25eVJyDrT1-JmG-oQvKIVz>$ z>QY)7Yxqr*V)+aaoJ8WgtAyaGazF(ys0S|!2RlMdD*czsio%84<$d`%2b6-%K8k>= zX;jdXQSH&FFtu?O{20>7TJ54}*3vfBG_-VzZ-3sOoO7}oAV3)t&HT#18r!TOM$Ewm z6X~zoz9p^>XlmfSZd%$N0VK3O%Z8sb`GgaAN@Nl?vW*7TuO&9O_$fPvWwtB{JDTeQ zCcxn4n3^Gt=0ae`J~()^4p!aKg4Chf>Gq6L0oHVynSW-r3ICG8Py1_D z8`?$Fd+l0-7o5{#tt_HJ=H?4ivv?(m5uqcnPIn)HII>837=I|SDTUYWbfHW$Fg|Fp zB&;j9EhCr*kQHx^som4O_o?jy@h}s|9YQ`~`OLuh`1pkUa+>eEXRyrV%o&yR;qg}H zNDBvvrs&>j&9ps1FMbx(d=94K?pA58!L2U@>3$jXkwFp63Ge!zv#bL}S{w1&Ad#(3 zRTXIlv8hYMqh*sztUdpGIC>1_K(}FQEskZMO&+X2DE+HEi@8&NB9l!B+m<_X3&Zh6 zg;3XNV=Y!kFYG6E)N~q_Zxz8g7tRmFYBxt1xc8cUD43e;htg6CJK4jlj<>&JyvKtD zYE0WWrDZ81{b+El7hi=(8AECq1&HeaJ90kLux2cZFMh9H@E|->ofaMB=P?OfZ1qrF!bVT%HRSBpdFnN!#xb%O!+ADv zndHhFxd1PTYf(8`*RdZQ&V9cW1)ZKnXy(KBw=BM=A-27kqX66~*!#22>RLzW0VJ?0 zMQy1V7!Z|B(Q3P$*#Q(&Gb1L(O`jQOG|C&%wC|m(Lyx(hA)4Di-VO;pEoY4ldmR1TnCsagHqXqbHXpK^2|y{%&Kz*$h+l~D zO$w~kR^&6x?bNyg*WF0p`Hd@qxz&)^EU6Txx#Fg7=4XTbz+0oQi3@V9S&)G^Xapcb>^S>t4ctjEZEpwi1XNmFNldedb5gtU=~e_#-|MRXDf=*L15f z2oAXPm@i8!$~8DJoSy}qy^u$fChlC0CdUEj(JY1ZqI%G|8u*Db23#pEH>c1S6J%bU zvwFT9a|&2NIm-gIfB?U{nP~%RSYav4tHoh$5+)|h+uOZzbfqr(C&w!XJ03Qy_OE?- z*O#X~ynVVOTjy85wqV|Qu-;ibZG1+yGS7;qV`&QrPT?9MXgmUtbYb2xd2rgX-y^3? zvpM%qzlWv$7l_%HW&9JwJn@3%;Rxjt83GC@K6JFe3U^Uydr9&Y2X9)y)78T@VPn0s zDT&4?cQGkE-5YqfKis*5)Ue5AAPO8o4)ugk&ZQHib|7(4xMW5Mq|&oX(EM9lj3zF# zF`QCN-;BYQ4_@nU8Z!Wosft?A{La~rPa5-8tYu$^kx0K(iiIo(W0yzbw*@#@A{z)O zuM0*ZK>`8WmgAUEIo~|!du`Lr=sQC|M=}Z2Jm&$+co5@9RK`cM9bDnZOus!yH6ti` zovm*(@o7L8!9S0e)a76A7oHC$leLppDb(-?i|L#k({?U+*Oph-i?L2$P9HCP(n^=w zrR|+OK3272EqlnA!qO9rYzlIsGPdEHK7QFlbdG1TKi-+;)(Kq+)||@es#$@K!YJa< zEs(DW(~vMAXR*lObl?>bNIgIcVTvAv#nYGNLjFMJzQT&Zj*c?;o;H(PS{*VS zL&UM=V$E?^3ayyE2$IdvV?9W9DWTt-M7#=*75y-2;M(Ys#H!_w^lKGG&mkBWi6w0H z7AT?JH|<&yP4g@hkzijx6YN3^`=`ikff|K@KGXLiQ6=Ug2kE)pGEm`&UGQW#hJtV3 z{0$f{Ns5dIg$L>}U6yl(=V-Zo81IL_da>JvR5{Scc-RG6g`E8?3e~^$5+~w%FNsOPbkKyUT>jM$mkN_UZMj-==-K#7I`K1*?V_-OPI(*wW23l`Qzd_BBbc ze(*3%)at;JI56S)hkz5zR)B7ytM9e%nVvcac|vRVS-P0Ln;GTSJCA4hx9=@wH`tO> zXpMDL6jOl=Mjb#KKgkmS)hG2aflyaCE(o~_Q_BMMw6wHmx-vp5m-A2Ky>*8c7Kz3& z6b_3_tZuu7&l(=# z>L{8zK~-)_+-I^CFflNeCHbkOTH@c-z`gK;rpY>TQ?zVKtvx`%3`E>bqi|L+oveAa zYvRGA?#)FeC|TvPiyc9A!KVsLhPEPscelsifG@MG=5RN#JjMJj8oHr+pJB*KTQlEF86x`7?;$e`Jo=PeRfw!G&?pCEE?pXk8V~*bgVbElI9pbTc{PKW__jzR zX#ot`TLpzu!WZOTQl&D2jtsi6Cy&PQ3#e?3^R(#}lrmf$*N73sD zDU_ZM;4xlyxOF`;+ip-D)2M3iAC*OO#ej62%sMCsI8i21%uqmL=TOt+$XIY<0%;op z!CFdx#=FVMc0(|q(=4Ks+H|+!|BiR#gf-J<#Ilanrv}D3NuTn9*8=(pFT!)aQOPb9 zP<0#{!k5C6Po9mi6dsr(6JjqO<-i5`sK2yF_-H27%DT-oAR)n zUxSRg)utX>!4?mWihQAQ{)}-8A>@J7zVLU#&%IM$%3YC1UCSQ|qj%rz81UTJO{pxl$sKujsw}p~pcxinkzvO|KudV1 z>_lLC->&AU1%oh!2Ad{5r_fi2fx#LX6_{7enrTrL291WK74p+0HiBZkk&BMVd0LLO z>Qq>}-t78uDkXGF)9T@2{jyycMcgN-+PS>^NKMJ@pEgcCu=C4f>mkiu2smZFo|vq;7Rcc($)G)*wBB4hiV?`Fun z!XJHIrcLZAG*kxabaK&6T9?vIi27&3Tk_TmD?CSa$rouoD zsP!B-GLmn2icTc`VOncnDj-#XAfAM-OH@RLB(_7gEa6x!b3sK@xFmNRE}RfLjSSo8 z%dRiZrAQX*HVJCjBe>9qM@@GnV8^kgK+@bIYBkXeym3bSJyIY#bxdyxD95gsdIw#Z z1)zO9XDqMv*ivhI6o*-(y^2=X zu)Zy|@5}XKO6@V^vKcuRkDh;1@uMsMZUz9J?h;MffHz(Y=;D?`;Zi(*w}fc`6v1xZ z)_^9f~?4N=Ekx z!^LEzQ8Q3ydH0|QtWAZrTeSLYwO48L&V_{Zzt3Fftcj754*v~Fe5dgYcV^% z zI^AVG6E!IL`1W4Nuwp5ri#w+K1ILIL!O{=njqpY@BV#o!ro7}IYZ6Pyz!z51gQbHZv@(k>C zrMj3KZg-AY=Oq9aqhg_+V##D#122U=LMw*`RnPwR>I!&Br!1RlW3ZMtMeJk2Qk^bR zsvRNJAD!i}drRy+-E7u#QJgq-4`ZFJ=Q$W3P2&Y_SJ8UIw&N^``?!lMB^>D2QuN9= zKUs|>vKE_*N*0Vh*Y$9f>k&wdbJclv|kK*-D^pV-OVNDOS#8vOchWZw73-Fv=i5g}Lhgn#=lU+z$VSO#LV1_>b<(Kk0U0rFOM- zu>7Y`m)~Oi8>9F8eXjPmWj{O%kT%trxCZjiLU^lU7)(xcD?%85-&|KwL_?YuVpn6R zU_Y+u2c;iJrNufP%>K>JvrBJKZ})7>n`6J7CSAm#>h4SGF^Z|B+$@?+tB) zTwI4#^wWN*?=bJfuh1uc6MpAYH@}A?{(j6W86CIF^b3hy_UiE(O-5=i!hnS01x4V% z6J^WX5r(13!PU*srsuaC@pu_i`|V*P>)`zU(~W4Y5zE@Ru#o;|F(ia$gC%`Q zNq?*p5M=oZ4pTLbRB14uXhA38)KmR=NU&Eb&mgT!)3;{fAodb)A<9-BY;oLcwDyYq z2Rn;-qbxV(^*8LLiN-TRHn0C7BC5*Vfco>w7uX0&utQh_ji@f9vRHBwCQ zbXEo(3J1vF+rL6fUtYzJ`5f~K(&Cw3`lG$2EG^>2Pn@aMT|^U4#7ok`6%dd~JM^%z zY0q{(0+ufGGZ(I_B0M`*-_;r3fENRLZ+&maW9Y~GGz~q;9ROC)kF4NT#_fNrBIiZ5 zQ!bLZum~qXd+3fZwYKT1cSKJq`_M;DcU9o0Bb7A3nZ%nnsD%ciO&gLvukcv|{Y zVC)f6z4>T@0Bd@~=sm>-=t+>37C}}DUnLAEdFWh)LdU>t3|u2>>LM#L^c2PuL;drc zh=w(`!lM|+t;3rrQ>-Ivs~cC(2Fjt%Gq6eX)xp(M-zLV>FU!)d*FIy>u3)ra!7r7o z!8aURgKElPf~n+1$@$MF8Fj2{_TvX>HXK!h_ zRs1KKzEw)5>Ho355pfdkCW;N363Z)wegIk}Iq+pjAtSX9Wm9^#vh^0i;k=)Q(?avy z*D6XM#kMhTVw5cH&lm8O;E!1Wnmv}<0y+QyhP*hX$1bc|0?8)RlmtC;haZ-m&XDtfPR3?nFG>uf*z9mRxNZe=ATcjHIC9d|WJ^qtc7>4cE$}!foID9fVdah}Sm9b2e{SX$$u0m3^A3$g?Cc*f+ z4!#+9xE*mt<&KH7GiOQ2H4wx2dT9I&lUpTQZe9Cqj!docb$Ihi==Idzp zjAN!3a;M7dk(?%TuaDfW^c@+OD5vPH$P-psW}pux=gid8U0ne>w>kr|N*j;dn4jBF z`cw!vXuLxwASG_nm#k~wF|H+ zAN51xC>>o9JPCrfS>y__M)VXB66G2IP(}d9H8*s&){5Iu+0tyb-y3`XOgas%nP`~s zNa_VCl(g||Xt=&#zi}A$V$iYWoxAot(x-Ngn`c}N$P?X_<6fAcPKKR|6vZ7+s#viC zOElM7pjOX{BG3C$wQs*>l$y7^15^(YF|I=UwR97#bX4*)dhXK2Ef=$TlLZ0tNO%_FC1%BUI%LZ|T|wQIg+#Zqh`Rca?->j9qOYI3U?ZP>utQmi`e!C6)oY=F*h-#7+IX}BRn!b@5{7gKX;vyT{SWidY4ita7A7>-v`VR?1#)wR*hmcV z^%2z;e+4Y@20xY4&<3?x3I}V^>V`E1lbGK4bF)U685PCzfdS0vSyb9Wbee>8_nk_q zji+BZC}u+)U_FC)o-6I2u$yeUwm|>K#MTPdudCC$Jn-4Aoa5(V7ACp3#cSTY`J=daC}zWfr&RV`pV49%8FzR z3(MWjutiv+2=L$|F+D6xo}S(ubO*S?k+NnxU#5q3ZId4hPZjb4Sj-BxLNVoG)9Wh5 z?68gz{LBx7={t8PTsPh^%t!IcR`a^-PvaH0C#q*+_wch&t~9NhpYVH`t^J&^vM_~s zJWx|f;9>XE-%{_G;ci1x%;7kBKBI%EI%75@9At4gzO)&gDw5upCRogfH>_kI|D>1K zHD_COnR}PI%ucXYSQD4J#J=;^3NM?JMb&AIL0y#>_pIRidTlkjb`a4F${H9Jg3=Iy zMgtpft+Z78RHb>rJw$D!L(Q#l%1M%lA{?%(b;1|L)~Q<-H}Gh+nhB+jctBR{?$5)| znDDK+of@T*CUW4HW4;d7NHAoTEzKMmQt^hUGjf}GXCb#&)5^i{lG4mdnGAvvYRU7+ ztv#k52Ek?jzQ*`~;)z{x;r-Iw&dAf8B8eVdvTS$m_vt`kZgWK3pHuwK2t|Z-ovqPy zV0sr!8;&ZTQRN^QVh;N3Qs5vny+NK4mwOs+*=iD1?di6g#ZNSJ88Ku>r;B@N*=Sj< zdGVfCc)yDUVK^I!yw6ts9PjUM_5Y}wf98nq-;mJXrNaM)a^YW|p8xmupOMYfgDGpx$T$cS; za+&2f=TbP9Z);i_EscBblhF_=mh>B>IGb~R_kj>UnmRslW!5&mB^{uG!EIeY+Ttwj zD+dCMT=c-2yH(``!eHd9LVOQpm3$P-El1N3y41d$gzT4*C6ll3H6{<%glxEpWkblz3hF@_%X=SUQw6bRa zBE$<}%jQw*7BE~wopQ`btsiL6m6zlvti61=O(WCZObi5 z5D1L|$LxqN?FsUQU43;pnyaU$SrfF33{CfbyY$R11XJ4&>lX*>vTeFXSlkSEpN4Z229<+xkLq zc*3V4PxnOJF1Vk00&soBKX#qJNl|u%Y<^8R>}g333z^w+pw!AV803vs%qbAWMo7#-y9#=l1VR(nqPxKr%^*e53oS1lZlYTJ+4 z6nsPOH^OYvgeBE8(ksWTdj+M@=~7i43fIx6Jb`^L_+z9R=kv9fF=ey+ElzmE49`kx7QZSVV0ZO zvZI5C925&vv$aDcHVl?ByZMDvfp03qksViNyGQ}9x=Df)_p6@h?AwI3r9#_>tF;UJ1d#Pf=nAnhD?q#O zC*6X#j@_X1dUp{opHXu&&`(wUBiBj;27(VJP<}k#^5L|r!+1k|4;n(a5X{8jA?|*H z1l)6M~C`au%GTlcJuK8d|+#%`G4p>fTE;wOnDrkoqlVmjT|qIIyDIA-7O2-jat;WEsEY7x;Ya z6kNQ{QW}Gw9|U7Q2z5*p@lK$FW?UBMsm{Xju(J|33-`d(@)bqddq@eh<2EcPV)$$- zHJ`k)MRQSNc!F;m5rZTczEfxtqe>@%H?CK?b(U-%F1KJ0{pMco3`bw4T`e~kh<6Xw zFt%oEZ_f!Bx)BxPPl6z%0_05y-;iWR5^BBY8HT`_S8e^*V<4}e@ADK=$XMatL4S*F z@|rEv-e+f?kN$rX+dnfG{}%=5e~Zxm+t>1+5d)59whm6ze@iz0A9dzxx|V+p`Gp7b zzWsIf1O93i0q?iklFE=1Q(2l{*jT=eRXIKALq|(vNkEbp!sWufL0{l0l9pyw<9p># zRum-cab`JvazbzP@>hB5IlF#MoQ-2|FhnMQ0ko~e3VDj^lB)8BfCAIVUp)tG#&22I z(X=klB@JkV#0eR*w`5nZY?n*#e(nWbnOT;{R}NXVn_l)sxGj97PW3a$U&Wz;mJCN| z27UDUVk#w9CW!P+Y#M?Oq-+-o&uSY;5k8Oy%WF3Gr6d|s7{KaYG5Lbf?`^sHqB=G1pD{G>MY4o6VEDScyK>x0!?b2Cj8IAI7l+{Z>dpN$s^U9w-kX*wkXYu_VR8vB~dACTzsvZIa|I3jdJeS{C6oH4Y8 zt6^U4Q98n8^L@S~xK9a!G$t(yw8tw)E5+Dx)n?u84T#=spV zYy#bDcXsA(CUv3FyTd=C!WPvlL|2t5g1av;$8XI71*;O83q1`A4N*bP+9Fe@?A++F z9yPHMZir&q%oH-Lvlj-8Y|zK&5YnQ9|7?iJOkCKUn_z85inY?5dmhCX4SY7of4rdu zmJu@pHU?=`Q5yy3>dNAw8MCy0k$>?9_84AlQ!&fb_Od*=fCg7goaYJ_Hr(eKLz^3O zFzb?IYY(t5XlkLz#++d*E%Kd8Hmqp?cN*hcCnvGDInbkm`h^1M^sLo3V9FQp;XtcU z*pyiOES}b+H{Lv)O0KUUTZgKt-#B5AbPLgTh|_@gmkEaVFATo}t6#`j{S)qXTIv!faF8^?vG;k_w4gvP8*6X)+Upzt>aGeTvmzw)Y z^wleOS#c6{m_Jepm6CVXeJHX-4hya9tKf2)iExO?buN#9)KKW`^2APmrkFeeWfdO7 zRCij~sT8-HgPK9D`-*yM3WNvb5@s zo?T3t;b%p69$N&}4kNQXX~Re&A0>d)&zHsDp(8{jSZ0lf=fNL$K%j7g&NG=eWp$wG zOw}L`GTL-PQOa#|7Ti1L2)RSeQhRGoZ=PuFX*tU&sjS{Z-)pY1@K3Lr0m0Tw#ebtXi5zm1lIL67}-4NS9V)a>X z%0tAJ#qKw2s=OswD@-R=pTwMt(WhJTq*m&W;Dxtok;3c+L$XZQ!u8&AbWZtpC*NXy zjatVhc+tlCwgJX!*noYpfXJ3mBz*Gd!UYUezp=_Xcky&C+)cs8kj%~f(hQe)-LdGn zd-$ov2Rl>Nbz6!9b-v~K@WvSSk}Ax4lUpG+SmJVWw&H@9$ogVhvy>7LG9)}p8yF^u zIho-?JA(wczS`7ce`+fRmq!h=v1pU^yNjY#hDZWd7^UpS? zpI)U}ed7gxN9o;PFHpCBiD>^n6w&{R4EH}JF8{Acsn|c8;r^dj26kE_I~#jDTN7Jn zr~mNT`tKZWO+CA{X2dU8J^>6)73go@cXP$Y0XLF54y8ShqXvZjv5U|D(b^HBOs!s<@pUy6V*&w_ai$>0Rk6HqB?WW+e}$PfrC{c`0V+Yt&za5W}Kfd?3&CV z^J;vrYeklW`jvbdSS6zQvbvC(+34GJ|7E|XMH^O4qsPAp#iYP^->7_lEx&(QoCc{p zpBFpLdayKeYs>m7;gB^YahfMg=|k^BsDkfFnB-bJ;2FlLqx7=!71zvue2&L^r%}zu z^yxaQO^8GldmBlNT#Z;M(T^!6;cCOit~|GsOzQt|^d>n~5CZWG|E@u6QHUK~5m(9Y zDF|p0X2zV7aFrSP0TIO4 zeR(=PdIigYaswbAm}e*EOS-*(#Nq{?&=FukANvBzohfihD*cL<9ovnK)IkQ>cyG6k zWdWQ(cpVgMJEbxMFc{NXTAue40T&je@dCEZa|le60+t7(5jI^5Zd0GGFZzrw!M4YU zRnf3vvg`ERTF!V0)&Pu+zR|ZbX|(auesOKvQ6G~V3AlKp$2;S-erhx^8*0S$$XJ! zFAK1rumSCWk6s!=a^M>DV!jJR{uR_i(6`2c5(V(fC_5TAkbpl}uR78(a@U^;rMdA) zIGAzaXqUzNy5)~ZjVs09*pEdiOtoHSc2z)?aUE}Y8yce}PVG)@mpJBXD9 zj)&Cf9-ykXNfFvz*#7#)<=ilD!Q*qoz_q{P4aIYsWhcp%!Jb^jyR!Z^E*pnSGwaiL z$&R}#(E)EdC)#6n8hS`d1xnS+daQ@l#H~dqZKnl};{o8?#PDv0TH~wA+c0Sy^9sRv zuBD!+EU9C%ktp-#>`4CnJs>h==B4jYcf|fTnISV6a37GlB&k{t-j(zee;fLf2eha;KHWx4D*vABn~k+IdVH&N^@~ICl?6lYiusX?zhofQh8nvnDPQMRFqtr&D6JV%tjy&lS zITdz9RW4X`M=XAoRzxEpvlS=n)J)2pCIK_j@*m-CqQ@%@uK|yq(*{_j^%gd$ax7qe zz9(XmwE0BBmiKy-Ne_BNF%HCYJJ23E!%a(>h^+9d)9{VRZf}ZiMty+H-%z4lqSu&t z_|NlDF2kj$Q`zfpN5M-{jZTamCG2x-i&GB@d*Q@Qq>@o}C3B5zimeFxgxcIC!*jiB_UCKsCkq_syVj?Jt3523 z)v{(c>5JNp?7uZMtCTf>&RDAN%YHc<4qDR#W)=iC}EIZtGav zvC|^s2{RPajHrzF`A)bcKQ6YsB^FSN|3Ut{&v1{aHM!@vdNQ zF>YWx(D3j+z-?XI4}H52eZ+1%jA~QY0?x!j*Ged6lT}cydw8xlFDhd3Ma1C3tyQ~4 z=`lh!9Vkdypn^cx)}}4x&)Yo^#V0Je{K| z?Lw~N&qlq-O{r2iyri#k)5t?@L*h5WI*u%@-b06uWp3Y2YlI6=i;>r4P#UML?vuF7_jj%#m9k!uYeABzQnX$V z_PAJ{36sq3h&@h7I;H1Q&0FMSUZdPkexZ-QYN~!7n}T9|WYVlzpn+ZDZ0TaJwD`4? zmEmiy++B@K9Xajh-b4iKeI;nXxZMELg)KzOz2A^%KQYJ7P)7TYypKOc<$8KD0zz_1>hyo@|Dn_S zhxG*i{6*&fl{?#i+Wuf*`8xv0$nFcT_>Zn_f0;H|t*WB-*?-(akDjrLlFpknZZYd7bjNX#>BNb3G3LHn(k~nq32|Sc=Vht#^(0 zvSzfJ6#132zPAC;`H{8MmGO@ZhKq{c(3b35*rN{Pf(%?bmR@Ay8rF+etcfE6lOJSP z2%WoucP4|Vbg4aHWZm%EY%hgEFGJBVLGaf1Xi^VxT|WBh()f-B%rme*Qv1E-BGt&& zn3Q1KyF`)2Tdb`(%{W37xe^j5nzbbf$nRRd&^B}=c)9QbJAFp1AqB-2l@<)H)3OXK zwxixxESu9qDijKBc-f+I1$Mm=N9^42dSZi%T9&7>L`kPUUE>x2_I>s=ilC@%tE*== zE|;X5+llfQlQOmRZOauft{ROy-46qzZl|Z#>8meO*QtCCg!J1V1se+mli&4Bpm})p zTahUkzoj^Z)GcwZ;C_?^+x5;~sXQT#dq()CY*WMfYUf9hZ}YK)qUDHg2BU9-R`SF| z&wDu+4#ZrqJ{~uYUg3UtVeu58+T|az+?d?~Lp@Xfo-@|hSj#Z~B@X>LptLC>mz0~3 z^xLBlTPl#s8uRW|5d8=ajM%`hQmAod|07mnU7^GMcfzy1;W=k2>>688_dEN-G7A*) zN1-DYG9z+2Oxf3rK{pS@?9Yq=kjm`mNuQR9S^1*Q=24}(s87iE7lc{-uNec1VNcgC zT0O4b9XUxE32A3ug01=B->j0zE^Nr9pMml1X|QBD`iSVT>Yd#Smz&EQM>f31ZmsZb zj~AQcIjtR%vu6`#s~LLS6jH+OS4MH*%Xo`{ydhHk{v8pFDDYVpG8c2s9jv&^8gyab z{%)1%Aa%01JSr+&D4ygNE%$g|z;^vasLLZ@FC-B!hOaLAgtri*4rIY!lMc3Mm}S^6 zKm3AW-12iCK-7VlZ#QECP^89m2$ zFFms79eDj2Glb4_fOfHIgI6keDANp-vF{%kv46w(2CBo%+@o#+WD{zH`qWcX}A|ro;hGAW7XOrTamSucAVA3kK z?dbIi)bpz7L@%0UM9kWJsz`imvY_DV-s?h7yy1rMGA>&U>DL54erzHBR-InB4gNe? z@@em$yNwcVwF`E$aa^DF6l;{CiL3`(aGl#xD6ueYS?}$qBOJ?}2#@-E$ovhP1YA(% zr#BKeg~Q0QD_i8db$$(jMF``O0Ih}(62OTJ={vX%y{3DJi+7m4n*cqQ8EO~$dxZ$! zwC8;gVyAkaI6}5hy4ga6lf&dPedi?07H`L{;v`b)hf4Ts-0@uNHu0>*LVU5DO=Pxw zrA~cS>&#;-rpJY6KnR8D{)Dfkq9)`x9zIfWOwnb!_L9qr!f=VG|Kt3r^aA-FG&L%f zizS(BE&d8~rgxhMKA+2qA1AUm#EY&CG~aF*rz%*p^BH$01uzXEX{oOJk;Rqaiuk9n z;!N5?=Ml}7Vn*e+ZoHC!-`;H{bF3rdy?-}MAORl8|J1UN|Nm~7{8MuD-zC0(-4B%h zXAP78bt#aI*1*xo+``$!$l1lw*>Xm*hY%|jcijAyf2ggSmPNDe04g7GN8kQp>p?vNpggB#ArUz4+rE9HW>96DnZW@(hl)BB3Sc z$Apoat1RR-=LOLMCfN}{IiV!J7n#y1vZ8K}6n;P+^O&Kq5p9y&Mli{8Z>JL?$ zU5A4CSms5tgIh$7;>#QYZEMs!$s9|ICjkKmCL;^(lXN^W<;D^qKtsCF6XT0jzeL#eq zg9iAd*ECLyM-hW(8S--|W^r;VjXgnAsH!pj*@YPs6X5ONrF6j>S?VWH1sI1{F5+ zZJJB&?<@JQW}9R3Ti{kNR{&8$x&d(K^(w!c2mAT-5i)aN5(@)XX?;VLp&Jv=99i3< zPPwrjCyqmNh+EKlPqtpNwxZA}B_aXHPS{|ou4{%FlV-74eo|NxVTNRIGDD!={eW+& z;A^Z*QW5ucueZHf(k#?KxU_LAWotCpJ#k{tU;vMT{#8qb)M}TgVy!jOg3EY$yv$q@ zpH#cf(b8E8OKGI>Z=o#6Ufj+Wcrq5tor+w<0I`0n^uJ2&8ZBm#x7aR(T+r?d&sD9n zZ-UuFC8c?SD5y&vaWsClA#(k z@S)EfFo~7?QY^J!yBlc?-8P_h7-|@@7!=>69xWaRpMJm6_~3RP^Pciv@4UU$vQr;^!j|&`Q&hS8906Xt3HErWOu(^ zw>{B=A8u~H-9FKd=;TgmJc@YXUAGvY73+1s#10a3;)lvC&dlcWGYN2e$E1ldo<2dpPDUaV9x#1IBQn-L4-oR8*Ax!z9b zwN=&;ohNZb@f%+)_qfkm!5X^e^I=5 z%^bU5zZ6*x(#mdAvbN5lEje%x?`5r{w$0NR-=(TY_It-tPR?F@%3kHQ{4`2s28f1_ z@g2pFlm^N#=hjLqm8)V07L(*I7hZo1cYt_qg$ePxw*gpj{(Ni0^i;!3Mbi}6k3%U76a)AH`>9^C741+jIo_lK^Nm=5~2e2 ziHT?_RYWOwExOVG=S(e4% zFT`cw$TtYE&Bgj%k0P}1xbYoW1*7!yksfI_M7`g!Jl)pkFDIn0ZnWusbla^IyWc0& zF*d}J zY|Uux9F4zr^8T-q2bel`t87>8odFC8&cJVRuGlsECJgbpvkt<1 z+2J2W^|+cOooImnz)yYXwznDV|rB)aWvJmEhj1*HYvq1phgrAoGmtST2s(c z(=NlRf0niJcPk<9ms`6+J=d;gj7Xh1u}@)`BnDt?R%8X~BJ>$Q98qJPylJ*+$)vgf z$2<2@74lJ*0ZpDfK0Ex?2@lBzyjm=pp+UzQ>@PKE(DBQ)tZl5;2+m|H0AfhHjx~g% zXU>{D(J*u{ai=7RtR6LHnidos!=?)0Do{62W!3cnV)L3`))wiY%!V$EK9o=!pCZ1T zI^sTH;0fI=ezi)hNYDn)5$TAX4{hj7&YE@;Q8 z&<#cR4ll@Tn-NmZvoi>NTk1X3kM4KQk1w9x16*(Y#$@{-NEiAOMh9%$HU|OjqYr4} zAP7Tid*Bs_E}Xw0Fps~ZetJLwOBr7)YMmtnd~^^kIR7(>9Dt%2|04l6T|$PH)o5Xd zm(-~?RE9g7lSkSXVAmElP$pjRB?4wN2eceyjRO!%Y*EuTwlM^QUW!Bp^QxViK4SlI zh@EE)L~cRi5M!=x5Pj^Lo!=)8=*-(Vvs!a|22ZaPS+T6Px5>tE8b}@UYosod zt51dL+hBrpJ*CZ9KY>oFz7hwx5q4_0w@TheNT=$w2Ut=@soy^Hg|nhMHi*z2^Aa8^Lbl(%v(kc4BNZOW#q8B)K+o3FUA zff@rJq$fkZmD6C5)V!^0GYq98oYS8GuszGN?k;K40=wo{mZ9xK$@^f%vuU!jVMRrT z6o!;Y8|^Fl+7ShgyAp<(fvPu)qF+o@Z)#|37Tn%9yqvdvoB2sMMwB|Ssjc^7>XJ&N z4eulDNWZ)*u>m4w!L?Q2&|Ci_I+4u95{4dDm2E_5&&DcZ7t_9jOW4OW_acpEJxyJJ zxghLSy0JNitk6chJr4P<`&Dh{^R>AkQQLy|5eW^<13zV2rCZ5gf~p0{^#?hee1Hr6 zRsG0lCrx-J;sCw*}}(EkrQm9CQ8cP&u4E_=$vlNi0l5UF1t{x#GK3sSW9tDsd}5zVSnS;2 zt@hQ;dRE2D85HD4v^J=dXE47mCF?AaNp|$qu&qRzM32P_>YVZjw5KmAHM!xTJ@nNq zsam+<-RedDz%6Z?1^cRKr8=+skS6IPiuh!%3Np;-ywG|_0qvV&!ohm}Y*5rizf?uZ z3QF>D!!i3?N?*IB;sV;4*^vtx5w!fjMdmj5<{Gnv5RqH`kZ7kaI0{(HP;q}kVR=$~ zg!n3KclgU(KHBWf>M8c|YFJ8Fqc8^kY7Aa}xvx?sPqNryj8cU;t~@eqI4mAf zc=xtse0IdI5o5KzMhZ;lp7NLB;1payI$T%a%gM>tI{)weONC*j^^*bOF!Gk^+spZ` z`YRolU(>q@7lTO7&aez7JY#Onh$su)kHBzhGy^aA1pSzjjGiO@vvgx1?Az?~jXWnj zJ;#F_+`LnPp}Wq;{nL&0 z7U;pE+=AHKrMfJk!a}gld}ZL`eG%_3E5-^qD!T~1+2b@#?ih+)Axyag;ED8R^z<__ zOSy+Jy{MbH_EL5cVnr+ap=O8itYp4Kk^s=_9s_?UrYMYCTL z;)NP*;YH8ed(H|uc+CcjdE|>?8UQDL!r+^O5a}q18+a!Eco4%jXcb=Qq1!NbGAg%U zL-n1wHR)pR4O$Z0;nMtWiA;ZdChYvC7993;fqX1y7ydIl!FxztzWa{W8`FpJRU>n-2)I86oS=tz$3Rc%4 zLiQTjWxMy>B(g0v_xmI`zLRp*3S zd^xQLz1dq{+}(Q7e*Q6#3l2u;7c%z`M;Dlx=^h8rMT+Sbi$tq}$rY%nBET{~w5BT# zl*rSDt~L%2Dv|h)QYdn_*#>latUFjS7c;WdB<9%FTDn zLxU>7vY_qMiiCDMytUO0zM)~Nli1Ati;r%)mNs9zY63sUCVGA52knFvk< z=N>$l-;RsiE-Kzi81f3-GVf2g2_nv>(^VUFV`5r-F@_DrysU8=eBtmW|cjKKGLueU zow%yxqE?qgUY>N$%LPOXynpK`A19`?3~ZCh|B`wM=`G0H9`})*j!W$^J%ex%ZY<9{ zN_JfsdZi;Afb;0Z|D_i}K@EJm9h%{%w%+G8WfUJo4;Qc$AIV)|8N*brf_HLy%`#wKKk+DSS*&Y-<} zJ9p}`F-gVM%?nCWISIn8PjO4_y0}-WcB75K4T+y~JI z`twBG@&41{6AiDEq>W${{Q(=A2>uui-tc%n&{raLdB6*b^MERFS!9;z8*FNwT{S~# zGPD3CL}yG+{^n%l=k)aCApL;cZi;NWgKWIxglqqBid0K}@6YnGFOy;x)z^6w=&_P+ zJKdwXJ!pL~cs(M|O~O}OrECu6id5=}OD61d8Wg@Z!N)wP4ZjTB6=YHIiOYM0<7rVt zJ;j>&mJB~+OSED99UgHgt`gjLfFAL|?3&u_jhMG1`V;f>q|XlV{_yG5`VD(Q^vz}G zn}@@jpt;#=cSqprgbm>PD9U7^xR>s4!nsYtLiQ>+CoGnrFYCe<_1Uxa^>gV%W$c4t zrBjsOUw|orz*HF9`HeHzSV&iS0Ip1hqf>)_pCUtF&oa^!G2S2#^DF@xA%ORea`#?| z@Nq_y3f)eZV*g>_<&NrjE9z;nm1SS6+$ z*99t~%b^ihmRi+=*wBSb$apV(ofWyrEp^2F#-@#bqWrP~ZD44ZtdXWRlbh%*6+{I8_#fYb;2-%GTK`49#Xl){|6L;g*9IlQe?{c~A=>Xx3*#SI|MU4r*8g4`guoV{ zO*85mfaAqX^pgRB%i=tjcEzvw-+_c)nje<5J_X@qwhJX*&{aQ6gf670Pc24iR}P58 zy+yqR7F1SugO6xJu2h46p~kje$iXD?jmf{npsfJMHAI9kz3 zKd%SUszsPPWuPmq=KkXHqFMN~t{D0A&pXqQ9?2+Pba(SVmzcMp{}42VdCJ%WLsyNq8Pz8nTU_KnfoAoGp=fDY*OB}0ElXTKqA5#J!Wgv>{zq9b-( zsu{xJWYp3{VOHQON37c`2awZRA(0vvdwfh$J;SIHo2_STeV^a`p~dz6I58~7oa0^J ztXcy9jC*Z@jp^7Wu~>mVNMSa;q4cL=lUwf}3NP6>qJO?%Ru%YD>$uTe-v{7{Yq1Ba5KVy`m1qhuWleZZN-c=yM1Gg@=fO8Q zrBToBIKiv5yOznR^L-S}(SnUB6xppgf#NORfHu4P8+}N#8SfHp56M=asn+>5&U8(& zY0jVcEkG#GqA+0WIt>*?eiJoJxUkd#ol6^*7q+W9!GAzN!jd8xrzlyU#%|v){Wdl^ zmpq@2>a~S$;rgeu0;?m!1ffE-62m#97DKQ!kD$Su-zVh2r>M_hJdB2;xOGack>4=R zbQ3A5S8X+z7J(!2B4<2h9a)Z4Rb=~|v5BAo&bI=l#bOeY!g?leS6ZMm2Q{z=UJ--9 z#FE2Q87;+FF-Tjt7UAIGb1+F~w|1B!X_qG_a55G)-|Vb({_gfnb7X#hK~TXLC=kkrFgqt)t6`1^c1l-ut;|k%Pk)PyOW5 zw%GLAVmplMvZQb^#BgY{26xsjlaSHmIs`Rf-4pn~))jV_Mq%wp0G+s~R;@X9f*^{b zcZr^1_5;F}^|g5^ycsf)i_L;ZJ@R7Nc)pFr;(`^)*w38VO5&R6u|xa(3Aw8m&S8i#v}Fkpe|k0-k4RHQ~k(RA5qfZMpny?VtuZd z+d#UP1RWs&p)1qY>_njlF0Yvp-*r?rQ2=FuyTZ#|YbyV_fVw{mJ{Gdl>_rkXn|LYUk=evKy>EIr1w+D^UYjyl%^93-S=lUmN`2w^e zr7qbLcjMf!O=UBWH-a+JFu>Cm{M6V628O*jT=LJpkwSkz2`v#gFwwBRfK(=~Ez}|3 z3qG+#dYTo8)6tLekJ~-gVGH4hwOZqHpyT;47XBg$gvk6^)bln-$#Jr^Pj;g-3;e>8N3mtHm#syhO#S%<7BIm&N5<3j;Y|% zkLI#_)NZcYAShm)D2*2H;R4uD1N&=P5SN;*nDAESs|wBaZ0v$DHG6yy^I;XqIwGhI z9jd&iXGT-)iw?hW8dasxxc+d;{O!NQJ+UGmjBiJ@9j@EZeqg9);cBQmz%An3z2Y*1Ve2r zuTwEY7>WQ4(OARY!`#Tr!{7Kq{nJb3uwU9-_V1qFe-$U0{~~SvztX8cifp8hYGkHw zsDC9Rt$GEo`UM>aip2mXN5BSjAVdg!iogs7iY6o!kS7x#gdsQ(Rq6>vK$n@AoR^}Z z7?PN$rWm1@8kZWAk~PscHoS`3@OBbhUKjk^5Cy=_j8FBe+o#~`$V&l(pa4L8{rnZE z^iMyz|2-Iih1Su<*4e_wgx1`|z}ngTKb$9+e|^_~JLl@_vR~NUjzdb(WFlJzGQM_* zZ>Rw!QCQ-r{5HW;=1V+{KeN}DC&sX}ASgjuzbPb@*-e#i5Gnt`?n1SFF@|1u*ZbM5 z;t^CN>8-2HCNeiKGkKig4j?St_0^5iaJHB~oKnF?bhORyE?ISskBZ@VVoD91js=v0 zJGSvy+PZ>{+0bT~HA6-KR}O&AS{53?inOG=avQ+Bu_&I2*+pkR+R=9VRDQ$r8VK;) z4+2(dxfTF-SYS?xHUZ)JZSl&(lEIjN`ixo@X>sm-LG^*tv+7}1^AP5anJ$#dY3LMU zF#EwHgbu>Ah2~blO_Hdi558wRBR4?HKFfCf0y_<7L&kD+tWxls1&zYy8pf*1w=ToQ z1en&rgi2wb`8E_jrd6p~b$1nGtMa}moX~34VfXnl;|z*4fmS-YHNx}MHSQ}t&gxJVGntG&r4xwoM%@| zB%zXNM*{A~yo)(vWEhm(XK$5uzqv9yKQ0LO2&;pp0^-3ZzUzj1YK+ngbo*R9(vHy1ATxcI6zb%pjf%iRM>K>RbE zTbcx+n)T1Cv{s%TW5^QK2CUGiIZ2H*7|W%3rnp$ae+)P)O0;r<6su*9k=>q>5q z7Zr_@m3Nvso)1Myr?nrHI)66^J7SzP~f!T1(l)(65|!LSZ3-N+bzd5zny8xzMRuQ z);iPBsf_ETS{sjOD`8;tTR;Ea7}Ib8+=M03OzNsn?`cB#ns3~(9(*x)z1wy7x#O0V zhoo=Q_Oo_~ShQaj+h_(SU(4=>k&MF|plWXYc##{0YR?f|8GugmzWyDW1ag9lHp_gB zscUjYhP<-XsHKcSma1mCZI-gG8FkHK@=~ctWAT`3Vn*fMgt~RLV^#O;IHHO^m6!@{ ztLUXicsmn?YK|OTm_z~W(BA~L=&0Qa}@WRJqhAQ`(py^M0RLaf( z(P?SL4^2K?WpC42nrhT!S zFOr)$otd$ld1kLWcMBS;*~zl_vUk>=xVS>?VD<^CYqF>n4<8W@`pV+V(18v>uz0=d zoJL!fA^XH&#YpMt`MR(QcUo`UAEcaf zRu(np87F7zb#(LIb=4kz zzZUpvw1XD~d(cD;XRP}C2Hh~;Bkeaf=sYLu{{`3uAM#pA$t!}Q$Oar@L-e5#b{R-c zPb4;Pv=CmPG;9O`x>ov`)h`8Px*$u&Dw3lisxqO>)rh&S)a6;V_J~}U!BJ_%rS%h9 zw))|Q%U~p%3Rrs7SXOz2IL68bwHn6TG__%((0hQgO?MvN-IigO_6YPT>nrr?uC8J^ zL3DfdH-$`?n^a5qO57#>LjvEw@_PLjwBx_)_4-%6`~x8TYr_8@=KKHscV_<|I!Wu~ zY~bwTWbz-cEdIga{@eM2^4YGkp>$j-A%KOi^(m~_b|q&Jnuk}aC&0-B*iZlk#6{ao zB$mV_A`?SQkuBM3=Jr;F@Q6$|sHd|YQ;XaE5_(rxv=(z+MFDP&7+~{oclYUVdWz#| z78M@_@71K<1L)kPPqD~d>-AsQGF?rmvOOJoOv7qS=`?@zgPgUp>Xj}OXhN$O(G(p4 zUD*aY6ExEboPk5Gxvc2+3z7T)shW1SpEbyI4~Hippn-v$XwGdgB5y^&81!RXf&6;! zg7dScQWOSiMYBqAaqfT}-I%fHnW4H85tghPapx{*;^gx(hhNgerqM$|tDu17Rygd> z7*3?&>3;NccWyO#$7)%rpT_3O^>sDhJ^k+~pHW-Azn0^*uKIovTH93O6f2~3FpD^C zm30czgj_A&xWYCE4zEX_Xgrc}wwu0@@cyCtT~qPO;H}Cb<(T+p4^}JOsd$OT>s{~S zzdZs4>mlRth#l`fMP!RtRPIdm^Q@niKvD+(<_a^YOtKVk?5d?c{X zON2{1HX&#vZB`PsIJ%UqFhFx(Ga@UWa^x&;ES)VFDVb|vtpvOwu4h8M73fT=rmaM< z4jr$z?OA~hFImzZ44PRj*DC)ix6xU5Iakd-2}>AtrEPy7e;8=W*j+W4WLx$D-%pnp z0I!b=S@t=6m2WDsZ!ot?f)!Kf5@oVz#>!kU_cU{`cI$rCm*Kw+s9mp?vnpI9KV^~r zDxpUXc&Le{do)eI2tRpS-EP>q%v-Ne!P5roaZFISUp0uZBPDi@pqf&IxeCH80v_xg znyY6lGGSqhs<4s1#HxRQ9fdNU8je8F8k})lfA1fbH639M_AW?0&q!(GD5veOP3)=H z?NN(83O_lUd!#^KtBZ?BC#TAQO0!_BZ)MgN4jJ9LiA8<#P)p#|^q0O?1w>-SU@(Bp zGKmp?0$~v%O=+Z3oJe6-PG1&t;-lV>F)xdPLlk z=P{L4H`~S#35{5xf5*2bQYJPT7(C$`5GDYbWC=@?`VfC1m5pp;+1?(deiI^6TLs&KR%JnEF*uVwuVc-b{?` zGc>*sAK0y;l&v2wQ!8%3W8ejXBR(k6(B@Z|2XnZ<4m>>g3<3=(tSpb7WjmYkV#D;; z5GzL#iD-%i>Ms<*corA7Le^JA=^UMT43=4DfYCI%a^UJ126Z&qVJU51n7+ z+u;y>WQ)gQ72TE}zM6zrjZ-IatmDu~{7tbBN`8f9=0x^2Nwq8%xBb z6LXtdFMiMDuB~RF-*tMGMD7&NCYuz08<8ZDlW>&2QF<+>YR}Gyp>Fy1f#lNg);%<} zQBK5IeDB-Hz^s)D8Q1?Ex1sv*qsm;+`1&ZNpcsxO8+f=blmIFJV=1{snZTmaEG(1B zuq6n{Va_fc!4C(v$mC$`}w_Dh}dFU#U$(gW5q#AHV58!DGxw_Z?xl+ofX(Fc4(88_*&jN<-+^}jv(^n; zlrDL{5D@4{5u!F7Eh=juS_wsjf3}S{jq#Cu?@z58!k~Brk&V(F%H5PzwJlbj>kNB! zmv;eNOPgk8fnGt%uV4dyDLAtb=37`k$86^+mDR04v`)J}cOC zQLN||ptql%{wj70mZr2n-9sirQKtGTcC&@4)0*ximAm7Zrce0!qTM<3a~S!J;OSJm zQ#Sfuul46<{*c5C?8LixJbvWwkKPK86z+i>p2Xhgn97+DRnr(F!~tKw$LzhxqpqsHgw2VT^UQEs!c_-9J6d$vZn9y3lK`K)}> zpd=QGWf4~Q7tcZw@Ju>ZfGt#ybHaSeYh=uQR%;!a+QE}<_wU~Sq5~z1^9#z)9 zdSZ4TD4m<3JAg}#hw^dDGP^F`Pr)rJS~pz%j!im7bwYwwr1OCATz<$Jz@moRcNO;r zzmqDZp)d@fKrbezvu4pLG~AmSnKZQQwLDWKOu(s9n`!~kp-m-^75E@rt1gyMRN|pj z?f1+pH;4Dk=K|OD8cbqzxs+B1xFDJZ7f`Dmk7Q+Jl#e%jzcby{-F?W?YDr2mVHUCT zX>ECU7R>{^#wwzMQ*4nJgch>hweY$1rhtLDXRD8$9AB;mk05mkxD1#MYkZ4u4fa_= zgW`dHHboy9AtGBvNSm6)1rbPR$>glS(KPmsbAhcx6ezJb&K@EV%}@@25(ZxzSy)&Q zLVcoqX~rJ_g8=`*hDMR@eHexbHsNq34akX;qeO(#UsKsww^Ef*E;YIgH+>(zu2d$f zuoOe$l#l7A;@UF^mYN2-2@8C;e$WBXSJG_ev}BouYfp*1=6uwhhys_nbS1Hxi3&1IzD%6`P=UxJl%3-@~n9zKNQy7C`W8`n(W^b`Dc7vnKf1qv+ zCuF8@hmOdJS+J|1Ibg9lVO$Z-e~R!MjtV!4D4`HK?8MC|9nAee(SguVJ5i9e*co=_ z|*LK301cZnCrBiI>O8QYz&^cd^=(~G?Tqq&z z5PUQ&pJenGs~KT^iP?$g`Q^$NenkBWfm>ZNGMr#3s`sW4D2C9)QL>q$hg(J`X@|WS zJ$biOPhVMA1ISxgnwAiJkb$uOj8yF9-rZG`DyhyNQ_3p0dEopt9@KSs>Mh9K!_t=c z_`PQfoX~}yS!$s|VV3BpMa&0 z3vHSp=`{!b4gI-GM0$^&V(#~Mk5xla>Ah+ubSjp_HLrB(#LE=#!`m0{OT!FAwIFkf zs{@__zT!DrSX0{X`}FGea3R{AjxaJCqN1IrVBbHcw2b)JZG@_?!%xp9JPm$LhCQt_ zU50rVPujl|ELD!;sg1C&`ckCste>`PxwcZYagD!GG3-le5mI;AX)&xfE4T(%*e^T) z2YV@~z`;?wS|^p?mGY~U2}4xNGK@Z;Wpl{p`=x@LNOQLYc<1-oRK3Cenbf`?P2C@U ziLW2p|0=$J6`y|vAp4)xq5lp~_^&ane`&Yue{+QY&$|0(uk6pP_Rr`4KC8v^qKq7( zgz1w_XE%>v(?42|>r0jTA9bqWE4mTcFU*eS0N=z{I%{6Ua2?$mG&M9ed{6-61Mzo^ z*l)+b^=_M|-F-{Pr4xE1?P6KHU~?g&jmcdGCbO=dHb*Kz!Ub@lW|KHA1+>wW?s6!H z^~SQg2LiG(_bupWhh)7BB%z6hoB+|69+hzxSV;yolA%6egrM`ss*#X>b<+f7*4HH4 zM*B0gy>tTN3PWHyVx+Su0s1CPY|6@~i(4a}YgtkO(k?N=!;VpkfJ*zgBR>}DZ=bMc z*27;=`&+t0h94g57@x#Dr=vf|cLtv19s2V(euo5K;pI$B@8U660PttAS+8320r7Ai zAtsC7cMdIonbbeEsTxo!L4&k5@kI~4-{q23*DzAhY$gYf9v)-xtk2I(l*l-8_wU}b z+S%GWZ}qu0hm5C`(pLmvW{X)*XZT5dE<^AUiSnh>iKlGad&~Qsr-YOhL|`F0{i;kA zl&D6z0?A%VN?&qcaiUcVuE>v@%=HaGo?51QAPeCX=}~EpLZxhJ;OkHs>v=4J_UGTO zHB6TYIORim6A0lkU)nPTty*xUrME$3c_y~jO^}}RQ|uX513Z(!jim-*wP;}q(hN{w zZ_DDOa^m# z*!)hRrrNks2Ij@=gn;EzPBqB14tmO;%VT_gwre&#+P{4{J5U;vCFVgzAV<^pw^1#m zrTEvV_6310o6q;7ha#;XJ;h}=*``M;(_l>;h21=B{yIDAOW;!x*=XMHPbJrKQU(#V5@^Bn>C*JX+Xv{Nf zpSX(P`H+>|R8qH|SkpB1W)q7jaD-xMGy^`)Gzoc?tN%ad-Z47RHQg2sD`v$`DzZS*Q0Hea1+}m%sTn-}y{U!;p#1Kl>_`=9;Z+ zKZ}Eu>OIVg2ntOn`g&_{dU>UQb`zduXL7X{o1Y7T>G3V2a#1b3-;PPj%Owd*z?pRK zh&x5Q1B4%XQd`uPAp0?+{JIEe#qN%`X8=?huQ0bUwsiN$*>u~aRS>RGvx$H#x~soF zJJ5>g5c1yHtEyG20WXj+jPNGgQ7zozCEJnE*dQ$&s1cyklzL{tf-?yRgFJ~@RNK4S zmhQ3Wf>#Vu(iN`g8FR^7{{9B^0Mm7L-R1>S6KRb;-ws%bMmfXf%ojTdkWxHDs9E8u zvnNLB%`M%W+Gj@IXnfNexMSz6HF(G7K9Qu*>(Z%%av`2qxxGCBUC5T`vcTlzivtoA z<|y~(x2$xpI}UY^Y>u{9lg`CMru^Q!A<;y0)L~ zc>g^T|04rdxBe=OHIAV)fu)U46m=QQT}u4a9uZNiylOv*c7Y z2pjc&riZ?(I^8vM&lCzi!~{K;pC2VYTV5l9#auYBxFm5-8w+Np;0`gwq`_-A7zIh+ zrS2XTDyj5_e2%aQBlDxIc4alnkU%Xguq-rUu%IN2(LQ|Z)6q#vZzjNHvF+ko@z8ArvvU2CN zSJs$yc~m91=k2YFZO%p#pM7B}Cm+`M=<>{Nbb6ze<5gvliouHOGqxwUNJa{BW$b~` zZsRT((sk=O0t zv3*#HWjV_{^Sm-A3$EexQZMD_j#$?ikXnq(EF8i5DH=llnqQdt)3#YlQ)pNzAErTS zug_;@Sxz1F1g{fPV1at3K6Sy7d7j03#ynyr0+XfkKy6-W45|J8X?#C%B>-gCG%l1? zY#{(K1-!X`=5s1lh7`@zvH(9*y-M3DQG6R@1MJ&ZhbJN%agW6WNH+22T5&^NgjlLz z=v#X@(Vt&n3L_~76I8Vg=X@=M;mNU73F(7nN#e7BroJ@VUaYsjkYCE*+wg?LAVfw| zp?o^A#(^0^(_#;k5$zdyj15Ss?SMLy_Z-tTv{c791!pMc3l+k1exQl&3);CVGWQJj zBo_as!gXr{9e91LtF>&D)#Er#pBrrCH##Daeq$OKeyrOj2b}l&*%YQp`1sGuM4R{k zmc*mFy5mHg5+I`y>J3XE)EuvePT>u--Bq7vFbX3V=%6IF=+xXrRl+w~fkHcbdhrp? zvyI}x=iOw*yb4u0sbL>vXUEV} zUK|hF`8yitaUK@qmNO46l8GAbA)G5si`4O3^EILdc~|dw&i=J#AO||Z0_FO4GXsI{ zdO>Ppi8a1#Gv;{R#7`dGgspgtJOsu#-%z3`ITHj#N>`HAYE0*129OqvB}>rplQ5p? z7*opY+PbQ8W0Q9#1_R$W!0*BC>|1B$++}#)L-NwQ=Z@yC0wVC%;VgqCvE1I+LxTFh zx{>uSO2b@Yk!fxg=U4%t>Y zVHzdsw8B|i;6Y02dXNU+?7o+@?}~Z>_+s^AGpfz}zS}gp0E=c|{Jm{K;^i@TL-OW% zu@jeel}E(cyk;<-e&9Y6)ySF3?ZPUD{u9Il=kz2V8d9#r+yF!a9m4BYq{K=;W zR$ehO@{<<(mEQXB{U*V z9D5TptPTmGli5vH)vVB{ot3Mr5Cp&AO5o+HmGjj}#0?%v;XOi{a!+d<5r1{>Y#x4L zRJxWwN0)qQOr^x@fPCg8_+-p7oD~jVAvAH43$~UIjj;MOKoAO3QV9#*;8JjAG*}!E z(WDYT_-j2#e~=*fx^kfiBE<&~VbJILzU2d>K*~rG$@a}bl09_kk$T9~twM>@&7{0g z>OwZghq2m<#ZOz;YxiWJSU*3Ex%gDE$xw$oD7tw}^3L-fQ z+dAm72Wm5*0ESc6nDEw5j|X*j2vwL#yC z82v@>F=>mGZZQ+n@?_%Ces}p*STA}ZHZ;XA3786K=d?yo^LVJws>xE>ADk@g7Dt&h zmya0{SscdO8|I+b_~_(Q3&8Qzjo_#!PV?5)&b#P(Homk^>%j5keq{l?X5$8e^}EHU zP4_J~=0y{NBD9~ZjPr9vT3uItHlD>x%?RHTS-eIf%-n*&I|kY1mXto(-6=1JnO<%Z z=R`**0u2ETbH?uG1P0xJpS&e}gGk;=S~x-nWYY46Ryd;S;^MWOQFfT#kx0_Yy_`$k zQU+O^5}RFg-3LQ@pxOMufvI_3(~S-Xih{_A5bH98tUJ>QXG*?yg%5Eom!Cl0$#O=i z!F29Vy{V>NZ|HRPPxQMLo|e_1?e$1C zGl`OKojLV}>c%%j<=y3jp?_RsJek+M|rh)98^ z58~yg+M|om6{FLpQ)-0-S^@*DN!d-(GjdhX=LDSCA)%Ir?XiSd8YAGj%*RvVh55dzIlPq*s}*ik>bp{Ma4pn92jF*~NRF;|RSxdiG_R(q-K$x3Xpejf zFl=I)dOJQCwd}P)NyOXCEY+926NbD2SVxud zh;@2%?On}mM6z24`f{JAg+St~8A-oYRzz@aq&qhzH$H}yld7m2SWL|l41LB2XfFjk zEqnG$X)fY)8ZR|)5JSld9vp==mb@bW(5`d-$ew%dhc0#tA|{CnB3u+DN>@tzK~WUN z=!{q`#rTf-P2Vvz2_r7Oy&VAMPwT+p)N*J9K<*y-*^(T%I_SL zfntA-oBU{W<@&`#4Ad4QoGwEi&KTsXhw1NfJC?4+*n}re{xv0RO+DJ|I>WFzGI#j+tXASRood3owzHPOP^+q5=(H!ch zU)FmDU50Wf5Z%hLRNYpU0+`+|qM&YL-ZeZ_g6m0XgxH#;3y0a&jrDR&s}IUV$czUvMI{jM`~$qNwB&iKlG|d7iAkFBiyGL=kWI?x9;HC*3Nmy<$Y&j}3(};;H^_4z%NIHz$KnrwPDWse zez#|rPuA$*A1vPPsqec+aE_3)kD8yhT**kjXW%bElF>J(CSFxlBMs-8)x$-Y-_GYMd zJ`ZccJpIjfO;r1%0qz8j_>}rA(t@Cnlp~eVwmG}dzkna-^93C?kbV|a>+mr?oEi*o zE&D~GaNgWsA40Buk>X$~W3CpWP`W$-=HUnh;BO8;!mR!oh2Naqm*l{Lvy>p03aLw& zNb}Xw1Dq41*QQ5DRIS2&bIA^G4IR%YJuW$#>_@wazG3x-pT(e5Yk>!>)Xk{#g~n7y zH17nIfzhntMMtBSzP^E2nnXxE`V~EuQNh62=wdPk4^e3C$amBO0Ievu)*GpYQ(VnU zD}|o05W(~1*W+4*dOs&^wyrep(9R;$flL^ueH``ijF&`<&4G$`&i9sAK1G-sj4CS- zZg5Ub4$hLL`a9lMwt@<#V9eVJcoA+6BElcF7W1OY7%?!;K0}fYr4sgMxR?)WPAkY- z&sm_S-vkz-xymD2?aSL+Y(A{qMl8)ng4L00ys(4MhXfz*d1z!pDfd4pnV6zpzyGQ? z(p>)~-1zfbnAGG>zbXq2E%o@C+Gc_1f;xUxQweIOHx@58 z^T+*}e}uik%qxIuKEvK2|8Um$^P58ZUwB9T4?HjaZ+KSy<$d|TZ}0j4UAO)Hfco3- z--W$_d^Ie@8~ku=$)Hz$D-BcZykU%sWkb<*OwA+b)P@kB`|{6CC|q~OyORJ?DS2K# z&%)`N9YV5k+C%tP-C2%CK@2xzqvNpB)@)KF0FoRJY4Yv^+J6+-L8VU(m}T0)eLQ6; zxt){>WOd*;Dj`Y{5gY;0DfF&+w_20EXlwg0*8 zE2k-d2C$$BBUWnli~kZGEQePZAKlV1g1V%Xpup$$JjOl~VKK@*vq@l>^~&EoL4>#7 zV5c4e=2b!f-3E4=RM}$8#OJbXIUp|_Q7*rWHA~t96rDr<5y%M~5+dphqvF}~$Aphf zu%qvROobFLyBcf7CI%6^Q@E`rMvc{Wi{hphDcXX$k5i$3KBuTQuO_xE&mf>OCjwfz z%wT%Z%0}Vx7Q2;jVg8B1Ly$GD#Thn|0Wx;9@80`*H*9m~gH9u%x2+Q?;Z!VqiV7h% zyt1Iuz<}70Mhu$iz3K{~3=II|0ZGOp`5Jytz<>y^h6kDmMwxB4s#i_uW@RYCF9g4@ zt8(+dz=_a_aZG*!?ns#KqiEpI3FK(#&UwD(RXHPKL4ZWtM!6`Ez#|*ng3QFC+lmQZ z>z3^L%-MVfx(DpUsQt5S`b)#c4DA-^?L_sc`RwfW(r2|3ucJWM{H{_&k${3TqAkC5 z-uqrSHagxrjh&~!aHs18D#0wOlAsAi-8;d-4&Bdh&HDvy#0i~SAm*K7zbAb)m!tb| zAh@qvL=`*ymW4uhGdjRvHSy-tJT;`8SvD*9c#0N|@Q!v`5tTX5%N$Td ztg8pIN&$w}*k{vYAJ7SA;#sZI?0wk%k94<+xY_Zx9z$v9kFo(GPK4&1 zaiG}ii{CMC$|a22G=b4TkXsRkZq%1=P?5uKR;)iUkrKU0$is`QrL^oucZN;{IP%CE zxirV9wS#wxM6tLv6R(8Rk`GKP2a2dEwV!WDx8{mIBF~Vq3fi4dY&Drve zch_iM@CT(SSu*HmI$0{)#EfaWJz{c_m4}_+Grf_0gSqddg3Nd_KY3xlIY9RTCg`K3lh*tM`D&)ur z=sxJ1jb`?=Tq?CnI=7jKI}oaS5Q_&&7x$jMcPkIg4#R6B=x648Mc{Yl`^=xB&O`_o zR{uxt{QFBH_-KEbhLKtUH)Kk@|(*otN0#Fc+3_k9q`)bFYA$1cf#=D#p;FUC@@yZndSm;7(X>+x`nHJ#DS( z7x7zS#FdT!zIEh7Xd|WoFuMkiQ@rBed4%~%^*5fs$7_^)Ll=+l)>26p=U3=jDA>NU zwS7u4+K5E+er-&)7XPg!}LO(vpe_6z?Y5MGrzLbcO;~gR2-K}o#~4~EethO{Yeesp*yUS z&`?(`5hgeIn(h($Lv{HsGva_|r51WLZUWoaZI#_B^QL_nF%;y^vNXeE6d!Ue%Oh}K zu>+jy@k?vmd9lBJkkh_v?W8B+ z;*`Ph(GH_|;w$`?;3d!5ol;@t_{a+M@4bLyn3w|yo;x(L6goXU0pGnm@}a0jtSZaO zD<6Gsxj-ZKcGIqbOo2|oF%K>5q(r+w0_+N-!d4mE*Fey` z*V`xR+1JoMAGHZZMdEWhW$(w*q3bey1tdGRF63+ypSH?o3VMRb=j=RCh<{Z!SMRMx zL=XA`1mPE>3H{)$yYKE7y5!g_4qa!_5H|hSSaJ}^ZFB3U7Y$YiY5t|M{yiu!Iq?@I zI+=SU=jWEzjgFnejm=?*A_YO*NMx(c8|&>KsxKq2S-YA>1h9fe?L|c5_PHxtaNi$^ z-Ele~z2GLUP9&YtJLoS54IkOrVLl4_4+-6IJicoAquSqdvWGn6l3YDQczUF2wnA@g zPYg~muwNCPwtyP8JSWpu5 zFr>wrj=B@`L&FNk!=llN*2$+iPpCrOyl#w{XKm%_^_);hf`J|1C2r%2$bM3z8v9Tk zI&0Lvgc-DA$y2}X`iF~e8x^d#GoF`|@9Q-9c|QGGK6F<8Q6E#H=A;4te6P278r~Xr zN5UId0cHdzli8&m!uKhuk=@E9XBiP`FA~y4^VXgA+BB!TvODcmR!&2bt8xsNrtb5vhQ;UDc}3 zMLaHL`B7GJ(3YQzmiM+#2TH&oR7Y8V7fBSR{5O$G2*E6`@7bWcqf-MR2bH_5)B9X_{C9a`seTt4$e) zSfp2mu<)MpoxPM}DucQQfvl3YC2%hoZ9!w3wIBzh+t0=NB8FUJ_XD(nqJP2%tmnW{u5Nn~U>fhO3A-Z$r-W+cGy0%|9T|=Qz zReUprrF#}`N*`k6CFxzjgt6@U$vM}1u{VHgE~>w|grcSQRiz6SE;?|soadiLq$jmc zl>iPAoGaURT?GmH^i~7YRjz(IJ&#*wg1n8Sjj^9}mk7N;(F9^56X&j5jJE!!4fK z`-42lOhQhX*#^;z<6Kdh046Y#Su)2>$hUuT&P_a#!a&c+__u% zG`o4Oe`&-7+Z#(Y%&v&G#`zCmU#%6J<^wc>Jwl2dWpXk?Q(7P76i zwG12M?rEynt9W^PzIx?Ew%!wuV|s|BjW$_KO=}Gv;ths}EfV3&VNNU5H~jl`M9z-p z+^TqQGAg{StAOoAwN!k+VC{4kRebwg`2 zKq?`yTP}fxau)tJ?`UIfUmr2yGr?8AxomfncR+D%5D8Hl1*=AmRF&1`lc7U>=icA? zE%ZmWPDwf5;t zzp>3K5l}C{17Iqx^tm72@B|kF&e&KLo`Yusk$SOHYSUbS<8aTO(Vdhl4z#Y$IIHWJ zYST0Pm5B0ZaoQ-0Koi}-v`x$NS?|k;Ip$Lxw38`yO>=uk$LpaD_ZX+YlnfK3L>(oM zMs6u41srafrNth&qSJ&bH9? zKH=wBLF1v$*h8k!j?i(D*KeMmOYo?quPK{{Y+|^=7q=F#qb5XC8%^6DuZ--%T!TdmL;c-<%c(8Fe$pEDK@?e-+B2E9WjB z*(4yz38&7(KkC;aBG(e}+Sq6kC@`au2vVf~^7yd`zEpnNHB1$XU*F!*QY~~rWlgo= zb!jNOH;fG(UtV86_>~0pPR;eA^em#1rE~?qxWu5-&s`EPE6mswR+Q%kKaL6mIG{~_ zkrLA?LfCPiLJhkEOpVFvM6qtYOusrc)`6VZHH-0AU6k*g()>|5-JJjzjnMesuRQ4> zmYR5(U>100}CzI+4`<_G>};DZpb0KgG?BB6p7L0Qx$&OBqMvw*$)IrrV=DK(guxi<`M z^BJjUkI<52t)HBWcb!gPK^YC03%Zftj$UZ1A7{R_n%X;Lx!pCKo`7GQ?Bg+6*v`B> z`c=m<2TRP}jdH-qPLvPX4j8ta(h=O<$17GrMP5t|XfbogLuOpuLD*fTKYR7oPFn;i z@&o;zM~TRMq{yp}HSO$&*x-%$E0Xjsqa|Br|KK8h#?P`fVoW2q8V#QhvukA6FjWdIrv$PVRFZ_)}1N)FV>4jY&6NNA4`ik@n91d5=h7caso& z4V>R&x&|NFLdK(!Zfjx>L2bW`<798T+#0{y<=}h13sr|D*PkG~d)}d3JwuZ3fwhRj zq=ycCj1+#1kjRl|77P!cvL_#JNUv%Zl2O!h95K=i7xzk*WQme)1w_hslt^j}#Td4z zm)0rr4ufM2v=g7$yC&5cYT9KdvS9QR4#$a!JAG?i)ID2z?=bE&0xmC9$1H`L*V?fh z_TMN()b|$M&>%q}?cI|z>lJtMlYb?qjlU}{s2j2B08iU$4Axi&tTd)SziBnhwL1L8 z`T9q*8QA9M)A*Agk6``1Meommrt&{^%l>RH{olp5|69QPFE7~s!||S$fl62Zw;SM} zx%7T_r~HQS-`_J8Y3a}Yl+G9VaNc030YX!_yRlHyFbr^*EauQ0-9?WElF@SuV@DX2 znm8UYa;6|9uDjWZp9OqGjD*^{ZxPQ%jte8p1I`G=tf-~1-!v2PX4SkuHB6j4h*Xj3gHeRdHu*Ye zW)&V@(~kE%Q|;6jp0a=}0Zk}p0N)p0CVyGp)CX(?wTFyD%*|#FiKYVML4UrtDU4OR`;dR2n4xEeJEqUE;`YW4 z&lesTPaMvWiS4hxA6orh$sc~WJNmUqxUp+$$6?E|*ZH01M2u;)dO5ZV_y*(gI5>>T zBz9x1jg9*WqZkhYb?lnCr5o1kre&6d>g>z8PxtfV&#pV`Zw6scQo`gI_dv965o1g( zEmNy)tqs-b@TBtvk>QjllC1>(!pW6zyy%gS%7|XU8-v!{40R`Do^Hb1@~^DDxPwHmsKn_ zP&fFf{!rgx_UvhcXel8R1mGu?Msqu$T}p-NzLi5lP!M0TZL59PkPI#r(TLZS(S!vX z$w;NM-3aJ4j2%Ft75iQ=HsZVKRvNMYT(Z^EFR0w@s>0BmGlq#IuV?Jxpr5*KWx;a3 z`bPeBsx4q^U2CO-r=eQU`S7gLiMeBGSV&(sFyu7XpITB#5R`s?tqdoLK?zK@4Z#`S zgMnmW8dHvgYA%#0?GpZDr}oi`?}h{i>JlXWWD~t~T=*o*@6r?~D?=xzhv)>)X{07x z!2+?UXJ!SFl=tx(!!l!uGYrv z=?rwFUj)W8weZ>1f=@{ z6thSCn?1&aq8e+xr^$ZOr(UkSu=jsmBxM_m`(>+}M1EYg8c_>JW_J`a>7?5Q8*z~8O&R06qaQS|@yQE+A=ch~^64-} zPkg#TYCt;@RJ~^;kdNN9Gqr$^L*MIX{>8tl5}F-{^ZTinnNNocKpO)u8@H(Ak2}iu zugY3*S}AYx{(~eC7&vWMA-cQhbt7x43cq|;wOjf$*%HzY!^qyQ+l03_Cc{}E?n%D9 z!eyvqUWMpeX8PYxvC&MMuxkRR%ZMF8i|(eO{4w6g3Jq17Scp=s59z}-#S za=7v^4Wz0gQrWg>8FS*q+8kdBFSZ!;H{!uMh?*zaEd4IhVOd`cGd~=MBRkcNM!DTv zX?IzyI2Ir|E9zw(SX)zcy*W#)hvPc%#NkSfuv8D~fLOG1P!j6Y! zJM|Xko23RMTI7g&b(yBH(IFC(0)wuI!)oig`iZ6!@Lj5$Rr9}X=^YIiCsC6ZW_RhD ztGEa6gKy126qI4Z=iA_AkCtP!N}+uGAwZv~Zio|pg0{gw5br;O_P;V-`hSLD|BkEn zpa1LM=Z1fQd;hg7={cp%N`%mcpU3-Sbg4D55SjCILLMa}jWY$~^pJzGCI}Kn~ zN@_bgx}<5$bw7JgSq3i$X=aT`rdV0R4Jzg*HtpZmbBcNA%voF8dlAWBLVgT7QsLq5 z?%8p(!yx(0l9CN6F+(WZcbmobp;`+iv1m1;V)PZb;6I~omUe(pdG)%ysVHBo*3<&I zBkEnDeVFS0KI?Y=JL_g?&->@B8;d$%Z`dDMw^tHIo&&UoulOdDh8l7tB-B&Es$-1@ zUnmhtQ>5}h+Ifc=nm)5`pi~pva=)`~KA+g_^IhLH#XZ#rS0`DR1w7d0=>W`wjOMC6-Uw)C`R7F_*$Q zbX`revpqxJWIo$RtfqFM78##lIByB)EHbY%`W8F%gWiL~J+cM6&>H;MHJs;Ry7$(h z;1XYS<2lOj7C8o|z$yvYOnUjUqjqZWxNyoSqM&WGi6!OY0d;X^-zpr_=l@PVzsjIHoL zaky!-Z;}tS+uw7F)|ii1xHeeK(8Y}xAtf37os_^Oyh#zBh0Eq^NNNdO%Y?2uHDuvs zTBl+aU?88%-nB#M`kD$K*i?T1T|b9YC%KhsM{?`g>_8ibKw`(b%9~NSL4=JF*9EpT zs<}z7B13HRg*)bODijmvwFHGR_cZl>VZs1%#&849xRMoO8`wEJl7Ny`O9F7`FT`~! zlO%IR?t~*)71Y|gut#p~<(tR7(@VR?>Qtenc23KmOiGz?BpjlK&_zdCI_%lo+M7Cq~5aVU|5DCI%KSsdVd19GrrQUuAd&^vI# z3Fxkvp)96AN)iD6&dCXU$*1?PnABzCkeKE}5GDbo(Gq$i+WK z%kvh}#OH?g7iKr@dIt3%)=0M_LO#jzUOpd(<4`t^r>oqY6&JFLu+@|zEQOkx1BEy# zi&MlnHCS%pv`J5G8JEyP&8v)tPb{p0h*@N9gp!eg1H*xUg(A76B{xNKBb+Q_9v7$z z4+~wZlsk?l8(tP?$u4J<88e6)8Ao3|nV+S58GSFzX%t!eMq=3QSns*QQa04DW4#OM1r4yA5KT>Wd=q>Vr>R4iYl`kwx|LeG!=-Uw<)NQN+vNv<6y8v^3Lcm$4iQ z-__W$*Wd}7n9WjtIE#n*dgZht`BfN(qW5OpLSGi%MnA16m#iCPr&>Nr$BWbpdo}}7 zg7qhbDd;aL6s1g0E#v@7yZPv09WWydj@AeZ%K*%eMV1I+^oZ@?qY^=XLK#F{l9*8m zq&J4zyj)5bT08XD=pO}+qZ6EM8vGBNSfYEzL?4kF{DM#*x!*8BcBx5};FLLqzL%jT>#r?DMyBtDH} zY0!rU0s~r?VS+uPcP489eno+0d{$O&+4SALA6{0bfJHqIoiNP87#Wh=3z!C(M_``3 z-v3OqrK|?>*#SR~Caz2Cd{Km4K2*Publ`CCB_adU+hwp>wV(b>#R*Fj%Ze8G$8Vvv}Ck;$=P^F&JT zkJ`>XWOQ|7mI|~{VYOf)pOZJqu>4RR@%PSl8j5R3eZg@ zQGKEQR0ip!+Od5lRG?fDwO343ge049X;R`IRYA)9X3(G4+VXS$NBi>F&o9cO^q?iUSAa+Tsa^; zk`}b5JBx<$hvYBi7tTXELsyJ2w+B1upz(^Jsa{QS6;2VoZ<*h93DCyV2D-)q3jCHW zQJ|H`h|sd&(2T+(ud3OHl;&2g8kw0_N+T81wx&;YTXfPyc=1J%=oX*^jYV>Z^N?5= zYhfsc0+Cn$Lpna4;X7Ji{gMhtcQo?FLPHm`vEss_q4B)xq@1HXwb2SmdQBzQ)bTAf zz5K#TTCC3&k&poHnybSfwnhBKhdT@~4ldnHa%m3;)=W-KHdN^&iDZz z&ihN`i>}NUYsZixazxSOBuyfeqObP#&Q>I2Wez*T$7<+)dq)Yx*T{Z+cx;LzPYnrk zHq{NNNB|4hTy@_EW!cb;pNeTSa#Is?3qGDo&emsR8jTeDdPL5ebsMo<4R;yQH>M>ZRsUTVegIw z90HQc5b|qJ=0e!w^}d%kIsf7WGp4Svy?Y$i4H+!y9p^_OJ%!Mri0L84%3q}ZLqc|v z{x1nx-8|6AZ2db%4^|d`ox2P*GQ~XFcS-t#Wha@2K>lb>x|@ReQv00A8rwr{l>o{f zDbrzlvnrgoNa#b*YHUfSjlPL!8LluX7)ej59OYl7>w+X-rpOGW21QyUxAnJWT9E!XHh1=RmpDAf$*E$bA{>(}<{MKZ`j5 z#GUX^Z6nl}poPaRCRU){hCm^)BJ*a_ezn)A9}gHqJcJ%=4)C~!R3R?$MB$<%#a`)S zu?ir1g;GsDxxZ^eHVz4J;|bD$m?GogA{5~QF3}`KMIq#VgGn8imRKtL%Ghvw^}X~9 zVHn81@8m3GJR6x>WmSQVoyE12 zpLm^715B7SbtKQCfcp7Lyp%~8Gh_q4_LyIE0^=E9_`nZ;kb`t?<=aQjZ^kqBn2Ao{ zRMNX;=H%ZJ+ZxFb^^;$%21i9~GswT5o)DmFr?rb)dtD0^eo=?y%xp=Ugr$zzo>(nH z44haE_B>{)Spvq+4N@~+s2DCgjkgvndy$)jf3m!8*RhaGfVs<{oPGzGS#NCqQCgQ< zH+2SjambS1)=EmOOstSR>wBt)T5s&~V)b_J1+A9&j9v@2uVuKyvxmCAj!cKa9!h3OEU1qr_nA)ZXi?+4j%ABannVM>`I8tiR#~%qc?vPL*$WP)+ z`wvZ~e}<=jh4}t;r22Q=ssHR@`^%vG_r|sVb*27ip!_$d_3!U*xp|fOb6ShcAJkW) zEnx?QYgZ1fK^`qQoxs5x$+T;7`jpx{L_yT79jcetbMk%>sQs4icd?7fs`6xqY*1WX zj8f^`GYcppE;N-fYuZMX!1d=|xIO=5-AxzUfc5L1EU5nz>m+)GlUw-9BMrcuX6r(J zhLLaSxY%%sASD-GpvB@^A!MGdDZn=;s6fJ)ZQ;v0f?kJ2`oTmC@YQVDUA%tad<}s^ z;Dw4W`SF<5;6MXDq?0y+fe#wF;kJsSj6dsN2vdzg?zi#q*1hSa+_#eP5#^|sOdKS7 z@fKtT()<{Qk>%~wNZm^v@yQAW7076D4ySne#>bJUH(_}3x0d&qJD0pVjAReV(heA%%M1! z))$x8m}||MLF~hY)R=TmsJmZXT3Xv1rI}goS#Y@C3n*<*aQKGD-yh`lB+2=`rTTGD zZwMf`pz|Z*pNw+RgQVYl_NI~}J5-88z!&k+*qXk4`mNiuYOE$uON&qam^;1!8(7Sn z`5eaVo}TO~y?^wT&5>-f!FL|Q4iI5wnq=dW$K1Bq2O}aQ+0y;6~yN6SV zOTrQZOf+=Fy!91>w$>wExN}d#bhqFL5fdO2NpSXR9J0~I*`Y?3~Kjy z?;6Ve(Y-_!3yA279abyIuy0ClWp`X?X(+cZ7O%7jUd*+?z>6f5ro{#g2-4fM`$K~5 z<%jD1o~8kY;Yufs{ie+vYJo5Htm8QQT#xq}op}IPZ-|FJBq;-z9+#L+Fo%Vsx7iuA zc&)Tj0%McOIYzl@cXbWdQ0CC!Zso4WweIzDa+~P7wC8}&%uway9sASIG$Jn!5gvi( zm0jH3mtctt;!eWCp<;PcA$9ku#kK?wS{C_feWUUgWN&L}(}_|=)5zK+WyYX43_stW zwsvVr<Rv1`cEj5#@ z`Z;`cEA}C`5Z_Qza94{Zl6S_#FNh>FutL+@CT?EL$?237R(4mvBx~ypRw1B`b>(`& zW{JNrOealKa0V(9VX)e53J$Y-t5oQdupWpFo_$+ZqR2U{S^|BKHO7gU4dlaI)WS@Z z2p8e#0D@QI->x@0HagpK4nLm>+|hR+KR9?Qa_=qWb|2%KeDj1HXJ~ggu@#K|Ks9Tp zb*`C?XvgxxiFl{cLAJq+A~QTKBbczLA(GJ6ltek=>nnBy6*gQ`hn!%jrl7HZu{&J5 z7p9($-l$bqe3bgaXAQ8fdy@W<#^NSUddyID=Kk&|gw( z_C8+UXXn%%G^bkvM7)&G-PNgqw6a>()VDXxFTYZj6IVLKxzjjZsBfeZ@D}Ya0Y~awXa-T=lx>mF>bND)R#}nDLln8c}er=fx!ilnGHPf zKqfqS=W_cEk|sCyk_em&v>LVMPT!f;Z&@7v1uJ70U_#~*slHf}BaQWrW)(xthwu59 zzIPYFGQuiA(B#~rVMqPK;3g9cgvHv)MG>|6CD1Y(jvXK);2N{;euBV4Fcf#c)Bcnc z{Xk4cpIo9h%i>as1Cd8WvX5lgUS`pd;YeeVxs~jCEp*8oz?7R3$!1?;5|kL)aeMX$ zner;&tj_TPfXyu{dx+=H3$L8?e6SPT3QvC)wKF%hS>pN-Y024T6;QYpQ+u-NxAXB{ zmXo_LS7ndwUoc3sjw7Gu+bqDi!S%xiqCHuq-1-Je`>8@TLF4kq_SDCG@Bm+JE$xn% z%Jk8*bZ)UncL?0I<_^u!=3I1EQ|K!UNiWTq^|f>vv88CS7UqR8K#3$4LcVJ#Vgl@{ zd-5dQ24KF!hH?QvxXZ<6z_w_8-=K)+T@YeR*p2$0un~xKy3qAvRz`9r1;=}t^|i3i zo;1$jn_?h_)UW(rd^}0B?If|8K%A>q6*LJUdw$Xwi05%?V19xM(`0X-U&<#-5#?X% z<+5$EXUQ2_pMw`Mit>dtU?MGyp@`j7673_&WD?@aADd~r_QlLyEQRhPDW=&L^WaWI zJb^}_(46huEDhTu64lP;-@tGUg{U{WWonn-Ees6h@B76c8Wwog$v<`c#L7Vqu@~pG zb075h=-pZeksFK%5OM}HIUW{L7glX}YxNg}NWh&|&@1b>uJ-|xDef)oWARBF)a^#! zdBc6lppeW+Ya*|xy)L_>mNR)8>>pLc!+Pk@@KCh!qs2OoQAWOBhTFR))OAMr)mq|? z`|V%V)NGjIA)*OwVp{?&>Se6=jd^%nBh?zZZYK}AS`BNZay|-fk!@$ zI1G4wXr{$#&V8xK0@ov`5_SnUP#_+qM_vqdm<7_}XGBC9S#U>rNAke-fci9sTaZ!f zkld-9vwgu7&3mvYiXSohx(ft0?el1#%ZNUH%bigPE}SwkZcx$L1-l2wG$AY^g+>gk zjLiB zoA+jNY%;MT@KWN{lsyXLx_ALp(n<&iPHag6r7`fnn&l^DU}pf$-W0!cNhI>PRn?Hr zO(`dJxWK8by{(_*m(ytB(Z0$f;bP4TngthwgYJYRHMog^@eI(|1p<8Hg9QR{E~Y-0LJ)Kpa(u;e zt8$+66B&mMOC{BMs&w$C;{P^)$D3n*!-)6Y}fqA$4p^uWf{EiDk)0oznv& zFWo6swe;k~(ZP=>pd-C9PGS!+2o|GlVU%U^L00sPqqqJU(K?Y1Ke~xQAw9b)Z;0Qn zD1tqq5&F~zr-25dnXPCXhl2vyyEs_q*eVVOQD6gdT(glV441=T)cygvyl(RUq3#{S zGjG#u@7T6&t76->ZQEAGwrx9=q~eNg+pbic?9|iKdrv=mdXDMoIo{syhyQVZzCW$& zJkPa$D@(rwiCD&}!WSE;dKU2z!iDbE3QK7m7X31#?4&6EtKFxi974 zy(%_}juZHXncXr*0qCRT-MB@{Pe)ja>pQ7BlIyaOmepkJId7?Ejunl1ey#=Ynl)E& zN6(E{{n~ePdWv-=^HW!oI8zt*hSYs`kZrbmnk~_Pj*$%C@;Q>#&DTO&-s}0p5rE#^ z7JT;^Nq3|D_m8kYKSwnF$F3Itz{})c^%naxX7Hba-?Gt~I6B%nI?);#I2%~onf)EM z&u^}e?dSIw_^rn8qEg?bS^{ejk9wNnOTfos2J1hXN_PQ1n@aQlt*NxV0koe#MmJU@ z_nBF-i8AYst?FGNZ2hyRv@WYiB#2wRjy-D!XA35*P-IrirllR`M#$fy#(NW_I+=CC zUxQ4!^snSwu0@Hnn!k{5t)M+w7Eb{|7N<8YBOQ<|H-RP8agd9Cy8#e632ep!>q}7Y zFhElIVV6ltx|&tL!=$B1w1IZqLQXtoeRm}Sf$fNr!m9XA``Zl=oBBe7RQ87(K$Z$m zJ4!h`LiJl43bPS`Hu+LI!?ZaKT|zC=^qc52wuD}h+|8BDa|Dd)Ocw}e(Kx%>@HeQpQ9ny$xr;PO2(=$%-)X-7xO%%sm@ci;Bbn> zLx`reEA7SE?|l#{h1XmsJbc80dEebj8G*RgadOgFBKG2D7 zq@+Y6#T@z0+O%XRlz)U3UH~k{*T#dC4X)YN-H8b>w6A`Frp^gVnNQd7U^EsKa|jCc z!Jt<0_yQboSCGhvamy_$a*=)Uxmj(n_{NyFY4P?~y7%A}D4;sbQ<`{cFyX)T}~ z(lO(XEsk6JPBe-B<0(@^)3JthhP}GN>Py+m79t)#Zb9}gCg*Gzi;{bgsIt#Kx1dE zQ8y;^sf1>` zk-fx$xT}r5v7e>mkC-1``&u1GAScVEusKDw_FGm2cqccxH5b88OpYu5aM)ji4Sl|Px(wBDHg7JNDQgY6SYBM$I;A3s4O2h+aucs&q?P; z!wEcoG%INa&msc%^d0(=i`o=+yd=bt_O?_O%}AL#p;M+e0oa)WZfYTrH9f>irEIh+ zVvxfKBzLX}Tb=R2a-*$Tk|+~LKNpoN3!fjivzx$F2QOvf!m;j#MYsL7Aff_sJy*Qa zI%YJT2@XNL7-b#%#rQN?P%S+MoO98pao5Dm{ONYQ=#U##QSKPfqQ=^fpnLa&Wc<5o zuz|cgn7#?Z+aDQ}#Ta*qQEBBgC!bCn;90#tMV~D+FiSK*48=9H{z|*Iwztnqa(LF$ zsumY2*N&qu@Ke6=A9ByDt2wTk&p~@988-^0bE=^@|DodUciAnRpp2-IO;3am%tS~~ z6Z#T{YxRP;(d4$#q>Y(NkKSbVNUC`vBG zHYPz1*gmHIq&^eqv~NF&yqc}|6k&H9H6MoDWLqhhtuC@NA$yiv--#c0|CP+i= zV|3zNsNUKES!PP6Xd(n+H8M?=uW}Z(bQRGtaAb3ecJ@4l-rFCh`;pUw3G~mEiS6H1 zmi}3={-?OO|DbmLzhE%<@0Y`{(HfdKSs0r*(HhuW{N3!_pBx5O>z@vTsagy)XJ7!JCP2Ry1OksMg%RYy(>WR9{_E*{i5wFr3(aPvfe2!!^&@-5b*(OurmuRF`Il z>&JvmI-LcnxbDECkaNL3@h7C+hT`7Z*_-Mxjy|Q*^ZdTVdo;p}#C{DMWJOF!TeF4* z>!9RblT{@fVo`+F(H#O8=diNqJlS;r<6K&ia}T1}p8x|wNT5TTN;xl@e`jFB97YVb zU)zkqVOnlFy>1?`ZM-qvR0~hi7~QM2M(

@`^Mt`0%MOjWC9|!zRJC=|I!3vS*_+ z9wSg`_7)*`9p$4Vb%M$-){NTKm5t47ZOe47Z&tKrtg9T@1Cs6PXX};rm0u#Q^I)7+ z3;x&kZ&`QI!+0~7+h%Crpk)J>ddId=dNx7LdaXkJCIi`a3b*mGU}A$3uV1!Rt|Jz6 zLWgI(9~rRthHA-AS{k=`-hB{wi&5?R%~)>L9)Y1e5VIH$GE3}BqtNQN?dG3(y%8Wi zn=;&Dt@kW&ii=-+`7M!lwi!elG_i~;ad)EIX3rraJ0F-}N)L0QK@d{tTy_R`CQ202 zewH-P{pgZ5XTk`P2^*oR&j23sCq5z0m>mDwT5;*x(^|ix_vQXI%Dx$q3D08}2#Qhv z7%EY#g&bT7NhKj+Yg&e_Y5<$TARE;S=2E>6kW%uODKCa$gol>1{vOg+n}>^AV~r>&B^siyYys0Vb#0JJL555ZiYA*UZ=Y4(he2`7cnCs&9U$Hpq-z~syZ zDW9GKZxYv0!Zwhl$ks0Y^Io>&dF10g|WYeG;R5=B(4%FZB zSZLkxh#P56H)3R4p4$UXv1337O$u_l-&C>WVa^$US_&qeef6#h9X~AvlZkNQBGIl`}e}X%*hVR%3_h~ zV6n~0p|YK7nb#IpYa{H~8Iz(VSSPQ~2UlEzX3q17dP9ICi->B?fNgJXU4HAXtXloppd?8L znkVKK;zTLZN@bkA9cpv+BI^+Vq@-_Go~&4f5zxXy!@n+H6e$nhLold2#Lfi7;*H~Q z3F*rNvpH^e2R%+j{RF_8vuA{ihu=FA>wixEt%F-M%J3OCESAD$b=7g`*R z@Y6fcR4|%lZLQYqD`mMDnTEX6_`w9NSumrW{SJ{6HdT;Gy_wWs+G{}>(pUQ7WqY2~ zF>1-Dg;da?qF!ec3Tf_Z)akti-jvDoCg<6zuMmOHToL~GMBLBM``zAK9~*5!A*f3)2AdCF?H0 zMTXHHYPASa9RgdtH|XDx+Y1~rkFihxUfAFG_x@}V_#Y{N`LAouziI~l^WPTyNAD5; z+Ya%60{H*2AO5$Z{-3(F4ckxHeD{M=6q3mLfP*+S;ZsRNxYQ?X{#NKOu=zD1Q@50K z9dcC^$UusUw!8|@nM~DFYZ<$rXOsZ=^P(hpH~Q)giFn4 zSY8UUib|^m0>yxN`Eup2De;c}Ep7gsp zq$7KeEWU`jiH|O~4DY~vy2ypJpryo=Sa)BGE!YhPgb&IDe*{wV7NZsizNWal2c!@}{qSEMp4v^lxf1nz%^s$Q^vxQsoi6K{Fmy!Xlj@G1+GTe7#llhl zG6LM`8~A~DWPEgk{rWAJn~^*!(*B@zzjIuM^On2Ba{!0vCYRz~#&L_uvn?Uh_-6qb ziYUjwMcD2r|A?@ijQEG(R^VFLd>p!-R_3&lGkT7@wU03%4Wcn^8`$lm2^Q%GL$l)0 z;nXAvTErWRl#+C`ELd0Bv3$bh^-M-j2rw8|q2ko}wHRZcnf9x53=|6RxV6XN)#mzD zxc@EGCJHcH+yS-N&q9Tw(<8lPr@gUZZhJXh`B~O?kG${;#SC8zC4bO|1U6k8sP=%#ge4x5_=4)!(b;(71h4s z=ajFXFnN+wTO&P^0rnm7F)Jnanp3I@>Wg_f8#V2qC4Gj@g*2&OVfs?jiI*q(x!{P3{soQ9t-D}T<(*)b*M zu8H2vvnFO_5%G!hhqHFLbX+LVLhTTX%k{dv1EH~YlJ*zC4zjuD``rJNM~l5K0Xp=Q zpMPNV&B=Gw0xzah?4wXkAvZc zQv&w@-XrG9$UuS&bqY&K8ZWiCBLHlQ`DdB9@A4BssGTjnE}R21$yAtes^l0pT;zoP_txo6CgP$M zf!x8@VCG6OBuNADyxmhij^)ZYbZ>t&xxD9~>P>yBD$9SWs=v7>|1>)Ozp6C;`n{)Hbk`7T4OK#9@15!9_)Aw0^VFTH zQ@i)~wjg}EGDnwY>EaE2z-0l7d}S&v$>3SAf)gv%gM6TJs`(JrVlbIqsT+_|s#)zC zc~g#rF9BNf541(gdCDTlr{9Al0jT6rbDy@E;DkSI??vs3_2ob+3WS#u6>Ji2*{1FY z9dz~BNe;UZTJVUmU~-99d#7iFatcX%a6 z+*({M_a_%OCN2d>FGAx;%wHJ7X)LmriCC;sC&JG>gB@K!6sMNbR2o)=QQPEG=c%0# z>w;V{@0HPH;$*{feVIgK&;*0t-dZO&KPGw@bQtsO(12v|vh+`rg+Ihn;;S6x+abv>x`6|@N2J6m17 z;N=g4Zcv4<;0!zYK!QWG_9}l&X~x+y$xm_!c{asqT{Q?zOUH3cRrfFgrC@uw0w%ja zun-glq;T$16cWU0>>Wv*3_MQ0*|OKU0$-!XjB6x<&w7R{TMI9 zRySkiU_9BIUwCE~Kp&``zb}J^d2Wm24?wnTgO3B+T0PGiHdEu|bQlkO#iRhL=2zsx zP|AD#g%hOdrnMbIf4w~fd2U&w6M>fg@&NG?k9Nh zj6pd8!~Jp$oNOw*oJI+#WR`YxJyA2&%lwLz7Dy#loU`@VAc$moCa{|-(oX_OC)$-T zV8Q_LQFzQ+xz0Jkt=%TqABAn#eh;f884pcXRFnDoxTTI(scB{Fqk(3xOU7kDtqTQ> z1Tla!cEFYMU6(0~F)Op0SE%BUocUqxF$`kNm>OCxYB@Af2wb$WB?%{PG?jYT9t2=1mG>Epkc!QUK^A5}qp z2P8jYr=(FchEEl9er($wtw1TL>0&2Lq@6Wb#4TIo2oww@DKT=qEM-hpAA78hh zDrCzg0rS(}cHeS|o||lxLkd#kBuGnpF1VW&3}RoBCm^}vq_2gFgB}bE1BEY9&Pb}t zB|ajZFqK!$mhaXuUc7NSBRG@aR;bBM;LRNL!;qm{{{RENCJ!P~o(`O&<7j5L{C~Y_I$0Yf&aL*{k$M zu6RyZ1b%E0`zRZdsn;-EaIM~(AlvZ$UG#ItR@qAzNXAVg$IJwW-4^bgRDy4kt!~C) zk!18IBNk7B#&>rz&LKI+Nc;NsQ31kd-Hme3$c^f}e6qxvu-TbfZ@tDe>_<0<=W#f3 zj$h+3ss{DK&o8QchZ$@>I6YliNKM;Wp3}s1)v8LCueP~ywkDJgt%iCK#UeVRb>jnx zcW1L!t3 zDHO0Qr@sBVBM_q8oW&G#E z2XvQwP&xsB?X-2t-g)7^;{8DItS%hTYk0~gxp*M3Sw?@=F8(On7}=2BT<&^83Drw=+sKRv?`}ux`$j!9Q%G zhhom~n*bq~vaL|nI64Z5r;G$z8ypLF88I0ZW(YPE%LSVvfWXZ^i`(K)YeMfzJ;~@9OwR(o7lF*S8rW<6Zu%Z;u9R)^*HrD^)>kYuJ*k3R5tt<4Q?`ohJA7v z747^F!M$G-7a^pLLnh(BB$kd(V>4S%t*}Q@K1c8FuCC5*-K~y9YsQmL3R8a#ylHKB zyQmr)R%YuGt1D8Ve{)$O(U|8%4aAND**zdgDDgY0LSZ-k9{k%8L@{~~d3a%1Ejh$? zbuV5IQTV`n){tEsNq>kuOdUTjv`xb@G58aag@9`~kP_q%$ji z>5z~pFrCZ1wPP4DFBI-&pff@KPmSf0RRy&54X>|^9h*6VrA#M|sRrx^S`_|a8}(Wk z9PI?!43;3W*oCkgNZ%bHfHVQ`%9IK1Tq%cYR0s_Q)zC0(do!Or|!Y?QB)i4Vhp6tvr25PpQb*gzGuJK z(!+;boF67vC$pKcsYAmyUtQhyIxn?mJ?B5?ClJ7OsGvFpZrWWBKgw{mBBA#JIidx#|)*z;u zh$!3MxiPaI7(X3_o3q82 zfA%L2bOHc7qi|Q{4}fd$U^wJM zoG)UmIgLQ3zYIsMxy|J^o4CFU4q224A5O*>e5tpVq0ruwRI{y|xpi>>#Lm1PY{Cog zX^WFl7!56!vA_5^Nn7TInY0JJhKarWF# zK?Q)t&^~2im9@VDf1AYtaOlZUC1luKESK`6@ddwagzU6km3kQu67ftd=LEi;E4pf&XIKh-d$O~(K95Yf&cOV} zuIy&4NQU{_@r_XzFK6{kB%d$K|7qQpsb3Q!e7{3goC|h4kjr^G z;|{SAxj$4Pf8KW=o$bpuF2lYoVWgwfBxPs`n|tqm&o=EjxKKXJ2*_UFNx~zqsQ3h)veIr&*x8f~L`3Ka_qXU~`!xuetB8;IFh0Op zk|aO*Ufx^39QjtFDrUSY=C7se>-@5p*0*?=aJ^qmFQWaJ3W+nz@x45gT$UT1_X0R6 zWPJ|TY=cMHS_{Qdie9(0y)P#Q&EZVuI4#L4H$Q2RVGWS_SR)>JPT0$zG?-EGaBuw- zitLbI>E$A;H-?fgfesvnyku22mh~ms`}-G8XpiaM7isUF@K?YuHJouNpF#E}X}!y) z-j&?@cN_4<$4wUGvtH65!XCyoc|k92tHM+Lcjm!h7v-%a%C4gc?(1~NlFT`%IND5F zz0FS=3|3Zi(d@G4>FkWdNKLg^}0W`FR$JZuh@yir? zNhcDTDeZ2UIgfT01okrM1Fvuqh+0tw-3xaz7a&L#xDi20Iid8v>YvT z?<{cYPw|HMPq8qn|Act|_vP$gq27Ofw*13x{D1#e`M=s_|6Wk;_r(6!??OY*ZjBYe z@2V652F2&=9trKQ=~P1VSwj9qIGqTaW2nIRNmlfTdGXPDL=baLYcJeiO|dg!s6QfF zUZ8%lt;Q$Nj5N@YJFEiQ-~na2ac}l)-MI619e7kDz}Rd&$lfsf-j##(0co4Vwyf%q z0lf|jw6a|`tI)te=Wl?I%Jej+oKG{U@*<3xxVhwfF35#AV7Ry#2;vj?g6vo@tz9VY zfCj+`xUod=6uqZAj39XsN{sliH@>QaWI+;ON#n%#Zp17|xH*r*#6^3NY?y(%8clxP zDwU4oe|G&EJWs)@jXx7-hE=c$l%ztpl`$iT$=>WFfk|4R8RR0I>IjR;HRtZX1s)x2 zW(%vv0e|Ji5H&3e!AF)Ldbi zo#AL{d~dR_|AOn$P0*Dhk3%+Okl?IK!%Kf_Y|8_jV?#`=_~fnqm3|oax>u7H0)NO> zYDAg>hzm``uW))JawDs1eRhfQ=9jEwq|zeo2Ql!^tVn+$sE0%&k`$zH^RIMZ+zoJg{C9w0QBv1gpZs zu;@_~3!zb^ntdL4{B!P;w)&CIQ(;u)E@?t9)6SSk0~rHL#HLHz+EfEEK&2xOAe4zOb2k6WQE&{@6dRL|?=@hDJCb>&YLqno*IBcR}eQrZhdxa!EEb5mX&J$+)T_Ss6EC|yPg}=I1SooTa9lr zlh+YW$H2MZ-O#Q}zRTGe1o9A2tY)1q!^jU&)Ac}VNluQwfI5Qcl>1Xq#iSoEWH}GM z@Sw*%h}^wtiT8gnzDA-Cu`JeT=^YQwH3-op)XW=AdM+jdyK$%j@b-T#Aqg=lA*>3e zf}6SixiG&BhUS`EO>1GlIkKQRCqEVOE9wKQ2mgb|m)Vz#83F9ju@w`-4v-aE<9lVE!Dt`#Eq;}c2y3L3p_U=Zt>=Ngz9zhEOh zL>h1P45kqj4YuGKP|gjrTS&O^Br9${I)F0wk&yYnt zjSnt~yF8}Zwgr-jsiC$bO|8h+!h^Rn#f*}mmms|Xfh!&^)*U&ngxN-UXyU*H6NRS8 zk_C5J&kF5C{|o4}qY0tKLp_Bs&dwb7(QR#Y@voa~12bheHdD0`#O{U|U=N~-uEQpi z^>qp`9!#!IM1oYrW4KtMJ;q|+vJguh@|=?%=NqUClW!>w)zlf zBS|`5)QuDMfU*=@@3fWAdipuWD!7*(kmE$~ADa@F60)7PKwaaJ-k{&BV&6z{827qE zJSU~P7bqDYI;MyeWDa8w)-*v#X{~xBA zY3&{D46RLU{*ER4Zx7RJwm2dPKDo8#D-E~1_neT5MLq)5UXbC-gswQj^79r`^EF(T z?L}Uu7s;OsArzp9@8RUZAV_}t2^fxqll0@ShzmTQ^@y2W(E;29o2Ji-IxeTmE-F)r zm&Kak+;P(LDfCM~Cw9>Gw3VVs_!8LWnb78O&nZCVr_$ejeNa14mNr1Sl$*TDC)piH zt^&o>5fHNK1N5(!BHVMsICD zoP>$0&cP9rRRKrFaSXfN{AdSD?_AZivtg;7pglFX41wtV&d@a@ZKm8L6S*=`-Q0XQ zgnoi@caHlRMMwX>J$cruiQUR;;gds`P$gu;$FxSDj!39I%H0gEcopGCP0&DCjA{al@>ee zk6YIWm8p$iGnL~`ZT)d_zbnu`@6{-Zr3k^mL%49~^cI4O{85y*3k>5p*|rMz(W*`^ z)y?~yPZWv2;1W=}XaU)vkHrrar{Fz0OGT1g;pu9QBCSq#vFK`^bmDa2yq*EpQ%|YX z;rlD)o$rZsy1E;h7d3k%)H2vImumDTPX~|bmr;qDQZZq(_uFGagA}+MczPr6t>>(E5F5a3~8(ApVqM=_YF zS&4nju+uX)97e&rOluFTn623RyR(j_gcY`!nTm`NeZCawxT;MRRl#8%^jv7%n%fL;w^1?m!1QJrzGY^6P-L(fjN`Upvq>``v-QCm8=n z2l^%J?+)~w#66FaV`5XNoO)Iq6fCP*bGX=VjZmkjq$Y}RRo^?6jL~n8BkK`AqFSGn zXb^LXiv=CIgEjY0xw5zti}uxV>0}uT6M!epPMXHPA%0--$;8N@2B|3B3a9eb)~$Q+ z_Fk8x3c~SI5*C5Fem#H!aFS17qXPq03{u#6=~R% zy2sQ_wc+Q+WvF@d+RKEyR4K{Lm&#t{uHG!95ScRiQn)Jc-#1-q^A^y-TRo44`=HawO(GsDOXt zSDTK90Jm!Rp#SyJH^?h}@oEut>PF$FrCj9tuFW*i#_#x6$s=$3`aF8%?OnPzP9+)D z#IG-Gpa z9V(jdC?|W<_%fE71$=E47AAYO!1P*)3|T*ib-eRyT$D1X3B(TExeRH-G&@>i??r{3~YPKX0yoH=O+wSky1Hwsy`IrWT*^ zCks1UT5CHy`@f^NzeDK1!KiKz?KJvZe zKG81kn4M9<^}tiwIK3@Z(F^@Hf{W&Oq85@QP^?I*DLM+cx({?()KVyLf`x1^uN4CK z$utM}WSSpI{=qZ{{LM6X-~D8oJ52-qnQ6|YX7yL5`GK6d=M=)f?XTrvOCkPXnya5O z$q`ung=xMekVmd#%+eE?_XpEl+elETn2ArWJDT5x`X;wa>}GD$;gyP)^v2?qj`!pZ zB{yyp{syv7mly_q3$y4E6X<#$($^i4Pi&v<#_IJa8l#?O0xWq{S{aTiM7mRP82!}3 z$ogq?a&@~1@SbnDrMQ9fMQ7#`_F3jge2lAw@3-d0`k6Ktat_1pxs-^|4S?~Ldu+Yx z+G(pLyLH(ZR4WBB(O*$$iBtjiM~?Y(8NEoeRD+mFgeB$ z!730!_u^an%4jMB=)|LbyIw3U-_QJIkvYmqPfX^gNQ`9u^bXx497!4=^qMl)tmXb? zmvE4domxR}`jum9e&vCf_~#lsUhIdsECgUE>_O8E@=OX;iXg(Y;&>q|LkG&+YD1j% zAOi+}jmZxQ6qm|y?POeeT(}nsQ`h(xIvkpG{XGAYFD%t==nz|)R#moD=~@ud?xK!4Cb zu@f~b?TzQn7WbperI7oWZc&p`ga%p`TYD6QZNWHh+nq`z=*W_h1qoUV%#EztIL3ia zb~BUt!9>ab0GU%djme6NGsOUqd5yQr`rH=UX;n~u48sPhJ(r_bevxWIi!|Lz`EnGM zHLHirtd5bRiaQeZPW|I)q}_VenpM1E0MgVoXaF&a8m3*ShfMK&n!i4MW8?SUdioWV zc~ebXx95b8r5LCpt!MacF&unSA@y$TZOB;MBl2SmV#?8HD}j|@*z%YGeQ`h(t@mg# zE!s}&8`KVmf53!V0wtM?>iq?ZXm=8!#kw|rgY1PiO9rJONXn)_Ql?lN9A*t@xOi!skRS5^ zbZx*P%P6ui`p(#)Kd#^GHXG1evdVF%JxuL zEd(+klU(ecP|0U6G4)w#E;qb~;CezP(g|dxh z0&eh3iidP?;+TZwaR~Q@pw(o>u#ljDIzBIRGo5i(yE7lUGcNY)VkfzK=C3XN)>8wj7yS6@^7TBp}J9Z_}FKDV=^n z<|&=`awL_N#iV5}Zb(ZwWf>!)G| zc7_KZ_rVnh2c2e$+(_>L0$vWGg_Iu4WkkQwc6c*(qM?cNwizPk00SPL2aiv z-B0jh^pnC%?0Qe*7pGS$ZepKzLZ)29k@3&S!V%s0b5P$dJf6u--0M<}ybH%X6o##ECEd9fE3e|p z>fmI7X=gO89T18EQ^L4|Fa>8Z8MMgBlznq?yE@p!80v%)8a5sv4$UiXkq2n)FV_l> zl|-Op|KhwXCT*b2Ql*YCJx5cbsIiHwC|ssSXePohhtMjut17!LxSN9Ik7vKE_q7mo ze@qV5I($VQx7{J#(AkX>gTT|q$LsB|ntn`)wFb?AtGWKv{kXZ-m9=NHLfEKdMf;b5 zY^wQjfm+wt`o}9kMWPh5<9@m;p|`b8pB$|W*0=4}OWGw_Byae2hqBPBZ0B-aVoeYA zX~xu3N18dFIyx5%{2QN^7PArRft@1-`~AjqR|TFQDIo*fqeL@QBCzFPg#!Qu+wX5L z@KFgKWRB@Ybj+UvsZxB?qfY3%a>1nZ0=Gu#(JA*z1WSIx1`#NOfto7xp8VPO%)~JU z6u2tWd>iv=ZY=*Oq!3nj3KdG{06^*igKD@J1O>7->YK#b5~#AU&f9RKsl80im>Bcj zI3zTguB_%gp0 z`!aQ)7LLUU%MUUm{NMl!ED-f>qD;}8N_H;;%-G)+{3TDNrklWQX`QE#dvPP@jnk9; znbJ!mYCcvp)`7%Vv?bDLq=YY}DmHA=?{M8A(Ayn7YX#&Kt}T&VK1|}<*-7mD52h>+ z7A`7D&{uNlH`SA_Sl$XPc62+A{GAX`7uTs;Q+{@T1{=#-*$Co5L6E;We^{r(7yQxSbb+gE%4+S zNv3zOKNZ!25f8r=*5AfH-P^qi_|fs6p(mq7Dk%9x=DfFD1J;6G?sFnB=`1@H?cmM@ z`;ejA{;EXue%aAFaFaC}x7BU~^v1|GRL<#(leVXFKEJ_cMnwl2jSqb29ad=$`XfiK zRF1E*QjnGXOv1z-fVp=^VS9;lec#O+x#`CvXiQqSq=>K}>5VMW$gH+TPm{FgXhNsd zQ7=AZD%R2SEYG}rxO+4K)EiHyJ#Br3Vv{ag>O0u)nHn&$Y&iOJrY1oD_Y3Sl3*|qv z!2YK+<6ohYf4(jMQ%-Pp+CTokg{`rP``^th+k6hyfBh~rrR@Ib`&5Gfb8Mt}iYNFX zQqou__(7nACP)veZ)m%1L7s3p%nAg3<9|5Y^!jcaz z-Hakms@1(0bjCn{q`aNj>nU|cti@!H688%%{d^9nGvExVQVv(N$*@hByCRrb8&hE_ z`U?u65kZsV$zs}}!&+IkWCSH|G7<}fBnW~N7t(>2Ph8vkMC1rnvoik%2%mO+dnsxD zdNq0G6d97kh5;08c2(jo3Iy7&wX1TYWRTNbcp8jY){S@lz*(`5$3SXaZgX zy8-d_DODXcVibwPh;Ud{DFBvUb-OEDOn2!}m9Yqgj6l=qbU#7vGoq+VxhxC%GrR!| zx4$#mj#w6jBw&bPqd-g<#3;ukJ3cAje{E`0-~yA?;=YCB0Fq0;SXMr;7hxjWDVss@ z5EQ=c6&~R!+%vKT#|T1pqymYS>fzk5w%**j{H*w$#43^*1*k^?79b*k0E$28Vs`|6 z)8_1p8li4&mShmj;oIEgBFM}Rn!HR5Td~{FBo|-dc;qBRD>CG*5I>jbm_nZxF~hVw zHZx-fwXmL1Y`8USuiJ2m;UD9Fs;YZ)1v}Ktzz_2I^-$_7VIrL)Yd82I z*F0a`q)TzFWFbL!YJ!^{2wuj3NYKvZFAcKSfnUZgPYS7>*{6V{c6hC=QB}!crZWs? zYLT;$?7I1Sup%m&KpK#bq@Hp*K2F_N2WE-_VETe1!?=?mH!iZC7LT}~m?^(BL+YCn zZmL`?*`EgkPRn@fl7}-{VGwS#YZ#&JBb|yt44{PtQ&y>!d)c^*rBn8B8NAlS)-`tU zO7TOb7PGjtw;fPwqWYAnwIr@%jJ(ZKe)gYTXQC8G`7f|5L z2pOBoWgRFSnlhW2&!%P{p+g%0F$tHWN{xsK6WfuoUYt4$hzVJMEj4XLFza!AJS~|Z zd!KNIF=t$>(G<4dq+!}QiObl}tJSIQ&N!BP{fgU%W#a3ceA1LDklqY1Ga${5Cl%xB z2KshENy|G!KVLwYj|J1J*$kgf&RnR}L^voj^g-eHcsj6dvqp2j*5Y~kdyK9*6ec;K z^&M}VTm-k~-SaDvuHN+3LQd}Oo0*sCveF#f9a>0FD1P5of9uZ6P36#|%cJWnFwE}_oNf#5UaW;WXUVg)d!%sHzwb&6xmiy z2q{Z@YKAO7%HeSDefkaJL)npFKg_2S-9 zP@?WBJdI_13ka`m?m)gG^g$6X&+3%+&})1>&u?OSZ-4NcMIXY995kg4~dYPq$w<)4yBa>zvj-7ur^8f?7D_H*0Hcn16PQ3#~gE z-x;ZT>&TL|EVwS(&FI8&Jd3P8Z*VKDjg^5z_KR{&A!MHq%{Ox?%^&l>#5t8uXzPq6 zGNTe0SjhPVaHKiW>=xqH%!X8D$2FQMiGo&vDmywU00>!%m>ozhU6e?b819bT|2n|Y z*co2%`r=!4yIa8f4GVlIRCc}tj{Nk}01nY&X!@LT2zp}f6>0)EVMk>1ok_bcg=G)6;*O6#tJW;NOSp-&64K-@mq=Jk(;4M!1iB zcD)8S(Jw?;Q&K_3L93|b8+^8&z+iffM|F)*MFn_vn8V z=3uU!-8U?K3wSo2Iv8*F-b!~ejd!MB;6(5@ENJm;Z-LJ6%Cn-`k5MAl92x~(Jp{rk z>i%4sb0XWT>jlxlCVvCBEwXq}%y!tN+zj!rV<2JQ3tV(z4(KcN1mT>$j|(Gk2T&G5 z32S=M*f7Cz)*0po>Uiduc)$#}P=`3ZWWo5&}rcr#gFCO*|s3>RWuf{G~4+`r3 zDL>;#4;LbBb&a(zMaIHDxl7cJ8g$ArqIc52A5{cDCw3x~kX5p^cO*yRk;p4Pnc$bG zH2clt0=hH*M3fPEGG6FMAh}Oc=QIJdnih8T#NlU*nt43vGyIQH(wean72{^X(b?SC zy}AC%nrRr&Nsb!rNeFZK&7rf|<3;l<(>mS|_jGjGw#Qg3_?i;>Cm=;5^-~DRRYKyv z%PkYfV69u(n^hp6nfWNOk@zhfEsunsxGrh!_^Of-{Ummz15Q^QFJ((M>DA4H!1H{S zdnPY4v0o`)K^*!q4ekrC5|1HT{60SSeb)^dlxLG-+V3zmoG1t0aoffro!DoX8c{O< zdSx_D#7ntzcJ+NDdt8mjPtEXHecK_H(0r5<<$K}g56S^CN(gXkc5ZfU#IQ#fU4^Lg{v|aN(#HpmmzO!ZbNx%p2FK@Un9}ZEbqArG`QA+&Z$( zybc_=alkhEIh8s*$1-K-3nHCP2NScd=6ac0me$PAd^N4ChSnFQpQCDA*m`!!NO6%0 zWV;kv=v3x~W7T{UY<$7D{_(4aZFZHK#MQ@w8(4?i zJ6rn%NZox9F%^@8oJA*26ln72K&E?I}@;)w)c;plO~Buv!PT%aq2V@ zDb0hFq|$A=Nh(d6XHvO{B)Z5|a-*o!HKYNdpXNECIZ5fFS>YG?ukGHOv+5k%-sjxk zpU3my@f_dt+3)(k?|RqTYx#IPDdlmS2WD+a6xz~F-c}vkcPk@9JEDT5F2E$4aOF;H zxWQrXeRZ$Mv4x?}!MwPlC`wF2&WQdC*#zE=eu-qk$b!(} zVs3I?*J#a(y&vc64Jov0L^uQtyChe~2rZEF6<@1&{U-BgvR1mUpZw-b)qx8NNtuq# z>mzfbG|LW_GrO+Z`q|w`fvs*nKbLr^PKh~hird+zbzl4hTelI-*EGME><^>Kq*^avdWH zI=_B*bp76<4AY9JJ%MVyQ*paoDqru=jyl--CGYdfeQjJ?cY-)B_IX!!@%w7t39=Jr za=eoNQR#S&a!h#dyes?aFZS`Tk|*&sYt~(j)5yK%Y}Ga~=%ix(yy!%Zt=Z7vPS>KL zim0D=O+E`WE^Df2&Mcf93)nYN1JWOs{!nu{b8|~D zuVP@Rde14V0*g)c*V_xi3NkpXda`)+W1pl196!Ev!|huCr(mO)zHc&DzZ6WJ1-`o+jjYbn{o*v1B=i4~PG?S;F&{=kxyw!I zdu!0pOVd^c;22K6qBoY@%8@o}s=OOT!W6`jQ#d^aQjk+Pos*ZBF7Yv}Ef?UNV^wGq z`u6e{F&EwkR_CS;HmJXraDMC}DpC8eyySGgYEf@!oahA$gZ(#Kx*N;XnT&jUj;3vu zc2_+2=*o`JO#>eUTsJDFY&kl2ok#9P6Rm5>5rV?4UG8$mVKtM>=FZcKR1gt*e1q5a zgz0J~-b9OXEp8hoCGHZjfiBPB>Im1wvwEA>4%WM0;BP*1FvTv;+aSERMQqU@`eTpB ziSw8<(j28UyyAVh7O+<8=~UfY$0zUjpiBJyS#SVnR`yA+o%K<=qn4xc!KdyT%9IZa zz8_gCtR_)$=cU%DiBJ69k}qE6!)xD<*p8lDF8WK|sV~2ncn@@~i*B=fe(2e%Zmm%f z%e%%?CAnVhJZ*M-3JvSrxNp43Bq&+6h_4=C3*@qR`c~)+Pod=E)D2zx!}o^kgP5O4OV*zOb>kjLBlJbjM-V zgtAMExy$z!dh+NIlXM!G*u>I>D#C^bY6C*OR<12Sr}!dzynU{se+-k zocFDNQDozIv9R6kTK;uCw_jr;MWZ@mw>dfW#AZ0PJMvgIK4HD}M%R4DBR@g$H!iJO zA8H$a&Mr3+pW5hk{*LN@*Jld7TozgXyj;3LT6YWR8EcDvD(xwYyC5X_*rrGR7-^!e zHYsPX>%>N`PHpMhEv1S}op<*Xhdp9RKDl%->fPH<*T!S3*EJP(R~xVhaiquZw%h(V z<@LzIH+BJQ^wqat$&b=WbP-*WD~TFrg% zZi&v$7I`^oALH^pY^3?W&2Qf^9FrL>P9)asiCQ451ajlAqE;itV!gR~aVe?Dv7B;e zI;7b6&IBGfQe|f-QENSUDfqNyskr9x=QX!JW!-ulnV%xpV;PiaoSjftA?~&yt}(%A zO1pJ}qoU1v`F{OjJFfk?s-7P<>NHkxz@6q^wOvx_}Bb&uNcFf!UWMzJozowEMr^^ z4@X0+5*4}0t`&VQkqNcdtkP9cy_MbDM9C5-5}n^mI`|qq`y>|@)0zK=oyOP&F8k)Z zg%xr-+qT9Ju%yY(%P{GWR4Fi%2+hv9+9ef!Y%(YBDx3aQuB@#?sVx3#QBr@dJRd3e z>~fNNo6MoAs?~e^UUCMg-GB1>QfqwvLK&W`^=dLZO?f5~Rcv_s$jOW9O)fMwO-w{e zm?|iZ7X3O9T-cc=b-j8{8k-{9yX}=p#ditg+MQ{f0ymZUj#agiIJ_nvmTJYgPqGIp z>+1FMWUEd*Ig)iUBT~Y{Ghs+&a)F<0z!KR**9=awke#H%3r&PgLb>z|g)_fgi`UX! zsCq$WWk=|-P{l`cbariS((UDcVO;FKyI=lIO#5-8gPFeXCAVEZR=)e*;jjhe$0C{y z2Roy(dRoKAlB33aoI;A$xYivWSKzwq?vS*}Xlau48N0!LgGaWlmS)}?j(3=rI5Pzi z55FP?6VIBRttQ^GCeLfSyf|mwqs;}QtwBByH+JNDh~%(!dUy0)og80qKk#i`pw0zp z6W;D-r%s1-*7>o_dJ-`cpU#VBl;+k5IDal~P5Qv1e&km-@=4pW`l7pL<_B)6yfJjj zJ6qZk{GZqX?^DXnTT%_8*>AH8SUfve%eNw4yg!QFjZ{#uCcNn5UpYCwhMx;ebH~4X z{3bnH#4u;7|7AWVGV#sfBOpI!W@K&xINs&&9|Ic5Z)R>8^ADOwATo~=2?S>3Bh0t6 z5Qs=qdh6!DK9!xo{@15^IjdWMe~=1(Eu#F?1IFNQrb`_e`x*bik9 zI{2!{PyKjIGQg~7F`5Ispd`uuEdR&a*gHaUH);SV;YwRSzld}Zu6oo{s=f;Q!Ub>Pa zxi~qv`?*lt9SHy-N90ig`r2Zm0Avbj`5COY;SC_VWFc{_`1?_7et<}BRs@*?mzWvO zKOD^RBwr`bUDQ{(eqe;b5%dWRf4qPw$2~?-$WxO)+Oen@Ozcj8iJd<5)P_Vc;`ygd zC`Tswx_J5ck$n9LW&5o^rNCf9AcK)0oGj0z@Q_7L1zq! zn*`!;54u@Lfa5iAD@aqGGJar`!wx_7Bz6-3wGG%ftc+O?BPfa(2j1@IKi+ z6RoJWhnV$k!Ox7rBKMqGJz@j!4T%HOheZAfN`Jf#MjIckphE-b0BbY}<<=ZmwhfG0O8_V|g>qY5!u#oL>_ zx(%jIF?FY&>PNtxv0 z>g+;tcM5QF|AEU~L3AO@|CGsc<_r-wev4oRAY+WkjjC>+-vWGjU_!JFGFPh*#^a+N zZ)osrAzi%@|0=v6lZccY?!xl%@8%H*r?$e~vP%d04$MaP{n;T}-jjq7XdeGA0&M>k zV$Hn#51jKr`VRpU7;5?m%;x?BhqsD>DBIw z$W_{FL5&VK?VQeFghx@;fhp;Cds1jkO}OPkNXAc#4pE2=O1AG7y-&B2I}GTx!xj?_~Fnsvi|+H@N~G&+SL zZ8X~{Ezjj3(tJTtX$bjgRUSr6)3w{|#vXN0Xl*@nNYA1B_(9Pv4T&hz`zH%kKtvq@ zwhlM-A|7BwMfu=VzI7CKdij05?~Xbyw77zsdgf*LaWO<5V)dT)g)=w+vTRU`!TAK*)z{^+Nb#&pG?s-xNgx2wdGokxa zMghVo3yB~dE>FYXK?DteHXdx_4$tU9G+j;6sy@-82)6OWPDVk(CG2#&m*PthNvU8> z4<2YIx-epz_R4SP;?P2bHcx{G8fzbZM0AQ8A9=dE5a1~Rc;GDe5s1Q6a{i+P)F|*O zA1z2|aRg_%%>(p9qDz`__#$>G(6!7U5eRxv0@fbHi3;vo;^hQ4BbeUP&k4V-xrB+8 zNRy;yRy=(Gx^Tr4S@Ey8M;*ODU5<2jX>mdubZ|U{O)-EIUTH|x#2@Ha;R+1AW>%Be z{|iP`lx4|`7B4MWXggWpCT|ccksIY9pGX+W|exUc}8It;9!3){NCJDwz8 zKL=fz-=lR7v2k@cHOPum@@)TH`~)~w2grzUJEqGVBckbG|8}7+t>OV~1j6kYT^sy>=n#d} zS!~a(1C>DpRe=>ixb#!8#fS%rZ7`kiaPahZaR2`1bhKh&2UIL@?8489QR?1Ub!}b_ zfb9bD1UF?^o#+DgZEq!YlR~RU;ik-eH%6htqbrU%Ubg}aI%Uw5fkQploi0eTi#+PE z(BkSRD6SU!G71)6eTY-39f@H=R%pmz$^%E1updTf)209w3wX^6j;#C;{IKZLg%k`N zV){eKhK@S0mJCD64#fzGGPQgQa$1nkQXUM+C=x#;`g9?tE?ATwJqD_(K+rgbmq#_D zFhYWD^9Q?WXjTO;k2V~|&x#@Pkcmyj>)skc5Lcd{6$5X8tv!Yj8Rhev^&SRwyTUfH z*?$T@Fb0T2ylP;{ir^|>@P~lG!_(!E1dO<*Jpn##gVs1itE}MZa@#rls2Ct@Dw*HD z4q#FQnBWFq<8OE|eJehx#}XPKxXP3JodJNbNp5ai`5upt? zc-=-g13x0Vr6G1sc?;=gsBl@Bi4hg-mvD_vofTRo1@DP_dL2J2`n4f(MR_$Gocro; zV1z~a@Md+WX!#RbY{9wDvj9IYhR8$AobrMn*rnVGF(RAx%x^musD~9cmuh=}9}{j# z$k3y_&;V{~R6oRs1`cm(o3E*pLMx`=emZLfeo~B7NO{0DJPcVY=>j)vAmXD24@22{ zMp45l4{TJw#m|REwtrRI3o%+eoS=9LZazD#gRO)soOuth=}r$(LN;(ylI7&`{2@Zst-RNjFOPI U*$IR&@bjV`c#-xM5&Y@@056igQUCw| literal 0 HcmV?d00001 diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json new file mode 100644 index 0000000..24e4724 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json @@ -0,0 +1,278 @@ +{ + "meta": { + "case_id": "v2-docs-summary-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected grounded_summary, got insufficient_evidence", + "llm: expected answer to contain '/health'", + "llm: expected answer to contain 'status'", + "llm: expected answer to contain 'components'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 2, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/readme.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Кратко объясни по документации, как работает `/health`", + "profile": "docs_summary_api_endpoint", + "row_count": 2, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/readme.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/readme.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/readme.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 96 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md new file mode 100644 index 0000000..f6b826c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md @@ -0,0 +1,327 @@ +# v2-docs-summary-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Кратко объясни по документации, как работает `/health` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 2, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/readme.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Кратко объясни по документации, как работает `/health`", + "profile": "docs_summary_api_endpoint", + "row_count": 2, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/readme.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/readme.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/readme.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 96 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected grounded_summary, got insufficient_evidence +- llm: expected answer to contain '/health' +- llm: expected answer to contain 'status' +- llm: expected answer to contain 'components' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json new file mode 100644 index 0000000..baa4326 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json @@ -0,0 +1,242 @@ +{ + "meta": { + "case_id": "v2-docs-summary-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/send'", + "llm: expected answer to contain 'message'", + "llm: expected answer to contain 'Telegram'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 2, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что делает endpoint `/send`?", + "profile": "docs_summary_api_endpoint", + "row_count": 2, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md new file mode 100644 index 0000000..15f051c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md @@ -0,0 +1,287 @@ +# v2-docs-summary-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что делает endpoint `/send`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 2, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что делает endpoint `/send`?", + "profile": "docs_summary_api_endpoint", + "row_count": 2, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/send' +- llm: expected answer to contain 'message' +- llm: expected answer to contain 'Telegram' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json new file mode 100644 index 0000000..ff05db4 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json @@ -0,0 +1,246 @@ +{ + "meta": { + "case_id": "v2-docs-summary-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/actions/{action}'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 2, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Объясни назначение `/actions/{action}`", + "profile": "docs_summary_api_endpoint", + "row_count": 2, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md new file mode 100644 index 0000000..5b32579 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md @@ -0,0 +1,291 @@ +# v2-docs-summary-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Объясни назначение `/actions/{action}` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 2, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Объясни назначение `/actions/{action}`", + "profile": "docs_summary_api_endpoint", + "row_count": 2, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/actions/{action}' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json new file mode 100644 index 0000000..5facb76 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json @@ -0,0 +1,219 @@ +{ + "meta": { + "case_id": "v2-docs-summary-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "llm: expected answer to contain 'runtime health'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 1, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что такое runtime health в этой документации?", + "profile": "docs_summary_domain_entity", + "row_count": 1, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md new file mode 100644 index 0000000..2ebbf68 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md @@ -0,0 +1,264 @@ +# v2-docs-summary-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что такое runtime health в этой документации? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 1, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что такое runtime health в этой документации?", + "profile": "docs_summary_domain_entity", + "row_count": 1, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- llm: expected answer to contain 'runtime health' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json new file mode 100644 index 0000000..11787e7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json @@ -0,0 +1,279 @@ +{ + "meta": { + "case_id": "v2-docs-summary-05-notification-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain 'worker'", + "llm: expected answer to contain 'interval'", + "llm: expected answer to contain 'degraded'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 2, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/readme.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Кратко опиши цикл отправки уведомлений", + "profile": "docs_summary_logic_flow", + "row_count": 2, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/readme.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/readme.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/readme.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 96 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md new file mode 100644 index 0000000..ed04fcb --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md @@ -0,0 +1,328 @@ +# v2-docs-summary-05-notification-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Кратко опиши цикл отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 2, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/readme.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Кратко опиши цикл отправки уведомлений", + "profile": "docs_summary_logic_flow", + "row_count": 2, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/readme.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/readme.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/readme.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 96 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain 'worker' +- llm: expected answer to contain 'interval' +- llm: expected answer to contain 'degraded' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json new file mode 100644 index 0000000..192639a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json @@ -0,0 +1,343 @@ +{ + "meta": { + "case_id": "v2-docs-summary-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 2, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/readme.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как устроена архитектура Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 2, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/readme.md", + "score": 600, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "match_reason": "exact_path" + }, + { + "doc": "docs/readme.md", + "score": 600, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md new file mode 100644 index 0000000..e9f44c1 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md @@ -0,0 +1,398 @@ +# v2-docs-summary-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Как устроена архитектура Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 2, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/readme.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как устроена архитектура Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 2, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/readme.md", + "score": 600, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "match_reason": "exact_path" + }, + { + "doc": "docs/readme.md", + "score": 600, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json new file mode 100644 index 0000000..f088444 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json @@ -0,0 +1,229 @@ +{ + "meta": { + "case_id": "v2-docs-summary-07-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain 'worker'", + "llm: expected answer to contain 'Telegram'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 2, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что делает worker в этом приложении?", + "profile": "docs_summary_logic_flow", + "row_count": 2, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md new file mode 100644 index 0000000..845b285 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md @@ -0,0 +1,274 @@ +# v2-docs-summary-07-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что делает worker в этом приложении? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 2, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что делает worker в этом приложении?", + "profile": "docs_summary_logic_flow", + "row_count": 2, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain 'worker' +- llm: expected answer to contain 'Telegram' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json new file mode 100644 index 0000000..761b90f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json @@ -0,0 +1,223 @@ +{ + "meta": { + "case_id": "v2-docs-summary-08-health-statuses", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "llm: expected answer to contain 'ok'", + "llm: expected answer to contain 'degraded'", + "llm: expected answer to contain 'unhealthy'", + "llm: expected answer to contain 'unknown'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 1, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие статусы здоровья есть у runtime?", + "profile": "docs_summary_domain_entity", + "row_count": 1, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md new file mode 100644 index 0000000..7a91f8b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md @@ -0,0 +1,268 @@ +# v2-docs-summary-08-health-statuses + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие статусы здоровья есть у runtime? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 1, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие статусы здоровья есть у runtime?", + "profile": "docs_summary_domain_entity", + "row_count": 1, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- llm: expected answer to contain 'ok' +- llm: expected answer to contain 'degraded' +- llm: expected answer to contain 'unhealthy' +- llm: expected answer to contain 'unknown' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json new file mode 100644 index 0000000..7465f31 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json @@ -0,0 +1,244 @@ +{ + "meta": { + "case_id": "v2-docs-summary-09-manual-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/send'", + "llm: expected answer to contain 'message'", + "llm: expected answer to contain 'TelegramSendService'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 2, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как в приложении устроена ручная отправка сообщения?", + "profile": "docs_summary_api_endpoint", + "row_count": 2, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md new file mode 100644 index 0000000..c5941ba --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md @@ -0,0 +1,289 @@ +# v2-docs-summary-09-manual-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как в приложении устроена ручная отправка сообщения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 2, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как в приложении устроена ручная отправка сообщения?", + "profile": "docs_summary_api_endpoint", + "row_count": 2, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/send' +- llm: expected answer to contain 'message' +- llm: expected answer to contain 'TelegramSendService' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json new file mode 100644 index 0000000..8832505 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json @@ -0,0 +1,259 @@ +{ + "meta": { + "case_id": "v2-docs-summary-10-telegram-integration", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA", + "anchor_type: expected API_ENDPOINT, got None", + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain 'worker'", + "llm: expected answer to contain '/send'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": null, + "rag_count": 2, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": null, + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как сервис взаимодействует с Telegram в целом?", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/readme.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/readme.md", + "score": 120, + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/readme.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 503 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md new file mode 100644 index 0000000..d1c4cb5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md @@ -0,0 +1,308 @@ +# v2-docs-summary-10-telegram-integration + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как сервис взаимодействует с Telegram в целом? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": null, + "rag_count": 2, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": null, + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как сервис взаимодействует с Telegram в целом?", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/readme.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/readme.md", + "score": 120, + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/readme.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 503 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA +- anchor_type: expected API_ENDPOINT, got None +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain 'worker' +- llm: expected answer to contain '/send' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-01-health.json new file mode 100644 index 0000000..ec6c769 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-01-health.json @@ -0,0 +1,295 @@ +{ + "meta": { + "case_id": "v2-find-files-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/health-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/readme.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком файле описан `/health`?", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/readme.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/readme.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/readme.md", + "score": 130, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-01-health.md new file mode 100644 index 0000000..cabe220 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-01-health.md @@ -0,0 +1,348 @@ +# v2-find-files-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком файле описан `/health`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/readme.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком файле описан `/health`?", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/readme.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/readme.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/readme.md", + "score": 130, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/health-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-02-send.json new file mode 100644 index 0000000..55f48e7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-02-send.json @@ -0,0 +1,295 @@ +{ + "meta": { + "case_id": "v2-find-files-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/send-message-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/readme.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Покажи файл с описанием endpoint `/send`", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/readme.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "match_reason": "semantic_match" + }, + { + "doc": "docs/readme.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-02-send.md new file mode 100644 index 0000000..710acd9 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-02-send.md @@ -0,0 +1,348 @@ +# v2-find-files-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Покажи файл с описанием endpoint `/send` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/readme.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Покажи файл с описанием endpoint `/send`", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/readme.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "match_reason": "semantic_match" + }, + { + "doc": "docs/readme.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/send-message-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-03-actions.json new file mode 100644 index 0000000..b79998a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-03-actions.json @@ -0,0 +1,301 @@ +{ + "meta": { + "case_id": "v2-find-files-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/control-actions-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/readme.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Где находится документация по `/actions/{action}`?", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/readme.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "match_reason": "semantic_match" + }, + { + "doc": "docs/readme.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-03-actions.md new file mode 100644 index 0000000..7d3aa54 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-03-actions.md @@ -0,0 +1,354 @@ +# v2-find-files-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Где находится документация по `/actions/{action}`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/readme.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Где находится документация по `/actions/{action}`?", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/readme.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "match_reason": "semantic_match" + }, + { + "doc": "docs/readme.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/control-actions-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json new file mode 100644 index 0000000..6ac04b2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json @@ -0,0 +1,299 @@ +{ + "meta": { + "case_id": "v2-find-files-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/domains/runtime-health-entity.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/readme.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком документе описан runtime health?", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/readme.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "match_reason": "semantic_match" + }, + { + "doc": "docs/readme.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md new file mode 100644 index 0000000..e0f251e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md @@ -0,0 +1,352 @@ +# v2-find-files-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком документе описан runtime health? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/readme.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком документе описан runtime health?", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/readme.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "match_reason": "semantic_match" + }, + { + "doc": "docs/readme.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/domains/runtime-health-entity.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-05-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-05-loop.json new file mode 100644 index 0000000..0af3f2c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-05-loop.json @@ -0,0 +1,293 @@ +{ + "meta": { + "case_id": "v2-find-files-05-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/readme.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Найди файл с логикой цикла отправки уведомлений", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/readme.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/readme.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/readme.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-05-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-05-loop.md new file mode 100644 index 0000000..80c75cc --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-05-loop.md @@ -0,0 +1,346 @@ +# v2-find-files-05-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Найди файл с логикой цикла отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/readme.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Найди файл с логикой цикла отправки уведомлений", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/readme.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/readme.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/readme.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json new file mode 100644 index 0000000..3c6e75d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json @@ -0,0 +1,339 @@ +{ + "meta": { + "case_id": "v2-find-files-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/readme.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Где описана архитектура приложения?", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/readme.md", + "score": 670, + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "match_reason": "exact_path" + }, + { + "doc": "docs/readme.md", + "score": 670, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md new file mode 100644 index 0000000..0d9949f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md @@ -0,0 +1,394 @@ +# v2-find-files-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Где описана архитектура приложения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/readme.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Где описана архитектура приложения?", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/readme.md", + "score": 670, + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "match_reason": "exact_path" + }, + { + "doc": "docs/readme.md", + "score": 670, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json new file mode 100644 index 0000000..abd1d19 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json @@ -0,0 +1,299 @@ +{ + "meta": { + "case_id": "v2-find-files-07-errors-catalog", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/errors/catalog.yaml'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/readme.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком файле лежит каталог ошибок?", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/readme.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/readme.md", + "score": 150, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/readme.md", + "score": 150, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md new file mode 100644 index 0000000..cdd064c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md @@ -0,0 +1,352 @@ +# v2-find-files-07-errors-catalog + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком файле лежит каталог ошибок? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/readme.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком файле лежит каталог ошибок?", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/readme.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/readme.md", + "score": 150, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/readme.md", + "score": 150, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/errors/catalog.yaml' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json new file mode 100644 index 0000000..6aa19d7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json @@ -0,0 +1,334 @@ +{ + "meta": { + "case_id": "v2-find-files-08-docs-index", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/readme.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/README.md" + ], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + } + ], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Покажи файл-индекс документации проекта", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [ + "docs/README.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/readme.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/readme.md", + "score": 2140, + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/readme.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md new file mode 100644 index 0000000..53a4120 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md @@ -0,0 +1,389 @@ +# v2-find-files-08-docs-index + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Покажи файл-индекс документации проекта + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/readme.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/README.md" + ], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + } + ], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Покажи файл-индекс документации проекта", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [ + "docs/README.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D5_RELATION_GRAPH", + "title": "index.test_echo_app_docs:related_doc", + "document_id": "" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/readme.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/readme.md", + "score": 2140, + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/readme.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json new file mode 100644 index 0000000..309f8a7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json @@ -0,0 +1,283 @@ +{ + "meta": { + "case_id": "v2-find-files-09-telegram-bot-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/send-message-endpoint.md'", + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/readme.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 710, + "score_breakdown": { + "semantic": 10, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/readme.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 710, + "match_reason": "exact_title" + }, + { + "doc": "docs/readme.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 10, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md new file mode 100644 index 0000000..fb23481 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md @@ -0,0 +1,336 @@ +# v2-find-files-09-telegram-bot-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие файлы относятся к Telegram Bot API интеграции? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/readme.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 710, + "score_breakdown": { + "semantic": 10, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/readme.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 710, + "match_reason": "exact_title" + }, + { + "doc": "docs/readme.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 10, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/send-message-endpoint.md' +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json new file mode 100644 index 0000000..90acd95 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json @@ -0,0 +1,301 @@ +{ + "meta": { + "case_id": "v2-find-files-10-telegram-notify-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'", + "llm: expected answer to contain 'docs/domains/runtime-health-entity.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/readme.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каких файлах описан worker `telegram_notify`?", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/readme.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "match_reason": "exact_title" + }, + { + "doc": "docs/readme.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md new file mode 100644 index 0000000..4fba286 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md @@ -0,0 +1,354 @@ +# v2-find-files-10-telegram-notify-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каких файлах описан worker `telegram_notify`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 2, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/readme.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каких файлах описан worker `telegram_notify`?", + "profile": "file_lookup", + "row_count": 2, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/readme.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "match_reason": "exact_title" + }, + { + "doc": "docs/readme.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- llm: expected answer to contain 'docs/domains/runtime-health-entity.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json new file mode 100644 index 0000000..16bad13 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json @@ -0,0 +1,245 @@ +{ + "meta": { + "case_id": "v2-general-01-what-is-service", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 2, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что это за сервис?", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/readme.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/readme.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/readme.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 503 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md new file mode 100644 index 0000000..874d85f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md @@ -0,0 +1,296 @@ +# v2-general-01-what-is-service + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что это за сервис? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 2, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что это за сервис?", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/readme.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/readme.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/readme.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 503 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-02-purpose.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-02-purpose.json new file mode 100644 index 0000000..f6b0284 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-02-purpose.json @@ -0,0 +1,225 @@ +{ + "meta": { + "case_id": "v2-general-02-purpose", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected grounded_summary, got insufficient_evidence", + "llm: expected answer to contain 'test_echo_app'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 2, + "llm_answer": "В найденной документации нет достаточной опоры для общего summary по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Для чего нужен test_echo_app?", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "general_docs_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 77 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-02-purpose.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-02-purpose.md new file mode 100644 index 0000000..081463c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-02-purpose.md @@ -0,0 +1,270 @@ +# v2-general-02-purpose + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Для чего нужен test_echo_app? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 2, + "llm_answer": "В найденной документации нет достаточной опоры для общего summary по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Для чего нужен test_echo_app?", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "general_docs_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 77 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected grounded_summary, got insufficient_evidence +- llm: expected answer to contain 'test_echo_app' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-03-problem.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-03-problem.json new file mode 100644 index 0000000..70fa4ba --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-03-problem.json @@ -0,0 +1,212 @@ +{ + "meta": { + "case_id": "v2-general-03-problem", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected grounded_summary, got insufficient_evidence", + "llm: expected answer to contain 'Telegram'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 2, + "llm_answer": "В найденной документации нет достаточной опоры для общего summary по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какую задачу решает это приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "general_docs_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 77 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-03-problem.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-03-problem.md new file mode 100644 index 0000000..f12bdca --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-03-problem.md @@ -0,0 +1,257 @@ +# v2-general-03-problem + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какую задачу решает это приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 2, + "llm_answer": "В найденной документации нет достаточной опоры для общего summary по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какую задачу решает это приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "general_docs_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 77 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected grounded_summary, got insufficient_evidence +- llm: expected answer to contain 'Telegram' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json new file mode 100644 index 0000000..2cac079 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json @@ -0,0 +1,211 @@ +{ + "meta": { + "case_id": "v2-general-04-docs-contents", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'архитект'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 2, + "llm_answer": "В найденной документации нет достаточной опоры для общего summary по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что входит в документацию этого проекта?", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "general_docs_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 77 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md new file mode 100644 index 0000000..5c46c9a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md @@ -0,0 +1,256 @@ +# v2-general-04-docs-contents + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что входит в документацию этого проекта? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 2, + "llm_answer": "В найденной документации нет достаточной опоры для общего summary по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что входит в документацию этого проекта?", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "general_docs_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 77 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'архитект' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-05-main-parts.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-05-main-parts.json new file mode 100644 index 0000000..524ef22 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-05-main-parts.json @@ -0,0 +1,212 @@ +{ + "meta": { + "case_id": "v2-general-05-main-parts", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'систем'", + "llm: expected answer to contain 'Telegram'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 2, + "llm_answer": "В найденной документации нет достаточной опоры для общего summary по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие основные части есть у системы?", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "general_docs_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 77 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-05-main-parts.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-05-main-parts.md new file mode 100644 index 0000000..5bcd8c1 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-05-main-parts.md @@ -0,0 +1,257 @@ +# v2-general-05-main-parts + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие основные части есть у системы? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 2, + "llm_answer": "В найденной документации нет достаточной опоры для общего summary по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие основные части есть у системы?", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "general_docs_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 77 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'систем' +- llm: expected answer to contain 'Telegram' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json new file mode 100644 index 0000000..01b4fa7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json @@ -0,0 +1,211 @@ +{ + "meta": { + "case_id": "v2-general-06-high-level-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'приложен'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 2, + "llm_answer": "В найденной документации нет достаточной опоры для общего summary по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как в целом устроено приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "general_docs_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 77 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md new file mode 100644 index 0000000..6c45cb4 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md @@ -0,0 +1,256 @@ +# v2-general-06-high-level-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как в целом устроено приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 2, + "llm_answer": "В найденной документации нет достаточной опоры для общего summary по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как в целом устроено приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "general_docs_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 77 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'приложен' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-07-besides-api.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-07-besides-api.json new file mode 100644 index 0000000..4c8194f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-07-besides-api.json @@ -0,0 +1,211 @@ +{ + "meta": { + "case_id": "v2-general-07-besides-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'API'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 2, + "llm_answer": "В найденной документации нет достаточной опоры для общего summary по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что тут есть кроме API?", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "general_docs_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 77 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-07-besides-api.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-07-besides-api.md new file mode 100644 index 0000000..6f6cc1b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-07-besides-api.md @@ -0,0 +1,256 @@ +# v2-general-07-besides-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что тут есть кроме API? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 2, + "llm_answer": "В найденной документации нет достаточной опоры для общего summary по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что тут есть кроме API?", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "general_docs_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 77 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'API' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-08-components.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-08-components.json new file mode 100644 index 0000000..ba6f84d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-08-components.json @@ -0,0 +1,342 @@ +{ + "meta": { + "case_id": "v2-general-08-components", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected GENERAL, got DOCS", + "intent: expected GENERAL_QA, got DOC_EXPLAIN", + "anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE", + "llm: expected answer to contain 'Telegram Notify App'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 2, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/readme.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Из чего состоит Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 2, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/readme.md", + "score": 60, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/readme.md", + "score": 60, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-08-components.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-08-components.md new file mode 100644 index 0000000..979075f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-08-components.md @@ -0,0 +1,395 @@ +# v2-general-08-components + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Из чего состоит Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 2, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/readme.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidates_before_ranking": [ + "docs/architecture/telegram-notify-app-overview.md", + "docs/readme.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Из чего состоит Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 2, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/readme.md", + "score": 60, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/readme.md", + "score": 60, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected GENERAL, got DOCS +- intent: expected GENERAL_QA, got DOC_EXPLAIN +- anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE +- llm: expected answer to contain 'Telegram Notify App' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-09-reading-order.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-09-reading-order.json new file mode 100644 index 0000000..f9668d6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-09-reading-order.json @@ -0,0 +1,247 @@ +{ + "meta": { + "case_id": "v2-general-09-reading-order", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'README'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 2, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие документы стоит читать сначала?", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/readme.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/readme.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/readme.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 503 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-09-reading-order.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-09-reading-order.md new file mode 100644 index 0000000..a179771 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-09-reading-order.md @@ -0,0 +1,296 @@ +# v2-general-09-reading-order + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие документы стоит читать сначала? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 2, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие документы стоит читать сначала?", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/readme.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/readme.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/readme.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/readme.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 503 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'README' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-10-short-summary.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-10-short-summary.json new file mode 100644 index 0000000..d284154 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-10-short-summary.json @@ -0,0 +1,209 @@ +{ + "meta": { + "case_id": "v2-general-10-short-summary", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 2, + "llm_answer": "В найденной документации нет достаточной опоры для общего summary по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Дай короткое summary по проектной документации", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "general_docs_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 77 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-10-short-summary.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-10-short-summary.md new file mode 100644 index 0000000..eec09a2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/full_chain_docs_v2_matrix_v2-general-10-short-summary.md @@ -0,0 +1,256 @@ +# v2-general-10-short-summary + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Дай короткое summary по проектной документации + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 2, + "llm_answer": "В найденной документации нет достаточной опоры для общего summary по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "details": { + "target_doc_hints": [], + "candidates_before_ranking": [ + "docs/readme.md", + "docs/architecture/telegram-notify-app-overview.md" + ] + }, + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Дай короткое summary по проектной документации", + "profile": "general_qa_grounded_summary", + "row_count": 2, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "general_docs_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 77 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/summary.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/summary.md new file mode 100644 index 0000000..28d6caa --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_095532/summary.md @@ -0,0 +1,155 @@ +# pipeline_setup_v3 summary + +Passed: 5/30 + +| File | Case | Mode | Query | Actual sub-intent | RAG layers | Tokens | Pass | +|------|------|------|-------|-------------------|------------|--------|------| +| full_chain_docs_v2_matrix.yaml | v2-general-01-what-is-service | full_chain | Что это за сервис? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-02-purpose | full_chain | Для чего нужен test_echo_app? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-03-problem | full_chain | Какую задачу решает это приложение? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-04-docs-contents | full_chain | Что входит в документацию этого проекта? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-05-main-parts | full_chain | Какие основные части есть у системы? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-06-high-level-architecture | full_chain | Как в целом устроено приложение? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-07-besides-api | full_chain | Что тут есть кроме API? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-08-components | full_chain | Из чего состоит Telegram Notify App? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-09-reading-order | full_chain | Какие документы стоит читать сначала? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-10-short-summary | full_chain | Дай короткое summary по проектной документации | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-01-health | full_chain | Кратко объясни по документации, как работает `/health` | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-02-send | full_chain | Что делает endpoint `/send`? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-03-actions | full_chain | Объясни назначение `/actions/{action}` | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-04-runtime-health | full_chain | Что такое runtime health в этой документации? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-05-notification-loop | full_chain | Кратко опиши цикл отправки уведомлений | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-06-architecture | full_chain | Как устроена архитектура Telegram Notify App? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-07-worker | full_chain | Что делает worker в этом приложении? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-08-health-statuses | full_chain | Какие статусы здоровья есть у runtime? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-09-manual-send | full_chain | Как в приложении устроена ручная отправка сообщения? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-10-telegram-integration | full_chain | Как сервис взаимодействует с Telegram в целом? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-01-health | full_chain | В каком файле описан `/health`? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-02-send | full_chain | Покажи файл с описанием endpoint `/send` | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-03-actions | full_chain | Где находится документация по `/actions/{action}`? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-04-runtime-health | full_chain | В каком документе описан runtime health? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-05-loop | full_chain | Найди файл с логикой цикла отправки уведомлений | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-06-architecture | full_chain | Где описана архитектура приложения? | FIND_FILES | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-07-errors-catalog | full_chain | В каком файле лежит каталог ошибок? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-08-docs-index | full_chain | Покажи файл-индекс документации проекта | FIND_FILES | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-09-telegram-bot-api | full_chain | Какие файлы относятся к Telegram Bot API интеграции? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-10-telegram-notify-worker | full_chain | В каких файлах описан worker `telegram_notify`? | FIND_FILES | — | — | ✗ | + +## Failures +- **v2-general-02-purpose**: answer_mode: expected grounded_summary, got insufficient_evidence; llm: expected answer to contain 'test_echo_app' +- **v2-general-03-problem**: answer_mode: expected grounded_summary, got insufficient_evidence; llm: expected answer to contain 'Telegram' +- **v2-general-04-docs-contents**: llm: expected answer to contain 'архитект' +- **v2-general-05-main-parts**: llm: expected answer to contain 'систем'; llm: expected answer to contain 'Telegram' +- **v2-general-06-high-level-architecture**: llm: expected answer to contain 'приложен' +- **v2-general-07-besides-api**: llm: expected answer to contain 'API' +- **v2-general-08-components**: domain: expected GENERAL, got DOCS; intent: expected GENERAL_QA, got DOC_EXPLAIN; anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE; llm: expected answer to contain 'Telegram Notify App' +- **v2-general-09-reading-order**: llm: expected answer to contain 'README' +- **v2-docs-summary-01-health**: answer_mode: expected grounded_summary, got insufficient_evidence; llm: expected answer to contain '/health'; llm: expected answer to contain 'status'; llm: expected answer to contain 'components' +- **v2-docs-summary-02-send**: doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/send'; llm: expected answer to contain 'message'; llm: expected answer to contain 'Telegram' +- **v2-docs-summary-03-actions**: doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/actions/{action}' +- **v2-docs-summary-04-runtime-health**: doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; llm: expected answer to contain 'runtime health' +- **v2-docs-summary-05-notification-loop**: doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain 'worker'; llm: expected answer to contain 'interval'; llm: expected answer to contain 'degraded' +- **v2-docs-summary-07-worker**: doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain 'worker'; llm: expected answer to contain 'Telegram' +- **v2-docs-summary-08-health-statuses**: doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; llm: expected answer to contain 'ok'; llm: expected answer to contain 'degraded'; llm: expected answer to contain 'unhealthy'; llm: expected answer to contain 'unknown' +- **v2-docs-summary-09-manual-send**: doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/send'; llm: expected answer to contain 'message'; llm: expected answer to contain 'TelegramSendService' +- **v2-docs-summary-10-telegram-integration**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA; anchor_type: expected API_ENDPOINT, got None; doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain 'worker'; llm: expected answer to contain '/send' +- **v2-find-files-01-health**: llm: expected answer to contain 'docs/api/health-endpoint.md' +- **v2-find-files-02-send**: llm: expected answer to contain 'docs/api/send-message-endpoint.md' +- **v2-find-files-03-actions**: llm: expected answer to contain 'docs/api/control-actions-endpoint.md' +- **v2-find-files-04-runtime-health**: llm: expected answer to contain 'docs/domains/runtime-health-entity.md' +- **v2-find-files-05-loop**: llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- **v2-find-files-07-errors-catalog**: llm: expected answer to contain 'docs/errors/catalog.yaml' +- **v2-find-files-09-telegram-bot-api**: llm: expected answer to contain 'docs/api/send-message-endpoint.md'; llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- **v2-find-files-10-telegram-notify-worker**: llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'; llm: expected answer to contain 'docs/domains/runtime-health-entity.md' + +## LLM Answers +- **v2-general-01-what-is-service** + Query: Что это за сервис? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. +- **v2-general-02-purpose** + Query: Для чего нужен test_echo_app? + > В найденной документации нет достаточной опоры для общего summary по запросу. +- **v2-general-03-problem** + Query: Какую задачу решает это приложение? + > В найденной документации нет достаточной опоры для общего summary по запросу. +- **v2-general-04-docs-contents** + Query: Что входит в документацию этого проекта? + > В найденной документации нет достаточной опоры для общего summary по запросу. +- **v2-general-05-main-parts** + Query: Какие основные части есть у системы? + > В найденной документации нет достаточной опоры для общего summary по запросу. +- **v2-general-06-high-level-architecture** + Query: Как в целом устроено приложение? + > В найденной документации нет достаточной опоры для общего summary по запросу. +- **v2-general-07-besides-api** + Query: Что тут есть кроме API? + > В найденной документации нет достаточной опоры для общего summary по запросу. +- **v2-general-08-components** + Query: Из чего состоит Telegram Notify App? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). Файлы\-источники: \- docs/architecture/telegram\-notify\-app\-overview.md \- docs/readme.md +- **v2-general-09-reading-order** + Query: Какие документы стоит читать сначала? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. +- **v2-general-10-short-summary** + Query: Дай короткое summary по проектной документации + > В найденной документации нет достаточной опоры для общего summary по запросу. +- **v2-docs-summary-01-health** + Query: Кратко объясни по документации, как работает `/health` + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/readme.md. +- **v2-docs-summary-02-send** + Query: Что делает endpoint `/send`? + > В поднятом контексте не найден целевой документ по запросу. +- **v2-docs-summary-03-actions** + Query: Объясни назначение `/actions/{action}` + > В поднятом контексте не найден целевой документ по запросу. +- **v2-docs-summary-04-runtime-health** + Query: Что такое runtime health в этой документации? + > В поднятом контексте не найден целевой документ по запросу. +- **v2-docs-summary-05-notification-loop** + Query: Кратко опиши цикл отправки уведомлений + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/readme.md. +- **v2-docs-summary-06-architecture** + Query: Как устроена архитектура Telegram Notify App? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). Файлы\-источники: \- docs/architecture/telegram\-notify\-app\-overview.md \- docs/readme.md +- **v2-docs-summary-07-worker** + Query: Что делает worker в этом приложении? + > В поднятом контексте не найден целевой документ по запросу. +- **v2-docs-summary-08-health-statuses** + Query: Какие статусы здоровья есть у runtime? + > В поднятом контексте не найден целевой документ по запросу. +- **v2-docs-summary-09-manual-send** + Query: Как в приложении устроена ручная отправка сообщения? + > В поднятом контексте не найден целевой документ по запросу. +- **v2-docs-summary-10-telegram-integration** + Query: Как сервис взаимодействует с Telegram в целом? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. +- **v2-find-files-01-health** + Query: В каком файле описан `/health`? + > docs/readme.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-02-send** + Query: Покажи файл с описанием endpoint `/send` + > docs/architecture/telegram\-notify\-app\-overview.md docs/readme.md +- **v2-find-files-03-actions** + Query: Где находится документация по `/actions/{action}`? + > docs/architecture/telegram\-notify\-app\-overview.md docs/readme.md +- **v2-find-files-04-runtime-health** + Query: В каком документе описан runtime health? + > docs/architecture/telegram\-notify\-app\-overview.md docs/readme.md +- **v2-find-files-05-loop** + Query: Найди файл с логикой цикла отправки уведомлений + > docs/readme.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-06-architecture** + Query: Где описана архитектура приложения? + > docs/architecture/telegram\-notify\-app\-overview.md docs/readme.md +- **v2-find-files-07-errors-catalog** + Query: В каком файле лежит каталог ошибок? + > docs/readme.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-08-docs-index** + Query: Покажи файл-индекс документации проекта + > docs/readme.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-09-telegram-bot-api** + Query: Какие файлы относятся к Telegram Bot API интеграции? + > docs/architecture/telegram\-notify\-app\-overview.md docs/readme.md +- **v2-find-files-10-telegram-notify-worker** + Query: В каких файлах описан worker `telegram_notify`? + > docs/architecture/telegram\-notify\-app\-overview.md docs/readme.md \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json new file mode 100644 index 0000000..1c20004 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json @@ -0,0 +1,295 @@ +{ + "meta": { + "case_id": "v2-docs-summary-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected grounded_summary, got insufficient_evidence", + "llm: expected answer to contain '/health'", + "llm: expected answer to contain 'status'", + "llm: expected answer to contain 'components'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Кратко объясни по документации, как работает `/health`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 96 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md new file mode 100644 index 0000000..b358832 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md @@ -0,0 +1,344 @@ +# v2-docs-summary-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Кратко объясни по документации, как работает `/health` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Кратко объясни по документации, как работает `/health`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 96 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected grounded_summary, got insufficient_evidence +- llm: expected answer to contain '/health' +- llm: expected answer to contain 'status' +- llm: expected answer to contain 'components' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json new file mode 100644 index 0000000..75c76f5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json @@ -0,0 +1,259 @@ +{ + "meta": { + "case_id": "v2-docs-summary-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/send'", + "llm: expected answer to contain 'message'", + "llm: expected answer to contain 'Telegram'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что делает endpoint `/send`?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md new file mode 100644 index 0000000..b31c739 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md @@ -0,0 +1,304 @@ +# v2-docs-summary-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что делает endpoint `/send`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что делает endpoint `/send`?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/send' +- llm: expected answer to contain 'message' +- llm: expected answer to contain 'Telegram' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json new file mode 100644 index 0000000..6196dff --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json @@ -0,0 +1,299 @@ +{ + "meta": { + "case_id": "v2-docs-summary-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/actions/{action}'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Объясни назначение `/actions/{action}`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md new file mode 100644 index 0000000..65c69a1 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md @@ -0,0 +1,348 @@ +# v2-docs-summary-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Объясни назначение `/actions/{action}` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Объясни назначение `/actions/{action}`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/actions/{action}' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json new file mode 100644 index 0000000..deb6ae2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json @@ -0,0 +1,285 @@ +{ + "meta": { + "case_id": "v2-docs-summary-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "llm: expected answer to contain 'runtime health'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что такое runtime health в этой документации?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md new file mode 100644 index 0000000..3ccb80d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md @@ -0,0 +1,334 @@ +# v2-docs-summary-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что такое runtime health в этой документации? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что такое runtime health в этой документации?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- llm: expected answer to contain 'runtime health' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json new file mode 100644 index 0000000..f23f2b3 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json @@ -0,0 +1,330 @@ +{ + "meta": { + "case_id": "v2-docs-summary-05-notification-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain 'worker'", + "llm: expected answer to contain 'interval'", + "llm: expected answer to contain 'degraded'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md, docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Кратко опиши цикл отправки уведомлений", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 147 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md new file mode 100644 index 0000000..963fd2f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md @@ -0,0 +1,383 @@ +# v2-docs-summary-05-notification-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Кратко опиши цикл отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md, docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Кратко опиши цикл отправки уведомлений", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 147 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain 'worker' +- llm: expected answer to contain 'interval' +- llm: expected answer to contain 'degraded' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json new file mode 100644 index 0000000..7e842f1 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json @@ -0,0 +1,390 @@ +{ + "meta": { + "case_id": "v2-docs-summary-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 16, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как устроена архитектура Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 16, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 600, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 600, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md new file mode 100644 index 0000000..257f09f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md @@ -0,0 +1,445 @@ +# v2-docs-summary-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Как устроена архитектура Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 16, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как устроена архитектура Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 16, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 600, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 600, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json new file mode 100644 index 0000000..fefba8a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json @@ -0,0 +1,281 @@ +{ + "meta": { + "case_id": "v2-docs-summary-07-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain 'worker'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что делает worker в этом приложении?", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md new file mode 100644 index 0000000..36f453c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md @@ -0,0 +1,330 @@ +# v2-docs-summary-07-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что делает worker в этом приложении? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что делает worker в этом приложении?", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain 'worker' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json new file mode 100644 index 0000000..0cdb688 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json @@ -0,0 +1,289 @@ +{ + "meta": { + "case_id": "v2-docs-summary-08-health-statuses", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "llm: expected answer to contain 'ok'", + "llm: expected answer to contain 'degraded'", + "llm: expected answer to contain 'unhealthy'", + "llm: expected answer to contain 'unknown'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие статусы здоровья есть у runtime?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md new file mode 100644 index 0000000..b9ceaa5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md @@ -0,0 +1,338 @@ +# v2-docs-summary-08-health-statuses + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие статусы здоровья есть у runtime? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие статусы здоровья есть у runtime?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- llm: expected answer to contain 'ok' +- llm: expected answer to contain 'degraded' +- llm: expected answer to contain 'unhealthy' +- llm: expected answer to contain 'unknown' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json new file mode 100644 index 0000000..17ded9c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json @@ -0,0 +1,297 @@ +{ + "meta": { + "case_id": "v2-docs-summary-09-manual-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/send'", + "llm: expected answer to contain 'message'", + "llm: expected answer to contain 'TelegramSendService'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как в приложении устроена ручная отправка сообщения?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md new file mode 100644 index 0000000..94c1b16 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md @@ -0,0 +1,346 @@ +# v2-docs-summary-09-manual-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как в приложении устроена ручная отправка сообщения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как в приложении устроена ручная отправка сообщения?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/send' +- llm: expected answer to contain 'message' +- llm: expected answer to contain 'TelegramSendService' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json new file mode 100644 index 0000000..1e0b5f0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json @@ -0,0 +1,338 @@ +{ + "meta": { + "case_id": "v2-docs-summary-10-telegram-integration", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA", + "anchor_type: expected API_ENDPOINT, got None", + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": null, + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": null, + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как сервис взаимодействует с Telegram в целом?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md new file mode 100644 index 0000000..7e1df31 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md @@ -0,0 +1,391 @@ +# v2-docs-summary-10-telegram-integration + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как сервис взаимодействует с Telegram в целом? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": null, + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": null, + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как сервис взаимодействует с Telegram в целом?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA +- anchor_type: expected API_ENDPOINT, got None +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-01-health.json new file mode 100644 index 0000000..78d41ba --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-01-health.json @@ -0,0 +1,298 @@ +{ + "meta": { + "case_id": "v2-find-files-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/health-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком файле описан `/health`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-01-health.md new file mode 100644 index 0000000..5207ae9 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-01-health.md @@ -0,0 +1,351 @@ +# v2-find-files-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком файле описан `/health`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком файле описан `/health`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/health-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-02-send.json new file mode 100644 index 0000000..863b971 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-02-send.json @@ -0,0 +1,298 @@ +{ + "meta": { + "case_id": "v2-find-files-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/send-message-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Покажи файл с описанием endpoint `/send`", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-02-send.md new file mode 100644 index 0000000..396c5d9 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-02-send.md @@ -0,0 +1,351 @@ +# v2-find-files-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Покажи файл с описанием endpoint `/send` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Покажи файл с описанием endpoint `/send`", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/send-message-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-03-actions.json new file mode 100644 index 0000000..3be1e4a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-03-actions.json @@ -0,0 +1,304 @@ +{ + "meta": { + "case_id": "v2-find-files-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/control-actions-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Где находится документация по `/actions/{action}`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-03-actions.md new file mode 100644 index 0000000..ce31457 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-03-actions.md @@ -0,0 +1,357 @@ +# v2-find-files-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Где находится документация по `/actions/{action}`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Где находится документация по `/actions/{action}`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/control-actions-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json new file mode 100644 index 0000000..9f88ec2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json @@ -0,0 +1,302 @@ +{ + "meta": { + "case_id": "v2-find-files-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/domains/runtime-health-entity.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком документе описан runtime health?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md new file mode 100644 index 0000000..e759ee7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md @@ -0,0 +1,355 @@ +# v2-find-files-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком документе описан runtime health? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком документе описан runtime health?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/domains/runtime-health-entity.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-05-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-05-loop.json new file mode 100644 index 0000000..672c6d5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-05-loop.json @@ -0,0 +1,296 @@ +{ + "meta": { + "case_id": "v2-find-files-05-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Найди файл с логикой цикла отправки уведомлений", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-05-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-05-loop.md new file mode 100644 index 0000000..e33bff1 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-05-loop.md @@ -0,0 +1,349 @@ +# v2-find-files-05-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Найди файл с логикой цикла отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Найди файл с логикой цикла отправки уведомлений", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json new file mode 100644 index 0000000..ba2f015 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json @@ -0,0 +1,344 @@ +{ + "meta": { + "case_id": "v2-find-files-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Где описана архитектура приложения?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 670, + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 670, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md new file mode 100644 index 0000000..7fc62c3 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md @@ -0,0 +1,399 @@ +# v2-find-files-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Где описана архитектура приложения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Где описана архитектура приложения?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 670, + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 670, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json new file mode 100644 index 0000000..238cb6e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json @@ -0,0 +1,302 @@ +{ + "meta": { + "case_id": "v2-find-files-07-errors-catalog", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/errors/catalog.yaml'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком файле лежит каталог ошибок?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 150, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 150, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md new file mode 100644 index 0000000..348b8b0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md @@ -0,0 +1,355 @@ +# v2-find-files-07-errors-catalog + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком файле лежит каталог ошибок? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком файле лежит каталог ошибок?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 150, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 150, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/errors/catalog.yaml' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json new file mode 100644 index 0000000..09e5785 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json @@ -0,0 +1,314 @@ +{ + "meta": { + "case_id": "v2-find-files-08-docs-index", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Покажи файл-индекс документации проекта", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/README.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 2140, + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md new file mode 100644 index 0000000..08bb57d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md @@ -0,0 +1,369 @@ +# v2-find-files-08-docs-index + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Покажи файл-индекс документации проекта + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Покажи файл-индекс документации проекта", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/README.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 2140, + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json new file mode 100644 index 0000000..67047e6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json @@ -0,0 +1,288 @@ +{ + "meta": { + "case_id": "v2-find-files-09-telegram-bot-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/send-message-endpoint.md'", + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md new file mode 100644 index 0000000..c4d79a7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md @@ -0,0 +1,341 @@ +# v2-find-files-09-telegram-bot-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие файлы относятся к Telegram Bot API интеграции? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/send-message-endpoint.md' +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json new file mode 100644 index 0000000..52da710 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json @@ -0,0 +1,304 @@ +{ + "meta": { + "case_id": "v2-find-files-10-telegram-notify-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'", + "llm: expected answer to contain 'docs/domains/runtime-health-entity.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каких файлах описан worker `telegram_notify`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md new file mode 100644 index 0000000..28d4704 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md @@ -0,0 +1,357 @@ +# v2-find-files-10-telegram-notify-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каких файлах описан worker `telegram_notify`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каких файлах описан worker `telegram_notify`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- llm: expected answer to contain 'docs/domains/runtime-health-entity.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json new file mode 100644 index 0000000..0cf24da --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json @@ -0,0 +1,326 @@ +{ + "meta": { + "case_id": "v2-general-01-what-is-service", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что это за сервис?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md new file mode 100644 index 0000000..302917b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md @@ -0,0 +1,381 @@ +# v2-general-01-what-is-service + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что это за сервис? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что это за сервис?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-02-purpose.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-02-purpose.json new file mode 100644 index 0000000..f047edf --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-02-purpose.json @@ -0,0 +1,339 @@ +{ + "meta": { + "case_id": "v2-general-02-purpose", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Для чего нужен test_echo_app?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-02-purpose.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-02-purpose.md new file mode 100644 index 0000000..8e52fc6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-02-purpose.md @@ -0,0 +1,394 @@ +# v2-general-02-purpose + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Для чего нужен test_echo_app? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Для чего нужен test_echo_app?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-03-problem.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-03-problem.json new file mode 100644 index 0000000..3583e60 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-03-problem.json @@ -0,0 +1,326 @@ +{ + "meta": { + "case_id": "v2-general-03-problem", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какую задачу решает это приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-03-problem.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-03-problem.md new file mode 100644 index 0000000..475e3e0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-03-problem.md @@ -0,0 +1,381 @@ +# v2-general-03-problem + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Какую задачу решает это приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какую задачу решает это приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json new file mode 100644 index 0000000..ad7cafc --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json @@ -0,0 +1,326 @@ +{ + "meta": { + "case_id": "v2-general-04-docs-contents", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что входит в документацию этого проекта?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md new file mode 100644 index 0000000..2de2e31 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md @@ -0,0 +1,381 @@ +# v2-general-04-docs-contents + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что входит в документацию этого проекта? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что входит в документацию этого проекта?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-05-main-parts.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-05-main-parts.json new file mode 100644 index 0000000..63a6a58 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-05-main-parts.json @@ -0,0 +1,328 @@ +{ + "meta": { + "case_id": "v2-general-05-main-parts", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'систем'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие основные части есть у системы?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-05-main-parts.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-05-main-parts.md new file mode 100644 index 0000000..cf79327 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-05-main-parts.md @@ -0,0 +1,381 @@ +# v2-general-05-main-parts + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие основные части есть у системы? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие основные части есть у системы?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'систем' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json new file mode 100644 index 0000000..46bf39b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json @@ -0,0 +1,328 @@ +{ + "meta": { + "case_id": "v2-general-06-high-level-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'приложен'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как в целом устроено приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md new file mode 100644 index 0000000..c2b9b4d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md @@ -0,0 +1,381 @@ +# v2-general-06-high-level-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как в целом устроено приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как в целом устроено приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'приложен' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-07-besides-api.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-07-besides-api.json new file mode 100644 index 0000000..750d6bb --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-07-besides-api.json @@ -0,0 +1,326 @@ +{ + "meta": { + "case_id": "v2-general-07-besides-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что тут есть кроме API?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-07-besides-api.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-07-besides-api.md new file mode 100644 index 0000000..493a888 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-07-besides-api.md @@ -0,0 +1,381 @@ +# v2-general-07-besides-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что тут есть кроме API? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что тут есть кроме API?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-08-components.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-08-components.json new file mode 100644 index 0000000..d2f8d32 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-08-components.json @@ -0,0 +1,389 @@ +{ + "meta": { + "case_id": "v2-general-08-components", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected GENERAL, got DOCS", + "intent: expected GENERAL_QA, got DOC_EXPLAIN", + "anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE", + "llm: expected answer to contain 'Telegram Notify App'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 16, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Из чего состоит Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 16, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 60, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 60, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-08-components.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-08-components.md new file mode 100644 index 0000000..11ee6e7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-08-components.md @@ -0,0 +1,442 @@ +# v2-general-08-components + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Из чего состоит Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 16, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Из чего состоит Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 16, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 60, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 60, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected GENERAL, got DOCS +- intent: expected GENERAL_QA, got DOC_EXPLAIN +- anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE +- llm: expected answer to contain 'Telegram Notify App' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-09-reading-order.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-09-reading-order.json new file mode 100644 index 0000000..194372a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-09-reading-order.json @@ -0,0 +1,328 @@ +{ + "meta": { + "case_id": "v2-general-09-reading-order", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'README'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие документы стоит читать сначала?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-09-reading-order.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-09-reading-order.md new file mode 100644 index 0000000..e9a5323 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-09-reading-order.md @@ -0,0 +1,381 @@ +# v2-general-09-reading-order + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие документы стоит читать сначала? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие документы стоит читать сначала?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'README' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-10-short-summary.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-10-short-summary.json new file mode 100644 index 0000000..2545ba8 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-10-short-summary.json @@ -0,0 +1,326 @@ +{ + "meta": { + "case_id": "v2-general-10-short-summary", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Дай короткое summary по проектной документации", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-10-short-summary.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-10-short-summary.md new file mode 100644 index 0000000..7e55ef2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/full_chain_docs_v2_matrix_v2-general-10-short-summary.md @@ -0,0 +1,381 @@ +# v2-general-10-short-summary + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Дай короткое summary по проектной документации + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Дай короткое summary по проектной документации", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/summary.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/summary.md new file mode 100644 index 0000000..632bd37 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100346/summary.md @@ -0,0 +1,151 @@ +# pipeline_setup_v3 summary + +Passed: 9/30 + +| File | Case | Mode | Query | Actual sub-intent | RAG layers | Tokens | Pass | +|------|------|------|-------|-------------------|------------|--------|------| +| full_chain_docs_v2_matrix.yaml | v2-general-01-what-is-service | full_chain | Что это за сервис? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-02-purpose | full_chain | Для чего нужен test_echo_app? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-03-problem | full_chain | Какую задачу решает это приложение? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-04-docs-contents | full_chain | Что входит в документацию этого проекта? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-05-main-parts | full_chain | Какие основные части есть у системы? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-06-high-level-architecture | full_chain | Как в целом устроено приложение? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-07-besides-api | full_chain | Что тут есть кроме API? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-08-components | full_chain | Из чего состоит Telegram Notify App? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-09-reading-order | full_chain | Какие документы стоит читать сначала? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-10-short-summary | full_chain | Дай короткое summary по проектной документации | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-01-health | full_chain | Кратко объясни по документации, как работает `/health` | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-02-send | full_chain | Что делает endpoint `/send`? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-03-actions | full_chain | Объясни назначение `/actions/{action}` | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-04-runtime-health | full_chain | Что такое runtime health в этой документации? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-05-notification-loop | full_chain | Кратко опиши цикл отправки уведомлений | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-06-architecture | full_chain | Как устроена архитектура Telegram Notify App? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-07-worker | full_chain | Что делает worker в этом приложении? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-08-health-statuses | full_chain | Какие статусы здоровья есть у runtime? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-09-manual-send | full_chain | Как в приложении устроена ручная отправка сообщения? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-10-telegram-integration | full_chain | Как сервис взаимодействует с Telegram в целом? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-01-health | full_chain | В каком файле описан `/health`? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-02-send | full_chain | Покажи файл с описанием endpoint `/send` | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-03-actions | full_chain | Где находится документация по `/actions/{action}`? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-04-runtime-health | full_chain | В каком документе описан runtime health? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-05-loop | full_chain | Найди файл с логикой цикла отправки уведомлений | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-06-architecture | full_chain | Где описана архитектура приложения? | FIND_FILES | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-07-errors-catalog | full_chain | В каком файле лежит каталог ошибок? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-08-docs-index | full_chain | Покажи файл-индекс документации проекта | FIND_FILES | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-09-telegram-bot-api | full_chain | Какие файлы относятся к Telegram Bot API интеграции? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-10-telegram-notify-worker | full_chain | В каких файлах описан worker `telegram_notify`? | FIND_FILES | — | — | ✗ | + +## Failures +- **v2-general-05-main-parts**: llm: expected answer to contain 'систем' +- **v2-general-06-high-level-architecture**: llm: expected answer to contain 'приложен' +- **v2-general-08-components**: domain: expected GENERAL, got DOCS; intent: expected GENERAL_QA, got DOC_EXPLAIN; anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE; llm: expected answer to contain 'Telegram Notify App' +- **v2-general-09-reading-order**: llm: expected answer to contain 'README' +- **v2-docs-summary-01-health**: answer_mode: expected grounded_summary, got insufficient_evidence; llm: expected answer to contain '/health'; llm: expected answer to contain 'status'; llm: expected answer to contain 'components' +- **v2-docs-summary-02-send**: doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/send'; llm: expected answer to contain 'message'; llm: expected answer to contain 'Telegram' +- **v2-docs-summary-03-actions**: doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/actions/{action}' +- **v2-docs-summary-04-runtime-health**: doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; llm: expected answer to contain 'runtime health' +- **v2-docs-summary-05-notification-loop**: doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain 'worker'; llm: expected answer to contain 'interval'; llm: expected answer to contain 'degraded' +- **v2-docs-summary-07-worker**: doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain 'worker' +- **v2-docs-summary-08-health-statuses**: doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; llm: expected answer to contain 'ok'; llm: expected answer to contain 'degraded'; llm: expected answer to contain 'unhealthy'; llm: expected answer to contain 'unknown' +- **v2-docs-summary-09-manual-send**: doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/send'; llm: expected answer to contain 'message'; llm: expected answer to contain 'TelegramSendService' +- **v2-docs-summary-10-telegram-integration**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA; anchor_type: expected API_ENDPOINT, got None; doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- **v2-find-files-01-health**: llm: expected answer to contain 'docs/api/health-endpoint.md' +- **v2-find-files-02-send**: llm: expected answer to contain 'docs/api/send-message-endpoint.md' +- **v2-find-files-03-actions**: llm: expected answer to contain 'docs/api/control-actions-endpoint.md' +- **v2-find-files-04-runtime-health**: llm: expected answer to contain 'docs/domains/runtime-health-entity.md' +- **v2-find-files-05-loop**: llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- **v2-find-files-07-errors-catalog**: llm: expected answer to contain 'docs/errors/catalog.yaml' +- **v2-find-files-09-telegram-bot-api**: llm: expected answer to contain 'docs/api/send-message-endpoint.md'; llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- **v2-find-files-10-telegram-notify-worker**: llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'; llm: expected answer to contain 'docs/domains/runtime-health-entity.md' + +## LLM Answers +- **v2-general-01-what-is-service** + Query: Что это за сервис? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-02-purpose** + Query: Для чего нужен test_echo_app? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/arc… +- **v2-general-03-problem** + Query: Какую задачу решает это приложение? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-04-docs-contents** + Query: Что входит в документацию этого проекта? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-05-main-parts** + Query: Какие основные части есть у системы? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-06-high-level-architecture** + Query: Как в целом устроено приложение? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-07-besides-api** + Query: Что тут есть кроме API? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-08-components** + Query: Из чего состоит Telegram Notify App? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). Файлы\-источники: \- docs/architecture/telegram\-notify\-app\-overview.md \- docs/README.md +- **v2-general-09-reading-order** + Query: Какие документы стоит читать сначала? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-10-short-summary** + Query: Дай короткое summary по проектной документации + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-docs-summary-01-health** + Query: Кратко объясни по документации, как работает `/health` + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/README.md. +- **v2-docs-summary-02-send** + Query: Что делает endpoint `/send`? + > В поднятом контексте не найден целевой документ по запросу. +- **v2-docs-summary-03-actions** + Query: Объясни назначение `/actions/{action}` + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-04-runtime-health** + Query: Что такое runtime health в этой документации? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-05-notification-loop** + Query: Кратко опиши цикл отправки уведомлений + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md, docs/README.md. +- **v2-docs-summary-06-architecture** + Query: Как устроена архитектура Telegram Notify App? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). Файлы\-источники: \- docs/architecture/telegram\-notify\-app\-overview.md \- docs/README.md +- **v2-docs-summary-07-worker** + Query: Что делает worker в этом приложении? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-08-health-statuses** + Query: Какие статусы здоровья есть у runtime? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-09-manual-send** + Query: Как в приложении устроена ручная отправка сообщения? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-10-telegram-integration** + Query: Как сервис взаимодействует с Telegram в целом? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/arc… +- **v2-find-files-01-health** + Query: В каком файле описан `/health`? + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-02-send** + Query: Покажи файл с описанием endpoint `/send` + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-03-actions** + Query: Где находится документация по `/actions/{action}`? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-04-runtime-health** + Query: В каком документе описан runtime health? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-05-loop** + Query: Найди файл с логикой цикла отправки уведомлений + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-06-architecture** + Query: Где описана архитектура приложения? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-07-errors-catalog** + Query: В каком файле лежит каталог ошибок? + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-08-docs-index** + Query: Покажи файл-индекс документации проекта + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-09-telegram-bot-api** + Query: Какие файлы относятся к Telegram Bot API интеграции? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-10-telegram-notify-worker** + Query: В каких файлах описан worker `telegram_notify`? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json new file mode 100644 index 0000000..1c20004 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-01-health.json @@ -0,0 +1,295 @@ +{ + "meta": { + "case_id": "v2-docs-summary-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "answer_mode: expected grounded_summary, got insufficient_evidence", + "llm: expected answer to contain '/health'", + "llm: expected answer to contain 'status'", + "llm: expected answer to contain 'components'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Кратко объясни по документации, как работает `/health`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 96 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md new file mode 100644 index 0000000..b358832 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-01-health.md @@ -0,0 +1,344 @@ +# v2-docs-summary-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Кратко объясни по документации, как работает `/health` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%", + "%/health%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Кратко объясни по документации, как работает `/health`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 96 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- answer_mode: expected grounded_summary, got insufficient_evidence +- llm: expected answer to contain '/health' +- llm: expected answer to contain 'status' +- llm: expected answer to contain 'components' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json new file mode 100644 index 0000000..75c76f5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-02-send.json @@ -0,0 +1,259 @@ +{ + "meta": { + "case_id": "v2-docs-summary-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/send'", + "llm: expected answer to contain 'message'", + "llm: expected answer to contain 'Telegram'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что делает endpoint `/send`?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md new file mode 100644 index 0000000..b31c739 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-02-send.md @@ -0,0 +1,304 @@ +# v2-docs-summary-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что делает endpoint `/send`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%", + "%/send%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что делает endpoint `/send`?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": null, + "document_count": 0 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [], + "ranking_score_breakdown": [] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 59 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/send' +- llm: expected answer to contain 'message' +- llm: expected answer to contain 'Telegram' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json new file mode 100644 index 0000000..6196dff --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.json @@ -0,0 +1,299 @@ +{ + "meta": { + "case_id": "v2-docs-summary-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/actions/{action}'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Объясни назначение `/actions/{action}`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md new file mode 100644 index 0000000..65c69a1 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-03-actions.md @@ -0,0 +1,348 @@ +# v2-docs-summary-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Объясни назначение `/actions/{action}` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%", + "%/actions/{action}%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Объясни назначение `/actions/{action}`", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 390, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 40, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/actions/{action}' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json new file mode 100644 index 0000000..deb6ae2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.json @@ -0,0 +1,285 @@ +{ + "meta": { + "case_id": "v2-docs-summary-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "llm: expected answer to contain 'runtime health'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что такое runtime health в этой документации?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md new file mode 100644 index 0000000..3ccb80d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-04-runtime-health.md @@ -0,0 +1,334 @@ +# v2-docs-summary-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что такое runtime health в этой документации? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что такое runtime health в этой документации?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- llm: expected answer to contain 'runtime health' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json new file mode 100644 index 0000000..f23f2b3 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.json @@ -0,0 +1,330 @@ +{ + "meta": { + "case_id": "v2-docs-summary-05-notification-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain 'worker'", + "llm: expected answer to contain 'interval'", + "llm: expected answer to contain 'degraded'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md, docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Кратко опиши цикл отправки уведомлений", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 147 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md new file mode 100644 index 0000000..963fd2f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-05-notification-loop.md @@ -0,0 +1,383 @@ +# v2-docs-summary-05-notification-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Кратко опиши цикл отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md, docs/README.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Кратко опиши цикл отправки уведомлений", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 880, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 147 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain 'worker' +- llm: expected answer to contain 'interval' +- llm: expected answer to contain 'degraded' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json new file mode 100644 index 0000000..7e842f1 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.json @@ -0,0 +1,390 @@ +{ + "meta": { + "case_id": "v2-docs-summary-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 16, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как устроена архитектура Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 16, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 600, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 600, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md new file mode 100644 index 0000000..257f09f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-06-architecture.md @@ -0,0 +1,445 @@ +# v2-docs-summary-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Как устроена архитектура Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 16, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как устроена архитектура Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 16, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 600, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2900, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 600, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 240, + "filename_match": 800, + "alias_match": 500, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json new file mode 100644 index 0000000..fefba8a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.json @@ -0,0 +1,281 @@ +{ + "meta": { + "case_id": "v2-docs-summary-07-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain 'worker'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что делает worker в этом приложении?", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md new file mode 100644 index 0000000..36f453c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-07-worker.md @@ -0,0 +1,330 @@ +# v2-docs-summary-07-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Что делает worker в этом приложении? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_logic_flow", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/", + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что делает worker в этом приложении?", + "profile": "docs_summary_logic_flow", + "row_count": 4, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 20, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain 'worker' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json new file mode 100644 index 0000000..0cdb688 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.json @@ -0,0 +1,289 @@ +{ + "meta": { + "case_id": "v2-docs-summary-08-health-statuses", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']", + "llm: expected answer to contain 'ok'", + "llm: expected answer to contain 'degraded'", + "llm: expected answer to contain 'unhealthy'", + "llm: expected answer to contain 'unknown'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие статусы здоровья есть у runtime?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md new file mode 100644 index 0000000..b9ceaa5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-08-health-statuses.md @@ -0,0 +1,338 @@ +# v2-docs-summary-08-health-statuses + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие статусы здоровья есть у runtime? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_domain_entity", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/", + "docs/api/", + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие статусы здоровья есть у runtime?", + "profile": "docs_summary_domain_entity", + "row_count": 4, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 410, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md'] +- llm: expected answer to contain 'ok' +- llm: expected answer to contain 'degraded' +- llm: expected answer to contain 'unhealthy' +- llm: expected answer to contain 'unknown' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json new file mode 100644 index 0000000..17ded9c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.json @@ -0,0 +1,297 @@ +{ + "meta": { + "case_id": "v2-docs-summary-09-manual-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']", + "llm: expected answer to contain '/send'", + "llm: expected answer to contain 'message'", + "llm: expected answer to contain 'TelegramSendService'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как в приложении устроена ручная отправка сообщения?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md new file mode 100644 index 0000000..94c1b16 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-09-manual-send.md @@ -0,0 +1,346 @@ +# v2-docs-summary-09-manual-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как в приложении устроена ручная отправка сообщения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 4, + "llm_answer": "В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram-notify-app-overview.md.", + "answer_mode": "insufficient_evidence", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_api_endpoint", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/", + "docs/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "path_prefixes": [ + "docs/api/", + "docs/architecture/", + "docs/" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как в приложении устроена ручная отправка сообщения?", + "profile": "docs_summary_api_endpoint", + "row_count": 4, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 1 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 370, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": -150 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "target_doc_missing", + "answer_mode": "insufficient_evidence" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "insufficient_evidence", + "answer_length": 131 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- llm: expected answer to contain '/send' +- llm: expected answer to contain 'message' +- llm: expected answer to contain 'TelegramSendService' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json new file mode 100644 index 0000000..1e0b5f0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.json @@ -0,0 +1,338 @@ +{ + "meta": { + "case_id": "v2-docs-summary-10-telegram-integration", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA", + "anchor_type: expected API_ENDPOINT, got None", + "doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": null, + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": null, + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как сервис взаимодействует с Telegram в целом?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md new file mode 100644 index 0000000..7e1df31 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-docs-summary-10-telegram-integration.md @@ -0,0 +1,391 @@ +# v2-docs-summary-10-telegram-integration + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как сервис взаимодействует с Telegram в целом? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": null, + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": null, + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как сервис взаимодействует с Telegram в целом?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 120, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA +- anchor_type: expected API_ENDPOINT, got None +- doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-01-health.json new file mode 100644 index 0000000..78d41ba --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-01-health.json @@ -0,0 +1,298 @@ +{ + "meta": { + "case_id": "v2-find-files-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/health-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком файле описан `/health`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-01-health.md new file mode 100644 index 0000000..5207ae9 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-01-health.md @@ -0,0 +1,351 @@ +# v2-find-files-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком файле описан `/health`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%health-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком файле описан `/health`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/health-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-02-send.json new file mode 100644 index 0000000..863b971 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-02-send.json @@ -0,0 +1,298 @@ +{ + "meta": { + "case_id": "v2-find-files-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/send-message-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Покажи файл с описанием endpoint `/send`", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-02-send.md new file mode 100644 index 0000000..396c5d9 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-02-send.md @@ -0,0 +1,351 @@ +# v2-find-files-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Покажи файл с описанием endpoint `/send` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramSendService" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%send-message-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Покажи файл с описанием endpoint `/send`", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/send-message-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-03-actions.json new file mode 100644 index 0000000..3be1e4a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-03-actions.json @@ -0,0 +1,304 @@ +{ + "meta": { + "case_id": "v2-find-files-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/control-actions-endpoint.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Где находится документация по `/actions/{action}`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-03-actions.md new file mode 100644 index 0000000..ce31457 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-03-actions.md @@ -0,0 +1,357 @@ +# v2-find-files-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Где находится документация по `/actions/{action}`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/api/" + ], + "prefer_like_patterns": [ + "%control-actions-endpoint.md%" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Где находится документация по `/actions/{action}`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 640, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/control-actions-endpoint.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json new file mode 100644 index 0000000..9f88ec2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.json @@ -0,0 +1,302 @@ +{ + "meta": { + "case_id": "v2-find-files-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/domains/runtime-health-entity.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком документе описан runtime health?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md new file mode 100644 index 0000000..e759ee7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-04-runtime-health.md @@ -0,0 +1,355 @@ +# v2-find-files-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком документе описан runtime health? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/domains/" + ], + "prefer_like_patterns": [ + "%runtime-health-entity.md%" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком документе описан runtime health?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 130, + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 650, + "match_reason": "alias_match" + }, + { + "doc": "docs/README.md", + "score": 130, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/domains/runtime-health-entity.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-05-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-05-loop.json new file mode 100644 index 0000000..672c6d5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-05-loop.json @@ -0,0 +1,296 @@ +{ + "meta": { + "case_id": "v2-find-files-05-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Найди файл с логикой цикла отправки уведомлений", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-05-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-05-loop.md new file mode 100644 index 0000000..e33bff1 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-05-loop.md @@ -0,0 +1,349 @@ +# v2-find-files-05-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Найди файл с логикой цикла отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Найди файл с логикой цикла отправки уведомлений", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json new file mode 100644 index 0000000..ba2f015 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-06-architecture.json @@ -0,0 +1,344 @@ +{ + "meta": { + "case_id": "v2-find-files-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Где описана архитектура приложения?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 670, + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 670, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md new file mode 100644 index 0000000..7fc62c3 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-06-architecture.md @@ -0,0 +1,399 @@ +# v2-find-files-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Где описана архитектура приложения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Где описана архитектура приложения?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 670, + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "alias_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 3970, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 670, + "match_reason": "alias_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 720, + "filename_match": 1600, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 50, + "path_match": 0, + "filename_match": 0, + "alias_match": 500, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json new file mode 100644 index 0000000..238cb6e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.json @@ -0,0 +1,302 @@ +{ + "meta": { + "case_id": "v2-find-files-07-errors-catalog", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/errors/catalog.yaml'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каком файле лежит каталог ошибок?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 150, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 150, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md new file mode 100644 index 0000000..348b8b0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-07-errors-catalog.md @@ -0,0 +1,355 @@ +# v2-find-files-07-errors-catalog + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каком файле лежит каталог ошибок? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/errors/" + ], + "prefer_like_patterns": [ + "%catalog.yaml%" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каком файле лежит каталог ошибок?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "RuntimeManager", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 150, + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 150, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 120, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 30, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/errors/catalog.yaml' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json new file mode 100644 index 0000000..09e5785 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.json @@ -0,0 +1,314 @@ +{ + "meta": { + "case_id": "v2-find-files-08-docs-index", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Покажи файл-индекс документации проекта", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/README.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 2140, + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md new file mode 100644 index 0000000..08bb57d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-08-docs-index.md @@ -0,0 +1,369 @@ +# v2-find-files-08-docs-index + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Покажи файл-индекс документации проекта + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/README.md\ndocs/architecture/telegram-notify-app-overview.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Покажи файл-индекс документации проекта", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/README.md" + ], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/README.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 2140, + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 300, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 10, + "path_match": 360, + "filename_match": 400, + "alias_match": 250, + "anchor_boost": 120, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 0, + "path_match": 180, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json new file mode 100644 index 0000000..67047e6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.json @@ -0,0 +1,288 @@ +{ + "meta": { + "case_id": "v2-find-files-09-telegram-bot-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/api/send-message-endpoint.md'", + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md new file mode 100644 index 0000000..c4d79a7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-09-telegram-bot-api.md @@ -0,0 +1,341 @@ +# v2-find-files-09-telegram-bot-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие файлы относятся к Telegram Bot API интеграции? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyModule" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/" + ], + "prefer_like_patterns": [], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramControlChannel", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 720, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 20, + "path_match": 180, + "filename_match": 400, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": false, + "reason": "low_confidence_shortlist", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/api/send-message-endpoint.md' +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json new file mode 100644 index 0000000..52da710 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.json @@ -0,0 +1,304 @@ +{ + "meta": { + "case_id": "v2-find-files-10-telegram-notify-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'", + "llm: expected answer to contain 'docs/domains/runtime-health-entity.md'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "В каких файлах описан worker `telegram_notify`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md new file mode 100644 index 0000000..28d4704 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-find-files-10-telegram-notify-worker.md @@ -0,0 +1,357 @@ +# v2-find-files-10-telegram-notify-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +В каких файлах описан worker `telegram_notify`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 3, + "llm_answer": "docs/architecture/telegram-notify-app-overview.md\ndocs/README.md", + "answer_mode": "deterministic", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "TelegramNotifyWorker" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "file_lookup", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/logic/" + ], + "prefer_like_patterns": [ + "%telegram-notification-loop.md%" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "В каких файлах описан worker `telegram_notify`?", + "profile": "file_lookup", + "row_count": 3, + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "find_files", + "primary_file": "docs/architecture/telegram-notify-app-overview.md", + "file_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 1310, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 30, + "path_match": 360, + "filename_match": 800, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 20, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 120, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "primary_file_confident", + "answer_mode": "deterministic" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "deterministic", + "answer_length": 64 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- llm: expected answer to contain 'docs/domains/runtime-health-entity.md' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json new file mode 100644 index 0000000..0cf24da --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-01-what-is-service.json @@ -0,0 +1,326 @@ +{ + "meta": { + "case_id": "v2-general-01-what-is-service", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что это за сервис?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md new file mode 100644 index 0000000..302917b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-01-what-is-service.md @@ -0,0 +1,381 @@ +# v2-general-01-what-is-service + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что это за сервис? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что это за сервис?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-02-purpose.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-02-purpose.json new file mode 100644 index 0000000..f047edf --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-02-purpose.json @@ -0,0 +1,339 @@ +{ + "meta": { + "case_id": "v2-general-02-purpose", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Для чего нужен test_echo_app?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-02-purpose.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-02-purpose.md new file mode 100644 index 0000000..8e52fc6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-02-purpose.md @@ -0,0 +1,394 @@ +# v2-general-02-purpose + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Для чего нужен test_echo_app? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Операторские и мониторинговые клиенты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + } + ], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Для чего нужен test_echo_app?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "exact_title" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 140, + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 380, + "match_reason": "exact_title" + }, + { + "doc": "docs/README.md", + "score": 140, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 120, + "path_match": 60, + "filename_match": 200, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 140, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-03-problem.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-03-problem.json new file mode 100644 index 0000000..3583e60 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-03-problem.json @@ -0,0 +1,326 @@ +{ + "meta": { + "case_id": "v2-general-03-problem", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какую задачу решает это приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-03-problem.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-03-problem.md new file mode 100644 index 0000000..475e3e0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-03-problem.md @@ -0,0 +1,381 @@ +# v2-general-03-problem + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Какую задачу решает это приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанный код", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какую задачу решает это приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json new file mode 100644 index 0000000..ad7cafc --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-04-docs-contents.json @@ -0,0 +1,326 @@ +{ + "meta": { + "case_id": "v2-general-04-docs-contents", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что входит в документацию этого проекта?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md new file mode 100644 index 0000000..2de2e31 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-04-docs-contents.md @@ -0,0 +1,381 @@ +# v2-general-04-docs-contents + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что входит в документацию этого проекта? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что входит в документацию этого проекта?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-05-main-parts.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-05-main-parts.json new file mode 100644 index 0000000..63a6a58 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-05-main-parts.json @@ -0,0 +1,328 @@ +{ + "meta": { + "case_id": "v2-general-05-main-parts", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'систем'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие основные части есть у системы?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-05-main-parts.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-05-main-parts.md new file mode 100644 index 0000000..cf79327 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-05-main-parts.md @@ -0,0 +1,381 @@ +# v2-general-05-main-parts + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие основные части есть у системы? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие основные части есть у системы?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'систем' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json new file mode 100644 index 0000000..46bf39b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.json @@ -0,0 +1,328 @@ +{ + "meta": { + "case_id": "v2-general-06-high-level-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'приложен'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Как в целом устроено приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md new file mode 100644 index 0000000..c2b9b4d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-06-high-level-architecture.md @@ -0,0 +1,381 @@ +# v2-general-06-high-level-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Как в целом устроено приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Как в целом устроено приложение?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'приложен' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-07-besides-api.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-07-besides-api.json new file mode 100644 index 0000000..750d6bb --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-07-besides-api.json @@ -0,0 +1,326 @@ +{ + "meta": { + "case_id": "v2-general-07-besides-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Что тут есть кроме API?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-07-besides-api.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-07-besides-api.md new file mode 100644 index 0000000..493a888 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-07-besides-api.md @@ -0,0 +1,381 @@ +# v2-general-07-besides-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Что тут есть кроме API? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Что тут есть кроме API?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Навигация", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Связанные документы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 100, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 100, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 100, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-08-components.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-08-components.json new file mode 100644 index 0000000..d2f8d32 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-08-components.json @@ -0,0 +1,389 @@ +{ + "meta": { + "case_id": "v2-general-08-components", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "domain: expected GENERAL, got DOCS", + "intent: expected GENERAL_QA, got DOC_EXPLAIN", + "anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE", + "llm: expected answer to contain 'Telegram Notify App'" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 16, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Из чего состоит Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 16, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 60, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 60, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-08-components.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-08-components.md new file mode 100644 index 0000000..11ee6e7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-08-components.md @@ -0,0 +1,442 @@ +# v2-general-08-components + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Из чего состоит Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 16, + "llm_answer": "- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).\n\nФайлы-источники:\n- docs/architecture/telegram-notify-app-overview.md\n- docs/README.md", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [ + "RuntimeManager" + ], + "doc_scope": [ + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md", + "index.test_echo_app_docs", + "docs/README.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "docs_summary_architecture", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D3_ENTITY_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%telegram-notify-app-overview.md%" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "candidate_docs_before_ranking": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Компоненты", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Интеграционные сценарии", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Telegram Bot API", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ], + "metadata_lookup": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + } + ], + "semantic": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyModule", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramNotifyWorker", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D3_ENTITY_CATALOG", + "title": "TelegramSendService", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Из чего состоит Telegram Notify App?", + "profile": "docs_summary_architecture", + "row_count": 16, + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "top_results": [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Summary", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Описание", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Границы системы", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/architecture/telegram-notify-app-overview.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + }, + "match_reason": "exact_path" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 60, + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 2140, + "match_reason": "exact_path" + }, + { + "doc": "docs/README.md", + "score": 60, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 60, + "path_match": 180, + "filename_match": 600, + "alias_match": 0, + "anchor_boost": 300, + "target_doc_boost": 1000, + "generic_penalty": 0 + } + }, + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 60, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "target_doc_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 753 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected GENERAL, got DOCS +- intent: expected GENERAL_QA, got DOC_EXPLAIN +- anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE +- llm: expected answer to contain 'Telegram Notify App' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-09-reading-order.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-09-reading-order.json new file mode 100644 index 0000000..194372a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-09-reading-order.json @@ -0,0 +1,328 @@ +{ + "meta": { + "case_id": "v2-general-09-reading-order", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": false, + "mismatches": [ + "llm: expected answer to contain 'README'" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Какие документы стоит читать сначала?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-09-reading-order.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-09-reading-order.md new file mode 100644 index 0000000..e9a5323 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-09-reading-order.md @@ -0,0 +1,381 @@ +# v2-general-09-reading-order + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: False + +## Query +Какие документы стоит читать сначала? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Правила ведения документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Ограничения", + "document_id": "architecture.telegram_notify_app" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Какие документы стоит читать сначала?", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- llm: expected answer to contain 'README' \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-10-short-summary.json b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-10-short-summary.json new file mode 100644 index 0000000..2545ba8 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-10-short-summary.json @@ -0,0 +1,326 @@ +{ + "meta": { + "case_id": "v2-general-10-short-summary", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "full_chain", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + }, + { + "step": "retrieval_profile_selected", + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } + }, + { + "step": "candidate_generation", + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } + }, + { + "step": "retrieval_executed", + "output": { + "query": "Дай короткое summary по проектной документации", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + }, + { + "step": "evidence_assembled", + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } + }, + { + "step": "ranking_explained", + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } + }, + { + "step": "evidence_gate_checked", + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } + }, + { + "step": "answer_generated", + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-10-short-summary.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-10-short-summary.md new file mode 100644 index 0000000..7e55ef2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/full_chain_docs_v2_matrix_v2-general-10-short-summary.md @@ -0,0 +1,381 @@ +# v2-general-10-short-summary + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_04_process_v2/full_chain_docs_v2_matrix.yaml +- runner: process_v2 +- mode: full_chain +- passed: True + +## Query +Дай короткое summary по проектной документации + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 8, + "llm_answer": "- Purpose: точка входа в техническую документацию сервиса `test_echo_app`.\n- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health-модель и каталог ошибок.\n- Canonical structure: `docs/architecture`, `docs/api`, `docs/logic`, `docs/domains`, `docs/errors`.\n- Primary parent doc: [Архитектура Telegram Notify App](./architecture/telegram-notify-app-overview.md).\n- Navigation: документы связаны через `related_docs`, `parent`/`children` и markdown-ссылки без дублирования деталей.\n- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram.\n- Entry point: `src/telegram_notify_app/main.py`.\n- Main components: `RuntimeManager`, `TelegramControlChannel`, `TelegramNotifyModule`, `TelegramNotifyWorker`, `TelegramSendService`.\n- Configuration: `config/config.yaml` или путь из `CONFIG_PATH`.\n- Related API: [`/health`](../api/health-endpoint.md), [`/actions/{action}`](../api/control-actions-endpoint.md), [`/send`](../api/send-message-endpoint.md).\n- Related logic: [цикл отправки уведомлений](../logic/telegram-notification-loop.md).\n- Related domain: [runtime health](../domains/runtime-health-entity.md).", + "answer_mode": "grounded_summary", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [ + "index.test_echo_app_docs", + "docs/README.md", + "architecture.telegram_notify_app", + "docs/architecture/telegram-notify-app-overview.md" + ], + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +### retrieval_profile_selected +```json +{ + "input": {}, + "output": { + "profile": "general_qa_grounded_summary", + "layers": [ + "D1_DOCUMENT_CATALOG", + "D0_DOC_CHUNKS" + ], + "filters": { + "prefer_path_prefixes": [ + "docs/architecture/", + "docs/" + ], + "prefer_like_patterns": [ + "%README.md%", + "%overview%" + ], + "target_doc_hints": [] + } + } +} +``` + +### candidate_generation +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [], + "candidate_docs_before_ranking": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Описание", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Summary", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Иерархия документации", + "document_id": "index.test_echo_app_docs" + } + ], + "sources": { + "seeded": [], + "metadata_lookup": [], + "semantic": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } + } +} +``` + +### retrieval_executed +```json +{ + "input": {}, + "output": { + "query": "Дай короткое summary по проектной документации", + "profile": "general_qa_grounded_summary", + "row_count": 8, + "target_doc_hints": [], + "top_results": [ + { + "path": "docs/README.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Индекс технической документации test_echo_app", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D1_DOCUMENT_CATALOG", + "title": "Архитектура Telegram Notify App", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:История изменений", + "document_id": "architecture.telegram_notify_app" + }, + { + "path": "docs/README.md", + "layer": "D0_DOC_CHUNKS", + "title": "index.test_echo_app_docs:Обязательные правила структуры", + "document_id": "index.test_echo_app_docs" + }, + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "layer": "D0_DOC_CHUNKS", + "title": "architecture.telegram_notify_app:Контекст", + "document_id": "architecture.telegram_notify_app" + } + ] + } +} +``` + +### evidence_assembled +```json +{ + "input": {}, + "output": { + "mode": "summary", + "primary_doc": "docs/README.md", + "document_count": 2 + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/README.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + }, + "match_reason": "semantic_match" + } +} +``` + +### ranking_explained +```json +{ + "input": {}, + "output": { + "top_docs_after_ranking": [ + { + "doc": "docs/README.md", + "score": 80, + "match_reason": "semantic_match" + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score": 80, + "match_reason": "semantic_match" + } + ], + "ranking_score_breakdown": [ + { + "doc": "docs/README.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + }, + { + "doc": "docs/architecture/telegram-notify-app-overview.md", + "score_breakdown": { + "semantic": 80, + "path_match": 0, + "filename_match": 0, + "alias_match": 0, + "anchor_boost": 0, + "target_doc_boost": 0, + "generic_penalty": 0 + } + } + ] + } +} +``` + +### evidence_gate_checked +```json +{ + "input": {}, + "output": { + "passed": true, + "reason": "general_docs_found", + "answer_mode": "grounded_summary" + } +} +``` + +### answer_generated +```json +{ + "input": {}, + "output": { + "answer_mode": "grounded_summary", + "answer_length": 1170 + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/summary.md b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/summary.md new file mode 100644 index 0000000..632bd37 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_docs_matrix/20260407_100457/summary.md @@ -0,0 +1,151 @@ +# pipeline_setup_v3 summary + +Passed: 9/30 + +| File | Case | Mode | Query | Actual sub-intent | RAG layers | Tokens | Pass | +|------|------|------|-------|-------------------|------------|--------|------| +| full_chain_docs_v2_matrix.yaml | v2-general-01-what-is-service | full_chain | Что это за сервис? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-02-purpose | full_chain | Для чего нужен test_echo_app? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-03-problem | full_chain | Какую задачу решает это приложение? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-04-docs-contents | full_chain | Что входит в документацию этого проекта? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-05-main-parts | full_chain | Какие основные части есть у системы? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-06-high-level-architecture | full_chain | Как в целом устроено приложение? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-07-besides-api | full_chain | Что тут есть кроме API? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-general-08-components | full_chain | Из чего состоит Telegram Notify App? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-09-reading-order | full_chain | Какие документы стоит читать сначала? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-general-10-short-summary | full_chain | Дай короткое summary по проектной документации | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-01-health | full_chain | Кратко объясни по документации, как работает `/health` | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-02-send | full_chain | Что делает endpoint `/send`? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-03-actions | full_chain | Объясни назначение `/actions/{action}` | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-04-runtime-health | full_chain | Что такое runtime health в этой документации? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-05-notification-loop | full_chain | Кратко опиши цикл отправки уведомлений | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-06-architecture | full_chain | Как устроена архитектура Telegram Notify App? | SUMMARY | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-07-worker | full_chain | Что делает worker в этом приложении? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-08-health-statuses | full_chain | Какие статусы здоровья есть у runtime? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-09-manual-send | full_chain | Как в приложении устроена ручная отправка сообщения? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-docs-summary-10-telegram-integration | full_chain | Как сервис взаимодействует с Telegram в целом? | SUMMARY | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-01-health | full_chain | В каком файле описан `/health`? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-02-send | full_chain | Покажи файл с описанием endpoint `/send` | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-03-actions | full_chain | Где находится документация по `/actions/{action}`? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-04-runtime-health | full_chain | В каком документе описан runtime health? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-05-loop | full_chain | Найди файл с логикой цикла отправки уведомлений | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-06-architecture | full_chain | Где описана архитектура приложения? | FIND_FILES | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-07-errors-catalog | full_chain | В каком файле лежит каталог ошибок? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-08-docs-index | full_chain | Покажи файл-индекс документации проекта | FIND_FILES | — | — | ✓ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-09-telegram-bot-api | full_chain | Какие файлы относятся к Telegram Bot API интеграции? | FIND_FILES | — | — | ✗ | +| full_chain_docs_v2_matrix.yaml | v2-find-files-10-telegram-notify-worker | full_chain | В каких файлах описан worker `telegram_notify`? | FIND_FILES | — | — | ✗ | + +## Failures +- **v2-general-05-main-parts**: llm: expected answer to contain 'систем' +- **v2-general-06-high-level-architecture**: llm: expected answer to contain 'приложен' +- **v2-general-08-components**: domain: expected GENERAL, got DOCS; intent: expected GENERAL_QA, got DOC_EXPLAIN; anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE; llm: expected answer to contain 'Telegram Notify App' +- **v2-general-09-reading-order**: llm: expected answer to contain 'README' +- **v2-docs-summary-01-health**: answer_mode: expected grounded_summary, got insufficient_evidence; llm: expected answer to contain '/health'; llm: expected answer to contain 'status'; llm: expected answer to contain 'components' +- **v2-docs-summary-02-send**: doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/send'; llm: expected answer to contain 'message'; llm: expected answer to contain 'Telegram' +- **v2-docs-summary-03-actions**: doc_scope should contain 'docs/api/control-actions-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/actions/{action}' +- **v2-docs-summary-04-runtime-health**: doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; llm: expected answer to contain 'runtime health' +- **v2-docs-summary-05-notification-loop**: doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain 'worker'; llm: expected answer to contain 'interval'; llm: expected answer to contain 'degraded' +- **v2-docs-summary-07-worker**: doc_scope should contain 'docs/logic/telegram-notification-loop.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain 'worker' +- **v2-docs-summary-08-health-statuses**: doc_scope should contain 'docs/domains/runtime-health-entity.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; doc_scope should contain 'docs/api/health-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md']; llm: expected answer to contain 'ok'; llm: expected answer to contain 'degraded'; llm: expected answer to contain 'unhealthy'; llm: expected answer to contain 'unknown' +- **v2-docs-summary-09-manual-send**: doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md']; llm: expected answer to contain '/send'; llm: expected answer to contain 'message'; llm: expected answer to contain 'TelegramSendService' +- **v2-docs-summary-10-telegram-integration**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA; anchor_type: expected API_ENDPOINT, got None; doc_scope should contain 'docs/api/send-message-endpoint.md', got ['architecture.telegram_notify_app', 'docs/architecture/telegram-notify-app-overview.md', 'index.test_echo_app_docs', 'docs/README.md'] +- **v2-find-files-01-health**: llm: expected answer to contain 'docs/api/health-endpoint.md' +- **v2-find-files-02-send**: llm: expected answer to contain 'docs/api/send-message-endpoint.md' +- **v2-find-files-03-actions**: llm: expected answer to contain 'docs/api/control-actions-endpoint.md' +- **v2-find-files-04-runtime-health**: llm: expected answer to contain 'docs/domains/runtime-health-entity.md' +- **v2-find-files-05-loop**: llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- **v2-find-files-07-errors-catalog**: llm: expected answer to contain 'docs/errors/catalog.yaml' +- **v2-find-files-09-telegram-bot-api**: llm: expected answer to contain 'docs/api/send-message-endpoint.md'; llm: expected answer to contain 'docs/logic/telegram-notification-loop.md' +- **v2-find-files-10-telegram-notify-worker**: llm: expected answer to contain 'docs/logic/telegram-notification-loop.md'; llm: expected answer to contain 'docs/domains/runtime-health-entity.md' + +## LLM Answers +- **v2-general-01-what-is-service** + Query: Что это за сервис? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-02-purpose** + Query: Для чего нужен test_echo_app? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/arc… +- **v2-general-03-problem** + Query: Какую задачу решает это приложение? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-04-docs-contents** + Query: Что входит в документацию этого проекта? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-05-main-parts** + Query: Какие основные части есть у системы? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-06-high-level-architecture** + Query: Как в целом устроено приложение? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-07-besides-api** + Query: Что тут есть кроме API? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-08-components** + Query: Из чего состоит Telegram Notify App? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). Файлы\-источники: \- docs/architecture/telegram\-notify\-app\-overview.md \- docs/README.md +- **v2-general-09-reading-order** + Query: Какие документы стоит читать сначала? + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-general-10-short-summary** + Query: Дай короткое summary по проектной документации + > \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/architecture\`, \`docs/api\`, \`docs/logic\`, \`docs/domains\`, \`docs/errors\`. \- Primary parent doc: \[Архитектура Telegram Notify App\]\(./architecture/telegram\-notify\-app\-overview.md\). \- Navigation: документы связаны через \`related\_docs\`, \`parent\`/\`children\` и markdown\-ссылки без дублирования деталей. \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`… +- **v2-docs-summary-01-health** + Query: Кратко объясни по документации, как работает `/health` + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/README.md. +- **v2-docs-summary-02-send** + Query: Что делает endpoint `/send`? + > В поднятом контексте не найден целевой документ по запросу. +- **v2-docs-summary-03-actions** + Query: Объясни назначение `/actions/{action}` + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-04-runtime-health** + Query: Что такое runtime health в этой документации? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-05-notification-loop** + Query: Кратко опиши цикл отправки уведомлений + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md, docs/README.md. +- **v2-docs-summary-06-architecture** + Query: Как устроена архитектура Telegram Notify App? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). Файлы\-источники: \- docs/architecture/telegram\-notify\-app\-overview.md \- docs/README.md +- **v2-docs-summary-07-worker** + Query: Что делает worker в этом приложении? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-08-health-statuses** + Query: Какие статусы здоровья есть у runtime? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-09-manual-send** + Query: Как в приложении устроена ручная отправка сообщения? + > В поднятом контексте не найден целевой документ по запросу. Ближайшие документы: docs/architecture/telegram\-notify\-app\-overview.md. +- **v2-docs-summary-10-telegram-integration** + Query: Как сервис взаимодействует с Telegram в целом? + > \- Purpose: сервис поднимает HTTP control plane и фоновый worker для отправки уведомлений в Telegram. \- Entry point: \`src/telegram\_notify\_app/main.py\`. \- Main components: \`RuntimeManager\`, \`TelegramControlChannel\`, \`TelegramNotifyModule\`, \`TelegramNotifyWorker\`, \`TelegramSendService\`. \- Configuration: \`config/config.yaml\` или путь из \`CONFIG\_PATH\`. \- Related API: \[\`/health\`\]\(../api/health\-endpoint.md\), \[\`/actions/\{action\}\`\]\(../api/control\-actions\-endpoint.md\), \[\`/send\`\]\(../api/send\-message\-endpoint.md\). \- Related logic: \[цикл отправки уведомлений\]\(../logic/telegram\-notification\-loop.md\). \- Related domain: \[runtime health\]\(../domains/runtime\-health\-entity.md\). \- Purpose: точка входа в техническую документацию сервиса \`test\_echo\_app\`. \- Scope: архитектура, HTTP API control plane, цикл отправки уведомлений, health\-модель и каталог ошибок. \- Canonical structure: \`docs/arc… +- **v2-find-files-01-health** + Query: В каком файле описан `/health`? + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-02-send** + Query: Покажи файл с описанием endpoint `/send` + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-03-actions** + Query: Где находится документация по `/actions/{action}`? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-04-runtime-health** + Query: В каком документе описан runtime health? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-05-loop** + Query: Найди файл с логикой цикла отправки уведомлений + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-06-architecture** + Query: Где описана архитектура приложения? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-07-errors-catalog** + Query: В каком файле лежит каталог ошибок? + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-08-docs-index** + Query: Покажи файл-индекс документации проекта + > docs/README.md docs/architecture/telegram\-notify\-app\-overview.md +- **v2-find-files-09-telegram-bot-api** + Query: Какие файлы относятся к Telegram Bot API интеграции? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md +- **v2-find-files-10-telegram-notify-worker** + Query: В каких файлах описан worker `telegram_notify`? + > docs/architecture/telegram\-notify\-app\-overview.md docs/README.md \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json new file mode 100644 index 0000000..c7a8098 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json @@ -0,0 +1,59 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md new file mode 100644 index 0000000..cf898c9 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md @@ -0,0 +1,78 @@ +# v2-router-docs-summary-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Кратко объясни по документации, как работает `/health` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json new file mode 100644 index 0000000..cc0f481 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json @@ -0,0 +1,59 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md new file mode 100644 index 0000000..c3fafc4 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md @@ -0,0 +1,78 @@ +# v2-router-docs-summary-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что делает endpoint `/send`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json new file mode 100644 index 0000000..4870cc7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json @@ -0,0 +1,63 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md new file mode 100644 index 0000000..a5b5d46 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md @@ -0,0 +1,82 @@ +# v2-router-docs-summary-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Объясни назначение `/actions/{action}` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json new file mode 100644 index 0000000..35bc7a6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md new file mode 100644 index 0000000..468082f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что такое runtime health в этой документации? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json new file mode 100644 index 0000000..7141f0d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-05-notification-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md new file mode 100644 index 0000000..ef11dd8 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-05-notification-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Кратко опиши цикл отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json new file mode 100644 index 0000000..983cfdd --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md new file mode 100644 index 0000000..221648a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Как устроена архитектура Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json new file mode 100644 index 0000000..0895b26 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json @@ -0,0 +1,57 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-07-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md new file mode 100644 index 0000000..701a79d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md @@ -0,0 +1,76 @@ +# v2-router-docs-summary-07-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что делает worker в этом приложении? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "LOGIC_FLOW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "LOGIC_FLOW", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json new file mode 100644 index 0000000..5c8de85 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-08-health-statuses", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md new file mode 100644 index 0000000..9356b42 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-08-health-statuses + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какие статусы здоровья есть у runtime? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "DOMAIN_ENTITY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "DOMAIN_ENTITY", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json new file mode 100644 index 0000000..f8d1581 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-09-manual-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md new file mode 100644 index 0000000..e3493ca --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-09-manual-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Как в приложении устроена ручная отправка сообщения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "API_ENDPOINT", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "API_ENDPOINT", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json new file mode 100644 index 0000000..3dbee41 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json @@ -0,0 +1,57 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-10-telegram-integration", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA", + "anchor_type: expected API_ENDPOINT, got GENERAL_OVERVIEW" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 0.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md new file mode 100644 index 0000000..6f4f175 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md @@ -0,0 +1,74 @@ +# v2-router-docs-summary-10-telegram-integration + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: False + +## Query +Как сервис взаимодействует с Telegram в целом? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 0.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA +- anchor_type: expected API_ENDPOINT, got GENERAL_OVERVIEW \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-01-health.json new file mode 100644 index 0000000..66a48dc --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-01-health.json @@ -0,0 +1,59 @@ +{ + "meta": { + "case_id": "v2-router-find-files-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-01-health.md new file mode 100644 index 0000000..de59127 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-01-health.md @@ -0,0 +1,78 @@ +# v2-router-find-files-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +В каком файле описан `/health`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-02-send.json new file mode 100644 index 0000000..507ac1d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-02-send.json @@ -0,0 +1,59 @@ +{ + "meta": { + "case_id": "v2-router-find-files-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-02-send.md new file mode 100644 index 0000000..b88507f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-02-send.md @@ -0,0 +1,78 @@ +# v2-router-find-files-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Покажи файл с описанием endpoint `/send` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json new file mode 100644 index 0000000..f38a120 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json @@ -0,0 +1,63 @@ +{ + "meta": { + "case_id": "v2-router-find-files-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md new file mode 100644 index 0000000..bf3de40 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md @@ -0,0 +1,82 @@ +# v2-router-find-files-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Где находится документация по `/actions/{action}`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json new file mode 100644 index 0000000..d7bd833 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-find-files-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md new file mode 100644 index 0000000..5b99592 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md @@ -0,0 +1,80 @@ +# v2-router-find-files-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +В каком документе описан runtime health? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json new file mode 100644 index 0000000..6e37615 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json @@ -0,0 +1,57 @@ +{ + "meta": { + "case_id": "v2-router-find-files-05-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md new file mode 100644 index 0000000..af50f94 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md @@ -0,0 +1,76 @@ +# v2-router-find-files-05-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Найди файл с логикой цикла отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json new file mode 100644 index 0000000..5726d29 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-find-files-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md new file mode 100644 index 0000000..d828f82 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md @@ -0,0 +1,80 @@ +# v2-router-find-files-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Где описана архитектура приложения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json new file mode 100644 index 0000000..d5cfe93 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-find-files-07-errors-catalog", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md new file mode 100644 index 0000000..187c811 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md @@ -0,0 +1,80 @@ +# v2-router-find-files-07-errors-catalog + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +В каком файле лежит каталог ошибок? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json new file mode 100644 index 0000000..597c4b1 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-find-files-08-docs-index", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md new file mode 100644 index 0000000..3c765c0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md @@ -0,0 +1,80 @@ +# v2-router-find-files-08-docs-index + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Покажи файл-индекс документации проекта + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json new file mode 100644 index 0000000..55b00b3 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json @@ -0,0 +1,53 @@ +{ + "meta": { + "case_id": "v2-router-find-files-09-telegram-bot-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md new file mode 100644 index 0000000..ab45131 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md @@ -0,0 +1,72 @@ +# v2-router-find-files-09-telegram-bot-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какие файлы относятся к Telegram Bot API интеграции? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "FIND_FILES", + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json new file mode 100644 index 0000000..740d9ee --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json @@ -0,0 +1,57 @@ +{ + "meta": { + "case_id": "v2-router-find-files-10-telegram-notify-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md new file mode 100644 index 0000000..2035d8c --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md @@ -0,0 +1,76 @@ +# v2-router-find-files-10-telegram-notify-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +В каких файлах описан worker `telegram_notify`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "anchor_type": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json new file mode 100644 index 0000000..0731458 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json @@ -0,0 +1,53 @@ +{ + "meta": { + "case_id": "v2-router-general-01-what-is-service", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md new file mode 100644 index 0000000..34cfd50 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md @@ -0,0 +1,72 @@ +# v2-router-general-01-what-is-service + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что это за сервис? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-02-purpose.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-02-purpose.json new file mode 100644 index 0000000..b8d2ba7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-02-purpose.json @@ -0,0 +1,53 @@ +{ + "meta": { + "case_id": "v2-router-general-02-purpose", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-02-purpose.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-02-purpose.md new file mode 100644 index 0000000..d11b972 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-02-purpose.md @@ -0,0 +1,72 @@ +# v2-router-general-02-purpose + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Для чего нужен test_echo_app? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-03-problem.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-03-problem.json new file mode 100644 index 0000000..3038ebf --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-03-problem.json @@ -0,0 +1,53 @@ +{ + "meta": { + "case_id": "v2-router-general-03-problem", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-03-problem.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-03-problem.md new file mode 100644 index 0000000..4b1bfc5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-03-problem.md @@ -0,0 +1,72 @@ +# v2-router-general-03-problem + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какую задачу решает это приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json new file mode 100644 index 0000000..eae1f2f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json @@ -0,0 +1,53 @@ +{ + "meta": { + "case_id": "v2-router-general-04-docs-contents", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md new file mode 100644 index 0000000..f4877f3 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md @@ -0,0 +1,72 @@ +# v2-router-general-04-docs-contents + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что входит в документацию этого проекта? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json new file mode 100644 index 0000000..1f79992 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json @@ -0,0 +1,53 @@ +{ + "meta": { + "case_id": "v2-router-general-05-main-parts", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md new file mode 100644 index 0000000..bf5a89d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md @@ -0,0 +1,72 @@ +# v2-router-general-05-main-parts + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какие основные части есть у системы? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json new file mode 100644 index 0000000..44292ab --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json @@ -0,0 +1,53 @@ +{ + "meta": { + "case_id": "v2-router-general-06-high-level-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md new file mode 100644 index 0000000..c5ae515 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md @@ -0,0 +1,72 @@ +# v2-router-general-06-high-level-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Как в целом устроено приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json new file mode 100644 index 0000000..4b21fbc --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json @@ -0,0 +1,53 @@ +{ + "meta": { + "case_id": "v2-router-general-07-besides-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md new file mode 100644 index 0000000..7e312de --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md @@ -0,0 +1,72 @@ +# v2-router-general-07-besides-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что тут есть кроме API? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-08-components.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-08-components.json new file mode 100644 index 0000000..aec7aba --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-08-components.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-general-08-components", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": false, + "mismatches": [ + "domain: expected GENERAL, got DOCS", + "intent: expected GENERAL_QA, got DOC_EXPLAIN", + "anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-08-components.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-08-components.md new file mode 100644 index 0000000..a77397e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-08-components.md @@ -0,0 +1,78 @@ +# v2-router-general-08-components + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: False + +## Query +Из чего состоит Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "anchor_type": "ARCHITECTURE", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": "ARCHITECTURE", + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected GENERAL, got DOCS +- intent: expected GENERAL_QA, got DOC_EXPLAIN +- anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json new file mode 100644 index 0000000..da4f134 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json @@ -0,0 +1,53 @@ +{ + "meta": { + "case_id": "v2-router-general-09-reading-order", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md new file mode 100644 index 0000000..a41a25b --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md @@ -0,0 +1,72 @@ +# v2-router-general-09-reading-order + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какие документы стоит читать сначала? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json new file mode 100644 index 0000000..38933e5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json @@ -0,0 +1,53 @@ +{ + "meta": { + "case_id": "v2-router-general-10-short-summary", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md new file mode 100644 index 0000000..e5a6141 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md @@ -0,0 +1,72 @@ +# v2-router-general-10-short-summary + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Дай короткое summary по проектной документации + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "anchor_type": "GENERAL_OVERVIEW", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "anchor_type": null, + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/summary.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/summary.md new file mode 100644 index 0000000..a562817 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router/20260407_102851/summary.md @@ -0,0 +1,40 @@ +# pipeline_setup_v3 summary + +Passed: 28/30 + +| File | Case | Mode | Query | Actual sub-intent | RAG layers | Tokens | Pass | +|------|------|------|-------|-------------------|------------|--------|------| +| router_only_docs_v2_matrix.yaml | v2-router-general-01-what-is-service | router_only | Что это за сервис? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-02-purpose | router_only | Для чего нужен test_echo_app? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-03-problem | router_only | Какую задачу решает это приложение? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-04-docs-contents | router_only | Что входит в документацию этого проекта? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-05-main-parts | router_only | Какие основные части есть у системы? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-06-high-level-architecture | router_only | Как в целом устроено приложение? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-07-besides-api | router_only | Что тут есть кроме API? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-08-components | router_only | Из чего состоит Telegram Notify App? | SUMMARY | — | — | ✗ | +| router_only_docs_v2_matrix.yaml | v2-router-general-09-reading-order | router_only | Какие документы стоит читать сначала? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-10-short-summary | router_only | Дай короткое summary по проектной документации | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-01-health | router_only | Кратко объясни по документации, как работает `/health` | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-02-send | router_only | Что делает endpoint `/send`? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-03-actions | router_only | Объясни назначение `/actions/{action}` | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-04-runtime-health | router_only | Что такое runtime health в этой документации? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-05-notification-loop | router_only | Кратко опиши цикл отправки уведомлений | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-06-architecture | router_only | Как устроена архитектура Telegram Notify App? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-07-worker | router_only | Что делает worker в этом приложении? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-08-health-statuses | router_only | Какие статусы здоровья есть у runtime? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-09-manual-send | router_only | Как в приложении устроена ручная отправка сообщения? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-10-telegram-integration | router_only | Как сервис взаимодействует с Telegram в целом? | SUMMARY | — | — | ✗ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-01-health | router_only | В каком файле описан `/health`? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-02-send | router_only | Покажи файл с описанием endpoint `/send` | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-03-actions | router_only | Где находится документация по `/actions/{action}`? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-04-runtime-health | router_only | В каком документе описан runtime health? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-05-loop | router_only | Найди файл с логикой цикла отправки уведомлений | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-06-architecture | router_only | Где описана архитектура приложения? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-07-errors-catalog | router_only | В каком файле лежит каталог ошибок? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-08-docs-index | router_only | Покажи файл-индекс документации проекта | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-09-telegram-bot-api | router_only | Какие файлы относятся к Telegram Bot API интеграции? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-10-telegram-notify-worker | router_only | В каких файлах описан worker `telegram_notify`? | FIND_FILES | — | — | ✓ | + +## Failures +- **v2-router-general-08-components**: domain: expected GENERAL, got DOCS; intent: expected GENERAL_QA, got DOC_EXPLAIN; anchor_type: expected GENERAL_OVERVIEW, got ARCHITECTURE +- **v2-router-docs-summary-10-telegram-integration**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA; anchor_type: expected API_ENDPOINT, got GENERAL_OVERVIEW \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json new file mode 100644 index 0000000..9ad57ff --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json @@ -0,0 +1,59 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md new file mode 100644 index 0000000..586d514 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md @@ -0,0 +1,78 @@ +# v2-router-docs-summary-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Кратко объясни по документации, как работает `/health` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json new file mode 100644 index 0000000..5c865f7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json @@ -0,0 +1,59 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md new file mode 100644 index 0000000..6d4f87a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md @@ -0,0 +1,78 @@ +# v2-router-docs-summary-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что делает endpoint `/send`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json new file mode 100644 index 0000000..f2c9a53 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json @@ -0,0 +1,63 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md new file mode 100644 index 0000000..5465b2e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md @@ -0,0 +1,82 @@ +# v2-router-docs-summary-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Объясни назначение `/actions/{action}` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json new file mode 100644 index 0000000..4427154 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "DOMAIN_ENTITY" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md new file mode 100644 index 0000000..a26e3e2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что такое runtime health в этой документации? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "DOMAIN_ENTITY" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json new file mode 100644 index 0000000..06d5e1a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-05-notification-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md new file mode 100644 index 0000000..5f7abaf --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-05-notification-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Кратко опиши цикл отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json new file mode 100644 index 0000000..87f19ff --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "ARCHITECTURE" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md new file mode 100644 index 0000000..2c84c78 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Как устроена архитектура Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "ARCHITECTURE" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json new file mode 100644 index 0000000..953a50f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json @@ -0,0 +1,57 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-07-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md new file mode 100644 index 0000000..006c102 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md @@ -0,0 +1,76 @@ +# v2-router-docs-summary-07-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что делает worker в этом приложении? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json new file mode 100644 index 0000000..3286890 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-08-health-statuses", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "DOMAIN_ENTITY" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md new file mode 100644 index 0000000..7cf2f0e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-08-health-statuses + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какие статусы здоровья есть у runtime? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "DOMAIN_ENTITY" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json new file mode 100644 index 0000000..0545f4e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-09-manual-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md new file mode 100644 index 0000000..10c0e8a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-09-manual-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Как в приложении устроена ручная отправка сообщения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json new file mode 100644 index 0000000..9d0de5d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json @@ -0,0 +1,54 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-10-telegram-integration", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 0.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md new file mode 100644 index 0000000..f24ae89 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md @@ -0,0 +1,71 @@ +# v2-router-docs-summary-10-telegram-integration + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: False + +## Query +Как сервис взаимодействует с Telegram в целом? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 0.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-01-health.json new file mode 100644 index 0000000..61ddbb0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-01-health.json @@ -0,0 +1,60 @@ +{ + "meta": { + "case_id": "v2-router-find-files-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT", + "FIND_FILES" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-01-health.md new file mode 100644 index 0000000..e208c21 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-01-health.md @@ -0,0 +1,79 @@ +# v2-router-find-files-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +В каком файле описан `/health`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT", + "FIND_FILES" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-02-send.json new file mode 100644 index 0000000..dcada94 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-02-send.json @@ -0,0 +1,60 @@ +{ + "meta": { + "case_id": "v2-router-find-files-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT", + "FIND_FILES" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-02-send.md new file mode 100644 index 0000000..255d636 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-02-send.md @@ -0,0 +1,79 @@ +# v2-router-find-files-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Покажи файл с описанием endpoint `/send` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT", + "FIND_FILES" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json new file mode 100644 index 0000000..5033f00 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json @@ -0,0 +1,64 @@ +{ + "meta": { + "case_id": "v2-router-find-files-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT", + "FIND_FILES" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md new file mode 100644 index 0000000..5231b00 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md @@ -0,0 +1,83 @@ +# v2-router-find-files-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Где находится документация по `/actions/{action}`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT", + "FIND_FILES" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json new file mode 100644 index 0000000..6cc99f4 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json @@ -0,0 +1,62 @@ +{ + "meta": { + "case_id": "v2-router-find-files-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "DOMAIN_ENTITY", + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md new file mode 100644 index 0000000..6857b04 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md @@ -0,0 +1,81 @@ +# v2-router-find-files-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +В каком документе описан runtime health? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "DOMAIN_ENTITY", + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json new file mode 100644 index 0000000..77a8f94 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json @@ -0,0 +1,58 @@ +{ + "meta": { + "case_id": "v2-router-find-files-05-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "FIND_FILES", + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md new file mode 100644 index 0000000..d73b60d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md @@ -0,0 +1,77 @@ +# v2-router-find-files-05-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Найди файл с логикой цикла отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "FIND_FILES", + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json new file mode 100644 index 0000000..9927fce --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json @@ -0,0 +1,62 @@ +{ + "meta": { + "case_id": "v2-router-find-files-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "ARCHITECTURE", + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md new file mode 100644 index 0000000..960d392 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md @@ -0,0 +1,81 @@ +# v2-router-find-files-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Где описана архитектура приложения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "ARCHITECTURE", + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json new file mode 100644 index 0000000..1932366 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-find-files-07-errors-catalog", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md new file mode 100644 index 0000000..90c1386 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md @@ -0,0 +1,80 @@ +# v2-router-find-files-07-errors-catalog + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +В каком файле лежит каталог ошибок? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json new file mode 100644 index 0000000..6b8c3ee --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-find-files-08-docs-index", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md new file mode 100644 index 0000000..bc2fe36 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md @@ -0,0 +1,80 @@ +# v2-router-find-files-08-docs-index + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Покажи файл-индекс документации проекта + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json new file mode 100644 index 0000000..fb33239 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json @@ -0,0 +1,53 @@ +{ + "meta": { + "case_id": "v2-router-find-files-09-telegram-bot-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md new file mode 100644 index 0000000..c5e6a01 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md @@ -0,0 +1,72 @@ +# v2-router-find-files-09-telegram-bot-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какие файлы относятся к Telegram Bot API интеграции? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json new file mode 100644 index 0000000..d535a15 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json @@ -0,0 +1,58 @@ +{ + "meta": { + "case_id": "v2-router-find-files-10-telegram-notify-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "FIND_FILES", + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md new file mode 100644 index 0000000..c7699bc --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md @@ -0,0 +1,77 @@ +# v2-router-find-files-10-telegram-notify-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +В каких файлах описан worker `telegram_notify`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "FIND_FILES", + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json new file mode 100644 index 0000000..d81ef16 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-01-what-is-service", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md new file mode 100644 index 0000000..1eb13a5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md @@ -0,0 +1,70 @@ +# v2-router-general-01-what-is-service + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что это за сервис? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-02-purpose.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-02-purpose.json new file mode 100644 index 0000000..a30bce2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-02-purpose.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-02-purpose", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-02-purpose.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-02-purpose.md new file mode 100644 index 0000000..1836903 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-02-purpose.md @@ -0,0 +1,70 @@ +# v2-router-general-02-purpose + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Для чего нужен test_echo_app? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-03-problem.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-03-problem.json new file mode 100644 index 0000000..1918311 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-03-problem.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-03-problem", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-03-problem.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-03-problem.md new file mode 100644 index 0000000..6a95066 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-03-problem.md @@ -0,0 +1,70 @@ +# v2-router-general-03-problem + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какую задачу решает это приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json new file mode 100644 index 0000000..9b56912 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-04-docs-contents", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md new file mode 100644 index 0000000..38ec7f8 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md @@ -0,0 +1,70 @@ +# v2-router-general-04-docs-contents + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что входит в документацию этого проекта? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json new file mode 100644 index 0000000..a009a7f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-05-main-parts", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md new file mode 100644 index 0000000..e4c3ddf --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md @@ -0,0 +1,70 @@ +# v2-router-general-05-main-parts + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какие основные части есть у системы? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json new file mode 100644 index 0000000..18664f6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-06-high-level-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md new file mode 100644 index 0000000..915cfdd --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md @@ -0,0 +1,70 @@ +# v2-router-general-06-high-level-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Как в целом устроено приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json new file mode 100644 index 0000000..42d1338 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-07-besides-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md new file mode 100644 index 0000000..9edb373 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md @@ -0,0 +1,70 @@ +# v2-router-general-07-besides-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что тут есть кроме API? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-08-components.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-08-components.json new file mode 100644 index 0000000..8310d99 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-08-components.json @@ -0,0 +1,60 @@ +{ + "meta": { + "case_id": "v2-router-general-08-components", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": false, + "mismatches": [ + "domain: expected GENERAL, got DOCS", + "intent: expected GENERAL_QA, got DOC_EXPLAIN" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "ARCHITECTURE" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-08-components.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-08-components.md new file mode 100644 index 0000000..9cd83a6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-08-components.md @@ -0,0 +1,77 @@ +# v2-router-general-08-components + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: False + +## Query +Из чего состоит Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "ARCHITECTURE" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected GENERAL, got DOCS +- intent: expected GENERAL_QA, got DOC_EXPLAIN \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json new file mode 100644 index 0000000..29f98ba --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-09-reading-order", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md new file mode 100644 index 0000000..b1f1028 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md @@ -0,0 +1,70 @@ +# v2-router-general-09-reading-order + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какие документы стоит читать сначала? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json new file mode 100644 index 0000000..3405b11 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-10-short-summary", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md new file mode 100644 index 0000000..1a8dd33 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md @@ -0,0 +1,70 @@ +# v2-router-general-10-short-summary + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Дай короткое summary по проектной документации + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/summary.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/summary.md new file mode 100644 index 0000000..8e30d1e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_modules/20260407_114412/summary.md @@ -0,0 +1,40 @@ +# pipeline_setup_v3 summary + +Passed: 28/30 + +| File | Case | Mode | Query | Actual sub-intent | RAG layers | Tokens | Pass | +|------|------|------|-------|-------------------|------------|--------|------| +| router_only_docs_v2_matrix.yaml | v2-router-general-01-what-is-service | router_only | Что это за сервис? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-02-purpose | router_only | Для чего нужен test_echo_app? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-03-problem | router_only | Какую задачу решает это приложение? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-04-docs-contents | router_only | Что входит в документацию этого проекта? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-05-main-parts | router_only | Какие основные части есть у системы? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-06-high-level-architecture | router_only | Как в целом устроено приложение? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-07-besides-api | router_only | Что тут есть кроме API? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-08-components | router_only | Из чего состоит Telegram Notify App? | SUMMARY | — | — | ✗ | +| router_only_docs_v2_matrix.yaml | v2-router-general-09-reading-order | router_only | Какие документы стоит читать сначала? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-10-short-summary | router_only | Дай короткое summary по проектной документации | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-01-health | router_only | Кратко объясни по документации, как работает `/health` | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-02-send | router_only | Что делает endpoint `/send`? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-03-actions | router_only | Объясни назначение `/actions/{action}` | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-04-runtime-health | router_only | Что такое runtime health в этой документации? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-05-notification-loop | router_only | Кратко опиши цикл отправки уведомлений | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-06-architecture | router_only | Как устроена архитектура Telegram Notify App? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-07-worker | router_only | Что делает worker в этом приложении? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-08-health-statuses | router_only | Какие статусы здоровья есть у runtime? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-09-manual-send | router_only | Как в приложении устроена ручная отправка сообщения? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-10-telegram-integration | router_only | Как сервис взаимодействует с Telegram в целом? | SUMMARY | — | — | ✗ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-01-health | router_only | В каком файле описан `/health`? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-02-send | router_only | Покажи файл с описанием endpoint `/send` | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-03-actions | router_only | Где находится документация по `/actions/{action}`? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-04-runtime-health | router_only | В каком документе описан runtime health? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-05-loop | router_only | Найди файл с логикой цикла отправки уведомлений | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-06-architecture | router_only | Где описана архитектура приложения? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-07-errors-catalog | router_only | В каком файле лежит каталог ошибок? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-08-docs-index | router_only | Покажи файл-индекс документации проекта | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-09-telegram-bot-api | router_only | Какие файлы относятся к Telegram Bot API интеграции? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-10-telegram-notify-worker | router_only | В каких файлах описан worker `telegram_notify`? | FIND_FILES | — | — | ✓ | + +## Failures +- **v2-router-general-08-components**: domain: expected GENERAL, got DOCS; intent: expected GENERAL_QA, got DOC_EXPLAIN +- **v2-router-docs-summary-10-telegram-integration**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json new file mode 100644 index 0000000..9ad57ff --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json @@ -0,0 +1,59 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md new file mode 100644 index 0000000..586d514 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md @@ -0,0 +1,78 @@ +# v2-router-docs-summary-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Кратко объясни по документации, как работает `/health` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json new file mode 100644 index 0000000..5c865f7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json @@ -0,0 +1,59 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md new file mode 100644 index 0000000..6d4f87a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md @@ -0,0 +1,78 @@ +# v2-router-docs-summary-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что делает endpoint `/send`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json new file mode 100644 index 0000000..f2c9a53 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json @@ -0,0 +1,63 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md new file mode 100644 index 0000000..5465b2e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md @@ -0,0 +1,82 @@ +# v2-router-docs-summary-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Объясни назначение `/actions/{action}` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json new file mode 100644 index 0000000..4427154 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "DOMAIN_ENTITY" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md new file mode 100644 index 0000000..a26e3e2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что такое runtime health в этой документации? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "DOMAIN_ENTITY" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json new file mode 100644 index 0000000..06d5e1a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-05-notification-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md new file mode 100644 index 0000000..5f7abaf --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-05-notification-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Кратко опиши цикл отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json new file mode 100644 index 0000000..87f19ff --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "ARCHITECTURE" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md new file mode 100644 index 0000000..2c84c78 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Как устроена архитектура Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "ARCHITECTURE" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json new file mode 100644 index 0000000..953a50f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json @@ -0,0 +1,57 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-07-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md new file mode 100644 index 0000000..006c102 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md @@ -0,0 +1,76 @@ +# v2-router-docs-summary-07-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что делает worker в этом приложении? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json new file mode 100644 index 0000000..3286890 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-08-health-statuses", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "DOMAIN_ENTITY" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md new file mode 100644 index 0000000..7cf2f0e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-08-health-statuses + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какие статусы здоровья есть у runtime? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "DOMAIN_ENTITY" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json new file mode 100644 index 0000000..0545f4e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-09-manual-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md new file mode 100644 index 0000000..10c0e8a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-09-manual-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Как в приложении устроена ручная отправка сообщения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json new file mode 100644 index 0000000..9d0de5d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json @@ -0,0 +1,54 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-10-telegram-integration", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 0.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md new file mode 100644 index 0000000..f24ae89 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md @@ -0,0 +1,71 @@ +# v2-router-docs-summary-10-telegram-integration + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: False + +## Query +Как сервис взаимодействует с Telegram в целом? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 0.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-01-health.json new file mode 100644 index 0000000..61ddbb0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-01-health.json @@ -0,0 +1,60 @@ +{ + "meta": { + "case_id": "v2-router-find-files-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT", + "FIND_FILES" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-01-health.md new file mode 100644 index 0000000..e208c21 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-01-health.md @@ -0,0 +1,79 @@ +# v2-router-find-files-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +В каком файле описан `/health`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT", + "FIND_FILES" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-02-send.json new file mode 100644 index 0000000..dcada94 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-02-send.json @@ -0,0 +1,60 @@ +{ + "meta": { + "case_id": "v2-router-find-files-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT", + "FIND_FILES" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-02-send.md new file mode 100644 index 0000000..255d636 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-02-send.md @@ -0,0 +1,79 @@ +# v2-router-find-files-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Покажи файл с описанием endpoint `/send` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT", + "FIND_FILES" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json new file mode 100644 index 0000000..5033f00 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json @@ -0,0 +1,64 @@ +{ + "meta": { + "case_id": "v2-router-find-files-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT", + "FIND_FILES" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md new file mode 100644 index 0000000..5231b00 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md @@ -0,0 +1,83 @@ +# v2-router-find-files-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Где находится документация по `/actions/{action}`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT", + "FIND_FILES" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json new file mode 100644 index 0000000..6cc99f4 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json @@ -0,0 +1,62 @@ +{ + "meta": { + "case_id": "v2-router-find-files-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "DOMAIN_ENTITY", + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md new file mode 100644 index 0000000..6857b04 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md @@ -0,0 +1,81 @@ +# v2-router-find-files-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +В каком документе описан runtime health? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "DOMAIN_ENTITY", + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json new file mode 100644 index 0000000..77a8f94 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json @@ -0,0 +1,58 @@ +{ + "meta": { + "case_id": "v2-router-find-files-05-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "FIND_FILES", + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md new file mode 100644 index 0000000..d73b60d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md @@ -0,0 +1,77 @@ +# v2-router-find-files-05-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Найди файл с логикой цикла отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "FIND_FILES", + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json new file mode 100644 index 0000000..9927fce --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json @@ -0,0 +1,62 @@ +{ + "meta": { + "case_id": "v2-router-find-files-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "ARCHITECTURE", + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md new file mode 100644 index 0000000..960d392 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md @@ -0,0 +1,81 @@ +# v2-router-find-files-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Где описана архитектура приложения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "ARCHITECTURE", + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json new file mode 100644 index 0000000..1932366 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-find-files-07-errors-catalog", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md new file mode 100644 index 0000000..90c1386 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md @@ -0,0 +1,80 @@ +# v2-router-find-files-07-errors-catalog + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +В каком файле лежит каталог ошибок? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json new file mode 100644 index 0000000..6b8c3ee --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-find-files-08-docs-index", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md new file mode 100644 index 0000000..bc2fe36 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md @@ -0,0 +1,80 @@ +# v2-router-find-files-08-docs-index + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Покажи файл-индекс документации проекта + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json new file mode 100644 index 0000000..fb33239 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json @@ -0,0 +1,53 @@ +{ + "meta": { + "case_id": "v2-router-find-files-09-telegram-bot-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md new file mode 100644 index 0000000..c5e6a01 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md @@ -0,0 +1,72 @@ +# v2-router-find-files-09-telegram-bot-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какие файлы относятся к Telegram Bot API интеграции? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json new file mode 100644 index 0000000..d535a15 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json @@ -0,0 +1,58 @@ +{ + "meta": { + "case_id": "v2-router-find-files-10-telegram-notify-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "FIND_FILES", + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md new file mode 100644 index 0000000..c7699bc --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md @@ -0,0 +1,77 @@ +# v2-router-find-files-10-telegram-notify-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +В каких файлах описан worker `telegram_notify`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "FIND_FILES", + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json new file mode 100644 index 0000000..d81ef16 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-01-what-is-service", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md new file mode 100644 index 0000000..1eb13a5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md @@ -0,0 +1,70 @@ +# v2-router-general-01-what-is-service + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что это за сервис? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-02-purpose.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-02-purpose.json new file mode 100644 index 0000000..a30bce2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-02-purpose.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-02-purpose", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-02-purpose.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-02-purpose.md new file mode 100644 index 0000000..1836903 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-02-purpose.md @@ -0,0 +1,70 @@ +# v2-router-general-02-purpose + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Для чего нужен test_echo_app? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-03-problem.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-03-problem.json new file mode 100644 index 0000000..1918311 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-03-problem.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-03-problem", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-03-problem.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-03-problem.md new file mode 100644 index 0000000..6a95066 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-03-problem.md @@ -0,0 +1,70 @@ +# v2-router-general-03-problem + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какую задачу решает это приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json new file mode 100644 index 0000000..9b56912 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-04-docs-contents", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md new file mode 100644 index 0000000..38ec7f8 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md @@ -0,0 +1,70 @@ +# v2-router-general-04-docs-contents + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что входит в документацию этого проекта? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json new file mode 100644 index 0000000..a009a7f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-05-main-parts", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md new file mode 100644 index 0000000..e4c3ddf --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md @@ -0,0 +1,70 @@ +# v2-router-general-05-main-parts + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какие основные части есть у системы? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json new file mode 100644 index 0000000..18664f6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-06-high-level-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md new file mode 100644 index 0000000..915cfdd --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md @@ -0,0 +1,70 @@ +# v2-router-general-06-high-level-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Как в целом устроено приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json new file mode 100644 index 0000000..42d1338 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-07-besides-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md new file mode 100644 index 0000000..9edb373 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md @@ -0,0 +1,70 @@ +# v2-router-general-07-besides-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что тут есть кроме API? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-08-components.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-08-components.json new file mode 100644 index 0000000..8310d99 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-08-components.json @@ -0,0 +1,60 @@ +{ + "meta": { + "case_id": "v2-router-general-08-components", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": false, + "mismatches": [ + "domain: expected GENERAL, got DOCS", + "intent: expected GENERAL_QA, got DOC_EXPLAIN" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "ARCHITECTURE" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-08-components.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-08-components.md new file mode 100644 index 0000000..9cd83a6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-08-components.md @@ -0,0 +1,77 @@ +# v2-router-general-08-components + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: False + +## Query +Из чего состоит Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "ARCHITECTURE" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected GENERAL, got DOCS +- intent: expected GENERAL_QA, got DOC_EXPLAIN \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json new file mode 100644 index 0000000..29f98ba --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-09-reading-order", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md new file mode 100644 index 0000000..b1f1028 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md @@ -0,0 +1,70 @@ +# v2-router-general-09-reading-order + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какие документы стоит читать сначала? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json new file mode 100644 index 0000000..3405b11 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-10-short-summary", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md new file mode 100644 index 0000000..1a8dd33 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md @@ -0,0 +1,70 @@ +# v2-router-general-10-short-summary + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Дай короткое summary по проектной документации + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/summary.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/summary.md new file mode 100644 index 0000000..8e30d1e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_no_anchor_type/20260407_111829/summary.md @@ -0,0 +1,40 @@ +# pipeline_setup_v3 summary + +Passed: 28/30 + +| File | Case | Mode | Query | Actual sub-intent | RAG layers | Tokens | Pass | +|------|------|------|-------|-------------------|------------|--------|------| +| router_only_docs_v2_matrix.yaml | v2-router-general-01-what-is-service | router_only | Что это за сервис? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-02-purpose | router_only | Для чего нужен test_echo_app? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-03-problem | router_only | Какую задачу решает это приложение? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-04-docs-contents | router_only | Что входит в документацию этого проекта? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-05-main-parts | router_only | Какие основные части есть у системы? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-06-high-level-architecture | router_only | Как в целом устроено приложение? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-07-besides-api | router_only | Что тут есть кроме API? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-08-components | router_only | Из чего состоит Telegram Notify App? | SUMMARY | — | — | ✗ | +| router_only_docs_v2_matrix.yaml | v2-router-general-09-reading-order | router_only | Какие документы стоит читать сначала? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-10-short-summary | router_only | Дай короткое summary по проектной документации | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-01-health | router_only | Кратко объясни по документации, как работает `/health` | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-02-send | router_only | Что делает endpoint `/send`? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-03-actions | router_only | Объясни назначение `/actions/{action}` | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-04-runtime-health | router_only | Что такое runtime health в этой документации? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-05-notification-loop | router_only | Кратко опиши цикл отправки уведомлений | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-06-architecture | router_only | Как устроена архитектура Telegram Notify App? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-07-worker | router_only | Что делает worker в этом приложении? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-08-health-statuses | router_only | Какие статусы здоровья есть у runtime? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-09-manual-send | router_only | Как в приложении устроена ручная отправка сообщения? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-10-telegram-integration | router_only | Как сервис взаимодействует с Telegram в целом? | SUMMARY | — | — | ✗ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-01-health | router_only | В каком файле описан `/health`? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-02-send | router_only | Покажи файл с описанием endpoint `/send` | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-03-actions | router_only | Где находится документация по `/actions/{action}`? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-04-runtime-health | router_only | В каком документе описан runtime health? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-05-loop | router_only | Найди файл с логикой цикла отправки уведомлений | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-06-architecture | router_only | Где описана архитектура приложения? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-07-errors-catalog | router_only | В каком файле лежит каталог ошибок? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-08-docs-index | router_only | Покажи файл-индекс документации проекта | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-09-telegram-bot-api | router_only | Какие файлы относятся к Telegram Bot API интеграции? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-10-telegram-notify-worker | router_only | В каких файлах описан worker `telegram_notify`? | FIND_FILES | — | — | ✓ | + +## Failures +- **v2-router-general-08-components**: domain: expected GENERAL, got DOCS; intent: expected GENERAL_QA, got DOC_EXPLAIN +- **v2-router-docs-summary-10-telegram-integration**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json new file mode 100644 index 0000000..9ad57ff --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json @@ -0,0 +1,59 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md new file mode 100644 index 0000000..586d514 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md @@ -0,0 +1,78 @@ +# v2-router-docs-summary-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Кратко объясни по документации, как работает `/health` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json new file mode 100644 index 0000000..5c865f7 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json @@ -0,0 +1,59 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md new file mode 100644 index 0000000..6d4f87a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md @@ -0,0 +1,78 @@ +# v2-router-docs-summary-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что делает endpoint `/send`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json new file mode 100644 index 0000000..f2c9a53 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json @@ -0,0 +1,63 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md new file mode 100644 index 0000000..5465b2e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md @@ -0,0 +1,82 @@ +# v2-router-docs-summary-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Объясни назначение `/actions/{action}` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json new file mode 100644 index 0000000..4427154 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "DOMAIN_ENTITY" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md new file mode 100644 index 0000000..a26e3e2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что такое runtime health в этой документации? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "DOMAIN_ENTITY" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json new file mode 100644 index 0000000..06d5e1a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-05-notification-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md new file mode 100644 index 0000000..5f7abaf --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-05-notification-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Кратко опиши цикл отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notification-loop" + ], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json new file mode 100644 index 0000000..87f19ff --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "ARCHITECTURE" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md new file mode 100644 index 0000000..2c84c78 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Как устроена архитектура Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "ARCHITECTURE" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json new file mode 100644 index 0000000..953a50f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json @@ -0,0 +1,57 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-07-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md new file mode 100644 index 0000000..006c102 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md @@ -0,0 +1,76 @@ +# v2-router-docs-summary-07-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что делает worker в этом приложении? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json new file mode 100644 index 0000000..3286890 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-08-health-statuses", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "DOMAIN_ENTITY" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md new file mode 100644 index 0000000..7cf2f0e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-08-health-statuses + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какие статусы здоровья есть у runtime? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "DOMAIN_ENTITY" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json new file mode 100644 index 0000000..0545f4e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-09-manual-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md new file mode 100644 index 0000000..10c0e8a --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md @@ -0,0 +1,80 @@ +# v2-router-docs-summary-09-manual-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Как в приложении устроена ручная отправка сообщения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json new file mode 100644 index 0000000..9d0de5d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json @@ -0,0 +1,54 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-10-telegram-integration", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA" + ], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 0.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md new file mode 100644 index 0000000..f24ae89 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md @@ -0,0 +1,71 @@ +# v2-router-docs-summary-10-telegram-integration + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: False + +## Query +Как сервис взаимодействует с Telegram в целом? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 0.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-01-health.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-01-health.json new file mode 100644 index 0000000..61ddbb0 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-01-health.json @@ -0,0 +1,60 @@ +{ + "meta": { + "case_id": "v2-router-find-files-01-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT", + "FIND_FILES" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-01-health.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-01-health.md new file mode 100644 index 0000000..e208c21 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-01-health.md @@ -0,0 +1,79 @@ +# v2-router-find-files-01-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +В каком файле описан `/health`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT", + "FIND_FILES" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-02-send.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-02-send.json new file mode 100644 index 0000000..dcada94 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-02-send.json @@ -0,0 +1,60 @@ +{ + "meta": { + "case_id": "v2-router-find-files-02-send", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT", + "FIND_FILES" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-02-send.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-02-send.md new file mode 100644 index 0000000..255d636 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-02-send.md @@ -0,0 +1,79 @@ +# v2-router-find-files-02-send + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Покажи файл с описанием endpoint `/send` + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT", + "FIND_FILES" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json new file mode 100644 index 0000000..5033f00 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json @@ -0,0 +1,64 @@ +{ + "meta": { + "case_id": "v2-router-find-files-03-actions", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "API_ENDPOINT", + "FIND_FILES" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md new file mode 100644 index 0000000..5231b00 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md @@ -0,0 +1,83 @@ +# v2-router-find-files-03-actions + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Где находится документация по `/actions/{action}`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "API_ENDPOINT", + "FIND_FILES" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json new file mode 100644 index 0000000..6cc99f4 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json @@ -0,0 +1,62 @@ +{ + "meta": { + "case_id": "v2-router-find-files-04-runtime-health", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "DOMAIN_ENTITY", + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md new file mode 100644 index 0000000..6857b04 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md @@ -0,0 +1,81 @@ +# v2-router-find-files-04-runtime-health + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +В каком документе описан runtime health? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "DOMAIN_ENTITY", + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "runtime-health-entity" + ], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json new file mode 100644 index 0000000..77a8f94 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json @@ -0,0 +1,58 @@ +{ + "meta": { + "case_id": "v2-router-find-files-05-loop", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "FIND_FILES", + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md new file mode 100644 index 0000000..d73b60d --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md @@ -0,0 +1,77 @@ +# v2-router-find-files-05-loop + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Найди файл с логикой цикла отправки уведомлений + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "FIND_FILES", + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json new file mode 100644 index 0000000..9927fce --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json @@ -0,0 +1,62 @@ +{ + "meta": { + "case_id": "v2-router-find-files-06-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "ARCHITECTURE", + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md new file mode 100644 index 0000000..960d392 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md @@ -0,0 +1,81 @@ +# v2-router-find-files-06-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Где описана архитектура приложения? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "ARCHITECTURE", + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "telegram-notify-app-overview" + ], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json new file mode 100644 index 0000000..1932366 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-find-files-07-errors-catalog", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md new file mode 100644 index 0000000..90c1386 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md @@ -0,0 +1,80 @@ +# v2-router-find-files-07-errors-catalog + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +В каком файле лежит каталог ошибок? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "catalog-errors" + ], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json new file mode 100644 index 0000000..6b8c3ee --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json @@ -0,0 +1,61 @@ +{ + "meta": { + "case_id": "v2-router-find-files-08-docs-index", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md new file mode 100644 index 0000000..bc2fe36 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md @@ -0,0 +1,80 @@ +# v2-router-find-files-08-docs-index + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Покажи файл-индекс документации проекта + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [ + "docs-readme" + ], + "target_doc_hints": [ + "docs/README.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json new file mode 100644 index 0000000..fb33239 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json @@ -0,0 +1,53 @@ +{ + "meta": { + "case_id": "v2-router-find-files-09-telegram-bot-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md new file mode 100644 index 0000000..c5e6a01 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md @@ -0,0 +1,72 @@ +# v2-router-find-files-09-telegram-bot-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какие файлы относятся к Telegram Bot API интеграции? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "FIND_FILES" + ], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json new file mode 100644 index 0000000..d535a15 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json @@ -0,0 +1,58 @@ +{ + "meta": { + "case_id": "v2-router-find-files-10-telegram-notify-worker", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "FIND_FILES", + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md new file mode 100644 index 0000000..c7699bc --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md @@ -0,0 +1,77 @@ +# v2-router-find-files-10-telegram-notify-worker + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +В каких файлах описан worker `telegram_notify`? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "FIND_FILES", + "LOGIC_FLOW" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json new file mode 100644 index 0000000..d81ef16 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-01-what-is-service", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md new file mode 100644 index 0000000..1eb13a5 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md @@ -0,0 +1,70 @@ +# v2-router-general-01-what-is-service + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что это за сервис? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-02-purpose.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-02-purpose.json new file mode 100644 index 0000000..a30bce2 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-02-purpose.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-02-purpose", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-02-purpose.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-02-purpose.md new file mode 100644 index 0000000..1836903 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-02-purpose.md @@ -0,0 +1,70 @@ +# v2-router-general-02-purpose + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Для чего нужен test_echo_app? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-03-problem.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-03-problem.json new file mode 100644 index 0000000..1918311 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-03-problem.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-03-problem", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-03-problem.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-03-problem.md new file mode 100644 index 0000000..6a95066 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-03-problem.md @@ -0,0 +1,70 @@ +# v2-router-general-03-problem + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какую задачу решает это приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json new file mode 100644 index 0000000..9b56912 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-04-docs-contents", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md new file mode 100644 index 0000000..38ec7f8 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md @@ -0,0 +1,70 @@ +# v2-router-general-04-docs-contents + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что входит в документацию этого проекта? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json new file mode 100644 index 0000000..a009a7f --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-05-main-parts", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md new file mode 100644 index 0000000..e4c3ddf --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md @@ -0,0 +1,70 @@ +# v2-router-general-05-main-parts + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какие основные части есть у системы? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json new file mode 100644 index 0000000..18664f6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-06-high-level-architecture", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md new file mode 100644 index 0000000..915cfdd --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md @@ -0,0 +1,70 @@ +# v2-router-general-06-high-level-architecture + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Как в целом устроено приложение? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json new file mode 100644 index 0000000..42d1338 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-07-besides-api", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md new file mode 100644 index 0000000..9edb373 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md @@ -0,0 +1,70 @@ +# v2-router-general-07-besides-api + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Что тут есть кроме API? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-08-components.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-08-components.json new file mode 100644 index 0000000..8310d99 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-08-components.json @@ -0,0 +1,60 @@ +{ + "meta": { + "case_id": "v2-router-general-08-components", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": false, + "mismatches": [ + "domain: expected GENERAL, got DOCS", + "intent: expected GENERAL_QA, got DOC_EXPLAIN" + ], + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [ + "ARCHITECTURE" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-08-components.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-08-components.md new file mode 100644 index 0000000..9cd83a6 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-08-components.md @@ -0,0 +1,77 @@ +# v2-router-general-08-components + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: False + +## Query +Из чего состоит Telegram Notify App? + +## Actual +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [ + "ARCHITECTURE" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- domain: expected GENERAL, got DOCS +- intent: expected GENERAL_QA, got DOC_EXPLAIN \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json new file mode 100644 index 0000000..29f98ba --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-09-reading-order", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md new file mode 100644 index 0000000..b1f1028 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md @@ -0,0 +1,70 @@ +# v2-router-general-09-reading-order + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Какие документы стоит читать сначала? + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json new file mode 100644 index 0000000..3405b11 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json @@ -0,0 +1,51 @@ +{ + "meta": { + "case_id": "v2-router-general-10-short-summary", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "runner": "process_v2", + "mode": "router_only", + "passed": true, + "mismatches": [], + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} + } + }, + "pipeline_steps": [ + { + "step": "router_resolved", + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } + }, + { + "step": "anchors_extracted", + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } + }, + { + "step": "alias_resolution", + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } + } + ] +} \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md new file mode 100644 index 0000000..1a8dd33 --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md @@ -0,0 +1,70 @@ +# v2-router-general-10-short-summary + +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_05_process_v2_intent_router/router_only_docs_v2_matrix.yaml +- runner: process_v2 +- mode: router_only +- passed: True + +## Query +Дай короткое summary по проектной документации + +## Actual +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "rag_count": 0, + "llm_answer": "", + "answer_mode": "partial", + "path_scope": [], + "symbol_candidates": [], + "entity_candidates": [], + "doc_scope": [], + "layers": [], + "filters": {} +} + +## Pipeline Steps +### router_resolved +```json +{ + "input": {}, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "confidence": 1.0 + } +} +``` + +### anchors_extracted +```json +{ + "input": {}, + "output": { + "signal_types": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [] + } +} +``` + +### alias_resolution +```json +{ + "input": {}, + "output": { + "resolved_aliases": [], + "target_doc_hints": [] + } +} +``` + +## Diagnostics +{} + + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/summary.md b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/summary.md new file mode 100644 index 0000000..8e30d1e --- /dev/null +++ b/tests/pipeline_setup_v3/test_results/process_v2_intent_router_refactored/20260407_113944/summary.md @@ -0,0 +1,40 @@ +# pipeline_setup_v3 summary + +Passed: 28/30 + +| File | Case | Mode | Query | Actual sub-intent | RAG layers | Tokens | Pass | +|------|------|------|-------|-------------------|------------|--------|------| +| router_only_docs_v2_matrix.yaml | v2-router-general-01-what-is-service | router_only | Что это за сервис? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-02-purpose | router_only | Для чего нужен test_echo_app? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-03-problem | router_only | Какую задачу решает это приложение? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-04-docs-contents | router_only | Что входит в документацию этого проекта? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-05-main-parts | router_only | Какие основные части есть у системы? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-06-high-level-architecture | router_only | Как в целом устроено приложение? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-07-besides-api | router_only | Что тут есть кроме API? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-08-components | router_only | Из чего состоит Telegram Notify App? | SUMMARY | — | — | ✗ | +| router_only_docs_v2_matrix.yaml | v2-router-general-09-reading-order | router_only | Какие документы стоит читать сначала? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-general-10-short-summary | router_only | Дай короткое summary по проектной документации | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-01-health | router_only | Кратко объясни по документации, как работает `/health` | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-02-send | router_only | Что делает endpoint `/send`? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-03-actions | router_only | Объясни назначение `/actions/{action}` | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-04-runtime-health | router_only | Что такое runtime health в этой документации? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-05-notification-loop | router_only | Кратко опиши цикл отправки уведомлений | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-06-architecture | router_only | Как устроена архитектура Telegram Notify App? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-07-worker | router_only | Что делает worker в этом приложении? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-08-health-statuses | router_only | Какие статусы здоровья есть у runtime? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-09-manual-send | router_only | Как в приложении устроена ручная отправка сообщения? | SUMMARY | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-docs-summary-10-telegram-integration | router_only | Как сервис взаимодействует с Telegram в целом? | SUMMARY | — | — | ✗ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-01-health | router_only | В каком файле описан `/health`? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-02-send | router_only | Покажи файл с описанием endpoint `/send` | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-03-actions | router_only | Где находится документация по `/actions/{action}`? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-04-runtime-health | router_only | В каком документе описан runtime health? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-05-loop | router_only | Найди файл с логикой цикла отправки уведомлений | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-06-architecture | router_only | Где описана архитектура приложения? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-07-errors-catalog | router_only | В каком файле лежит каталог ошибок? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-08-docs-index | router_only | Покажи файл-индекс документации проекта | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-09-telegram-bot-api | router_only | Какие файлы относятся к Telegram Bot API интеграции? | FIND_FILES | — | — | ✓ | +| router_only_docs_v2_matrix.yaml | v2-router-find-files-10-telegram-notify-worker | router_only | В каких файлах описан worker `telegram_notify`? | FIND_FILES | — | — | ✓ | + +## Failures +- **v2-router-general-08-components**: domain: expected GENERAL, got DOCS; intent: expected GENERAL_QA, got DOC_EXPLAIN +- **v2-router-docs-summary-10-telegram-integration**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA \ No newline at end of file diff --git a/tests/pipeline_setup_v4/README.md b/tests/pipeline_setup_v4/README.md new file mode 100644 index 0000000..057c1c4 --- /dev/null +++ b/tests/pipeline_setup_v4/README.md @@ -0,0 +1,25 @@ +# pipeline_setup_v4 + +`pipeline_setup_v4` is a component-level test harness built on top of the `v3` ideas. + +Differences from `v3`: + +- each YAML case targets a single isolated component; +- results are written next to the suite in `cases/.../test_runs/...`; +- the first supported component is `process_v2_intent_router`. + +## Run + +```bash +PYTHONPATH=. python -m tests.pipeline_setup_v4.run \ + --cases-dir tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml \ + --run-name smoke_v4 +``` + +LLM-first router suite: + +```bash +PYTHONPATH=. python -m tests.pipeline_setup_v4.run \ + --cases-dir tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/router_llm_first_v3.yaml \ + --run-name llm_first_v3 +``` diff --git a/tests/pipeline_setup_v4/__init__.py b/tests/pipeline_setup_v4/__init__.py new file mode 100644 index 0000000..d8578dc --- /dev/null +++ b/tests/pipeline_setup_v4/__init__.py @@ -0,0 +1 @@ +"""pipeline_setup_v4 package.""" diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml new file mode 100644 index 0000000..030d93c --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml @@ -0,0 +1,243 @@ +defaults: + component: process_v2_intent_router + +cases: + - id: v2-router-general-01-what-is-service + query: "Что это за сервис?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-general-02-purpose + query: "Для чего нужен test_echo_app?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-general-03-problem + query: "Какую задачу решает это приложение?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-general-04-docs-contents + query: "Что входит в документацию этого проекта?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-general-05-main-parts + query: "Какие основные части есть у системы?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-general-06-high-level-architecture + query: "Как в целом устроено приложение?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-general-07-besides-api + query: "Что тут есть кроме API?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-general-08-components + query: "Из чего состоит Telegram Notify App?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-general-09-reading-order + query: "Какие документы стоит читать сначала?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-general-10-short-summary + query: "Дай короткое summary по проектной документации" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-docs-summary-01-health + query: "Кратко объясни по документации, как работает `/health`" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-docs-summary-02-send + query: "Что делает endpoint `/send`?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-docs-summary-03-actions + query: "Объясни назначение `/actions/{action}`" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-docs-summary-04-runtime-health + query: "Что такое runtime health в этой документации?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-docs-summary-05-notification-loop + query: "Кратко опиши цикл отправки уведомлений" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-docs-summary-06-architecture + query: "Как устроена архитектура Telegram Notify App?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-docs-summary-07-worker + query: "Что делает worker в этом приложении?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-docs-summary-08-health-statuses + query: "Какие статусы здоровья есть у runtime?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-docs-summary-09-manual-send + query: "Как в приложении устроена ручная отправка сообщения?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v2-router-docs-summary-10-telegram-integration + query: "Как сервис взаимодействует с Telegram в целом?" + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v2-router-find-files-01-health + query: "В каком файле описан `/health`?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v2-router-find-files-02-send + query: "Покажи файл с описанием endpoint `/send`" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v2-router-find-files-03-actions + query: "Где находится документация по `/actions/{action}`?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v2-router-find-files-04-runtime-health + query: "В каком документе описан runtime health?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v2-router-find-files-05-loop + query: "Найди файл с логикой цикла отправки уведомлений" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v2-router-find-files-06-architecture + query: "Где описана архитектура приложения?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v2-router-find-files-07-errors-catalog + query: "В каком файле лежит каталог ошибок?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v2-router-find-files-08-docs-index + query: "Покажи файл-индекс документации проекта" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v2-router-find-files-09-telegram-bot-api + query: "Какие файлы относятся к Telegram Bot API интеграции?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v2-router-find-files-10-telegram-notify-worker + query: "В каких файлах описан worker `telegram_notify`?" + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json new file mode 100644 index 0000000..e0ce050 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json @@ -0,0 +1,81 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-01-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Кратко объясни по документации, как работает `/health`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Кратко объясни по документации, как работает `/health`", + "normalized_query": "Кратко объясни по документации, как работает `/health`", + "target_terms": [ + "/health", + "кратко", + "работает" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко объясни по документации, как работает `/health`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/health", + "кратко", + "работает" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md new file mode 100644 index 0000000..4d811c8 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md @@ -0,0 +1,91 @@ +# v2-router-docs-summary-01-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Кратко объясни по документации, как работает `/health` + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Кратко объясни по документации, как работает `/health`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Кратко объясни по документации, как работает `/health`", + "normalized_query": "Кратко объясни по документации, как работает `/health`", + "target_terms": [ + "/health", + "кратко", + "работает" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко объясни по документации, как работает `/health`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/health", + "кратко", + "работает" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json new file mode 100644 index 0000000..1317d91 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json @@ -0,0 +1,81 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-02-send", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Что делает endpoint `/send`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает endpoint `/send`?", + "normalized_query": "Что делает endpoint `/send`?", + "target_terms": [ + "/send", + "делает", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает endpoint `/send`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/send", + "делает", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md new file mode 100644 index 0000000..d70e7b6 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md @@ -0,0 +1,91 @@ +# v2-router-docs-summary-02-send + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что делает endpoint `/send`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Что делает endpoint `/send`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает endpoint `/send`?", + "normalized_query": "Что делает endpoint `/send`?", + "target_terms": [ + "/send", + "делает", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает endpoint `/send`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/send", + "делает", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json new file mode 100644 index 0000000..2907bc2 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json @@ -0,0 +1,85 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-03-actions", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Объясни назначение `/actions/{action}`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Объясни назначение `/actions/{action}`", + "normalized_query": "Объясни назначение `/actions/{action}`", + "target_terms": [ + "/actions/{action}", + "назначение", + "/actions/{action" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Объясни назначение `/actions/{action}`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/actions/{action}", + "назначение", + "/actions/{action" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md new file mode 100644 index 0000000..8d1e4cc --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md @@ -0,0 +1,95 @@ +# v2-router-docs-summary-03-actions + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Объясни назначение `/actions/{action}` + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Объясни назначение `/actions/{action}`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Объясни назначение `/actions/{action}`", + "normalized_query": "Объясни назначение `/actions/{action}`", + "target_terms": [ + "/actions/{action}", + "назначение", + "/actions/{action" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Объясни назначение `/actions/{action}`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/actions/{action}", + "назначение", + "/actions/{action" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json new file mode 100644 index 0000000..28a51bc --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-04-runtime-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Что такое runtime health в этой документации?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что такое runtime health в этой документации?", + "normalized_query": "Что такое runtime health в этой документации?", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что такое runtime health в этой документации?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md new file mode 100644 index 0000000..95d4c46 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md @@ -0,0 +1,93 @@ +# v2-router-docs-summary-04-runtime-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что такое runtime health в этой документации? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Что такое runtime health в этой документации?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что такое runtime health в этой документации?", + "normalized_query": "Что такое runtime health в этой документации?", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что такое runtime health в этой документации?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json new file mode 100644 index 0000000..52760be --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json @@ -0,0 +1,90 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-05-notification-loop", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA" + ] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Кратко опиши цикл отправки уведомлений", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Кратко опиши цикл отправки уведомлений", + "normalized_query": "Кратко опиши цикл отправки уведомлений", + "target_terms": [ + "telegram-notify-loop", + "кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notify-loop" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко опиши цикл отправки уведомлений" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "telegram-notify-loop", + "кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notify-loop" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md new file mode 100644 index 0000000..8673dfa --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md @@ -0,0 +1,98 @@ +# v2-router-docs-summary-05-notification-loop + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: False + +## Query +Кратко опиши цикл отправки уведомлений + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Кратко опиши цикл отправки уведомлений", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Кратко опиши цикл отправки уведомлений", + "normalized_query": "Кратко опиши цикл отправки уведомлений", + "target_terms": [ + "telegram-notify-loop", + "кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notify-loop" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко опиши цикл отправки уведомлений" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "telegram-notify-loop", + "кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notify-loop" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json new file mode 100644 index 0000000..30385d9 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json @@ -0,0 +1,95 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-06-architecture", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Как устроена архитектура Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как устроена архитектура Telegram Notify App?", + "normalized_query": "Как устроена архитектура Telegram Notify App?", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как устроена архитектура Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md new file mode 100644 index 0000000..401cc55 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md @@ -0,0 +1,105 @@ +# v2-router-docs-summary-06-architecture + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Как устроена архитектура Telegram Notify App? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Как устроена архитектура Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как устроена архитектура Telegram Notify App?", + "normalized_query": "Как устроена архитектура Telegram Notify App?", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как устроена архитектура Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json new file mode 100644 index 0000000..ed32c20 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json @@ -0,0 +1,79 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-07-worker", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Что делает worker в этом приложении?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает worker в этом приложении?", + "normalized_query": "Что делает worker в этом приложении?", + "target_terms": [ + "делает", + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает worker в этом приложении?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "делает", + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md new file mode 100644 index 0000000..397ca47 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md @@ -0,0 +1,89 @@ +# v2-router-docs-summary-07-worker + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что делает worker в этом приложении? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Что делает worker в этом приложении?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает worker в этом приложении?", + "normalized_query": "Что делает worker в этом приложении?", + "target_terms": [ + "делает", + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает worker в этом приложении?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "делает", + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json new file mode 100644 index 0000000..337ae24 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json @@ -0,0 +1,88 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-08-health-statuses", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA" + ] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Какие статусы здоровья есть у runtime?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие статусы здоровья есть у runtime?", + "normalized_query": "Какие статусы здоровья есть у runtime?", + "target_terms": [ + "runtime_health", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие статусы здоровья есть у runtime?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "runtime_health", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md new file mode 100644 index 0000000..5a07b34 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md @@ -0,0 +1,96 @@ +# v2-router-docs-summary-08-health-statuses + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: False + +## Query +Какие статусы здоровья есть у runtime? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Какие статусы здоровья есть у runtime?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие статусы здоровья есть у runtime?", + "normalized_query": "Какие статусы здоровья есть у runtime?", + "target_terms": [ + "runtime_health", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие статусы здоровья есть у runtime?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "runtime_health", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json new file mode 100644 index 0000000..15af6d7 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json @@ -0,0 +1,90 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-09-manual-send", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA" + ] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Как в приложении устроена ручная отправка сообщения?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как в приложении устроена ручная отправка сообщения?", + "normalized_query": "Как в приложении устроена ручная отправка сообщения?", + "target_terms": [ + "/send", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в приложении устроена ручная отправка сообщения?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "/send", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md new file mode 100644 index 0000000..ca816f5 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md @@ -0,0 +1,98 @@ +# v2-router-docs-summary-09-manual-send + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: False + +## Query +Как в приложении устроена ручная отправка сообщения? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Как в приложении устроена ручная отправка сообщения?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как в приложении устроена ручная отправка сообщения?", + "normalized_query": "Как в приложении устроена ручная отправка сообщения?", + "target_terms": [ + "/send", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в приложении устроена ручная отправка сообщения?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "/send", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json new file mode 100644 index 0000000..78ed8cc --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json @@ -0,0 +1,79 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-10-telegram-integration", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Как сервис взаимодействует с Telegram в целом?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как сервис взаимодействует с Telegram в целом?", + "normalized_query": "Как сервис взаимодействует с Telegram в целом?", + "target_terms": [ + "сервис", + "взаимодействует", + "telegram", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как сервис взаимодействует с Telegram в целом?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "сервис", + "взаимодействует", + "telegram", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md new file mode 100644 index 0000000..a1bdb67 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md @@ -0,0 +1,89 @@ +# v2-router-docs-summary-10-telegram-integration + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Как сервис взаимодействует с Telegram в целом? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Как сервис взаимодействует с Telegram в целом?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как сервис взаимодействует с Telegram в целом?", + "normalized_query": "Как сервис взаимодействует с Telegram в целом?", + "target_terms": [ + "сервис", + "взаимодействует", + "telegram", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как сервис взаимодействует с Telegram в целом?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "сервис", + "взаимодействует", + "telegram", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-01-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-01-health.json new file mode 100644 index 0000000..e9cf5a9 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-01-health.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v2-router-find-files-01-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "В каком файле описан `/health`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле описан `/health`?", + "normalized_query": "В каком файле описан `/health`?", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле описан `/health`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-01-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-01-health.md new file mode 100644 index 0000000..c53bee3 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-01-health.md @@ -0,0 +1,93 @@ +# v2-router-find-files-01-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каком файле описан `/health`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "В каком файле описан `/health`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле описан `/health`?", + "normalized_query": "В каком файле описан `/health`?", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле описан `/health`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-02-send.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-02-send.json new file mode 100644 index 0000000..b100875 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-02-send.json @@ -0,0 +1,81 @@ +{ + "meta": { + "case_id": "v2-router-find-files-02-send", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Покажи файл с описанием endpoint `/send`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл с описанием endpoint `/send`", + "normalized_query": "Покажи файл с описанием endpoint `/send`", + "target_terms": [ + "/send", + "описанием", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл с описанием endpoint `/send`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/send", + "описанием", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-02-send.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-02-send.md new file mode 100644 index 0000000..00d0a8b --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-02-send.md @@ -0,0 +1,91 @@ +# v2-router-find-files-02-send + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Покажи файл с описанием endpoint `/send` + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Покажи файл с описанием endpoint `/send`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл с описанием endpoint `/send`", + "normalized_query": "Покажи файл с описанием endpoint `/send`", + "target_terms": [ + "/send", + "описанием", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл с описанием endpoint `/send`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/send", + "описанием", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json new file mode 100644 index 0000000..2e1f88e --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json @@ -0,0 +1,85 @@ +{ + "meta": { + "case_id": "v2-router-find-files-03-actions", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Где находится документация по `/actions/{action}`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где находится документация по `/actions/{action}`?", + "normalized_query": "Где находится документация по `/actions/{action}`?", + "target_terms": [ + "/actions/{action}", + "находится", + "/actions/{action" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где находится документация по `/actions/{action}`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/actions/{action}", + "находится", + "/actions/{action" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md new file mode 100644 index 0000000..7d725f4 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md @@ -0,0 +1,95 @@ +# v2-router-find-files-03-actions + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Где находится документация по `/actions/{action}`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Где находится документация по `/actions/{action}`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где находится документация по `/actions/{action}`?", + "normalized_query": "Где находится документация по `/actions/{action}`?", + "target_terms": [ + "/actions/{action}", + "находится", + "/actions/{action" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где находится документация по `/actions/{action}`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/actions/{action}", + "находится", + "/actions/{action" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json new file mode 100644 index 0000000..6bcb3fe --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json @@ -0,0 +1,87 @@ +{ + "meta": { + "case_id": "v2-router-find-files-04-runtime-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "В каком документе описан runtime health?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком документе описан runtime health?", + "normalized_query": "В каком документе описан runtime health?", + "target_terms": [ + "runtime_health", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком документе описан runtime health?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "runtime_health", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md new file mode 100644 index 0000000..67a4971 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md @@ -0,0 +1,97 @@ +# v2-router-find-files-04-runtime-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каком документе описан runtime health? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "В каком документе описан runtime health?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком документе описан runtime health?", + "normalized_query": "В каком документе описан runtime health?", + "target_terms": [ + "runtime_health", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком документе описан runtime health?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "runtime_health", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json new file mode 100644 index 0000000..22e0dc9 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json @@ -0,0 +1,79 @@ +{ + "meta": { + "case_id": "v2-router-find-files-05-loop", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Найди файл с логикой цикла отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Найди файл с логикой цикла отправки уведомлений", + "normalized_query": "Найди файл с логикой цикла отправки уведомлений", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Найди файл с логикой цикла отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md new file mode 100644 index 0000000..e5fb3cc --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md @@ -0,0 +1,89 @@ +# v2-router-find-files-05-loop + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Найди файл с логикой цикла отправки уведомлений + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Найди файл с логикой цикла отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Найди файл с логикой цикла отправки уведомлений", + "normalized_query": "Найди файл с логикой цикла отправки уведомлений", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Найди файл с логикой цикла отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json new file mode 100644 index 0000000..0274ae5 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v2-router-find-files-06-architecture", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Где описана архитектура приложения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где описана архитектура приложения?", + "normalized_query": "Где описана архитектура приложения?", + "target_terms": [ + "architecture_overview", + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где описана архитектура приложения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "architecture_overview", + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md new file mode 100644 index 0000000..e9e5561 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md @@ -0,0 +1,93 @@ +# v2-router-find-files-06-architecture + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Где описана архитектура приложения? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Где описана архитектура приложения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где описана архитектура приложения?", + "normalized_query": "Где описана архитектура приложения?", + "target_terms": [ + "architecture_overview", + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где описана архитектура приложения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "architecture_overview", + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json new file mode 100644 index 0000000..f395d9e --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json @@ -0,0 +1,87 @@ +{ + "meta": { + "case_id": "v2-router-find-files-07-errors-catalog", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "В каком файле лежит каталог ошибок?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле лежит каталог ошибок?", + "normalized_query": "В каком файле лежит каталог ошибок?", + "target_terms": [ + "errors_catalog", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "errors_catalog" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле лежит каталог ошибок?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "errors_catalog", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "errors_catalog" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md new file mode 100644 index 0000000..06d4c48 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md @@ -0,0 +1,97 @@ +# v2-router-find-files-07-errors-catalog + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каком файле лежит каталог ошибок? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "В каком файле лежит каталог ошибок?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле лежит каталог ошибок?", + "normalized_query": "В каком файле лежит каталог ошибок?", + "target_terms": [ + "errors_catalog", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "errors_catalog" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле лежит каталог ошибок?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "errors_catalog", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "errors_catalog" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json new file mode 100644 index 0000000..f9b1b13 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json @@ -0,0 +1,81 @@ +{ + "meta": { + "case_id": "v2-router-find-files-08-docs-index", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Покажи файл-индекс документации проекта", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл-индекс документации проекта", + "normalized_query": "Покажи файл-индекс документации проекта", + "target_terms": [ + "docs_index", + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs_index" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл-индекс документации проекта" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "docs_index", + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs_index" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md new file mode 100644 index 0000000..fa65c6a --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md @@ -0,0 +1,91 @@ +# v2-router-find-files-08-docs-index + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Покажи файл-индекс документации проекта + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Покажи файл-индекс документации проекта", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл-индекс документации проекта", + "normalized_query": "Покажи файл-индекс документации проекта", + "target_terms": [ + "docs_index", + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs_index" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл-индекс документации проекта" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "docs_index", + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs_index" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json new file mode 100644 index 0000000..a8ff1d8 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json @@ -0,0 +1,87 @@ +{ + "meta": { + "case_id": "v2-router-find-files-09-telegram-bot-api", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": false, + "mismatches": [ + "sub_intent: expected FIND_FILES, got SUMMARY" + ] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "normalized_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "target_terms": [ + "относятся", + "telegram", + "bot", + "api", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "относятся", + "telegram", + "bot", + "api", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md new file mode 100644 index 0000000..3450321 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md @@ -0,0 +1,95 @@ +# v2-router-find-files-09-telegram-bot-api + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: False + +## Query +Какие файлы относятся к Telegram Bot API интеграции? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "normalized_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "target_terms": [ + "относятся", + "telegram", + "bot", + "api", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "относятся", + "telegram", + "bot", + "api", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- sub_intent: expected FIND_FILES, got SUMMARY \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json new file mode 100644 index 0000000..982e56f --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json @@ -0,0 +1,85 @@ +{ + "meta": { + "case_id": "v2-router-find-files-10-telegram-notify-worker", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "В каких файлах описан worker `telegram_notify`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каких файлах описан worker `telegram_notify`?", + "normalized_query": "В каких файлах описан worker `telegram_notify`?", + "target_terms": [ + "каких", + "файлах", + "описан", + "worker", + "telegram_notify" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "telegram_notify" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каких файлах описан worker `telegram_notify`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "каких", + "файлах", + "описан", + "worker", + "telegram_notify" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "telegram_notify" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md new file mode 100644 index 0000000..5f77518 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md @@ -0,0 +1,95 @@ +# v2-router-find-files-10-telegram-notify-worker + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каких файлах описан worker `telegram_notify`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "В каких файлах описан worker `telegram_notify`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каких файлах описан worker `telegram_notify`?", + "normalized_query": "В каких файлах описан worker `telegram_notify`?", + "target_terms": [ + "каких", + "файлах", + "описан", + "worker", + "telegram_notify" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "telegram_notify" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каких файлах описан worker `telegram_notify`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "каких", + "файлах", + "описан", + "worker", + "telegram_notify" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "telegram_notify" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json new file mode 100644 index 0000000..27d18f8 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json @@ -0,0 +1,69 @@ +{ + "meta": { + "case_id": "v2-router-general-01-what-is-service", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Что это за сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что это за сервис?", + "normalized_query": "Что это за сервис?", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что это за сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md new file mode 100644 index 0000000..aa7263c --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md @@ -0,0 +1,79 @@ +# v2-router-general-01-what-is-service + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что это за сервис? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Что это за сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что это за сервис?", + "normalized_query": "Что это за сервис?", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что это за сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-02-purpose.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-02-purpose.json new file mode 100644 index 0000000..4480103 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-02-purpose.json @@ -0,0 +1,79 @@ +{ + "meta": { + "case_id": "v2-router-general-02-purpose", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Для чего нужен test_echo_app?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Для чего нужен test_echo_app?", + "normalized_query": "Для чего нужен test_echo_app?", + "target_terms": [ + "для", + "чего", + "нужен", + "test_echo_app" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "test_echo_app" + ], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Для чего нужен test_echo_app?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "для", + "чего", + "нужен", + "test_echo_app" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "test_echo_app" + ], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-02-purpose.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-02-purpose.md new file mode 100644 index 0000000..d662352 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-02-purpose.md @@ -0,0 +1,89 @@ +# v2-router-general-02-purpose + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Для чего нужен test_echo_app? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Для чего нужен test_echo_app?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Для чего нужен test_echo_app?", + "normalized_query": "Для чего нужен test_echo_app?", + "target_terms": [ + "для", + "чего", + "нужен", + "test_echo_app" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "test_echo_app" + ], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Для чего нужен test_echo_app?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "для", + "чего", + "нужен", + "test_echo_app" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "test_echo_app" + ], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-03-problem.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-03-problem.json new file mode 100644 index 0000000..d6694a2 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-03-problem.json @@ -0,0 +1,75 @@ +{ + "meta": { + "case_id": "v2-router-general-03-problem", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Какую задачу решает это приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какую задачу решает это приложение?", + "normalized_query": "Какую задачу решает это приложение?", + "target_terms": [ + "какую", + "задачу", + "решает", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какую задачу решает это приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "какую", + "задачу", + "решает", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-03-problem.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-03-problem.md new file mode 100644 index 0000000..e0055a8 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-03-problem.md @@ -0,0 +1,85 @@ +# v2-router-general-03-problem + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какую задачу решает это приложение? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Какую задачу решает это приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какую задачу решает это приложение?", + "normalized_query": "Какую задачу решает это приложение?", + "target_terms": [ + "какую", + "задачу", + "решает", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какую задачу решает это приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "какую", + "задачу", + "решает", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json new file mode 100644 index 0000000..cf9f2ed --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json @@ -0,0 +1,73 @@ +{ + "meta": { + "case_id": "v2-router-general-04-docs-contents", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Что входит в документацию этого проекта?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что входит в документацию этого проекта?", + "normalized_query": "Что входит в документацию этого проекта?", + "target_terms": [ + "входит", + "документацию", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что входит в документацию этого проекта?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "входит", + "документацию", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md new file mode 100644 index 0000000..adba625 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md @@ -0,0 +1,83 @@ +# v2-router-general-04-docs-contents + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что входит в документацию этого проекта? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Что входит в документацию этого проекта?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что входит в документацию этого проекта?", + "normalized_query": "Что входит в документацию этого проекта?", + "target_terms": [ + "входит", + "документацию", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что входит в документацию этого проекта?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "входит", + "документацию", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json new file mode 100644 index 0000000..bb52214 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json @@ -0,0 +1,75 @@ +{ + "meta": { + "case_id": "v2-router-general-05-main-parts", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Какие основные части есть у системы?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие основные части есть у системы?", + "normalized_query": "Какие основные части есть у системы?", + "target_terms": [ + "основные", + "части", + "есть", + "системы" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие основные части есть у системы?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "основные", + "части", + "есть", + "системы" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md new file mode 100644 index 0000000..4dd636a --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md @@ -0,0 +1,85 @@ +# v2-router-general-05-main-parts + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какие основные части есть у системы? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Какие основные части есть у системы?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие основные части есть у системы?", + "normalized_query": "Какие основные части есть у системы?", + "target_terms": [ + "основные", + "части", + "есть", + "системы" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие основные части есть у системы?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "основные", + "части", + "есть", + "системы" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json new file mode 100644 index 0000000..b5a6df4 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json @@ -0,0 +1,73 @@ +{ + "meta": { + "case_id": "v2-router-general-06-high-level-architecture", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Как в целом устроено приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как в целом устроено приложение?", + "normalized_query": "Как в целом устроено приложение?", + "target_terms": [ + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в целом устроено приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md new file mode 100644 index 0000000..693f1cf --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md @@ -0,0 +1,83 @@ +# v2-router-general-06-high-level-architecture + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Как в целом устроено приложение? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Как в целом устроено приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как в целом устроено приложение?", + "normalized_query": "Как в целом устроено приложение?", + "target_terms": [ + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в целом устроено приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json new file mode 100644 index 0000000..1336596 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json @@ -0,0 +1,79 @@ +{ + "meta": { + "case_id": "v2-router-general-07-besides-api", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Что тут есть кроме API?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что тут есть кроме API?", + "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 + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что тут есть кроме API?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "тут", + "есть", + "кроме", + "api" + ], + "anchors": { + "entity_names": [ + "API" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md new file mode 100644 index 0000000..72b9d53 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md @@ -0,0 +1,89 @@ +# v2-router-general-07-besides-api + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что тут есть кроме API? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Что тут есть кроме API?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что тут есть кроме API?", + "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 + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что тут есть кроме API?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "тут", + "есть", + "кроме", + "api" + ], + "anchors": { + "entity_names": [ + "API" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-08-components.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-08-components.json new file mode 100644 index 0000000..e7aa4e4 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-08-components.json @@ -0,0 +1,89 @@ +{ + "meta": { + "case_id": "v2-router-general-08-components", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Из чего состоит Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Из чего состоит Telegram Notify App?", + "normalized_query": "Из чего состоит Telegram Notify App?", + "target_terms": [ + "чего", + "состоит", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Из чего состоит Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "чего", + "состоит", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-08-components.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-08-components.md new file mode 100644 index 0000000..8973686 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-08-components.md @@ -0,0 +1,99 @@ +# v2-router-general-08-components + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Из чего состоит Telegram Notify App? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Из чего состоит Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Из чего состоит Telegram Notify App?", + "normalized_query": "Из чего состоит Telegram Notify App?", + "target_terms": [ + "чего", + "состоит", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Из чего состоит Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "чего", + "состоит", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json new file mode 100644 index 0000000..0b62adf --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json @@ -0,0 +1,73 @@ +{ + "meta": { + "case_id": "v2-router-general-09-reading-order", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Какие документы стоит читать сначала?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие документы стоит читать сначала?", + "normalized_query": "Какие документы стоит читать сначала?", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие документы стоит читать сначала?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md new file mode 100644 index 0000000..a246294 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md @@ -0,0 +1,83 @@ +# v2-router-general-09-reading-order + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какие документы стоит читать сначала? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Какие документы стоит читать сначала?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие документы стоит читать сначала?", + "normalized_query": "Какие документы стоит читать сначала?", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие документы стоит читать сначала?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json new file mode 100644 index 0000000..2b70a92 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json @@ -0,0 +1,71 @@ +{ + "meta": { + "case_id": "v2-router-general-10-short-summary", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Дай короткое summary по проектной документации", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Дай короткое summary по проектной документации", + "normalized_query": "Дай короткое summary по проектной документации", + "target_terms": [ + "короткое", + "проектной" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Дай короткое summary по проектной документации" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "короткое", + "проектной" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md new file mode 100644 index 0000000..2df755e --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md @@ -0,0 +1,81 @@ +# v2-router-general-10-short-summary + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Дай короткое summary по проектной документации + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Дай короткое summary по проектной документации", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Дай короткое summary по проектной документации", + "normalized_query": "Дай короткое summary по проектной документации", + "target_terms": [ + "короткое", + "проектной" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Дай короткое summary по проектной документации" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "короткое", + "проектной" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/summary.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/summary.md new file mode 100644 index 0000000..b7d961f --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_124956/summary.md @@ -0,0 +1,42 @@ +# pipeline_setup_v4 summary + +Passed: 26/30 + +| Case | Component | Query | Intent | Sub-intent | Pass | +|------|-----------|-------|--------|------------|------| +| v2-router-general-01-what-is-service | process_v2_intent_router | Что это за сервис? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-02-purpose | process_v2_intent_router | Для чего нужен test_echo_app? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-03-problem | process_v2_intent_router | Какую задачу решает это приложение? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-04-docs-contents | process_v2_intent_router | Что входит в документацию этого проекта? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-05-main-parts | process_v2_intent_router | Какие основные части есть у системы? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-06-high-level-architecture | process_v2_intent_router | Как в целом устроено приложение? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-07-besides-api | process_v2_intent_router | Что тут есть кроме API? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-08-components | process_v2_intent_router | Из чего состоит Telegram Notify App? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-general-09-reading-order | process_v2_intent_router | Какие документы стоит читать сначала? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-10-short-summary | process_v2_intent_router | Дай короткое summary по проектной документации | GENERAL_QA | SUMMARY | ✓ | +| v2-router-docs-summary-01-health | process_v2_intent_router | Кратко объясни по документации, как работает `/health` | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-02-send | process_v2_intent_router | Что делает endpoint `/send`? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-03-actions | process_v2_intent_router | Объясни назначение `/actions/{action}` | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-04-runtime-health | process_v2_intent_router | Что такое runtime health в этой документации? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-05-notification-loop | process_v2_intent_router | Кратко опиши цикл отправки уведомлений | GENERAL_QA | SUMMARY | ✗ | +| v2-router-docs-summary-06-architecture | process_v2_intent_router | Как устроена архитектура Telegram Notify App? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-07-worker | process_v2_intent_router | Что делает worker в этом приложении? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-08-health-statuses | process_v2_intent_router | Какие статусы здоровья есть у runtime? | GENERAL_QA | SUMMARY | ✗ | +| v2-router-docs-summary-09-manual-send | process_v2_intent_router | Как в приложении устроена ручная отправка сообщения? | GENERAL_QA | SUMMARY | ✗ | +| v2-router-docs-summary-10-telegram-integration | process_v2_intent_router | Как сервис взаимодействует с Telegram в целом? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-find-files-01-health | process_v2_intent_router | В каком файле описан `/health`? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-02-send | process_v2_intent_router | Покажи файл с описанием endpoint `/send` | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-03-actions | process_v2_intent_router | Где находится документация по `/actions/{action}`? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-04-runtime-health | process_v2_intent_router | В каком документе описан runtime health? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-05-loop | process_v2_intent_router | Найди файл с логикой цикла отправки уведомлений | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-06-architecture | process_v2_intent_router | Где описана архитектура приложения? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-07-errors-catalog | process_v2_intent_router | В каком файле лежит каталог ошибок? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-08-docs-index | process_v2_intent_router | Покажи файл-индекс документации проекта | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-09-telegram-bot-api | process_v2_intent_router | Какие файлы относятся к Telegram Bot API интеграции? | DOC_EXPLAIN | SUMMARY | ✗ | +| v2-router-find-files-10-telegram-notify-worker | process_v2_intent_router | В каких файлах описан worker `telegram_notify`? | DOC_EXPLAIN | FIND_FILES | ✓ | + +## Failures +- **v2-router-docs-summary-05-notification-loop**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA +- **v2-router-docs-summary-08-health-statuses**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA +- **v2-router-docs-summary-09-manual-send**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA +- **v2-router-find-files-09-telegram-bot-api**: sub_intent: expected FIND_FILES, got SUMMARY \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json new file mode 100644 index 0000000..e0ce050 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json @@ -0,0 +1,81 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-01-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Кратко объясни по документации, как работает `/health`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Кратко объясни по документации, как работает `/health`", + "normalized_query": "Кратко объясни по документации, как работает `/health`", + "target_terms": [ + "/health", + "кратко", + "работает" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко объясни по документации, как работает `/health`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/health", + "кратко", + "работает" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md new file mode 100644 index 0000000..4d811c8 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md @@ -0,0 +1,91 @@ +# v2-router-docs-summary-01-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Кратко объясни по документации, как работает `/health` + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Кратко объясни по документации, как работает `/health`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Кратко объясни по документации, как работает `/health`", + "normalized_query": "Кратко объясни по документации, как работает `/health`", + "target_terms": [ + "/health", + "кратко", + "работает" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко объясни по документации, как работает `/health`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/health", + "кратко", + "работает" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json new file mode 100644 index 0000000..1317d91 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json @@ -0,0 +1,81 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-02-send", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Что делает endpoint `/send`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает endpoint `/send`?", + "normalized_query": "Что делает endpoint `/send`?", + "target_terms": [ + "/send", + "делает", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает endpoint `/send`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/send", + "делает", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md new file mode 100644 index 0000000..d70e7b6 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md @@ -0,0 +1,91 @@ +# v2-router-docs-summary-02-send + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что делает endpoint `/send`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Что делает endpoint `/send`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает endpoint `/send`?", + "normalized_query": "Что делает endpoint `/send`?", + "target_terms": [ + "/send", + "делает", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает endpoint `/send`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/send", + "делает", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json new file mode 100644 index 0000000..2907bc2 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json @@ -0,0 +1,85 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-03-actions", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Объясни назначение `/actions/{action}`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Объясни назначение `/actions/{action}`", + "normalized_query": "Объясни назначение `/actions/{action}`", + "target_terms": [ + "/actions/{action}", + "назначение", + "/actions/{action" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Объясни назначение `/actions/{action}`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/actions/{action}", + "назначение", + "/actions/{action" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md new file mode 100644 index 0000000..8d1e4cc --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md @@ -0,0 +1,95 @@ +# v2-router-docs-summary-03-actions + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Объясни назначение `/actions/{action}` + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Объясни назначение `/actions/{action}`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Объясни назначение `/actions/{action}`", + "normalized_query": "Объясни назначение `/actions/{action}`", + "target_terms": [ + "/actions/{action}", + "назначение", + "/actions/{action" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Объясни назначение `/actions/{action}`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/actions/{action}", + "назначение", + "/actions/{action" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json new file mode 100644 index 0000000..28a51bc --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-04-runtime-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Что такое runtime health в этой документации?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что такое runtime health в этой документации?", + "normalized_query": "Что такое runtime health в этой документации?", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что такое runtime health в этой документации?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md new file mode 100644 index 0000000..95d4c46 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md @@ -0,0 +1,93 @@ +# v2-router-docs-summary-04-runtime-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что такое runtime health в этой документации? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Что такое runtime health в этой документации?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что такое runtime health в этой документации?", + "normalized_query": "Что такое runtime health в этой документации?", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что такое runtime health в этой документации?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json new file mode 100644 index 0000000..aba1991 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json @@ -0,0 +1,87 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-05-notification-loop", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Кратко опиши цикл отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Кратко опиши цикл отправки уведомлений", + "normalized_query": "Кратко опиши цикл отправки уведомлений", + "target_terms": [ + "telegram-notify-loop", + "кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notify-loop" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко опиши цикл отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "telegram-notify-loop", + "кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notify-loop" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md new file mode 100644 index 0000000..19ea1b6 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md @@ -0,0 +1,97 @@ +# v2-router-docs-summary-05-notification-loop + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Кратко опиши цикл отправки уведомлений + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Кратко опиши цикл отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Кратко опиши цикл отправки уведомлений", + "normalized_query": "Кратко опиши цикл отправки уведомлений", + "target_terms": [ + "telegram-notify-loop", + "кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notify-loop" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко опиши цикл отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "telegram-notify-loop", + "кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notify-loop" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json new file mode 100644 index 0000000..30385d9 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json @@ -0,0 +1,95 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-06-architecture", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Как устроена архитектура Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как устроена архитектура Telegram Notify App?", + "normalized_query": "Как устроена архитектура Telegram Notify App?", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как устроена архитектура Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md new file mode 100644 index 0000000..401cc55 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md @@ -0,0 +1,105 @@ +# v2-router-docs-summary-06-architecture + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Как устроена архитектура Telegram Notify App? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Как устроена архитектура Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как устроена архитектура Telegram Notify App?", + "normalized_query": "Как устроена архитектура Telegram Notify App?", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как устроена архитектура Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json new file mode 100644 index 0000000..ed32c20 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json @@ -0,0 +1,79 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-07-worker", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Что делает worker в этом приложении?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает worker в этом приложении?", + "normalized_query": "Что делает worker в этом приложении?", + "target_terms": [ + "делает", + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает worker в этом приложении?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "делает", + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md new file mode 100644 index 0000000..397ca47 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md @@ -0,0 +1,89 @@ +# v2-router-docs-summary-07-worker + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что делает worker в этом приложении? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Что делает worker в этом приложении?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает worker в этом приложении?", + "normalized_query": "Что делает worker в этом приложении?", + "target_terms": [ + "делает", + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает worker в этом приложении?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "делает", + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json new file mode 100644 index 0000000..2054dda --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json @@ -0,0 +1,85 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-08-health-statuses", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Какие статусы здоровья есть у runtime?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Какие статусы здоровья есть у runtime?", + "normalized_query": "Какие статусы здоровья есть у runtime?", + "target_terms": [ + "runtime_health", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие статусы здоровья есть у runtime?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "runtime_health", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md new file mode 100644 index 0000000..a360ce2 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md @@ -0,0 +1,95 @@ +# v2-router-docs-summary-08-health-statuses + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какие статусы здоровья есть у runtime? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Какие статусы здоровья есть у runtime?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Какие статусы здоровья есть у runtime?", + "normalized_query": "Какие статусы здоровья есть у runtime?", + "target_terms": [ + "runtime_health", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие статусы здоровья есть у runtime?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "runtime_health", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json new file mode 100644 index 0000000..0ca5792 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json @@ -0,0 +1,87 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-09-manual-send", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Как в приложении устроена ручная отправка сообщения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как в приложении устроена ручная отправка сообщения?", + "normalized_query": "Как в приложении устроена ручная отправка сообщения?", + "target_terms": [ + "/send", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в приложении устроена ручная отправка сообщения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/send", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md new file mode 100644 index 0000000..7ec0fc0 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md @@ -0,0 +1,97 @@ +# v2-router-docs-summary-09-manual-send + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Как в приложении устроена ручная отправка сообщения? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Как в приложении устроена ручная отправка сообщения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как в приложении устроена ручная отправка сообщения?", + "normalized_query": "Как в приложении устроена ручная отправка сообщения?", + "target_terms": [ + "/send", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в приложении устроена ручная отправка сообщения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/send", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json new file mode 100644 index 0000000..78ed8cc --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json @@ -0,0 +1,79 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-10-telegram-integration", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Как сервис взаимодействует с Telegram в целом?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как сервис взаимодействует с Telegram в целом?", + "normalized_query": "Как сервис взаимодействует с Telegram в целом?", + "target_terms": [ + "сервис", + "взаимодействует", + "telegram", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как сервис взаимодействует с Telegram в целом?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "сервис", + "взаимодействует", + "telegram", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md new file mode 100644 index 0000000..a1bdb67 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md @@ -0,0 +1,89 @@ +# v2-router-docs-summary-10-telegram-integration + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Как сервис взаимодействует с Telegram в целом? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Как сервис взаимодействует с Telegram в целом?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как сервис взаимодействует с Telegram в целом?", + "normalized_query": "Как сервис взаимодействует с Telegram в целом?", + "target_terms": [ + "сервис", + "взаимодействует", + "telegram", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как сервис взаимодействует с Telegram в целом?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "сервис", + "взаимодействует", + "telegram", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-01-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-01-health.json new file mode 100644 index 0000000..e9cf5a9 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-01-health.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v2-router-find-files-01-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "В каком файле описан `/health`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле описан `/health`?", + "normalized_query": "В каком файле описан `/health`?", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле описан `/health`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-01-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-01-health.md new file mode 100644 index 0000000..c53bee3 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-01-health.md @@ -0,0 +1,93 @@ +# v2-router-find-files-01-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каком файле описан `/health`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "В каком файле описан `/health`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле описан `/health`?", + "normalized_query": "В каком файле описан `/health`?", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле описан `/health`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-02-send.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-02-send.json new file mode 100644 index 0000000..b100875 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-02-send.json @@ -0,0 +1,81 @@ +{ + "meta": { + "case_id": "v2-router-find-files-02-send", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Покажи файл с описанием endpoint `/send`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл с описанием endpoint `/send`", + "normalized_query": "Покажи файл с описанием endpoint `/send`", + "target_terms": [ + "/send", + "описанием", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл с описанием endpoint `/send`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/send", + "описанием", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-02-send.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-02-send.md new file mode 100644 index 0000000..00d0a8b --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-02-send.md @@ -0,0 +1,91 @@ +# v2-router-find-files-02-send + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Покажи файл с описанием endpoint `/send` + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Покажи файл с описанием endpoint `/send`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл с описанием endpoint `/send`", + "normalized_query": "Покажи файл с описанием endpoint `/send`", + "target_terms": [ + "/send", + "описанием", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл с описанием endpoint `/send`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/send", + "описанием", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json new file mode 100644 index 0000000..2e1f88e --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json @@ -0,0 +1,85 @@ +{ + "meta": { + "case_id": "v2-router-find-files-03-actions", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Где находится документация по `/actions/{action}`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где находится документация по `/actions/{action}`?", + "normalized_query": "Где находится документация по `/actions/{action}`?", + "target_terms": [ + "/actions/{action}", + "находится", + "/actions/{action" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где находится документация по `/actions/{action}`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/actions/{action}", + "находится", + "/actions/{action" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md new file mode 100644 index 0000000..7d725f4 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md @@ -0,0 +1,95 @@ +# v2-router-find-files-03-actions + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Где находится документация по `/actions/{action}`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Где находится документация по `/actions/{action}`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где находится документация по `/actions/{action}`?", + "normalized_query": "Где находится документация по `/actions/{action}`?", + "target_terms": [ + "/actions/{action}", + "находится", + "/actions/{action" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где находится документация по `/actions/{action}`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/actions/{action}", + "находится", + "/actions/{action" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json new file mode 100644 index 0000000..6bcb3fe --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json @@ -0,0 +1,87 @@ +{ + "meta": { + "case_id": "v2-router-find-files-04-runtime-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "В каком документе описан runtime health?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком документе описан runtime health?", + "normalized_query": "В каком документе описан runtime health?", + "target_terms": [ + "runtime_health", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком документе описан runtime health?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "runtime_health", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md new file mode 100644 index 0000000..67a4971 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md @@ -0,0 +1,97 @@ +# v2-router-find-files-04-runtime-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каком документе описан runtime health? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "В каком документе описан runtime health?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком документе описан runtime health?", + "normalized_query": "В каком документе описан runtime health?", + "target_terms": [ + "runtime_health", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком документе описан runtime health?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "runtime_health", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json new file mode 100644 index 0000000..22e0dc9 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json @@ -0,0 +1,79 @@ +{ + "meta": { + "case_id": "v2-router-find-files-05-loop", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Найди файл с логикой цикла отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Найди файл с логикой цикла отправки уведомлений", + "normalized_query": "Найди файл с логикой цикла отправки уведомлений", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Найди файл с логикой цикла отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md new file mode 100644 index 0000000..e5fb3cc --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md @@ -0,0 +1,89 @@ +# v2-router-find-files-05-loop + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Найди файл с логикой цикла отправки уведомлений + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Найди файл с логикой цикла отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Найди файл с логикой цикла отправки уведомлений", + "normalized_query": "Найди файл с логикой цикла отправки уведомлений", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Найди файл с логикой цикла отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json new file mode 100644 index 0000000..0274ae5 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v2-router-find-files-06-architecture", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Где описана архитектура приложения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где описана архитектура приложения?", + "normalized_query": "Где описана архитектура приложения?", + "target_terms": [ + "architecture_overview", + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где описана архитектура приложения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "architecture_overview", + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md new file mode 100644 index 0000000..e9e5561 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md @@ -0,0 +1,93 @@ +# v2-router-find-files-06-architecture + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Где описана архитектура приложения? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Где описана архитектура приложения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где описана архитектура приложения?", + "normalized_query": "Где описана архитектура приложения?", + "target_terms": [ + "architecture_overview", + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где описана архитектура приложения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "architecture_overview", + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json new file mode 100644 index 0000000..f395d9e --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json @@ -0,0 +1,87 @@ +{ + "meta": { + "case_id": "v2-router-find-files-07-errors-catalog", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "В каком файле лежит каталог ошибок?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле лежит каталог ошибок?", + "normalized_query": "В каком файле лежит каталог ошибок?", + "target_terms": [ + "errors_catalog", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "errors_catalog" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле лежит каталог ошибок?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "errors_catalog", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "errors_catalog" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md new file mode 100644 index 0000000..06d4c48 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md @@ -0,0 +1,97 @@ +# v2-router-find-files-07-errors-catalog + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каком файле лежит каталог ошибок? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "В каком файле лежит каталог ошибок?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле лежит каталог ошибок?", + "normalized_query": "В каком файле лежит каталог ошибок?", + "target_terms": [ + "errors_catalog", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "errors_catalog" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле лежит каталог ошибок?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "errors_catalog", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "errors_catalog" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json new file mode 100644 index 0000000..f9b1b13 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json @@ -0,0 +1,81 @@ +{ + "meta": { + "case_id": "v2-router-find-files-08-docs-index", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Покажи файл-индекс документации проекта", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл-индекс документации проекта", + "normalized_query": "Покажи файл-индекс документации проекта", + "target_terms": [ + "docs_index", + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs_index" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл-индекс документации проекта" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "docs_index", + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs_index" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md new file mode 100644 index 0000000..fa65c6a --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md @@ -0,0 +1,91 @@ +# v2-router-find-files-08-docs-index + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Покажи файл-индекс документации проекта + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Покажи файл-индекс документации проекта", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл-индекс документации проекта", + "normalized_query": "Покажи файл-индекс документации проекта", + "target_terms": [ + "docs_index", + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs_index" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл-индекс документации проекта" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "docs_index", + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs_index" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json new file mode 100644 index 0000000..083049f --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json @@ -0,0 +1,85 @@ +{ + "meta": { + "case_id": "v2-router-find-files-09-telegram-bot-api", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "normalized_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "target_terms": [ + "относятся", + "telegram", + "bot", + "api", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "относятся", + "telegram", + "bot", + "api", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md new file mode 100644 index 0000000..e633f25 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md @@ -0,0 +1,95 @@ +# v2-router-find-files-09-telegram-bot-api + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какие файлы относятся к Telegram Bot API интеграции? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "normalized_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "target_terms": [ + "относятся", + "telegram", + "bot", + "api", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "относятся", + "telegram", + "bot", + "api", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json new file mode 100644 index 0000000..982e56f --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json @@ -0,0 +1,85 @@ +{ + "meta": { + "case_id": "v2-router-find-files-10-telegram-notify-worker", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "В каких файлах описан worker `telegram_notify`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каких файлах описан worker `telegram_notify`?", + "normalized_query": "В каких файлах описан worker `telegram_notify`?", + "target_terms": [ + "каких", + "файлах", + "описан", + "worker", + "telegram_notify" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "telegram_notify" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каких файлах описан worker `telegram_notify`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "каких", + "файлах", + "описан", + "worker", + "telegram_notify" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "telegram_notify" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md new file mode 100644 index 0000000..5f77518 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md @@ -0,0 +1,95 @@ +# v2-router-find-files-10-telegram-notify-worker + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каких файлах описан worker `telegram_notify`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "В каких файлах описан worker `telegram_notify`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каких файлах описан worker `telegram_notify`?", + "normalized_query": "В каких файлах описан worker `telegram_notify`?", + "target_terms": [ + "каких", + "файлах", + "описан", + "worker", + "telegram_notify" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "telegram_notify" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каких файлах описан worker `telegram_notify`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "каких", + "файлах", + "описан", + "worker", + "telegram_notify" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "telegram_notify" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json new file mode 100644 index 0000000..27d18f8 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json @@ -0,0 +1,69 @@ +{ + "meta": { + "case_id": "v2-router-general-01-what-is-service", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Что это за сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что это за сервис?", + "normalized_query": "Что это за сервис?", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что это за сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md new file mode 100644 index 0000000..aa7263c --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md @@ -0,0 +1,79 @@ +# v2-router-general-01-what-is-service + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что это за сервис? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Что это за сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что это за сервис?", + "normalized_query": "Что это за сервис?", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что это за сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-02-purpose.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-02-purpose.json new file mode 100644 index 0000000..4480103 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-02-purpose.json @@ -0,0 +1,79 @@ +{ + "meta": { + "case_id": "v2-router-general-02-purpose", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Для чего нужен test_echo_app?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Для чего нужен test_echo_app?", + "normalized_query": "Для чего нужен test_echo_app?", + "target_terms": [ + "для", + "чего", + "нужен", + "test_echo_app" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "test_echo_app" + ], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Для чего нужен test_echo_app?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "для", + "чего", + "нужен", + "test_echo_app" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "test_echo_app" + ], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-02-purpose.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-02-purpose.md new file mode 100644 index 0000000..d662352 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-02-purpose.md @@ -0,0 +1,89 @@ +# v2-router-general-02-purpose + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Для чего нужен test_echo_app? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Для чего нужен test_echo_app?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Для чего нужен test_echo_app?", + "normalized_query": "Для чего нужен test_echo_app?", + "target_terms": [ + "для", + "чего", + "нужен", + "test_echo_app" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "test_echo_app" + ], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Для чего нужен test_echo_app?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "для", + "чего", + "нужен", + "test_echo_app" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "test_echo_app" + ], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-03-problem.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-03-problem.json new file mode 100644 index 0000000..d6694a2 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-03-problem.json @@ -0,0 +1,75 @@ +{ + "meta": { + "case_id": "v2-router-general-03-problem", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Какую задачу решает это приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какую задачу решает это приложение?", + "normalized_query": "Какую задачу решает это приложение?", + "target_terms": [ + "какую", + "задачу", + "решает", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какую задачу решает это приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "какую", + "задачу", + "решает", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-03-problem.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-03-problem.md new file mode 100644 index 0000000..e0055a8 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-03-problem.md @@ -0,0 +1,85 @@ +# v2-router-general-03-problem + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какую задачу решает это приложение? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Какую задачу решает это приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какую задачу решает это приложение?", + "normalized_query": "Какую задачу решает это приложение?", + "target_terms": [ + "какую", + "задачу", + "решает", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какую задачу решает это приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "какую", + "задачу", + "решает", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json new file mode 100644 index 0000000..cf9f2ed --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json @@ -0,0 +1,73 @@ +{ + "meta": { + "case_id": "v2-router-general-04-docs-contents", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Что входит в документацию этого проекта?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что входит в документацию этого проекта?", + "normalized_query": "Что входит в документацию этого проекта?", + "target_terms": [ + "входит", + "документацию", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что входит в документацию этого проекта?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "входит", + "документацию", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md new file mode 100644 index 0000000..adba625 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md @@ -0,0 +1,83 @@ +# v2-router-general-04-docs-contents + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что входит в документацию этого проекта? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Что входит в документацию этого проекта?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что входит в документацию этого проекта?", + "normalized_query": "Что входит в документацию этого проекта?", + "target_terms": [ + "входит", + "документацию", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что входит в документацию этого проекта?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "входит", + "документацию", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json new file mode 100644 index 0000000..bb52214 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json @@ -0,0 +1,75 @@ +{ + "meta": { + "case_id": "v2-router-general-05-main-parts", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Какие основные части есть у системы?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие основные части есть у системы?", + "normalized_query": "Какие основные части есть у системы?", + "target_terms": [ + "основные", + "части", + "есть", + "системы" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие основные части есть у системы?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "основные", + "части", + "есть", + "системы" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md new file mode 100644 index 0000000..4dd636a --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md @@ -0,0 +1,85 @@ +# v2-router-general-05-main-parts + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какие основные части есть у системы? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Какие основные части есть у системы?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие основные части есть у системы?", + "normalized_query": "Какие основные части есть у системы?", + "target_terms": [ + "основные", + "части", + "есть", + "системы" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие основные части есть у системы?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "основные", + "части", + "есть", + "системы" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json new file mode 100644 index 0000000..b5a6df4 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json @@ -0,0 +1,73 @@ +{ + "meta": { + "case_id": "v2-router-general-06-high-level-architecture", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Как в целом устроено приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как в целом устроено приложение?", + "normalized_query": "Как в целом устроено приложение?", + "target_terms": [ + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в целом устроено приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md new file mode 100644 index 0000000..693f1cf --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md @@ -0,0 +1,83 @@ +# v2-router-general-06-high-level-architecture + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Как в целом устроено приложение? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Как в целом устроено приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как в целом устроено приложение?", + "normalized_query": "Как в целом устроено приложение?", + "target_terms": [ + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в целом устроено приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json new file mode 100644 index 0000000..1336596 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json @@ -0,0 +1,79 @@ +{ + "meta": { + "case_id": "v2-router-general-07-besides-api", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Что тут есть кроме API?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что тут есть кроме API?", + "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 + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что тут есть кроме API?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "тут", + "есть", + "кроме", + "api" + ], + "anchors": { + "entity_names": [ + "API" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md new file mode 100644 index 0000000..72b9d53 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md @@ -0,0 +1,89 @@ +# v2-router-general-07-besides-api + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что тут есть кроме API? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Что тут есть кроме API?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что тут есть кроме API?", + "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 + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что тут есть кроме API?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "тут", + "есть", + "кроме", + "api" + ], + "anchors": { + "entity_names": [ + "API" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-08-components.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-08-components.json new file mode 100644 index 0000000..e7aa4e4 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-08-components.json @@ -0,0 +1,89 @@ +{ + "meta": { + "case_id": "v2-router-general-08-components", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Из чего состоит Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Из чего состоит Telegram Notify App?", + "normalized_query": "Из чего состоит Telegram Notify App?", + "target_terms": [ + "чего", + "состоит", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Из чего состоит Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "чего", + "состоит", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-08-components.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-08-components.md new file mode 100644 index 0000000..8973686 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-08-components.md @@ -0,0 +1,99 @@ +# v2-router-general-08-components + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Из чего состоит Telegram Notify App? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Из чего состоит Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Из чего состоит Telegram Notify App?", + "normalized_query": "Из чего состоит Telegram Notify App?", + "target_terms": [ + "чего", + "состоит", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Из чего состоит Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "чего", + "состоит", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json new file mode 100644 index 0000000..0b62adf --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json @@ -0,0 +1,73 @@ +{ + "meta": { + "case_id": "v2-router-general-09-reading-order", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Какие документы стоит читать сначала?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие документы стоит читать сначала?", + "normalized_query": "Какие документы стоит читать сначала?", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие документы стоит читать сначала?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md new file mode 100644 index 0000000..a246294 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md @@ -0,0 +1,83 @@ +# v2-router-general-09-reading-order + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какие документы стоит читать сначала? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Какие документы стоит читать сначала?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие документы стоит читать сначала?", + "normalized_query": "Какие документы стоит читать сначала?", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие документы стоит читать сначала?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json new file mode 100644 index 0000000..2b70a92 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json @@ -0,0 +1,71 @@ +{ + "meta": { + "case_id": "v2-router-general-10-short-summary", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Дай короткое summary по проектной документации", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Дай короткое summary по проектной документации", + "normalized_query": "Дай короткое summary по проектной документации", + "target_terms": [ + "короткое", + "проектной" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Дай короткое summary по проектной документации" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "короткое", + "проектной" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md new file mode 100644 index 0000000..2df755e --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md @@ -0,0 +1,81 @@ +# v2-router-general-10-short-summary + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Дай короткое summary по проектной документации + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Дай короткое summary по проектной документации", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Дай короткое summary по проектной документации", + "normalized_query": "Дай короткое summary по проектной документации", + "target_terms": [ + "короткое", + "проектной" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Дай короткое summary по проектной документации" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "короткое", + "проектной" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/summary.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/summary.md new file mode 100644 index 0000000..966c540 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_compat/20260407_125007/summary.md @@ -0,0 +1,36 @@ +# pipeline_setup_v4 summary + +Passed: 30/30 + +| Case | Component | Query | Intent | Sub-intent | Pass | +|------|-----------|-------|--------|------------|------| +| v2-router-general-01-what-is-service | process_v2_intent_router | Что это за сервис? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-02-purpose | process_v2_intent_router | Для чего нужен test_echo_app? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-03-problem | process_v2_intent_router | Какую задачу решает это приложение? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-04-docs-contents | process_v2_intent_router | Что входит в документацию этого проекта? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-05-main-parts | process_v2_intent_router | Какие основные части есть у системы? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-06-high-level-architecture | process_v2_intent_router | Как в целом устроено приложение? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-07-besides-api | process_v2_intent_router | Что тут есть кроме API? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-08-components | process_v2_intent_router | Из чего состоит Telegram Notify App? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-general-09-reading-order | process_v2_intent_router | Какие документы стоит читать сначала? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-10-short-summary | process_v2_intent_router | Дай короткое summary по проектной документации | GENERAL_QA | SUMMARY | ✓ | +| v2-router-docs-summary-01-health | process_v2_intent_router | Кратко объясни по документации, как работает `/health` | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-02-send | process_v2_intent_router | Что делает endpoint `/send`? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-03-actions | process_v2_intent_router | Объясни назначение `/actions/{action}` | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-04-runtime-health | process_v2_intent_router | Что такое runtime health в этой документации? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-05-notification-loop | process_v2_intent_router | Кратко опиши цикл отправки уведомлений | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-06-architecture | process_v2_intent_router | Как устроена архитектура Telegram Notify App? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-07-worker | process_v2_intent_router | Что делает worker в этом приложении? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-08-health-statuses | process_v2_intent_router | Какие статусы здоровья есть у runtime? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-09-manual-send | process_v2_intent_router | Как в приложении устроена ручная отправка сообщения? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-10-telegram-integration | process_v2_intent_router | Как сервис взаимодействует с Telegram в целом? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-find-files-01-health | process_v2_intent_router | В каком файле описан `/health`? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-02-send | process_v2_intent_router | Покажи файл с описанием endpoint `/send` | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-03-actions | process_v2_intent_router | Где находится документация по `/actions/{action}`? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-04-runtime-health | process_v2_intent_router | В каком документе описан runtime health? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-05-loop | process_v2_intent_router | Найди файл с логикой цикла отправки уведомлений | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-06-architecture | process_v2_intent_router | Где описана архитектура приложения? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-07-errors-catalog | process_v2_intent_router | В каком файле лежит каталог ошибок? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-08-docs-index | process_v2_intent_router | Покажи файл-индекс документации проекта | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-09-telegram-bot-api | process_v2_intent_router | Какие файлы относятся к Telegram Bot API интеграции? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-10-telegram-notify-worker | process_v2_intent_router | В каких файлах описан worker `telegram_notify`? | DOC_EXPLAIN | FIND_FILES | ✓ | \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json new file mode 100644 index 0000000..7c989bf --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json @@ -0,0 +1,77 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-01-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8800000000000001 + }, + "details": { + "query": "Кратко объясни по документации, как работает `/health`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Кратко объясни по документации, как работает `/health`", + "normalized_query": "Кратко объясни по документации, как работает `/health`", + "target_terms": [ + "/health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко объясни по документации, как работает `/health`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md new file mode 100644 index 0000000..6d17fdf --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md @@ -0,0 +1,87 @@ +# v2-router-docs-summary-01-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Кратко объясни по документации, как работает `/health` + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8800000000000001 +} +``` + +## Details +```json +{ + "query": "Кратко объясни по документации, как работает `/health`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Кратко объясни по документации, как работает `/health`", + "normalized_query": "Кратко объясни по документации, как работает `/health`", + "target_terms": [ + "/health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко объясни по документации, как работает `/health`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json new file mode 100644 index 0000000..4f9dfb9 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json @@ -0,0 +1,77 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-02-send", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8800000000000001 + }, + "details": { + "query": "Что делает endpoint `/send`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает endpoint `/send`?", + "normalized_query": "Что делает endpoint `/send`?", + "target_terms": [ + "/send" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает endpoint `/send`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/send" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md new file mode 100644 index 0000000..83b7d54 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md @@ -0,0 +1,87 @@ +# v2-router-docs-summary-02-send + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что делает endpoint `/send`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8800000000000001 +} +``` + +## Details +```json +{ + "query": "Что делает endpoint `/send`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает endpoint `/send`?", + "normalized_query": "Что делает endpoint `/send`?", + "target_terms": [ + "/send" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает endpoint `/send`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/send" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json new file mode 100644 index 0000000..8612208 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-03-actions", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8800000000000001 + }, + "details": { + "query": "Объясни назначение `/actions/{action}`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Объясни назначение `/actions/{action}`", + "normalized_query": "Объясни назначение `/actions/{action}`", + "target_terms": [ + "/actions/{action}", + "назначение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Объясни назначение `/actions/{action}`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/actions/{action}", + "назначение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md new file mode 100644 index 0000000..742b36f --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md @@ -0,0 +1,93 @@ +# v2-router-docs-summary-03-actions + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Объясни назначение `/actions/{action}` + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8800000000000001 +} +``` + +## Details +```json +{ + "query": "Объясни назначение `/actions/{action}`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Объясни назначение `/actions/{action}`", + "normalized_query": "Объясни назначение `/actions/{action}`", + "target_terms": [ + "/actions/{action}", + "назначение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Объясни назначение `/actions/{action}`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/actions/{action}", + "назначение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json new file mode 100644 index 0000000..7ddb660 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json @@ -0,0 +1,81 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-04-runtime-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Что такое runtime health в этой документации?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что такое runtime health в этой документации?", + "normalized_query": "Что такое runtime health в этой документации?", + "target_terms": [ + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что такое runtime health в этой документации?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md new file mode 100644 index 0000000..e15eace --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md @@ -0,0 +1,91 @@ +# v2-router-docs-summary-04-runtime-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что такое runtime health в этой документации? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Что такое runtime health в этой документации?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что такое runtime health в этой документации?", + "normalized_query": "Что такое runtime health в этой документации?", + "target_terms": [ + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что такое runtime health в этой документации?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json new file mode 100644 index 0000000..ad7f0c4 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-05-notification-loop", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Кратко опиши цикл отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Кратко опиши цикл отправки уведомлений", + "normalized_query": "Кратко опиши цикл отправки уведомлений", + "target_terms": [ + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notify-loop" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко опиши цикл отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notify-loop" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md new file mode 100644 index 0000000..c1d9844 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md @@ -0,0 +1,93 @@ +# v2-router-docs-summary-05-notification-loop + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Кратко опиши цикл отправки уведомлений + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Кратко опиши цикл отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Кратко опиши цикл отправки уведомлений", + "normalized_query": "Кратко опиши цикл отправки уведомлений", + "target_terms": [ + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notify-loop" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко опиши цикл отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notify-loop" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json new file mode 100644 index 0000000..7821918 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json @@ -0,0 +1,93 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-06-architecture", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Как устроена архитектура Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как устроена архитектура Telegram Notify App?", + "normalized_query": "Как устроена архитектура Telegram Notify App?", + "target_terms": [ + "устроена", + "архитектура", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как устроена архитектура Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "устроена", + "архитектура", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md new file mode 100644 index 0000000..18d5da5 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md @@ -0,0 +1,103 @@ +# v2-router-docs-summary-06-architecture + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Как устроена архитектура Telegram Notify App? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Как устроена архитектура Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как устроена архитектура Telegram Notify App?", + "normalized_query": "Как устроена архитектура Telegram Notify App?", + "target_terms": [ + "устроена", + "архитектура", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как устроена архитектура Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "устроена", + "архитектура", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json new file mode 100644 index 0000000..55a9191 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json @@ -0,0 +1,77 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-07-worker", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Что делает worker в этом приложении?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает worker в этом приложении?", + "normalized_query": "Что делает worker в этом приложении?", + "target_terms": [ + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает worker в этом приложении?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md new file mode 100644 index 0000000..421bafd --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md @@ -0,0 +1,87 @@ +# v2-router-docs-summary-07-worker + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что делает worker в этом приложении? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Что делает worker в этом приложении?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает worker в этом приложении?", + "normalized_query": "Что делает worker в этом приложении?", + "target_terms": [ + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает worker в этом приложении?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json new file mode 100644 index 0000000..dc2e465 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json @@ -0,0 +1,81 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-08-health-statuses", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Какие статусы здоровья есть у runtime?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Какие статусы здоровья есть у runtime?", + "normalized_query": "Какие статусы здоровья есть у runtime?", + "target_terms": [ + "статусы", + "здоровья", + "runtime" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие статусы здоровья есть у runtime?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "статусы", + "здоровья", + "runtime" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md new file mode 100644 index 0000000..bfcf2cc --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md @@ -0,0 +1,91 @@ +# v2-router-docs-summary-08-health-statuses + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какие статусы здоровья есть у runtime? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Какие статусы здоровья есть у runtime?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Какие статусы здоровья есть у runtime?", + "normalized_query": "Какие статусы здоровья есть у runtime?", + "target_terms": [ + "статусы", + "здоровья", + "runtime" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие статусы здоровья есть у runtime?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "статусы", + "здоровья", + "runtime" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json new file mode 100644 index 0000000..bc2ffd0 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json @@ -0,0 +1,85 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-09-manual-send", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Как в приложении устроена ручная отправка сообщения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как в приложении устроена ручная отправка сообщения?", + "normalized_query": "Как в приложении устроена ручная отправка сообщения?", + "target_terms": [ + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в приложении устроена ручная отправка сообщения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md new file mode 100644 index 0000000..b658419 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md @@ -0,0 +1,95 @@ +# v2-router-docs-summary-09-manual-send + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Как в приложении устроена ручная отправка сообщения? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Как в приложении устроена ручная отправка сообщения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как в приложении устроена ручная отправка сообщения?", + "normalized_query": "Как в приложении устроена ручная отправка сообщения?", + "target_terms": [ + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в приложении устроена ручная отправка сообщения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json new file mode 100644 index 0000000..133f00c --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json @@ -0,0 +1,79 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-10-telegram-integration", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 + }, + "details": { + "query": "Как сервис взаимодействует с Telegram в целом?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как сервис взаимодействует с Telegram в целом?", + "normalized_query": "Как сервис взаимодействует с Telegram в целом?", + "target_terms": [ + "сервис", + "взаимодействует", + "telegram", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как сервис взаимодействует с Telegram в целом?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "сервис", + "взаимодействует", + "telegram", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md new file mode 100644 index 0000000..77df245 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md @@ -0,0 +1,89 @@ +# v2-router-docs-summary-10-telegram-integration + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Как сервис взаимодействует с Telegram в целом? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 +} +``` + +## Details +```json +{ + "query": "Как сервис взаимодействует с Telegram в целом?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как сервис взаимодействует с Telegram в целом?", + "normalized_query": "Как сервис взаимодействует с Telegram в целом?", + "target_terms": [ + "сервис", + "взаимодействует", + "telegram", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как сервис взаимодействует с Telegram в целом?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "сервис", + "взаимодействует", + "telegram", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-01-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-01-health.json new file mode 100644 index 0000000..4353690 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-01-health.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v2-router-find-files-01-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 + }, + "details": { + "query": "В каком файле описан `/health`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле описан `/health`?", + "normalized_query": "В каком файле описан `/health`?", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле описан `/health`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-01-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-01-health.md new file mode 100644 index 0000000..cc44e90 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-01-health.md @@ -0,0 +1,93 @@ +# v2-router-find-files-01-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каком файле описан `/health`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 +} +``` + +## Details +```json +{ + "query": "В каком файле описан `/health`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле описан `/health`?", + "normalized_query": "В каком файле описан `/health`?", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле описан `/health`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-02-send.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-02-send.json new file mode 100644 index 0000000..fbb207f --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-02-send.json @@ -0,0 +1,79 @@ +{ + "meta": { + "case_id": "v2-router-find-files-02-send", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 + }, + "details": { + "query": "Покажи файл с описанием endpoint `/send`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл с описанием endpoint `/send`", + "normalized_query": "Покажи файл с описанием endpoint `/send`", + "target_terms": [ + "/send", + "описанием" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл с описанием endpoint `/send`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/send", + "описанием" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-02-send.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-02-send.md new file mode 100644 index 0000000..6b3c64a --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-02-send.md @@ -0,0 +1,89 @@ +# v2-router-find-files-02-send + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Покажи файл с описанием endpoint `/send` + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 +} +``` + +## Details +```json +{ + "query": "Покажи файл с описанием endpoint `/send`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл с описанием endpoint `/send`", + "normalized_query": "Покажи файл с описанием endpoint `/send`", + "target_terms": [ + "/send", + "описанием" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл с описанием endpoint `/send`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/send", + "описанием" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json new file mode 100644 index 0000000..0eb1e76 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v2-router-find-files-03-actions", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 + }, + "details": { + "query": "Где находится документация по `/actions/{action}`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где находится документация по `/actions/{action}`?", + "normalized_query": "Где находится документация по `/actions/{action}`?", + "target_terms": [ + "/actions/{action}", + "находится" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где находится документация по `/actions/{action}`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/actions/{action}", + "находится" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md new file mode 100644 index 0000000..62a7292 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md @@ -0,0 +1,93 @@ +# v2-router-find-files-03-actions + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Где находится документация по `/actions/{action}`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 +} +``` + +## Details +```json +{ + "query": "Где находится документация по `/actions/{action}`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где находится документация по `/actions/{action}`?", + "normalized_query": "Где находится документация по `/actions/{action}`?", + "target_terms": [ + "/actions/{action}", + "находится" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где находится документация по `/actions/{action}`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/actions/{action}", + "находится" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json new file mode 100644 index 0000000..40de3ef --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json @@ -0,0 +1,85 @@ +{ + "meta": { + "case_id": "v2-router-find-files-04-runtime-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 + }, + "details": { + "query": "В каком документе описан runtime health?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком документе описан runtime health?", + "normalized_query": "В каком документе описан runtime health?", + "target_terms": [ + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком документе описан runtime health?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md new file mode 100644 index 0000000..1dfe736 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md @@ -0,0 +1,95 @@ +# v2-router-find-files-04-runtime-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каком документе описан runtime health? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 +} +``` + +## Details +```json +{ + "query": "В каком документе описан runtime health?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком документе описан runtime health?", + "normalized_query": "В каком документе описан runtime health?", + "target_terms": [ + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком документе описан runtime health?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json new file mode 100644 index 0000000..bf38dab --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json @@ -0,0 +1,79 @@ +{ + "meta": { + "case_id": "v2-router-find-files-05-loop", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 + }, + "details": { + "query": "Найди файл с логикой цикла отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Найди файл с логикой цикла отправки уведомлений", + "normalized_query": "Найди файл с логикой цикла отправки уведомлений", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Найди файл с логикой цикла отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md new file mode 100644 index 0000000..47a101f --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md @@ -0,0 +1,89 @@ +# v2-router-find-files-05-loop + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Найди файл с логикой цикла отправки уведомлений + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 +} +``` + +## Details +```json +{ + "query": "Найди файл с логикой цикла отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Найди файл с логикой цикла отправки уведомлений", + "normalized_query": "Найди файл с логикой цикла отправки уведомлений", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Найди файл с логикой цикла отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json new file mode 100644 index 0000000..48e96de --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json @@ -0,0 +1,81 @@ +{ + "meta": { + "case_id": "v2-router-find-files-06-architecture", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 + }, + "details": { + "query": "Где описана архитектура приложения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где описана архитектура приложения?", + "normalized_query": "Где описана архитектура приложения?", + "target_terms": [ + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где описана архитектура приложения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md new file mode 100644 index 0000000..d2e2182 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md @@ -0,0 +1,91 @@ +# v2-router-find-files-06-architecture + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Где описана архитектура приложения? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 +} +``` + +## Details +```json +{ + "query": "Где описана архитектура приложения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где описана архитектура приложения?", + "normalized_query": "Где описана архитектура приложения?", + "target_terms": [ + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где описана архитектура приложения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json new file mode 100644 index 0000000..7e02ad0 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json @@ -0,0 +1,85 @@ +{ + "meta": { + "case_id": "v2-router-find-files-07-errors-catalog", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 + }, + "details": { + "query": "В каком файле лежит каталог ошибок?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле лежит каталог ошибок?", + "normalized_query": "В каком файле лежит каталог ошибок?", + "target_terms": [ + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "errors_catalog" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле лежит каталог ошибок?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "errors_catalog" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md new file mode 100644 index 0000000..9cb49d4 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md @@ -0,0 +1,95 @@ +# v2-router-find-files-07-errors-catalog + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каком файле лежит каталог ошибок? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 +} +``` + +## Details +```json +{ + "query": "В каком файле лежит каталог ошибок?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле лежит каталог ошибок?", + "normalized_query": "В каком файле лежит каталог ошибок?", + "target_terms": [ + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "errors_catalog" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле лежит каталог ошибок?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "errors_catalog" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json new file mode 100644 index 0000000..30ab76f --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json @@ -0,0 +1,79 @@ +{ + "meta": { + "case_id": "v2-router-find-files-08-docs-index", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 + }, + "details": { + "query": "Покажи файл-индекс документации проекта", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл-индекс документации проекта", + "normalized_query": "Покажи файл-индекс документации проекта", + "target_terms": [ + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs_index" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл-индекс документации проекта" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs_index" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md new file mode 100644 index 0000000..bd52df0 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md @@ -0,0 +1,89 @@ +# v2-router-find-files-08-docs-index + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Покажи файл-индекс документации проекта + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 +} +``` + +## Details +```json +{ + "query": "Покажи файл-индекс документации проекта", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл-индекс документации проекта", + "normalized_query": "Покажи файл-индекс документации проекта", + "target_terms": [ + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs_index" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл-индекс документации проекта" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs_index" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json new file mode 100644 index 0000000..10f692c --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json @@ -0,0 +1,85 @@ +{ + "meta": { + "case_id": "v2-router-find-files-09-telegram-bot-api", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8800000000000001 + }, + "details": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "normalized_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "target_terms": [ + "относятся", + "telegram", + "bot", + "api", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "относятся", + "telegram", + "bot", + "api", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md new file mode 100644 index 0000000..bc25ac2 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md @@ -0,0 +1,95 @@ +# v2-router-find-files-09-telegram-bot-api + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какие файлы относятся к Telegram Bot API интеграции? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8800000000000001 +} +``` + +## Details +```json +{ + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "normalized_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "target_terms": [ + "относятся", + "telegram", + "bot", + "api", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "относятся", + "telegram", + "bot", + "api", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json new file mode 100644 index 0000000..901cd5d --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json @@ -0,0 +1,81 @@ +{ + "meta": { + "case_id": "v2-router-find-files-10-telegram-notify-worker", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 + }, + "details": { + "query": "В каких файлах описан worker `telegram_notify`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каких файлах описан worker `telegram_notify`?", + "normalized_query": "В каких файлах описан worker `telegram_notify`?", + "target_terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каких файлах описан worker `telegram_notify`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md new file mode 100644 index 0000000..72a7da6 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md @@ -0,0 +1,91 @@ +# v2-router-find-files-10-telegram-notify-worker + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каких файлах описан worker `telegram_notify`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 +} +``` + +## Details +```json +{ + "query": "В каких файлах описан worker `telegram_notify`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каких файлах описан worker `telegram_notify`?", + "normalized_query": "В каких файлах описан worker `telegram_notify`?", + "target_terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каких файлах описан worker `telegram_notify`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json new file mode 100644 index 0000000..2a7445a --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json @@ -0,0 +1,69 @@ +{ + "meta": { + "case_id": "v2-router-general-01-what-is-service", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.7300000000000001 + }, + "details": { + "query": "Что это за сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что это за сервис?", + "normalized_query": "Что это за сервис?", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.7300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что это за сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md new file mode 100644 index 0000000..4b09b55 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md @@ -0,0 +1,79 @@ +# v2-router-general-01-what-is-service + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что это за сервис? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.7300000000000001 +} +``` + +## Details +```json +{ + "query": "Что это за сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что это за сервис?", + "normalized_query": "Что это за сервис?", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.7300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что это за сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-02-purpose.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-02-purpose.json new file mode 100644 index 0000000..1d8f479 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-02-purpose.json @@ -0,0 +1,73 @@ +{ + "meta": { + "case_id": "v2-router-general-02-purpose", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 + }, + "details": { + "query": "Для чего нужен test_echo_app?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Для чего нужен test_echo_app?", + "normalized_query": "Для чего нужен test_echo_app?", + "target_terms": [ + "test_echo_app", + "чего", + "нужен" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Для чего нужен test_echo_app?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "test_echo_app", + "чего", + "нужен" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-02-purpose.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-02-purpose.md new file mode 100644 index 0000000..3bb6f54 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-02-purpose.md @@ -0,0 +1,83 @@ +# v2-router-general-02-purpose + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Для чего нужен test_echo_app? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 +} +``` + +## Details +```json +{ + "query": "Для чего нужен test_echo_app?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Для чего нужен test_echo_app?", + "normalized_query": "Для чего нужен test_echo_app?", + "target_terms": [ + "test_echo_app", + "чего", + "нужен" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Для чего нужен test_echo_app?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "test_echo_app", + "чего", + "нужен" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-03-problem.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-03-problem.json new file mode 100644 index 0000000..015580b --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-03-problem.json @@ -0,0 +1,75 @@ +{ + "meta": { + "case_id": "v2-router-general-03-problem", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 + }, + "details": { + "query": "Какую задачу решает это приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какую задачу решает это приложение?", + "normalized_query": "Какую задачу решает это приложение?", + "target_terms": [ + "какую", + "задачу", + "решает", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какую задачу решает это приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "какую", + "задачу", + "решает", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-03-problem.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-03-problem.md new file mode 100644 index 0000000..c7c182d --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-03-problem.md @@ -0,0 +1,85 @@ +# v2-router-general-03-problem + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какую задачу решает это приложение? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 +} +``` + +## Details +```json +{ + "query": "Какую задачу решает это приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какую задачу решает это приложение?", + "normalized_query": "Какую задачу решает это приложение?", + "target_terms": [ + "какую", + "задачу", + "решает", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какую задачу решает это приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "какую", + "задачу", + "решает", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json new file mode 100644 index 0000000..530abcb --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json @@ -0,0 +1,73 @@ +{ + "meta": { + "case_id": "v2-router-general-04-docs-contents", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 + }, + "details": { + "query": "Что входит в документацию этого проекта?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что входит в документацию этого проекта?", + "normalized_query": "Что входит в документацию этого проекта?", + "target_terms": [ + "входит", + "документацию", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что входит в документацию этого проекта?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "входит", + "документацию", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md new file mode 100644 index 0000000..c2fbaf0 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md @@ -0,0 +1,83 @@ +# v2-router-general-04-docs-contents + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что входит в документацию этого проекта? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 +} +``` + +## Details +```json +{ + "query": "Что входит в документацию этого проекта?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что входит в документацию этого проекта?", + "normalized_query": "Что входит в документацию этого проекта?", + "target_terms": [ + "входит", + "документацию", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что входит в документацию этого проекта?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "входит", + "документацию", + "проекта" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json new file mode 100644 index 0000000..c19325f --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json @@ -0,0 +1,73 @@ +{ + "meta": { + "case_id": "v2-router-general-05-main-parts", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 + }, + "details": { + "query": "Какие основные части есть у системы?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие основные части есть у системы?", + "normalized_query": "Какие основные части есть у системы?", + "target_terms": [ + "основные", + "части", + "системы" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие основные части есть у системы?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "основные", + "части", + "системы" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md new file mode 100644 index 0000000..dd6e2ef --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md @@ -0,0 +1,83 @@ +# v2-router-general-05-main-parts + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какие основные части есть у системы? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 +} +``` + +## Details +```json +{ + "query": "Какие основные части есть у системы?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие основные части есть у системы?", + "normalized_query": "Какие основные части есть у системы?", + "target_terms": [ + "основные", + "части", + "системы" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие основные части есть у системы?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "основные", + "части", + "системы" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json new file mode 100644 index 0000000..ec496b3 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json @@ -0,0 +1,73 @@ +{ + "meta": { + "case_id": "v2-router-general-06-high-level-architecture", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 + }, + "details": { + "query": "Как в целом устроено приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как в целом устроено приложение?", + "normalized_query": "Как в целом устроено приложение?", + "target_terms": [ + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в целом устроено приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md new file mode 100644 index 0000000..c72e3f8 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md @@ -0,0 +1,83 @@ +# v2-router-general-06-high-level-architecture + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Как в целом устроено приложение? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 +} +``` + +## Details +```json +{ + "query": "Как в целом устроено приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как в целом устроено приложение?", + "normalized_query": "Как в целом устроено приложение?", + "target_terms": [ + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в целом устроено приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json new file mode 100644 index 0000000..edb215e --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json @@ -0,0 +1,75 @@ +{ + "meta": { + "case_id": "v2-router-general-07-besides-api", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 + }, + "details": { + "query": "Что тут есть кроме API?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что тут есть кроме API?", + "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 + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что тут есть кроме API?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "кроме", + "api" + ], + "anchors": { + "entity_names": [ + "API" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md new file mode 100644 index 0000000..de030b2 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md @@ -0,0 +1,85 @@ +# v2-router-general-07-besides-api + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что тут есть кроме API? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 +} +``` + +## Details +```json +{ + "query": "Что тут есть кроме API?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что тут есть кроме API?", + "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 + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что тут есть кроме API?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "кроме", + "api" + ], + "anchors": { + "entity_names": [ + "API" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-08-components.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-08-components.json new file mode 100644 index 0000000..e7aa4e4 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-08-components.json @@ -0,0 +1,89 @@ +{ + "meta": { + "case_id": "v2-router-general-08-components", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Из чего состоит Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Из чего состоит Telegram Notify App?", + "normalized_query": "Из чего состоит Telegram Notify App?", + "target_terms": [ + "чего", + "состоит", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Из чего состоит Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "чего", + "состоит", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-08-components.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-08-components.md new file mode 100644 index 0000000..8973686 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-08-components.md @@ -0,0 +1,99 @@ +# v2-router-general-08-components + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Из чего состоит Telegram Notify App? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Из чего состоит Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Из чего состоит Telegram Notify App?", + "normalized_query": "Из чего состоит Telegram Notify App?", + "target_terms": [ + "чего", + "состоит", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Из чего состоит Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "чего", + "состоит", + "telegram", + "notify", + "app" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json new file mode 100644 index 0000000..ecd9d97 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json @@ -0,0 +1,73 @@ +{ + "meta": { + "case_id": "v2-router-general-09-reading-order", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 + }, + "details": { + "query": "Какие документы стоит читать сначала?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие документы стоит читать сначала?", + "normalized_query": "Какие документы стоит читать сначала?", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие документы стоит читать сначала?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md new file mode 100644 index 0000000..48cdf2e --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md @@ -0,0 +1,83 @@ +# v2-router-general-09-reading-order + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какие документы стоит читать сначала? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 +} +``` + +## Details +```json +{ + "query": "Какие документы стоит читать сначала?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие документы стоит читать сначала?", + "normalized_query": "Какие документы стоит читать сначала?", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие документы стоит читать сначала?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json new file mode 100644 index 0000000..ab2692c --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json @@ -0,0 +1,71 @@ +{ + "meta": { + "case_id": "v2-router-general-10-short-summary", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 + }, + "details": { + "query": "Дай короткое summary по проектной документации", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Дай короткое summary по проектной документации", + "normalized_query": "Дай короткое summary по проектной документации", + "target_terms": [ + "короткое", + "проектной" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Дай короткое summary по проектной документации" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "короткое", + "проектной" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md new file mode 100644 index 0000000..c874c73 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md @@ -0,0 +1,81 @@ +# v2-router-general-10-short-summary + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Дай короткое summary по проектной документации + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 +} +``` + +## Details +```json +{ + "query": "Дай короткое summary по проектной документации", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Дай короткое summary по проектной документации", + "normalized_query": "Дай короткое summary по проектной документации", + "target_terms": [ + "короткое", + "проектной" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Дай короткое summary по проектной документации" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "короткое", + "проектной" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/summary.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/summary.md new file mode 100644 index 0000000..966c540 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_postfix_compat/20260407_125827/summary.md @@ -0,0 +1,36 @@ +# pipeline_setup_v4 summary + +Passed: 30/30 + +| Case | Component | Query | Intent | Sub-intent | Pass | +|------|-----------|-------|--------|------------|------| +| v2-router-general-01-what-is-service | process_v2_intent_router | Что это за сервис? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-02-purpose | process_v2_intent_router | Для чего нужен test_echo_app? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-03-problem | process_v2_intent_router | Какую задачу решает это приложение? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-04-docs-contents | process_v2_intent_router | Что входит в документацию этого проекта? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-05-main-parts | process_v2_intent_router | Какие основные части есть у системы? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-06-high-level-architecture | process_v2_intent_router | Как в целом устроено приложение? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-07-besides-api | process_v2_intent_router | Что тут есть кроме API? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-08-components | process_v2_intent_router | Из чего состоит Telegram Notify App? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-general-09-reading-order | process_v2_intent_router | Какие документы стоит читать сначала? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-10-short-summary | process_v2_intent_router | Дай короткое summary по проектной документации | GENERAL_QA | SUMMARY | ✓ | +| v2-router-docs-summary-01-health | process_v2_intent_router | Кратко объясни по документации, как работает `/health` | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-02-send | process_v2_intent_router | Что делает endpoint `/send`? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-03-actions | process_v2_intent_router | Объясни назначение `/actions/{action}` | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-04-runtime-health | process_v2_intent_router | Что такое runtime health в этой документации? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-05-notification-loop | process_v2_intent_router | Кратко опиши цикл отправки уведомлений | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-06-architecture | process_v2_intent_router | Как устроена архитектура Telegram Notify App? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-07-worker | process_v2_intent_router | Что делает worker в этом приложении? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-08-health-statuses | process_v2_intent_router | Какие статусы здоровья есть у runtime? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-09-manual-send | process_v2_intent_router | Как в приложении устроена ручная отправка сообщения? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-10-telegram-integration | process_v2_intent_router | Как сервис взаимодействует с Telegram в целом? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-find-files-01-health | process_v2_intent_router | В каком файле описан `/health`? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-02-send | process_v2_intent_router | Покажи файл с описанием endpoint `/send` | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-03-actions | process_v2_intent_router | Где находится документация по `/actions/{action}`? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-04-runtime-health | process_v2_intent_router | В каком документе описан runtime health? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-05-loop | process_v2_intent_router | Найди файл с логикой цикла отправки уведомлений | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-06-architecture | process_v2_intent_router | Где описана архитектура приложения? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-07-errors-catalog | process_v2_intent_router | В каком файле лежит каталог ошибок? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-08-docs-index | process_v2_intent_router | Покажи файл-индекс документации проекта | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-09-telegram-bot-api | process_v2_intent_router | Какие файлы относятся к Telegram Bot API интеграции? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-10-telegram-notify-worker | process_v2_intent_router | В каких файлах описан worker `telegram_notify`? | DOC_EXPLAIN | FIND_FILES | ✓ | \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-01-endpoint.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-01-endpoint.json new file mode 100644 index 0000000..74dc15a --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-01-endpoint.json @@ -0,0 +1,77 @@ +{ + "meta": { + "case_id": "v3-docs-summary-01-endpoint", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8800000000000001 + }, + "details": { + "query": "Объясни по документации endpoint `/health`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Объясни по документации endpoint `/health`", + "normalized_query": "Объясни по документации endpoint `/health`", + "target_terms": [ + "/health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Объясни по документации endpoint `/health`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-01-endpoint.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-01-endpoint.md new file mode 100644 index 0000000..2a190d5 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-01-endpoint.md @@ -0,0 +1,87 @@ +# v3-docs-summary-01-endpoint + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Объясни по документации endpoint `/health` + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8800000000000001 +} +``` + +## Details +```json +{ + "query": "Объясни по документации endpoint `/health`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Объясни по документации endpoint `/health`", + "normalized_query": "Объясни по документации endpoint `/health`", + "target_terms": [ + "/health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Объясни по документации endpoint `/health`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-02-architecture.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-02-architecture.json new file mode 100644 index 0000000..2a57176 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-02-architecture.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v3-docs-summary-02-architecture", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Как устроена архитектура приложения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как устроена архитектура приложения?", + "normalized_query": "Как устроена архитектура приложения?", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как устроена архитектура приложения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-02-architecture.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-02-architecture.md new file mode 100644 index 0000000..19bd099 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-02-architecture.md @@ -0,0 +1,93 @@ +# v3-docs-summary-02-architecture + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Как устроена архитектура приложения? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Как устроена архитектура приложения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как устроена архитектура приложения?", + "normalized_query": "Как устроена архитектура приложения?", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как устроена архитектура приложения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-03-process.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-03-process.json new file mode 100644 index 0000000..fe982bd --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-03-process.json @@ -0,0 +1,75 @@ +{ + "meta": { + "case_id": "v3-docs-summary-03-process", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 + }, + "details": { + "query": "Опиши процесс отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Опиши процесс отправки уведомлений", + "normalized_query": "Опиши процесс отправки уведомлений", + "target_terms": [ + "опиши", + "процесс", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Опиши процесс отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "опиши", + "процесс", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-03-process.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-03-process.md new file mode 100644 index 0000000..cb54efa --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-03-process.md @@ -0,0 +1,85 @@ +# v3-docs-summary-03-process + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Опиши процесс отправки уведомлений + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 +} +``` + +## Details +```json +{ + "query": "Опиши процесс отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Опиши процесс отправки уведомлений", + "normalized_query": "Опиши процесс отправки уведомлений", + "target_terms": [ + "опиши", + "процесс", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Опиши процесс отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "опиши", + "процесс", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-04-entity.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-04-entity.json new file mode 100644 index 0000000..e6948f5 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-04-entity.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v3-docs-summary-04-entity", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Что такое runtime health в документации?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что такое runtime health в документации?", + "normalized_query": "Что такое runtime health в документации?", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что такое runtime health в документации?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-04-entity.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-04-entity.md new file mode 100644 index 0000000..aa95a4b --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-docs-summary-04-entity.md @@ -0,0 +1,93 @@ +# v3-docs-summary-04-entity + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Что такое runtime health в документации? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Что такое runtime health в документации?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что такое runtime health в документации?", + "normalized_query": "Что такое runtime health в документации?", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что такое runtime health в документации?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-01-which-file.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-01-which-file.json new file mode 100644 index 0000000..1473439 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-01-which-file.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v3-find-files-01-which-file", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 + }, + "details": { + "query": "В каком файле описан `/health`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле описан `/health`?", + "normalized_query": "В каком файле описан `/health`?", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле описан `/health`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-01-which-file.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-01-which-file.md new file mode 100644 index 0000000..c3e030c --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-01-which-file.md @@ -0,0 +1,93 @@ +# v3-find-files-01-which-file + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +В каком файле описан `/health`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 +} +``` + +## Details +```json +{ + "query": "В каком файле описан `/health`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле описан `/health`?", + "normalized_query": "В каком файле описан `/health`?", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле описан `/health`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-02-show-doc.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-02-show-doc.json new file mode 100644 index 0000000..774eadc --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-02-show-doc.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v3-find-files-02-show-doc", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 + }, + "details": { + "query": "Покажи документ про runtime health", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи документ про runtime health", + "normalized_query": "Покажи документ про runtime health", + "target_terms": [ + "runtime_health", + "про", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи документ про runtime health" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "runtime_health", + "про", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-02-show-doc.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-02-show-doc.md new file mode 100644 index 0000000..12d9de3 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-02-show-doc.md @@ -0,0 +1,93 @@ +# v3-find-files-02-show-doc + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Покажи документ про runtime health + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 +} +``` + +## Details +```json +{ + "query": "Покажи документ про runtime health", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи документ про runtime health", + "normalized_query": "Покажи документ про runtime health", + "target_terms": [ + "runtime_health", + "про", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи документ про runtime health" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "runtime_health", + "про", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-03-where-described.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-03-where-described.json new file mode 100644 index 0000000..2680d84 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-03-where-described.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v3-find-files-03-where-described", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8800000000000001 + }, + "details": { + "query": "Где описано `docs/architecture/overview.md`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где описано `docs/architecture/overview.md`?", + "normalized_query": "Где описано `docs/architecture/overview.md`?", + "target_terms": [ + "architecture_overview", + "описано" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "docs/architecture/overview.md" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где описано `docs/architecture/overview.md`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "architecture_overview", + "описано" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "docs/architecture/overview.md" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-03-where-described.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-03-where-described.md new file mode 100644 index 0000000..5074f19 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-find-files-03-where-described.md @@ -0,0 +1,93 @@ +# v3-find-files-03-where-described + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Где описано `docs/architecture/overview.md`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8800000000000001 +} +``` + +## Details +```json +{ + "query": "Где описано `docs/architecture/overview.md`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где описано `docs/architecture/overview.md`?", + "normalized_query": "Где описано `docs/architecture/overview.md`?", + "target_terms": [ + "architecture_overview", + "описано" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "docs/architecture/overview.md" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где описано `docs/architecture/overview.md`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "architecture_overview", + "описано" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "docs/architecture/overview.md" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-01-overview.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-01-overview.json new file mode 100644 index 0000000..6c2877d --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-01-overview.json @@ -0,0 +1,73 @@ +{ + "meta": { + "case_id": "v3-general-01-overview", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.7300000000000001 + }, + "details": { + "query": "Общий обзор сервиса", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Общий обзор сервиса", + "normalized_query": "Общий обзор сервиса", + "target_terms": [ + "общий", + "обзор", + "сервиса" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.7300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Общий обзор сервиса" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "общий", + "обзор", + "сервиса" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-01-overview.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-01-overview.md new file mode 100644 index 0000000..1a8372c --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-01-overview.md @@ -0,0 +1,83 @@ +# v3-general-01-overview + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Общий обзор сервиса + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.7300000000000001 +} +``` + +## Details +```json +{ + "query": "Общий обзор сервиса", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Общий обзор сервиса", + "normalized_query": "Общий обзор сервиса", + "target_terms": [ + "общий", + "обзор", + "сервиса" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.7300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Общий обзор сервиса" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "общий", + "обзор", + "сервиса" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-02-what-is-service.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-02-what-is-service.json new file mode 100644 index 0000000..26d33e6 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-02-what-is-service.json @@ -0,0 +1,69 @@ +{ + "meta": { + "case_id": "v3-general-02-what-is-service", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.7300000000000001 + }, + "details": { + "query": "Что это за сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что это за сервис?", + "normalized_query": "Что это за сервис?", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.7300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что это за сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-02-what-is-service.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-02-what-is-service.md new file mode 100644 index 0000000..1f3ce10 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-02-what-is-service.md @@ -0,0 +1,79 @@ +# v3-general-02-what-is-service + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Что это за сервис? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.7300000000000001 +} +``` + +## Details +```json +{ + "query": "Что это за сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что это за сервис?", + "normalized_query": "Что это за сервис?", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.7300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что это за сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-03-purpose.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-03-purpose.json new file mode 100644 index 0000000..9cbced6 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-03-purpose.json @@ -0,0 +1,73 @@ +{ + "meta": { + "case_id": "v3-general-03-purpose", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 + }, + "details": { + "query": "Для чего нужен этот сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Для чего нужен этот сервис?", + "normalized_query": "Для чего нужен этот сервис?", + "target_terms": [ + "чего", + "нужен", + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Для чего нужен этот сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "чего", + "нужен", + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-03-purpose.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-03-purpose.md new file mode 100644 index 0000000..d21bc3e --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-general-03-purpose.md @@ -0,0 +1,83 @@ +# v3-general-03-purpose + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Для чего нужен этот сервис? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 +} +``` + +## Details +```json +{ + "query": "Для чего нужен этот сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Для чего нужен этот сервис?", + "normalized_query": "Для чего нужен этот сервис?", + "target_terms": [ + "чего", + "нужен", + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Для чего нужен этот сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "чего", + "нужен", + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-01-operational.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-01-operational.json new file mode 100644 index 0000000..79e9d03 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-01-operational.json @@ -0,0 +1,77 @@ +{ + "meta": { + "case_id": "v3-negative-01-operational", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 + }, + "details": { + "query": "Почему у меня сейчас упал деплой?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Почему у меня сейчас упал деплой?", + "normalized_query": "Почему у меня сейчас упал деплой?", + "target_terms": [ + "почему", + "меня", + "сейчас", + "упал", + "деплой" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Почему у меня сейчас упал деплой?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "почему", + "меня", + "сейчас", + "упал", + "деплой" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-01-operational.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-01-operational.md new file mode 100644 index 0000000..cb7720c --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-01-operational.md @@ -0,0 +1,87 @@ +# v3-negative-01-operational + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Почему у меня сейчас упал деплой? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 +} +``` + +## Details +```json +{ + "query": "Почему у меня сейчас упал деплой?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Почему у меня сейчас упал деплой?", + "normalized_query": "Почему у меня сейчас упал деплой?", + "target_terms": [ + "почему", + "меня", + "сейчас", + "упал", + "деплой" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Почему у меня сейчас упал деплой?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "почему", + "меня", + "сейчас", + "упал", + "деплой" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-02-meta.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-02-meta.json new file mode 100644 index 0000000..f1145a1 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-02-meta.json @@ -0,0 +1,71 @@ +{ + "meta": { + "case_id": "v3-negative-02-meta", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 + }, + "details": { + "query": "Как ты выбираешь маршрут?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как ты выбираешь маршрут?", + "normalized_query": "Как ты выбираешь маршрут?", + "target_terms": [ + "выбираешь", + "маршрут" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как ты выбираешь маршрут?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "выбираешь", + "маршрут" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-02-meta.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-02-meta.md new file mode 100644 index 0000000..ed21532 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-02-meta.md @@ -0,0 +1,81 @@ +# v3-negative-02-meta + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Как ты выбираешь маршрут? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 +} +``` + +## Details +```json +{ + "query": "Как ты выбираешь маршрут?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как ты выбираешь маршрут?", + "normalized_query": "Как ты выбираешь маршрут?", + "target_terms": [ + "выбираешь", + "маршрут" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как ты выбираешь маршрут?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "выбираешь", + "маршрут" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-03-non-docs.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-03-non-docs.json new file mode 100644 index 0000000..cf49152 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-03-non-docs.json @@ -0,0 +1,75 @@ +{ + "meta": { + "case_id": "v3-negative-03-non-docs", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 + }, + "details": { + "query": "Сколько сейчас времени на сервере?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Сколько сейчас времени на сервере?", + "normalized_query": "Сколько сейчас времени на сервере?", + "target_terms": [ + "сколько", + "сейчас", + "времени", + "сервере" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Сколько сейчас времени на сервере?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "сколько", + "сейчас", + "времени", + "сервере" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-03-non-docs.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-03-non-docs.md new file mode 100644 index 0000000..6bf263d --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-negative-03-non-docs.md @@ -0,0 +1,85 @@ +# v3-negative-03-non-docs + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Сколько сейчас времени на сервере? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.8300000000000001 +} +``` + +## Details +```json +{ + "query": "Сколько сейчас времени на сервере?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Сколько сейчас времени на сервере?", + "normalized_query": "Сколько сейчас времени на сервере?", + "target_terms": [ + "сколько", + "сейчас", + "времени", + "сервере" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.8300000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Сколько сейчас времени на сервере?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "сколько", + "сейчас", + "времени", + "сервере" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-01-colloquial.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-01-colloquial.json new file mode 100644 index 0000000..adacddb --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-01-colloquial.json @@ -0,0 +1,87 @@ +{ + "meta": { + "case_id": "v3-noisy-01-colloquial", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 + }, + "details": { + "query": "Где там дока про health, покажи плз", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где там дока про health, покажи плз", + "normalized_query": "Где там дока про health, покажи плз", + "target_terms": [ + "/health", + "там", + "дока", + "про", + "health", + "плз" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где там дока про health, покажи плз" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/health", + "там", + "дока", + "про", + "health", + "плз" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-01-colloquial.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-01-colloquial.md new file mode 100644 index 0000000..cc51cf6 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-01-colloquial.md @@ -0,0 +1,97 @@ +# v3-noisy-01-colloquial + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Где там дока про health, покажи плз + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 +} +``` + +## Details +```json +{ + "query": "Где там дока про health, покажи плз", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где там дока про health, покажи плз", + "normalized_query": "Где там дока про health, покажи плз", + "target_terms": [ + "/health", + "там", + "дока", + "про", + "health", + "плз" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где там дока про health, покажи плз" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/health", + "там", + "дока", + "про", + "health", + "плз" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-02-abbrev.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-02-abbrev.json new file mode 100644 index 0000000..f2c1731 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-02-abbrev.json @@ -0,0 +1,85 @@ +{ + "meta": { + "case_id": "v3-noisy-02-abbrev", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 + }, + "details": { + "query": "Нужен краткий док-саммари по api /send", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Нужен краткий док-саммари по api /send", + "normalized_query": "Нужен краткий док-саммари по api /send", + "target_terms": [ + "/send", + "нужен", + "краткий", + "док-саммари", + "api" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Нужен краткий док-саммари по api /send" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/send", + "нужен", + "краткий", + "док-саммари", + "api" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-02-abbrev.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-02-abbrev.md new file mode 100644 index 0000000..4364012 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-02-abbrev.md @@ -0,0 +1,95 @@ +# v3-noisy-02-abbrev + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Нужен краткий док-саммари по api /send + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 +} +``` + +## Details +```json +{ + "query": "Нужен краткий док-саммари по api /send", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Нужен краткий док-саммари по api /send", + "normalized_query": "Нужен краткий док-саммари по api /send", + "target_terms": [ + "/send", + "нужен", + "краткий", + "док-саммари", + "api" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Нужен краткий док-саммари по api /send" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/send", + "нужен", + "краткий", + "док-саммари", + "api" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-03-broken-phrase.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-03-broken-phrase.json new file mode 100644 index 0000000..88082c2 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-03-broken-phrase.json @@ -0,0 +1,85 @@ +{ + "meta": { + "case_id": "v3-noisy-03-broken-phrase", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 + }, + "details": { + "query": "runtime health это где описано в доках", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "runtime health это где описано в доках", + "normalized_query": "runtime health это где описано в доках", + "target_terms": [ + "runtime_health", + "runtime", + "health", + "описано", + "доках" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "runtime health это где описано в доках" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "runtime_health", + "runtime", + "health", + "описано", + "доках" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-03-broken-phrase.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-03-broken-phrase.md new file mode 100644 index 0000000..24577cc --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/router_llm_first_v3_v3-noisy-03-broken-phrase.md @@ -0,0 +1,95 @@ +# v3-noisy-03-broken-phrase + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +runtime health это где описано в доках + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.9800000000000001 +} +``` + +## Details +```json +{ + "query": "runtime health это где описано в доках", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "runtime health это где описано в доках", + "normalized_query": "runtime health это где описано в доках", + "target_terms": [ + "runtime_health", + "runtime", + "health", + "описано", + "доках" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.9800000000000001, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "runtime health это где описано в доках" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "runtime_health", + "runtime", + "health", + "описано", + "доках" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/summary.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/summary.md new file mode 100644 index 0000000..fee2567 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_postfix/20260407_125805/summary.md @@ -0,0 +1,22 @@ +# pipeline_setup_v4 summary + +Passed: 16/16 + +| Case | Component | Query | Intent | Sub-intent | Pass | +|------|-----------|-------|--------|------------|------| +| v3-docs-summary-01-endpoint | process_v2_intent_router | Объясни по документации endpoint `/health` | DOC_EXPLAIN | SUMMARY | ✓ | +| v3-docs-summary-02-architecture | process_v2_intent_router | Как устроена архитектура приложения? | DOC_EXPLAIN | SUMMARY | ✓ | +| v3-docs-summary-03-process | process_v2_intent_router | Опиши процесс отправки уведомлений | DOC_EXPLAIN | SUMMARY | ✓ | +| v3-docs-summary-04-entity | process_v2_intent_router | Что такое runtime health в документации? | DOC_EXPLAIN | SUMMARY | ✓ | +| v3-find-files-01-which-file | process_v2_intent_router | В каком файле описан `/health`? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v3-find-files-02-show-doc | process_v2_intent_router | Покажи документ про runtime health | DOC_EXPLAIN | FIND_FILES | ✓ | +| v3-find-files-03-where-described | process_v2_intent_router | Где описано `docs/architecture/overview.md`? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v3-general-01-overview | process_v2_intent_router | Общий обзор сервиса | GENERAL_QA | SUMMARY | ✓ | +| v3-general-02-what-is-service | process_v2_intent_router | Что это за сервис? | GENERAL_QA | SUMMARY | ✓ | +| v3-general-03-purpose | process_v2_intent_router | Для чего нужен этот сервис? | GENERAL_QA | SUMMARY | ✓ | +| v3-negative-01-operational | process_v2_intent_router | Почему у меня сейчас упал деплой? | GENERAL_QA | SUMMARY | ✓ | +| v3-negative-02-meta | process_v2_intent_router | Как ты выбираешь маршрут? | GENERAL_QA | SUMMARY | ✓ | +| v3-negative-03-non-docs | process_v2_intent_router | Сколько сейчас времени на сервере? | GENERAL_QA | SUMMARY | ✓ | +| v3-noisy-01-colloquial | process_v2_intent_router | Где там дока про health, покажи плз | DOC_EXPLAIN | FIND_FILES | ✓ | +| v3-noisy-02-abbrev | process_v2_intent_router | Нужен краткий док-саммари по api /send | DOC_EXPLAIN | SUMMARY | ✓ | +| v3-noisy-03-broken-phrase | process_v2_intent_router | runtime health это где описано в доках | DOC_EXPLAIN | FIND_FILES | ✓ | \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-01-endpoint.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-01-endpoint.json new file mode 100644 index 0000000..19e26c7 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-01-endpoint.json @@ -0,0 +1,79 @@ +{ + "meta": { + "case_id": "v3-docs-summary-01-endpoint", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Объясни по документации endpoint `/health`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Объясни по документации endpoint `/health`", + "normalized_query": "Объясни по документации endpoint `/health`", + "target_terms": [ + "/health", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Объясни по документации endpoint `/health`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/health", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-01-endpoint.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-01-endpoint.md new file mode 100644 index 0000000..c39757f --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-01-endpoint.md @@ -0,0 +1,89 @@ +# v3-docs-summary-01-endpoint + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Объясни по документации endpoint `/health` + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Объясни по документации endpoint `/health`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Объясни по документации endpoint `/health`", + "normalized_query": "Объясни по документации endpoint `/health`", + "target_terms": [ + "/health", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Объясни по документации endpoint `/health`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/health", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-02-architecture.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-02-architecture.json new file mode 100644 index 0000000..2a57176 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-02-architecture.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v3-docs-summary-02-architecture", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Как устроена архитектура приложения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как устроена архитектура приложения?", + "normalized_query": "Как устроена архитектура приложения?", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как устроена архитектура приложения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-02-architecture.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-02-architecture.md new file mode 100644 index 0000000..19bd099 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-02-architecture.md @@ -0,0 +1,93 @@ +# v3-docs-summary-02-architecture + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Как устроена архитектура приложения? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Как устроена архитектура приложения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как устроена архитектура приложения?", + "normalized_query": "Как устроена архитектура приложения?", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как устроена архитектура приложения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-03-process.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-03-process.json new file mode 100644 index 0000000..01283be --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-03-process.json @@ -0,0 +1,75 @@ +{ + "meta": { + "case_id": "v3-docs-summary-03-process", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Опиши процесс отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Опиши процесс отправки уведомлений", + "normalized_query": "Опиши процесс отправки уведомлений", + "target_terms": [ + "опиши", + "процесс", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Опиши процесс отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "опиши", + "процесс", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-03-process.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-03-process.md new file mode 100644 index 0000000..c7439dd --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-03-process.md @@ -0,0 +1,85 @@ +# v3-docs-summary-03-process + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Опиши процесс отправки уведомлений + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Опиши процесс отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Опиши процесс отправки уведомлений", + "normalized_query": "Опиши процесс отправки уведомлений", + "target_terms": [ + "опиши", + "процесс", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Опиши процесс отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "опиши", + "процесс", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-04-entity.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-04-entity.json new file mode 100644 index 0000000..e6948f5 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-04-entity.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v3-docs-summary-04-entity", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Что такое runtime health в документации?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что такое runtime health в документации?", + "normalized_query": "Что такое runtime health в документации?", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что такое runtime health в документации?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-04-entity.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-04-entity.md new file mode 100644 index 0000000..aa95a4b --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-docs-summary-04-entity.md @@ -0,0 +1,93 @@ +# v3-docs-summary-04-entity + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Что такое runtime health в документации? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Что такое runtime health в документации?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что такое runtime health в документации?", + "normalized_query": "Что такое runtime health в документации?", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что такое runtime health в документации?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-01-which-file.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-01-which-file.json new file mode 100644 index 0000000..9256884 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-01-which-file.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v3-find-files-01-which-file", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "В каком файле описан `/health`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле описан `/health`?", + "normalized_query": "В каком файле описан `/health`?", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле описан `/health`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-01-which-file.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-01-which-file.md new file mode 100644 index 0000000..6ae9877 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-01-which-file.md @@ -0,0 +1,93 @@ +# v3-find-files-01-which-file + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +В каком файле описан `/health`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "В каком файле описан `/health`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле описан `/health`?", + "normalized_query": "В каком файле описан `/health`?", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле описан `/health`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-02-show-doc.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-02-show-doc.json new file mode 100644 index 0000000..77c7f5b --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-02-show-doc.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v3-find-files-02-show-doc", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Покажи документ про runtime health", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи документ про runtime health", + "normalized_query": "Покажи документ про runtime health", + "target_terms": [ + "runtime_health", + "про", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи документ про runtime health" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "runtime_health", + "про", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-02-show-doc.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-02-show-doc.md new file mode 100644 index 0000000..50b93d6 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-02-show-doc.md @@ -0,0 +1,93 @@ +# v3-find-files-02-show-doc + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Покажи документ про runtime health + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Покажи документ про runtime health", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи документ про runtime health", + "normalized_query": "Покажи документ про runtime health", + "target_terms": [ + "runtime_health", + "про", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи документ про runtime health" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "runtime_health", + "про", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-03-where-described.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-03-where-described.json new file mode 100644 index 0000000..0e5e9f8 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-03-where-described.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v3-find-files-03-where-described", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Где описано `docs/architecture/overview.md`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где описано `docs/architecture/overview.md`?", + "normalized_query": "Где описано `docs/architecture/overview.md`?", + "target_terms": [ + "architecture_overview", + "описано" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "docs/architecture/overview.md" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где описано `docs/architecture/overview.md`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "architecture_overview", + "описано" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "docs/architecture/overview.md" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-03-where-described.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-03-where-described.md new file mode 100644 index 0000000..81a1a8f --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-find-files-03-where-described.md @@ -0,0 +1,93 @@ +# v3-find-files-03-where-described + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Где описано `docs/architecture/overview.md`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Где описано `docs/architecture/overview.md`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где описано `docs/architecture/overview.md`?", + "normalized_query": "Где описано `docs/architecture/overview.md`?", + "target_terms": [ + "architecture_overview", + "описано" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "docs/architecture/overview.md" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где описано `docs/architecture/overview.md`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "architecture_overview", + "описано" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "docs/architecture/overview.md" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-01-overview.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-01-overview.json new file mode 100644 index 0000000..9659127 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-01-overview.json @@ -0,0 +1,73 @@ +{ + "meta": { + "case_id": "v3-general-01-overview", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Общий обзор сервиса", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Общий обзор сервиса", + "normalized_query": "Общий обзор сервиса", + "target_terms": [ + "общий", + "обзор", + "сервиса" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Общий обзор сервиса" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "общий", + "обзор", + "сервиса" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-01-overview.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-01-overview.md new file mode 100644 index 0000000..795dcdb --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-01-overview.md @@ -0,0 +1,83 @@ +# v3-general-01-overview + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Общий обзор сервиса + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Общий обзор сервиса", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Общий обзор сервиса", + "normalized_query": "Общий обзор сервиса", + "target_terms": [ + "общий", + "обзор", + "сервиса" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Общий обзор сервиса" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "общий", + "обзор", + "сервиса" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-02-what-is-service.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-02-what-is-service.json new file mode 100644 index 0000000..6f22b47 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-02-what-is-service.json @@ -0,0 +1,69 @@ +{ + "meta": { + "case_id": "v3-general-02-what-is-service", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Что это за сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что это за сервис?", + "normalized_query": "Что это за сервис?", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что это за сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-02-what-is-service.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-02-what-is-service.md new file mode 100644 index 0000000..c2e4650 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-02-what-is-service.md @@ -0,0 +1,79 @@ +# v3-general-02-what-is-service + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Что это за сервис? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Что это за сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что это за сервис?", + "normalized_query": "Что это за сервис?", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что это за сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-03-purpose.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-03-purpose.json new file mode 100644 index 0000000..c9e2a55 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-03-purpose.json @@ -0,0 +1,75 @@ +{ + "meta": { + "case_id": "v3-general-03-purpose", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Для чего нужен этот сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Для чего нужен этот сервис?", + "normalized_query": "Для чего нужен этот сервис?", + "target_terms": [ + "для", + "чего", + "нужен", + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Для чего нужен этот сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "для", + "чего", + "нужен", + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-03-purpose.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-03-purpose.md new file mode 100644 index 0000000..fc18f93 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-general-03-purpose.md @@ -0,0 +1,85 @@ +# v3-general-03-purpose + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Для чего нужен этот сервис? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Для чего нужен этот сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Для чего нужен этот сервис?", + "normalized_query": "Для чего нужен этот сервис?", + "target_terms": [ + "для", + "чего", + "нужен", + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Для чего нужен этот сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "для", + "чего", + "нужен", + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-01-operational.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-01-operational.json new file mode 100644 index 0000000..dfa4498 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-01-operational.json @@ -0,0 +1,77 @@ +{ + "meta": { + "case_id": "v3-negative-01-operational", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Почему у меня сейчас упал деплой?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Почему у меня сейчас упал деплой?", + "normalized_query": "Почему у меня сейчас упал деплой?", + "target_terms": [ + "почему", + "меня", + "сейчас", + "упал", + "деплой" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Почему у меня сейчас упал деплой?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "почему", + "меня", + "сейчас", + "упал", + "деплой" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-01-operational.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-01-operational.md new file mode 100644 index 0000000..0d5d63e --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-01-operational.md @@ -0,0 +1,87 @@ +# v3-negative-01-operational + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Почему у меня сейчас упал деплой? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Почему у меня сейчас упал деплой?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Почему у меня сейчас упал деплой?", + "normalized_query": "Почему у меня сейчас упал деплой?", + "target_terms": [ + "почему", + "меня", + "сейчас", + "упал", + "деплой" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Почему у меня сейчас упал деплой?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "почему", + "меня", + "сейчас", + "упал", + "деплой" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-02-meta.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-02-meta.json new file mode 100644 index 0000000..20b8c25 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-02-meta.json @@ -0,0 +1,71 @@ +{ + "meta": { + "case_id": "v3-negative-02-meta", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Как ты выбираешь маршрут?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как ты выбираешь маршрут?", + "normalized_query": "Как ты выбираешь маршрут?", + "target_terms": [ + "выбираешь", + "маршрут" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как ты выбираешь маршрут?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "выбираешь", + "маршрут" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-02-meta.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-02-meta.md new file mode 100644 index 0000000..5954af9 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-02-meta.md @@ -0,0 +1,81 @@ +# v3-negative-02-meta + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Как ты выбираешь маршрут? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Как ты выбираешь маршрут?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как ты выбираешь маршрут?", + "normalized_query": "Как ты выбираешь маршрут?", + "target_terms": [ + "выбираешь", + "маршрут" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как ты выбираешь маршрут?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "выбираешь", + "маршрут" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-03-non-docs.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-03-non-docs.json new file mode 100644 index 0000000..92f2143 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-03-non-docs.json @@ -0,0 +1,75 @@ +{ + "meta": { + "case_id": "v3-negative-03-non-docs", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Сколько сейчас времени на сервере?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Сколько сейчас времени на сервере?", + "normalized_query": "Сколько сейчас времени на сервере?", + "target_terms": [ + "сколько", + "сейчас", + "времени", + "сервере" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Сколько сейчас времени на сервере?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "сколько", + "сейчас", + "времени", + "сервере" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-03-non-docs.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-03-non-docs.md new file mode 100644 index 0000000..6c37d74 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-negative-03-non-docs.md @@ -0,0 +1,85 @@ +# v3-negative-03-non-docs + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Сколько сейчас времени на сервере? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Сколько сейчас времени на сервере?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Сколько сейчас времени на сервере?", + "normalized_query": "Сколько сейчас времени на сервере?", + "target_terms": [ + "сколько", + "сейчас", + "времени", + "сервере" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Сколько сейчас времени на сервере?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "сколько", + "сейчас", + "времени", + "сервере" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-01-colloquial.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-01-colloquial.json new file mode 100644 index 0000000..f8d7d4f --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-01-colloquial.json @@ -0,0 +1,89 @@ +{ + "meta": { + "case_id": "v3-noisy-01-colloquial", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": false, + "mismatches": [ + "sub_intent: expected FIND_FILES, got SUMMARY" + ] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Где там дока про health, покажи плз", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Где там дока про health, покажи плз", + "normalized_query": "Где там дока про health, покажи плз", + "target_terms": [ + "/health", + "там", + "дока", + "про", + "health", + "плз" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где там дока про health, покажи плз" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/health", + "там", + "дока", + "про", + "health", + "плз" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-01-colloquial.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-01-colloquial.md new file mode 100644 index 0000000..c5ae023 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-01-colloquial.md @@ -0,0 +1,97 @@ +# v3-noisy-01-colloquial + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: False + +## Query +Где там дока про health, покажи плз + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Где там дока про health, покажи плз", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Где там дока про health, покажи плз", + "normalized_query": "Где там дока про health, покажи плз", + "target_terms": [ + "/health", + "там", + "дока", + "про", + "health", + "плз" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где там дока про health, покажи плз" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/health", + "там", + "дока", + "про", + "health", + "плз" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- sub_intent: expected FIND_FILES, got SUMMARY \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-02-abbrev.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-02-abbrev.json new file mode 100644 index 0000000..aa38be7 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-02-abbrev.json @@ -0,0 +1,85 @@ +{ + "meta": { + "case_id": "v3-noisy-02-abbrev", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Нужен краткий док-саммари по api /send", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Нужен краткий док-саммари по api /send", + "normalized_query": "Нужен краткий док-саммари по api /send", + "target_terms": [ + "/send", + "нужен", + "краткий", + "док-саммари", + "api" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Нужен краткий док-саммари по api /send" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/send", + "нужен", + "краткий", + "док-саммари", + "api" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-02-abbrev.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-02-abbrev.md new file mode 100644 index 0000000..c9b24c5 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-02-abbrev.md @@ -0,0 +1,95 @@ +# v3-noisy-02-abbrev + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Нужен краткий док-саммари по api /send + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Нужен краткий док-саммари по api /send", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Нужен краткий док-саммари по api /send", + "normalized_query": "Нужен краткий док-саммари по api /send", + "target_terms": [ + "/send", + "нужен", + "краткий", + "док-саммари", + "api" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Нужен краткий док-саммари по api /send" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/send", + "нужен", + "краткий", + "док-саммари", + "api" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-03-broken-phrase.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-03-broken-phrase.json new file mode 100644 index 0000000..14503a3 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-03-broken-phrase.json @@ -0,0 +1,85 @@ +{ + "meta": { + "case_id": "v3-noisy-03-broken-phrase", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "runtime health это где описано в доках", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "runtime health это где описано в доках", + "normalized_query": "runtime health это где описано в доках", + "target_terms": [ + "runtime_health", + "runtime", + "health", + "описано", + "доках" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "runtime health это где описано в доках" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "runtime_health", + "runtime", + "health", + "описано", + "доках" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-03-broken-phrase.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-03-broken-phrase.md new file mode 100644 index 0000000..e4c3e72 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/router_llm_first_v3_v3-noisy-03-broken-phrase.md @@ -0,0 +1,95 @@ +# v3-noisy-03-broken-phrase + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +runtime health это где описано в доках + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "runtime health это где описано в доках", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "runtime health это где описано в доках", + "normalized_query": "runtime health это где описано в доках", + "target_terms": [ + "runtime_health", + "runtime", + "health", + "описано", + "доках" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "runtime health это где описано в доках" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "runtime_health", + "runtime", + "health", + "описано", + "доках" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/summary.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/summary.md new file mode 100644 index 0000000..f329ebf --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124942/summary.md @@ -0,0 +1,25 @@ +# pipeline_setup_v4 summary + +Passed: 15/16 + +| Case | Component | Query | Intent | Sub-intent | Pass | +|------|-----------|-------|--------|------------|------| +| v3-docs-summary-01-endpoint | process_v2_intent_router | Объясни по документации endpoint `/health` | DOC_EXPLAIN | SUMMARY | ✓ | +| v3-docs-summary-02-architecture | process_v2_intent_router | Как устроена архитектура приложения? | DOC_EXPLAIN | SUMMARY | ✓ | +| v3-docs-summary-03-process | process_v2_intent_router | Опиши процесс отправки уведомлений | DOC_EXPLAIN | SUMMARY | ✓ | +| v3-docs-summary-04-entity | process_v2_intent_router | Что такое runtime health в документации? | DOC_EXPLAIN | SUMMARY | ✓ | +| v3-find-files-01-which-file | process_v2_intent_router | В каком файле описан `/health`? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v3-find-files-02-show-doc | process_v2_intent_router | Покажи документ про runtime health | DOC_EXPLAIN | FIND_FILES | ✓ | +| v3-find-files-03-where-described | process_v2_intent_router | Где описано `docs/architecture/overview.md`? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v3-general-01-overview | process_v2_intent_router | Общий обзор сервиса | GENERAL_QA | SUMMARY | ✓ | +| v3-general-02-what-is-service | process_v2_intent_router | Что это за сервис? | GENERAL_QA | SUMMARY | ✓ | +| v3-general-03-purpose | process_v2_intent_router | Для чего нужен этот сервис? | GENERAL_QA | SUMMARY | ✓ | +| v3-negative-01-operational | process_v2_intent_router | Почему у меня сейчас упал деплой? | GENERAL_QA | SUMMARY | ✓ | +| v3-negative-02-meta | process_v2_intent_router | Как ты выбираешь маршрут? | GENERAL_QA | SUMMARY | ✓ | +| v3-negative-03-non-docs | process_v2_intent_router | Сколько сейчас времени на сервере? | GENERAL_QA | SUMMARY | ✓ | +| v3-noisy-01-colloquial | process_v2_intent_router | Где там дока про health, покажи плз | DOC_EXPLAIN | SUMMARY | ✗ | +| v3-noisy-02-abbrev | process_v2_intent_router | Нужен краткий док-саммари по api /send | DOC_EXPLAIN | SUMMARY | ✓ | +| v3-noisy-03-broken-phrase | process_v2_intent_router | runtime health это где описано в доках | DOC_EXPLAIN | FIND_FILES | ✓ | + +## Failures +- **v3-noisy-01-colloquial**: sub_intent: expected FIND_FILES, got SUMMARY \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-01-endpoint.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-01-endpoint.json new file mode 100644 index 0000000..19e26c7 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-01-endpoint.json @@ -0,0 +1,79 @@ +{ + "meta": { + "case_id": "v3-docs-summary-01-endpoint", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Объясни по документации endpoint `/health`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Объясни по документации endpoint `/health`", + "normalized_query": "Объясни по документации endpoint `/health`", + "target_terms": [ + "/health", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Объясни по документации endpoint `/health`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/health", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-01-endpoint.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-01-endpoint.md new file mode 100644 index 0000000..c39757f --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-01-endpoint.md @@ -0,0 +1,89 @@ +# v3-docs-summary-01-endpoint + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Объясни по документации endpoint `/health` + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Объясни по документации endpoint `/health`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Объясни по документации endpoint `/health`", + "normalized_query": "Объясни по документации endpoint `/health`", + "target_terms": [ + "/health", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Объясни по документации endpoint `/health`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/health", + "endpoint" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-02-architecture.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-02-architecture.json new file mode 100644 index 0000000..2a57176 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-02-architecture.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v3-docs-summary-02-architecture", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Как устроена архитектура приложения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как устроена архитектура приложения?", + "normalized_query": "Как устроена архитектура приложения?", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как устроена архитектура приложения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-02-architecture.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-02-architecture.md new file mode 100644 index 0000000..19bd099 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-02-architecture.md @@ -0,0 +1,93 @@ +# v3-docs-summary-02-architecture + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Как устроена архитектура приложения? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Как устроена архитектура приложения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как устроена архитектура приложения?", + "normalized_query": "Как устроена архитектура приложения?", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как устроена архитектура приложения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "architecture_overview", + "устроена", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-03-process.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-03-process.json new file mode 100644 index 0000000..01283be --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-03-process.json @@ -0,0 +1,75 @@ +{ + "meta": { + "case_id": "v3-docs-summary-03-process", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Опиши процесс отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Опиши процесс отправки уведомлений", + "normalized_query": "Опиши процесс отправки уведомлений", + "target_terms": [ + "опиши", + "процесс", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Опиши процесс отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "опиши", + "процесс", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-03-process.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-03-process.md new file mode 100644 index 0000000..c7439dd --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-03-process.md @@ -0,0 +1,85 @@ +# v3-docs-summary-03-process + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Опиши процесс отправки уведомлений + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Опиши процесс отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Опиши процесс отправки уведомлений", + "normalized_query": "Опиши процесс отправки уведомлений", + "target_terms": [ + "опиши", + "процесс", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Опиши процесс отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "опиши", + "процесс", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-04-entity.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-04-entity.json new file mode 100644 index 0000000..e6948f5 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-04-entity.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v3-docs-summary-04-entity", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Что такое runtime health в документации?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что такое runtime health в документации?", + "normalized_query": "Что такое runtime health в документации?", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что такое runtime health в документации?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-04-entity.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-04-entity.md new file mode 100644 index 0000000..aa95a4b --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-docs-summary-04-entity.md @@ -0,0 +1,93 @@ +# v3-docs-summary-04-entity + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Что такое runtime health в документации? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Что такое runtime health в документации?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что такое runtime health в документации?", + "normalized_query": "Что такое runtime health в документации?", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что такое runtime health в документации?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "runtime_health", + "такое", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-01-which-file.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-01-which-file.json new file mode 100644 index 0000000..9256884 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-01-which-file.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v3-find-files-01-which-file", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "В каком файле описан `/health`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле описан `/health`?", + "normalized_query": "В каком файле описан `/health`?", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле описан `/health`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-01-which-file.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-01-which-file.md new file mode 100644 index 0000000..6ae9877 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-01-which-file.md @@ -0,0 +1,93 @@ +# v3-find-files-01-which-file + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +В каком файле описан `/health`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "В каком файле описан `/health`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле описан `/health`?", + "normalized_query": "В каком файле описан `/health`?", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле описан `/health`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-02-show-doc.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-02-show-doc.json new file mode 100644 index 0000000..77c7f5b --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-02-show-doc.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v3-find-files-02-show-doc", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Покажи документ про runtime health", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи документ про runtime health", + "normalized_query": "Покажи документ про runtime health", + "target_terms": [ + "runtime_health", + "про", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи документ про runtime health" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "runtime_health", + "про", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-02-show-doc.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-02-show-doc.md new file mode 100644 index 0000000..50b93d6 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-02-show-doc.md @@ -0,0 +1,93 @@ +# v3-find-files-02-show-doc + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Покажи документ про runtime health + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Покажи документ про runtime health", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи документ про runtime health", + "normalized_query": "Покажи документ про runtime health", + "target_terms": [ + "runtime_health", + "про", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи документ про runtime health" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "runtime_health", + "про", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-03-where-described.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-03-where-described.json new file mode 100644 index 0000000..0e5e9f8 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-03-where-described.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v3-find-files-03-where-described", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Где описано `docs/architecture/overview.md`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где описано `docs/architecture/overview.md`?", + "normalized_query": "Где описано `docs/architecture/overview.md`?", + "target_terms": [ + "architecture_overview", + "описано" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "docs/architecture/overview.md" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где описано `docs/architecture/overview.md`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "architecture_overview", + "описано" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "docs/architecture/overview.md" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-03-where-described.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-03-where-described.md new file mode 100644 index 0000000..81a1a8f --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-find-files-03-where-described.md @@ -0,0 +1,93 @@ +# v3-find-files-03-where-described + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Где описано `docs/architecture/overview.md`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Где описано `docs/architecture/overview.md`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где описано `docs/architecture/overview.md`?", + "normalized_query": "Где описано `docs/architecture/overview.md`?", + "target_terms": [ + "architecture_overview", + "описано" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "docs/architecture/overview.md" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где описано `docs/architecture/overview.md`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "architecture_overview", + "описано" + ], + "anchors": { + "entity_names": [], + "file_names": [ + "docs/architecture/overview.md" + ], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "architecture_overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-01-overview.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-01-overview.json new file mode 100644 index 0000000..9659127 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-01-overview.json @@ -0,0 +1,73 @@ +{ + "meta": { + "case_id": "v3-general-01-overview", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Общий обзор сервиса", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Общий обзор сервиса", + "normalized_query": "Общий обзор сервиса", + "target_terms": [ + "общий", + "обзор", + "сервиса" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Общий обзор сервиса" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "общий", + "обзор", + "сервиса" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-01-overview.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-01-overview.md new file mode 100644 index 0000000..795dcdb --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-01-overview.md @@ -0,0 +1,83 @@ +# v3-general-01-overview + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Общий обзор сервиса + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Общий обзор сервиса", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Общий обзор сервиса", + "normalized_query": "Общий обзор сервиса", + "target_terms": [ + "общий", + "обзор", + "сервиса" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Общий обзор сервиса" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "общий", + "обзор", + "сервиса" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-02-what-is-service.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-02-what-is-service.json new file mode 100644 index 0000000..6f22b47 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-02-what-is-service.json @@ -0,0 +1,69 @@ +{ + "meta": { + "case_id": "v3-general-02-what-is-service", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Что это за сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что это за сервис?", + "normalized_query": "Что это за сервис?", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что это за сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-02-what-is-service.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-02-what-is-service.md new file mode 100644 index 0000000..c2e4650 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-02-what-is-service.md @@ -0,0 +1,79 @@ +# v3-general-02-what-is-service + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Что это за сервис? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Что это за сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что это за сервис?", + "normalized_query": "Что это за сервис?", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что это за сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-03-purpose.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-03-purpose.json new file mode 100644 index 0000000..c9e2a55 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-03-purpose.json @@ -0,0 +1,75 @@ +{ + "meta": { + "case_id": "v3-general-03-purpose", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Для чего нужен этот сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Для чего нужен этот сервис?", + "normalized_query": "Для чего нужен этот сервис?", + "target_terms": [ + "для", + "чего", + "нужен", + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Для чего нужен этот сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "для", + "чего", + "нужен", + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-03-purpose.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-03-purpose.md new file mode 100644 index 0000000..fc18f93 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-general-03-purpose.md @@ -0,0 +1,85 @@ +# v3-general-03-purpose + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Для чего нужен этот сервис? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Для чего нужен этот сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Для чего нужен этот сервис?", + "normalized_query": "Для чего нужен этот сервис?", + "target_terms": [ + "для", + "чего", + "нужен", + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "general overview" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Для чего нужен этот сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general overview", + "target_terms": [ + "для", + "чего", + "нужен", + "сервис" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-01-operational.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-01-operational.json new file mode 100644 index 0000000..dfa4498 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-01-operational.json @@ -0,0 +1,77 @@ +{ + "meta": { + "case_id": "v3-negative-01-operational", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Почему у меня сейчас упал деплой?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Почему у меня сейчас упал деплой?", + "normalized_query": "Почему у меня сейчас упал деплой?", + "target_terms": [ + "почему", + "меня", + "сейчас", + "упал", + "деплой" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Почему у меня сейчас упал деплой?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "почему", + "меня", + "сейчас", + "упал", + "деплой" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-01-operational.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-01-operational.md new file mode 100644 index 0000000..0d5d63e --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-01-operational.md @@ -0,0 +1,87 @@ +# v3-negative-01-operational + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Почему у меня сейчас упал деплой? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Почему у меня сейчас упал деплой?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Почему у меня сейчас упал деплой?", + "normalized_query": "Почему у меня сейчас упал деплой?", + "target_terms": [ + "почему", + "меня", + "сейчас", + "упал", + "деплой" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Почему у меня сейчас упал деплой?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "почему", + "меня", + "сейчас", + "упал", + "деплой" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-02-meta.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-02-meta.json new file mode 100644 index 0000000..20b8c25 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-02-meta.json @@ -0,0 +1,71 @@ +{ + "meta": { + "case_id": "v3-negative-02-meta", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Как ты выбираешь маршрут?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как ты выбираешь маршрут?", + "normalized_query": "Как ты выбираешь маршрут?", + "target_terms": [ + "выбираешь", + "маршрут" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как ты выбираешь маршрут?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "выбираешь", + "маршрут" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-02-meta.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-02-meta.md new file mode 100644 index 0000000..5954af9 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-02-meta.md @@ -0,0 +1,81 @@ +# v3-negative-02-meta + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Как ты выбираешь маршрут? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Как ты выбираешь маршрут?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как ты выбираешь маршрут?", + "normalized_query": "Как ты выбираешь маршрут?", + "target_terms": [ + "выбираешь", + "маршрут" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как ты выбираешь маршрут?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "выбираешь", + "маршрут" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-03-non-docs.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-03-non-docs.json new file mode 100644 index 0000000..92f2143 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-03-non-docs.json @@ -0,0 +1,75 @@ +{ + "meta": { + "case_id": "v3-negative-03-non-docs", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Сколько сейчас времени на сервере?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Сколько сейчас времени на сервере?", + "normalized_query": "Сколько сейчас времени на сервере?", + "target_terms": [ + "сколько", + "сейчас", + "времени", + "сервере" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Сколько сейчас времени на сервере?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "сколько", + "сейчас", + "времени", + "сервере" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-03-non-docs.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-03-non-docs.md new file mode 100644 index 0000000..6c37d74 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-negative-03-non-docs.md @@ -0,0 +1,85 @@ +# v3-negative-03-non-docs + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Сколько сейчас времени на сервере? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Сколько сейчас времени на сервере?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Сколько сейчас времени на сервере?", + "normalized_query": "Сколько сейчас времени на сервере?", + "target_terms": [ + "сколько", + "сейчас", + "времени", + "сервере" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "default general" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Сколько сейчас времени на сервере?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "default general", + "target_terms": [ + "сколько", + "сейчас", + "времени", + "сервере" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-01-colloquial.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-01-colloquial.json new file mode 100644 index 0000000..02660ca --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-01-colloquial.json @@ -0,0 +1,87 @@ +{ + "meta": { + "case_id": "v3-noisy-01-colloquial", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Где там дока про health, покажи плз", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где там дока про health, покажи плз", + "normalized_query": "Где там дока про health, покажи плз", + "target_terms": [ + "/health", + "там", + "дока", + "про", + "health", + "плз" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где там дока про health, покажи плз" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/health", + "там", + "дока", + "про", + "health", + "плз" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-01-colloquial.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-01-colloquial.md new file mode 100644 index 0000000..6141922 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-01-colloquial.md @@ -0,0 +1,97 @@ +# v3-noisy-01-colloquial + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Где там дока про health, покажи плз + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Где там дока про health, покажи плз", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где там дока про health, покажи плз", + "normalized_query": "Где там дока про health, покажи плз", + "target_terms": [ + "/health", + "там", + "дока", + "про", + "health", + "плз" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где там дока про health, покажи плз" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "/health", + "там", + "дока", + "про", + "health", + "плз" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-02-abbrev.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-02-abbrev.json new file mode 100644 index 0000000..aa38be7 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-02-abbrev.json @@ -0,0 +1,85 @@ +{ + "meta": { + "case_id": "v3-noisy-02-abbrev", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "Нужен краткий док-саммари по api /send", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Нужен краткий док-саммари по api /send", + "normalized_query": "Нужен краткий док-саммари по api /send", + "target_terms": [ + "/send", + "нужен", + "краткий", + "док-саммари", + "api" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Нужен краткий док-саммари по api /send" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/send", + "нужен", + "краткий", + "док-саммари", + "api" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-02-abbrev.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-02-abbrev.md new file mode 100644 index 0000000..c9b24c5 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-02-abbrev.md @@ -0,0 +1,95 @@ +# v3-noisy-02-abbrev + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +Нужен краткий док-саммари по api /send + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "Нужен краткий док-саммари по api /send", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Нужен краткий док-саммари по api /send", + "normalized_query": "Нужен краткий док-саммари по api /send", + "target_terms": [ + "/send", + "нужен", + "краткий", + "док-саммари", + "api" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "docs topic" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Нужен краткий док-саммари по api /send" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "docs topic", + "target_terms": [ + "/send", + "нужен", + "краткий", + "док-саммари", + "api" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-03-broken-phrase.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-03-broken-phrase.json new file mode 100644 index 0000000..14503a3 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-03-broken-phrase.json @@ -0,0 +1,85 @@ +{ + "meta": { + "case_id": "v3-noisy-03-broken-phrase", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 + }, + "details": { + "query": "runtime health это где описано в доках", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "runtime health это где описано в доках", + "normalized_query": "runtime health это где описано в доках", + "target_terms": [ + "runtime_health", + "runtime", + "health", + "описано", + "доках" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "runtime health это где описано в доках" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "runtime_health", + "runtime", + "health", + "описано", + "доках" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-03-broken-phrase.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-03-broken-phrase.md new file mode 100644 index 0000000..e4c3e72 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/router_llm_first_v3_v3-noisy-03-broken-phrase.md @@ -0,0 +1,95 @@ +# v3-noisy-03-broken-phrase + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_llm_first_v3.yaml +- passed: True + +## Query +runtime health это где описано в доках + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "llm_default", + "llm_router_used": true, + "confidence": 0.93 +} +``` + +## Details +```json +{ + "query": "runtime health это где описано в доках", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "runtime health это где описано в доках", + "normalized_query": "runtime health это где описано в доках", + "target_terms": [ + "runtime_health", + "runtime", + "health", + "описано", + "доках" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.93, + "routing_mode": "llm_default", + "llm_router_used": true, + "reason_short": "file lookup" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "runtime health это где описано в доках" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "file lookup", + "target_terms": [ + "runtime_health", + "runtime", + "health", + "описано", + "доках" + ], + "anchors": { + "entity_names": [], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime_health" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/summary.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/summary.md new file mode 100644 index 0000000..fee2567 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/llm_first_v3_smoke/20260407_124956/summary.md @@ -0,0 +1,22 @@ +# pipeline_setup_v4 summary + +Passed: 16/16 + +| Case | Component | Query | Intent | Sub-intent | Pass | +|------|-----------|-------|--------|------------|------| +| v3-docs-summary-01-endpoint | process_v2_intent_router | Объясни по документации endpoint `/health` | DOC_EXPLAIN | SUMMARY | ✓ | +| v3-docs-summary-02-architecture | process_v2_intent_router | Как устроена архитектура приложения? | DOC_EXPLAIN | SUMMARY | ✓ | +| v3-docs-summary-03-process | process_v2_intent_router | Опиши процесс отправки уведомлений | DOC_EXPLAIN | SUMMARY | ✓ | +| v3-docs-summary-04-entity | process_v2_intent_router | Что такое runtime health в документации? | DOC_EXPLAIN | SUMMARY | ✓ | +| v3-find-files-01-which-file | process_v2_intent_router | В каком файле описан `/health`? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v3-find-files-02-show-doc | process_v2_intent_router | Покажи документ про runtime health | DOC_EXPLAIN | FIND_FILES | ✓ | +| v3-find-files-03-where-described | process_v2_intent_router | Где описано `docs/architecture/overview.md`? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v3-general-01-overview | process_v2_intent_router | Общий обзор сервиса | GENERAL_QA | SUMMARY | ✓ | +| v3-general-02-what-is-service | process_v2_intent_router | Что это за сервис? | GENERAL_QA | SUMMARY | ✓ | +| v3-general-03-purpose | process_v2_intent_router | Для чего нужен этот сервис? | GENERAL_QA | SUMMARY | ✓ | +| v3-negative-01-operational | process_v2_intent_router | Почему у меня сейчас упал деплой? | GENERAL_QA | SUMMARY | ✓ | +| v3-negative-02-meta | process_v2_intent_router | Как ты выбираешь маршрут? | GENERAL_QA | SUMMARY | ✓ | +| v3-negative-03-non-docs | process_v2_intent_router | Сколько сейчас времени на сервере? | GENERAL_QA | SUMMARY | ✓ | +| v3-noisy-01-colloquial | process_v2_intent_router | Где там дока про health, покажи плз | DOC_EXPLAIN | FIND_FILES | ✓ | +| v3-noisy-02-abbrev | process_v2_intent_router | Нужен краткий док-саммари по api /send | DOC_EXPLAIN | SUMMARY | ✓ | +| v3-noisy-03-broken-phrase | process_v2_intent_router | runtime health это где описано в доках | DOC_EXPLAIN | FIND_FILES | ✓ | \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json new file mode 100644 index 0000000..a474862 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json @@ -0,0 +1,99 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-01-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Кратко объясни по документации, как работает `/health`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Кратко объясни по документации, как работает `/health`", + "normalized_query": "Кратко объясни по документации, как работает `/health`", + "target_terms": [ + "/health", + "Кратко", + "как", + "работает" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/health", + "Кратко", + "как", + "работает" + ], + "file_names": [ + "/health" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко объясни по документации, как работает `/health`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "/health", + "Кратко", + "как", + "работает" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/health", + "Кратко", + "как", + "работает" + ], + "file_names": [ + "/health" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md new file mode 100644 index 0000000..3da6762 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md @@ -0,0 +1,109 @@ +# v2-router-docs-summary-01-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Кратко объясни по документации, как работает `/health` + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Кратко объясни по документации, как работает `/health`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Кратко объясни по документации, как работает `/health`", + "normalized_query": "Кратко объясни по документации, как работает `/health`", + "target_terms": [ + "/health", + "Кратко", + "как", + "работает" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/health", + "Кратко", + "как", + "работает" + ], + "file_names": [ + "/health" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко объясни по документации, как работает `/health`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "/health", + "Кратко", + "как", + "работает" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/health", + "Кратко", + "как", + "работает" + ], + "file_names": [ + "/health" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json new file mode 100644 index 0000000..0e631d2 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json @@ -0,0 +1,99 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-02-send", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Что делает endpoint `/send`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает endpoint `/send`?", + "normalized_query": "Что делает endpoint `/send`?", + "target_terms": [ + "/send", + "Что", + "делает", + "endpoint" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "Что", + "делает", + "endpoint" + ], + "file_names": [ + "/send" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает endpoint `/send`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "/send", + "Что", + "делает", + "endpoint" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "Что", + "делает", + "endpoint" + ], + "file_names": [ + "/send" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md new file mode 100644 index 0000000..84c294e --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md @@ -0,0 +1,109 @@ +# v2-router-docs-summary-02-send + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что делает endpoint `/send`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Что делает endpoint `/send`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает endpoint `/send`?", + "normalized_query": "Что делает endpoint `/send`?", + "target_terms": [ + "/send", + "Что", + "делает", + "endpoint" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "Что", + "делает", + "endpoint" + ], + "file_names": [ + "/send" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает endpoint `/send`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "/send", + "Что", + "делает", + "endpoint" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "Что", + "делает", + "endpoint" + ], + "file_names": [ + "/send" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json new file mode 100644 index 0000000..163fe3e --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json @@ -0,0 +1,99 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-03-actions", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Объясни назначение `/actions/{action}`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Объясни назначение `/actions/{action}`", + "normalized_query": "Объясни назначение `/actions/{action}`", + "target_terms": [ + "/actions/{action}", + "назначение", + "action" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/actions/{action}", + "назначение", + "action" + ], + "file_names": [ + "/actions/{action}" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Объясни назначение `/actions/{action}`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "/actions/{action}", + "назначение", + "action" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/actions/{action}", + "назначение", + "action" + ], + "file_names": [ + "/actions/{action}" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md new file mode 100644 index 0000000..f40b533 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md @@ -0,0 +1,109 @@ +# v2-router-docs-summary-03-actions + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Объясни назначение `/actions/{action}` + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Объясни назначение `/actions/{action}`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Объясни назначение `/actions/{action}`", + "normalized_query": "Объясни назначение `/actions/{action}`", + "target_terms": [ + "/actions/{action}", + "назначение", + "action" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/actions/{action}", + "назначение", + "action" + ], + "file_names": [ + "/actions/{action}" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Объясни назначение `/actions/{action}`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "/actions/{action}", + "назначение", + "action" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/actions/{action}", + "назначение", + "action" + ], + "file_names": [ + "/actions/{action}" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json new file mode 100644 index 0000000..c3e16d3 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json @@ -0,0 +1,103 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-04-runtime-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Что такое runtime health в этой документации?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что такое runtime health в этой документации?", + "normalized_query": "Что такое runtime health в этой документации?", + "target_terms": [ + "runtime-health-entity", + "Что", + "такое", + "runtime", + "health", + "этой" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "Что", + "такое", + "runtime", + "health", + "этой" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что такое runtime health в этой документации?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "runtime-health-entity", + "Что", + "такое", + "runtime", + "health", + "этой" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "Что", + "такое", + "runtime", + "health", + "этой" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md new file mode 100644 index 0000000..dc1d626 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md @@ -0,0 +1,113 @@ +# v2-router-docs-summary-04-runtime-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что такое runtime health в этой документации? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Что такое runtime health в этой документации?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что такое runtime health в этой документации?", + "normalized_query": "Что такое runtime health в этой документации?", + "target_terms": [ + "runtime-health-entity", + "Что", + "такое", + "runtime", + "health", + "этой" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "Что", + "такое", + "runtime", + "health", + "этой" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что такое runtime health в этой документации?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "runtime-health-entity", + "Что", + "такое", + "runtime", + "health", + "этой" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "Что", + "такое", + "runtime", + "health", + "этой" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json new file mode 100644 index 0000000..039b19b --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json @@ -0,0 +1,103 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-05-notification-loop", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Кратко опиши цикл отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Кратко опиши цикл отправки уведомлений", + "normalized_query": "Кратко опиши цикл отправки уведомлений", + "target_terms": [ + "telegram-notification-loop", + "Кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram-notification-loop", + "Кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко опиши цикл отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "telegram-notification-loop", + "Кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram-notification-loop", + "Кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md new file mode 100644 index 0000000..900a1ad --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md @@ -0,0 +1,113 @@ +# v2-router-docs-summary-05-notification-loop + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Кратко опиши цикл отправки уведомлений + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Кратко опиши цикл отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Кратко опиши цикл отправки уведомлений", + "normalized_query": "Кратко опиши цикл отправки уведомлений", + "target_terms": [ + "telegram-notification-loop", + "Кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram-notification-loop", + "Кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко опиши цикл отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "telegram-notification-loop", + "Кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram-notification-loop", + "Кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json new file mode 100644 index 0000000..18d10be --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json @@ -0,0 +1,115 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-06-architecture", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Как устроена архитектура Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как устроена архитектура Telegram Notify App?", + "normalized_query": "Как устроена архитектура Telegram Notify App?", + "target_terms": [ + "telegram-notify-app-overview", + "Telegram", + "Notify", + "App", + "Как", + "устроена", + "архитектура" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "terms": [ + "telegram-notify-app-overview", + "Telegram", + "Notify", + "App", + "Как", + "устроена", + "архитектура" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как устроена архитектура Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "telegram-notify-app-overview", + "Telegram", + "Notify", + "App", + "Как", + "устроена", + "архитектура" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "terms": [ + "telegram-notify-app-overview", + "Telegram", + "Notify", + "App", + "Как", + "устроена", + "архитектура" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md new file mode 100644 index 0000000..da255cd --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md @@ -0,0 +1,125 @@ +# v2-router-docs-summary-06-architecture + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Как устроена архитектура Telegram Notify App? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Как устроена архитектура Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как устроена архитектура Telegram Notify App?", + "normalized_query": "Как устроена архитектура Telegram Notify App?", + "target_terms": [ + "telegram-notify-app-overview", + "Telegram", + "Notify", + "App", + "Как", + "устроена", + "архитектура" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "terms": [ + "telegram-notify-app-overview", + "Telegram", + "Notify", + "App", + "Как", + "устроена", + "архитектура" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как устроена архитектура Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "telegram-notify-app-overview", + "Telegram", + "Notify", + "App", + "Как", + "устроена", + "архитектура" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "terms": [ + "telegram-notify-app-overview", + "Telegram", + "Notify", + "App", + "Как", + "устроена", + "архитектура" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json new file mode 100644 index 0000000..8720862 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json @@ -0,0 +1,95 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-07-worker", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Что делает worker в этом приложении?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает worker в этом приложении?", + "normalized_query": "Что делает worker в этом приложении?", + "target_terms": [ + "Что", + "делает", + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "делает", + "worker", + "этом", + "приложении" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает worker в этом приложении?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "Что", + "делает", + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "делает", + "worker", + "этом", + "приложении" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md new file mode 100644 index 0000000..64e5208 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md @@ -0,0 +1,105 @@ +# v2-router-docs-summary-07-worker + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что делает worker в этом приложении? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Что делает worker в этом приложении?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает worker в этом приложении?", + "normalized_query": "Что делает worker в этом приложении?", + "target_terms": [ + "Что", + "делает", + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "делает", + "worker", + "этом", + "приложении" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает worker в этом приложении?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "Что", + "делает", + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "делает", + "worker", + "этом", + "приложении" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json new file mode 100644 index 0000000..00bfebe --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json @@ -0,0 +1,99 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-08-health-statuses", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Какие статусы здоровья есть у runtime?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Какие статусы здоровья есть у runtime?", + "normalized_query": "Какие статусы здоровья есть у runtime?", + "target_terms": [ + "runtime-health-entity", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие статусы здоровья есть у runtime?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "runtime-health-entity", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md new file mode 100644 index 0000000..2aef934 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md @@ -0,0 +1,109 @@ +# v2-router-docs-summary-08-health-statuses + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какие статусы здоровья есть у runtime? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Какие статусы здоровья есть у runtime?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Какие статусы здоровья есть у runtime?", + "normalized_query": "Какие статусы здоровья есть у runtime?", + "target_terms": [ + "runtime-health-entity", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие статусы здоровья есть у runtime?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "runtime-health-entity", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json new file mode 100644 index 0000000..ea42750 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json @@ -0,0 +1,107 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-09-manual-send", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Как в приложении устроена ручная отправка сообщения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как в приложении устроена ручная отправка сообщения?", + "normalized_query": "Как в приложении устроена ручная отправка сообщения?", + "target_terms": [ + "/send", + "Как", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "Как", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в приложении устроена ручная отправка сообщения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "/send", + "Как", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "Как", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md new file mode 100644 index 0000000..c808ec2 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md @@ -0,0 +1,117 @@ +# v2-router-docs-summary-09-manual-send + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Как в приложении устроена ручная отправка сообщения? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Как в приложении устроена ручная отправка сообщения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как в приложении устроена ручная отправка сообщения?", + "normalized_query": "Как в приложении устроена ручная отправка сообщения?", + "target_terms": [ + "/send", + "Как", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "Как", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в приложении устроена ручная отправка сообщения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "/send", + "Как", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "Как", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json new file mode 100644 index 0000000..52fc26c --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json @@ -0,0 +1,98 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-10-telegram-integration", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": false, + "mismatches": [ + "domain: expected DOCS, got GENERAL", + "intent: expected DOC_EXPLAIN, got GENERAL_QA" + ] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_fallback", + "llm_router_used": false, + "confidence": 0.0 + }, + "details": { + "query": "Как сервис взаимодействует с Telegram в целом?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как сервис взаимодействует с Telegram в целом?", + "normalized_query": "Как сервис взаимодействует с Telegram в целом?", + "target_terms": [ + "Telegram", + "Как", + "сервис", + "взаимодействует", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "terms": [ + "Telegram", + "Как", + "сервис", + "взаимодействует", + "целом" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.0, + "routing_mode": "llm_fallback", + "llm_router_used": false, + "reason_short": "fallback to GENERAL_QA.SUMMARY" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как сервис взаимодействует с Telegram в целом?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "fallback to GENERAL_QA.SUMMARY", + "target_terms": [ + "Telegram", + "Как", + "сервис", + "взаимодействует", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "terms": [ + "Telegram", + "Как", + "сервис", + "взаимодействует", + "целом" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md new file mode 100644 index 0000000..ab810ba --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md @@ -0,0 +1,106 @@ +# v2-router-docs-summary-10-telegram-integration + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: False + +## Query +Как сервис взаимодействует с Telegram в целом? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_fallback", + "llm_router_used": false, + "confidence": 0.0 +} +``` + +## Details +```json +{ + "query": "Как сервис взаимодействует с Telegram в целом?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как сервис взаимодействует с Telegram в целом?", + "normalized_query": "Как сервис взаимодействует с Telegram в целом?", + "target_terms": [ + "Telegram", + "Как", + "сервис", + "взаимодействует", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "terms": [ + "Telegram", + "Как", + "сервис", + "взаимодействует", + "целом" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.0, + "routing_mode": "llm_fallback", + "llm_router_used": false, + "reason_short": "fallback to GENERAL_QA.SUMMARY" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как сервис взаимодействует с Telegram в целом?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "fallback to GENERAL_QA.SUMMARY", + "target_terms": [ + "Telegram", + "Как", + "сервис", + "взаимодействует", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "terms": [ + "Telegram", + "Как", + "сервис", + "взаимодействует", + "целом" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- domain: expected DOCS, got GENERAL +- intent: expected DOC_EXPLAIN, got GENERAL_QA \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-01-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-01-health.json new file mode 100644 index 0000000..c5dbf06 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-01-health.json @@ -0,0 +1,99 @@ +{ + "meta": { + "case_id": "v2-router-find-files-01-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "В каком файле описан `/health`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле описан `/health`?", + "normalized_query": "В каком файле описан `/health`?", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "file_names": [ + "/health" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле описан `/health`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "file_names": [ + "/health" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-01-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-01-health.md new file mode 100644 index 0000000..9870147 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-01-health.md @@ -0,0 +1,109 @@ +# v2-router-find-files-01-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каком файле описан `/health`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "В каком файле описан `/health`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле описан `/health`?", + "normalized_query": "В каком файле описан `/health`?", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "file_names": [ + "/health" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле описан `/health`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "file_names": [ + "/health" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-02-send.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-02-send.json new file mode 100644 index 0000000..1a2c1aa --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-02-send.json @@ -0,0 +1,95 @@ +{ + "meta": { + "case_id": "v2-router-find-files-02-send", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Покажи файл с описанием endpoint `/send`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл с описанием endpoint `/send`", + "normalized_query": "Покажи файл с описанием endpoint `/send`", + "target_terms": [ + "/send", + "описанием", + "endpoint" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "описанием", + "endpoint" + ], + "file_names": [ + "/send" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл с описанием endpoint `/send`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "/send", + "описанием", + "endpoint" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "описанием", + "endpoint" + ], + "file_names": [ + "/send" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-02-send.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-02-send.md new file mode 100644 index 0000000..47e2080 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-02-send.md @@ -0,0 +1,105 @@ +# v2-router-find-files-02-send + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Покажи файл с описанием endpoint `/send` + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Покажи файл с описанием endpoint `/send`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл с описанием endpoint `/send`", + "normalized_query": "Покажи файл с описанием endpoint `/send`", + "target_terms": [ + "/send", + "описанием", + "endpoint" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "описанием", + "endpoint" + ], + "file_names": [ + "/send" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл с описанием endpoint `/send`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "/send", + "описанием", + "endpoint" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "описанием", + "endpoint" + ], + "file_names": [ + "/send" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json new file mode 100644 index 0000000..1204332 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json @@ -0,0 +1,99 @@ +{ + "meta": { + "case_id": "v2-router-find-files-03-actions", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Где находится документация по `/actions/{action}`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где находится документация по `/actions/{action}`?", + "normalized_query": "Где находится документация по `/actions/{action}`?", + "target_terms": [ + "/actions/{action}", + "находится", + "action" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/actions/{action}", + "находится", + "action" + ], + "file_names": [ + "/actions/{action}" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где находится документация по `/actions/{action}`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "/actions/{action}", + "находится", + "action" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/actions/{action}", + "находится", + "action" + ], + "file_names": [ + "/actions/{action}" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md new file mode 100644 index 0000000..e25674d --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md @@ -0,0 +1,109 @@ +# v2-router-find-files-03-actions + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Где находится документация по `/actions/{action}`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Где находится документация по `/actions/{action}`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где находится документация по `/actions/{action}`?", + "normalized_query": "Где находится документация по `/actions/{action}`?", + "target_terms": [ + "/actions/{action}", + "находится", + "action" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/actions/{action}", + "находится", + "action" + ], + "file_names": [ + "/actions/{action}" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где находится документация по `/actions/{action}`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "/actions/{action}", + "находится", + "action" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/actions/{action}", + "находится", + "action" + ], + "file_names": [ + "/actions/{action}" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json new file mode 100644 index 0000000..7bccd5a --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json @@ -0,0 +1,103 @@ +{ + "meta": { + "case_id": "v2-router-find-files-04-runtime-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "В каком документе описан runtime health?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком документе описан runtime health?", + "normalized_query": "В каком документе описан runtime health?", + "target_terms": [ + "runtime-health-entity", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком документе описан runtime health?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "runtime-health-entity", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md new file mode 100644 index 0000000..ad030e5 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md @@ -0,0 +1,113 @@ +# v2-router-find-files-04-runtime-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каком документе описан runtime health? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "В каком документе описан runtime health?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком документе описан runtime health?", + "normalized_query": "В каком документе описан runtime health?", + "target_terms": [ + "runtime-health-entity", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком документе описан runtime health?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "runtime-health-entity", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json new file mode 100644 index 0000000..d05481c --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json @@ -0,0 +1,91 @@ +{ + "meta": { + "case_id": "v2-router-find-files-05-loop", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Найди файл с логикой цикла отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Найди файл с логикой цикла отправки уведомлений", + "normalized_query": "Найди файл с логикой цикла отправки уведомлений", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Найди файл с логикой цикла отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md new file mode 100644 index 0000000..6736e8f --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md @@ -0,0 +1,101 @@ +# v2-router-find-files-05-loop + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Найди файл с логикой цикла отправки уведомлений + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Найди файл с логикой цикла отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Найди файл с логикой цикла отправки уведомлений", + "normalized_query": "Найди файл с логикой цикла отправки уведомлений", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Найди файл с логикой цикла отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json new file mode 100644 index 0000000..8dd2948 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json @@ -0,0 +1,95 @@ +{ + "meta": { + "case_id": "v2-router-find-files-06-architecture", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Где описана архитектура приложения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где описана архитектура приложения?", + "normalized_query": "Где описана архитектура приложения?", + "target_terms": [ + "telegram-notify-app-overview", + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram-notify-app-overview", + "описана", + "архитектура", + "приложения" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где описана архитектура приложения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "telegram-notify-app-overview", + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram-notify-app-overview", + "описана", + "архитектура", + "приложения" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md new file mode 100644 index 0000000..4411a1a --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md @@ -0,0 +1,105 @@ +# v2-router-find-files-06-architecture + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Где описана архитектура приложения? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Где описана архитектура приложения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где описана архитектура приложения?", + "normalized_query": "Где описана архитектура приложения?", + "target_terms": [ + "telegram-notify-app-overview", + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram-notify-app-overview", + "описана", + "архитектура", + "приложения" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где описана архитектура приложения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "telegram-notify-app-overview", + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram-notify-app-overview", + "описана", + "архитектура", + "приложения" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json new file mode 100644 index 0000000..7976947 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json @@ -0,0 +1,103 @@ +{ + "meta": { + "case_id": "v2-router-find-files-07-errors-catalog", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "В каком файле лежит каталог ошибок?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле лежит каталог ошибок?", + "normalized_query": "В каком файле лежит каталог ошибок?", + "target_terms": [ + "catalog-errors", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "terms": [ + "catalog-errors", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле лежит каталог ошибок?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "catalog-errors", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "terms": [ + "catalog-errors", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md new file mode 100644 index 0000000..8175992 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md @@ -0,0 +1,113 @@ +# v2-router-find-files-07-errors-catalog + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каком файле лежит каталог ошибок? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "В каком файле лежит каталог ошибок?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле лежит каталог ошибок?", + "normalized_query": "В каком файле лежит каталог ошибок?", + "target_terms": [ + "catalog-errors", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "terms": [ + "catalog-errors", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле лежит каталог ошибок?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "catalog-errors", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "terms": [ + "catalog-errors", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json new file mode 100644 index 0000000..c1c5b7c --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json @@ -0,0 +1,91 @@ +{ + "meta": { + "case_id": "v2-router-find-files-08-docs-index", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Покажи файл-индекс документации проекта", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл-индекс документации проекта", + "normalized_query": "Покажи файл-индекс документации проекта", + "target_terms": [ + "docs-readme", + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "terms": [ + "docs-readme", + "файл-индекс", + "проекта" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл-индекс документации проекта" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "docs-readme", + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "terms": [ + "docs-readme", + "файл-индекс", + "проекта" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md new file mode 100644 index 0000000..1946d5c --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md @@ -0,0 +1,101 @@ +# v2-router-find-files-08-docs-index + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Покажи файл-индекс документации проекта + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Покажи файл-индекс документации проекта", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл-индекс документации проекта", + "normalized_query": "Покажи файл-индекс документации проекта", + "target_terms": [ + "docs-readme", + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "terms": [ + "docs-readme", + "файл-индекс", + "проекта" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл-индекс документации проекта" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "docs-readme", + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "terms": [ + "docs-readme", + "файл-индекс", + "проекта" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json new file mode 100644 index 0000000..42be420 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json @@ -0,0 +1,99 @@ +{ + "meta": { + "case_id": "v2-router-find-files-09-telegram-bot-api", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "normalized_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "target_terms": [ + "Telegram", + "Bot", + "API", + "относятся", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "terms": [ + "Telegram", + "Bot", + "API", + "относятся", + "интеграции" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "Telegram", + "Bot", + "API", + "относятся", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "terms": [ + "Telegram", + "Bot", + "API", + "относятся", + "интеграции" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md new file mode 100644 index 0000000..2f1b0c1 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md @@ -0,0 +1,109 @@ +# v2-router-find-files-09-telegram-bot-api + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какие файлы относятся к Telegram Bot API интеграции? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "normalized_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "target_terms": [ + "Telegram", + "Bot", + "API", + "относятся", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "terms": [ + "Telegram", + "Bot", + "API", + "относятся", + "интеграции" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "Telegram", + "Bot", + "API", + "относятся", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "terms": [ + "Telegram", + "Bot", + "API", + "относятся", + "интеграции" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json new file mode 100644 index 0000000..4b2866b --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json @@ -0,0 +1,95 @@ +{ + "meta": { + "case_id": "v2-router-find-files-10-telegram-notify-worker", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "В каких файлах описан worker `telegram_notify`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каких файлах описан worker `telegram_notify`?", + "normalized_query": "В каких файлах описан worker `telegram_notify`?", + "target_terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каких файлах описан worker `telegram_notify`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md new file mode 100644 index 0000000..c0b6454 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md @@ -0,0 +1,105 @@ +# v2-router-find-files-10-telegram-notify-worker + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каких файлах описан worker `telegram_notify`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "В каких файлах описан worker `telegram_notify`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каких файлах описан worker `telegram_notify`?", + "normalized_query": "В каких файлах описан worker `telegram_notify`?", + "target_terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каких файлах описан worker `telegram_notify`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json new file mode 100644 index 0000000..9eef4cc --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v2-router-general-01-what-is-service", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Что это за сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что это за сервис?", + "normalized_query": "Что это за сервис?", + "target_terms": [ + "Что", + "это", + "сервис" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "это", + "сервис" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что это за сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Что", + "это", + "сервис" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "это", + "сервис" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md new file mode 100644 index 0000000..e007ea0 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md @@ -0,0 +1,93 @@ +# v2-router-general-01-what-is-service + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что это за сервис? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Что это за сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что это за сервис?", + "normalized_query": "Что это за сервис?", + "target_terms": [ + "Что", + "это", + "сервис" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "это", + "сервис" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что это за сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Что", + "это", + "сервис" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "это", + "сервис" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-02-purpose.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-02-purpose.json new file mode 100644 index 0000000..9aed4f1 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-02-purpose.json @@ -0,0 +1,87 @@ +{ + "meta": { + "case_id": "v2-router-general-02-purpose", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Для чего нужен test_echo_app?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Для чего нужен test_echo_app?", + "normalized_query": "Для чего нужен test_echo_app?", + "target_terms": [ + "Для", + "чего", + "нужен", + "test_echo_app" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Для", + "чего", + "нужен", + "test_echo_app" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Для чего нужен test_echo_app?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Для", + "чего", + "нужен", + "test_echo_app" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Для", + "чего", + "нужен", + "test_echo_app" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-02-purpose.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-02-purpose.md new file mode 100644 index 0000000..9bcf726 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-02-purpose.md @@ -0,0 +1,97 @@ +# v2-router-general-02-purpose + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Для чего нужен test_echo_app? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Для чего нужен test_echo_app?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Для чего нужен test_echo_app?", + "normalized_query": "Для чего нужен test_echo_app?", + "target_terms": [ + "Для", + "чего", + "нужен", + "test_echo_app" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Для", + "чего", + "нужен", + "test_echo_app" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Для чего нужен test_echo_app?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Для", + "чего", + "нужен", + "test_echo_app" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Для", + "чего", + "нужен", + "test_echo_app" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-03-problem.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-03-problem.json new file mode 100644 index 0000000..0d45adc --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-03-problem.json @@ -0,0 +1,91 @@ +{ + "meta": { + "case_id": "v2-router-general-03-problem", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Какую задачу решает это приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какую задачу решает это приложение?", + "normalized_query": "Какую задачу решает это приложение?", + "target_terms": [ + "Какую", + "задачу", + "решает", + "это", + "приложение" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Какую", + "задачу", + "решает", + "это", + "приложение" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какую задачу решает это приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Какую", + "задачу", + "решает", + "это", + "приложение" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Какую", + "задачу", + "решает", + "это", + "приложение" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-03-problem.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-03-problem.md new file mode 100644 index 0000000..1a3c320 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-03-problem.md @@ -0,0 +1,101 @@ +# v2-router-general-03-problem + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какую задачу решает это приложение? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Какую задачу решает это приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какую задачу решает это приложение?", + "normalized_query": "Какую задачу решает это приложение?", + "target_terms": [ + "Какую", + "задачу", + "решает", + "это", + "приложение" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Какую", + "задачу", + "решает", + "это", + "приложение" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какую задачу решает это приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Какую", + "задачу", + "решает", + "это", + "приложение" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Какую", + "задачу", + "решает", + "это", + "приложение" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json new file mode 100644 index 0000000..f57afcc --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json @@ -0,0 +1,91 @@ +{ + "meta": { + "case_id": "v2-router-general-04-docs-contents", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Что входит в документацию этого проекта?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что входит в документацию этого проекта?", + "normalized_query": "Что входит в документацию этого проекта?", + "target_terms": [ + "Что", + "входит", + "документацию", + "этого", + "проекта" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "входит", + "документацию", + "этого", + "проекта" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что входит в документацию этого проекта?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Что", + "входит", + "документацию", + "этого", + "проекта" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "входит", + "документацию", + "этого", + "проекта" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md new file mode 100644 index 0000000..cfcb6e8 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md @@ -0,0 +1,101 @@ +# v2-router-general-04-docs-contents + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что входит в документацию этого проекта? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Что входит в документацию этого проекта?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что входит в документацию этого проекта?", + "normalized_query": "Что входит в документацию этого проекта?", + "target_terms": [ + "Что", + "входит", + "документацию", + "этого", + "проекта" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "входит", + "документацию", + "этого", + "проекта" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что входит в документацию этого проекта?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Что", + "входит", + "документацию", + "этого", + "проекта" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "входит", + "документацию", + "этого", + "проекта" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json new file mode 100644 index 0000000..c697753 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json @@ -0,0 +1,87 @@ +{ + "meta": { + "case_id": "v2-router-general-05-main-parts", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Какие основные части есть у системы?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие основные части есть у системы?", + "normalized_query": "Какие основные части есть у системы?", + "target_terms": [ + "основные", + "части", + "есть", + "системы" + ], + "anchors": { + "entity_names": [], + "terms": [ + "основные", + "части", + "есть", + "системы" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие основные части есть у системы?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "основные", + "части", + "есть", + "системы" + ], + "anchors": { + "entity_names": [], + "terms": [ + "основные", + "части", + "есть", + "системы" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md new file mode 100644 index 0000000..a3ddb38 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md @@ -0,0 +1,97 @@ +# v2-router-general-05-main-parts + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какие основные части есть у системы? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Какие основные части есть у системы?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие основные части есть у системы?", + "normalized_query": "Какие основные части есть у системы?", + "target_terms": [ + "основные", + "части", + "есть", + "системы" + ], + "anchors": { + "entity_names": [], + "terms": [ + "основные", + "части", + "есть", + "системы" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие основные части есть у системы?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "основные", + "части", + "есть", + "системы" + ], + "anchors": { + "entity_names": [], + "terms": [ + "основные", + "части", + "есть", + "системы" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json new file mode 100644 index 0000000..16bab4d --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json @@ -0,0 +1,87 @@ +{ + "meta": { + "case_id": "v2-router-general-06-high-level-architecture", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Как в целом устроено приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как в целом устроено приложение?", + "normalized_query": "Как в целом устроено приложение?", + "target_terms": [ + "Как", + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Как", + "целом", + "устроено", + "приложение" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в целом устроено приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Как", + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Как", + "целом", + "устроено", + "приложение" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md new file mode 100644 index 0000000..06d558a --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md @@ -0,0 +1,97 @@ +# v2-router-general-06-high-level-architecture + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Как в целом устроено приложение? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Как в целом устроено приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как в целом устроено приложение?", + "normalized_query": "Как в целом устроено приложение?", + "target_terms": [ + "Как", + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Как", + "целом", + "устроено", + "приложение" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в целом устроено приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Как", + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Как", + "целом", + "устроено", + "приложение" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json new file mode 100644 index 0000000..f451d58 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json @@ -0,0 +1,95 @@ +{ + "meta": { + "case_id": "v2-router-general-07-besides-api", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Что тут есть кроме API?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что тут есть кроме API?", + "normalized_query": "Что тут есть кроме API?", + "target_terms": [ + "API", + "Что", + "тут", + "есть", + "кроме" + ], + "anchors": { + "entity_names": [ + "API" + ], + "terms": [ + "API", + "Что", + "тут", + "есть", + "кроме" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что тут есть кроме API?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "API", + "Что", + "тут", + "есть", + "кроме" + ], + "anchors": { + "entity_names": [ + "API" + ], + "terms": [ + "API", + "Что", + "тут", + "есть", + "кроме" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md new file mode 100644 index 0000000..cd93ca7 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md @@ -0,0 +1,105 @@ +# v2-router-general-07-besides-api + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что тут есть кроме API? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Что тут есть кроме API?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что тут есть кроме API?", + "normalized_query": "Что тут есть кроме API?", + "target_terms": [ + "API", + "Что", + "тут", + "есть", + "кроме" + ], + "anchors": { + "entity_names": [ + "API" + ], + "terms": [ + "API", + "Что", + "тут", + "есть", + "кроме" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что тут есть кроме API?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "API", + "Что", + "тут", + "есть", + "кроме" + ], + "anchors": { + "entity_names": [ + "API" + ], + "terms": [ + "API", + "Что", + "тут", + "есть", + "кроме" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-08-components.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-08-components.json new file mode 100644 index 0000000..47390ed --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-08-components.json @@ -0,0 +1,106 @@ +{ + "meta": { + "case_id": "v2-router-general-08-components", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": false, + "mismatches": [ + "domain: expected GENERAL, got DOCS", + "intent: expected GENERAL_QA, got DOC_EXPLAIN" + ] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Из чего состоит Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Из чего состоит Telegram Notify App?", + "normalized_query": "Из чего состоит Telegram Notify App?", + "target_terms": [ + "Telegram", + "Notify", + "App", + "чего", + "состоит" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "terms": [ + "Telegram", + "Notify", + "App", + "чего", + "состоит" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Из чего состоит Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "Telegram", + "Notify", + "App", + "чего", + "состоит" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "terms": [ + "Telegram", + "Notify", + "App", + "чего", + "состоит" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-08-components.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-08-components.md new file mode 100644 index 0000000..c0416ea --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-08-components.md @@ -0,0 +1,114 @@ +# v2-router-general-08-components + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: False + +## Query +Из чего состоит Telegram Notify App? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Из чего состоит Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Из чего состоит Telegram Notify App?", + "normalized_query": "Из чего состоит Telegram Notify App?", + "target_terms": [ + "Telegram", + "Notify", + "App", + "чего", + "состоит" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "terms": [ + "Telegram", + "Notify", + "App", + "чего", + "состоит" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Из чего состоит Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "Telegram", + "Notify", + "App", + "чего", + "состоит" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "terms": [ + "Telegram", + "Notify", + "App", + "чего", + "состоит" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- domain: expected GENERAL, got DOCS +- intent: expected GENERAL_QA, got DOC_EXPLAIN \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json new file mode 100644 index 0000000..cca6d29 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v2-router-general-09-reading-order", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Какие документы стоит читать сначала?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие документы стоит читать сначала?", + "normalized_query": "Какие документы стоит читать сначала?", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "terms": [ + "стоит", + "читать", + "сначала" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие документы стоит читать сначала?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "terms": [ + "стоит", + "читать", + "сначала" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md new file mode 100644 index 0000000..02662d1 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md @@ -0,0 +1,93 @@ +# v2-router-general-09-reading-order + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какие документы стоит читать сначала? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Какие документы стоит читать сначала?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие документы стоит читать сначала?", + "normalized_query": "Какие документы стоит читать сначала?", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "terms": [ + "стоит", + "читать", + "сначала" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие документы стоит читать сначала?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "terms": [ + "стоит", + "читать", + "сначала" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json new file mode 100644 index 0000000..ce8e869 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json @@ -0,0 +1,87 @@ +{ + "meta": { + "case_id": "v2-router-general-10-short-summary", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Дай короткое summary по проектной документации", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Дай короткое summary по проектной документации", + "normalized_query": "Дай короткое summary по проектной документации", + "target_terms": [ + "Дай", + "короткое", + "summary", + "проектной" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Дай", + "короткое", + "summary", + "проектной" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Дай короткое summary по проектной документации" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Дай", + "короткое", + "summary", + "проектной" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Дай", + "короткое", + "summary", + "проектной" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md new file mode 100644 index 0000000..be3dbe5 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md @@ -0,0 +1,97 @@ +# v2-router-general-10-short-summary + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Дай короткое summary по проектной документации + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Дай короткое summary по проектной документации", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Дай короткое summary по проектной документации", + "normalized_query": "Дай короткое summary по проектной документации", + "target_terms": [ + "Дай", + "короткое", + "summary", + "проектной" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Дай", + "короткое", + "summary", + "проектной" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Дай короткое summary по проектной документации" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Дай", + "короткое", + "summary", + "проектной" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Дай", + "короткое", + "summary", + "проектной" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/summary.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/summary.md new file mode 100644 index 0000000..9a8e5ed --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4/20260407_120038/summary.md @@ -0,0 +1,40 @@ +# pipeline_setup_v4 summary + +Passed: 28/30 + +| Case | Component | Query | Intent | Sub-intent | Pass | +|------|-----------|-------|--------|------------|------| +| v2-router-general-01-what-is-service | process_v2_intent_router | Что это за сервис? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-02-purpose | process_v2_intent_router | Для чего нужен test_echo_app? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-03-problem | process_v2_intent_router | Какую задачу решает это приложение? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-04-docs-contents | process_v2_intent_router | Что входит в документацию этого проекта? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-05-main-parts | process_v2_intent_router | Какие основные части есть у системы? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-06-high-level-architecture | process_v2_intent_router | Как в целом устроено приложение? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-07-besides-api | process_v2_intent_router | Что тут есть кроме API? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-08-components | process_v2_intent_router | Из чего состоит Telegram Notify App? | DOC_EXPLAIN | SUMMARY | ✗ | +| v2-router-general-09-reading-order | process_v2_intent_router | Какие документы стоит читать сначала? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-10-short-summary | process_v2_intent_router | Дай короткое summary по проектной документации | GENERAL_QA | SUMMARY | ✓ | +| v2-router-docs-summary-01-health | process_v2_intent_router | Кратко объясни по документации, как работает `/health` | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-02-send | process_v2_intent_router | Что делает endpoint `/send`? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-03-actions | process_v2_intent_router | Объясни назначение `/actions/{action}` | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-04-runtime-health | process_v2_intent_router | Что такое runtime health в этой документации? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-05-notification-loop | process_v2_intent_router | Кратко опиши цикл отправки уведомлений | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-06-architecture | process_v2_intent_router | Как устроена архитектура Telegram Notify App? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-07-worker | process_v2_intent_router | Что делает worker в этом приложении? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-08-health-statuses | process_v2_intent_router | Какие статусы здоровья есть у runtime? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-09-manual-send | process_v2_intent_router | Как в приложении устроена ручная отправка сообщения? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-10-telegram-integration | process_v2_intent_router | Как сервис взаимодействует с Telegram в целом? | GENERAL_QA | SUMMARY | ✗ | +| v2-router-find-files-01-health | process_v2_intent_router | В каком файле описан `/health`? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-02-send | process_v2_intent_router | Покажи файл с описанием endpoint `/send` | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-03-actions | process_v2_intent_router | Где находится документация по `/actions/{action}`? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-04-runtime-health | process_v2_intent_router | В каком документе описан runtime health? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-05-loop | process_v2_intent_router | Найди файл с логикой цикла отправки уведомлений | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-06-architecture | process_v2_intent_router | Где описана архитектура приложения? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-07-errors-catalog | process_v2_intent_router | В каком файле лежит каталог ошибок? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-08-docs-index | process_v2_intent_router | Покажи файл-индекс документации проекта | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-09-telegram-bot-api | process_v2_intent_router | Какие файлы относятся к Telegram Bot API интеграции? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-10-telegram-notify-worker | process_v2_intent_router | В каких файлах описан worker `telegram_notify`? | DOC_EXPLAIN | FIND_FILES | ✓ | + +## Failures +- **v2-router-general-08-components**: domain: expected GENERAL, got DOCS; intent: expected GENERAL_QA, got DOC_EXPLAIN +- **v2-router-docs-summary-10-telegram-integration**: domain: expected DOCS, got GENERAL; intent: expected DOC_EXPLAIN, got GENERAL_QA \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104.zip b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104.zip new file mode 100644 index 0000000000000000000000000000000000000000..f0be01bbb094943eb4fc1d8068d59d14913cf028 GIT binary patch literal 91192 zcmdSB1yH20e!#}fho0RSUCBP%^KJ)15ABRvB> zGo7;=GyovTEg%5EZ~vsM1PcH@^L4?TesaP5*KfJst_A@B@xNRR>*H#=y3+iDvWjYS zw7UQ0!oPQ2j*n{_>Y*B%>KW+$kd{*U0k0A!=LZyr0sIL88_=E*A@Cs*GYlw(kdR-F zOzbNR!GVZke;5L~^wjjCBsKYn_#zeg7@g##`S0Jo^#A6&aIkfDGIr3lwXt&7HL^8y)OBIhwbplXFn9ZSMe~op(wLar z7=1ih89UO@GtuZ9I+@$rIMP}h{dXVObmAXhWRuFI%{(7M_cMjcano^gup(_4QMFPz z3IYLPzD48myh-J4&Ci;`5K3^3zGPs!et!vw*(<0iYz9lNdgQOP@n&!_pLw^um~vkC zU>R4>hdJvJTxElyeh~FJwctCq*#@f&U$+l_(=S3LUn7>U@}>`oc1f2*lcts(CNE4} z20sAs275^GNSm3qbp4bcHRGP0Tho|G}Vl>y;qnqP|*5>xW^zq`&{0&v#TF1?|8_w74&7zihDwu}=8K)QV%Mm}c#)8zx zNuwVmfg9J>{l#n;FjLVgo5iAHpJoWrE9Qx_->yq*IWwnHuIa3--p?Zoy9RdGjT7#x zobYk*?pOM@XMN(2G*C~Xf;j;W;Q_edgOP@zc;Vw2slf)2tgs4Y+L+@Wy{ct|0mfWM zxir@{2kj@z?)w}FCyDOiZKP_Z-m{ce!VR}il&~}zs+ZjNku7mB+U+42JX=NT0_N;T ziXR~Q2A1l%d4R{)vDwsiwM~RQX^O@8RJ(kR#{;=mcE#lbsC>%|nSANY`um``Od>+# zls~5fQzM%f&&imCPh}yjW_Knnu1PE^@Poz=Z|EVm4BXB~x)&DJ5f)GbvKQxbBcZ@2 zM>l01o4TqvQ^B01l}WxKpo88Im9MR4nGmt_exi(TI2aA+{6YYG3yj6;eM_& z_Xw&2+9*@FB;SizD)M_3^dcpX`XDEe(pOvL0_V2oh&h2l34Mp2aMf4WZ;4}HN15~; zy1{r4P<+zgKz|kFX;rt+9S{J(Fx2lAq}spY^BdI?NBU57=V+VaJ z8hS<=J7)(wTSsGB3rAa<{}YRfRl01}=n*zwQ34Lw9Rg&up@3oAnL#s%1m!_Mh_kJm zQAQJz5ZQh#c7oV`{!b?Cs$-Eg1QNEZ6pWPmA&j1;EI75g5Gz*dd z%qoB6NquKIa}Z?$C_S5mP(b{ZK;Z}MsF4Ptg9S?m$L35HTM#M>m=;YHZSR_c2|{{J zZ{F(wDpt!B^85l?(j|2IXcpu4m6!9~!I{BZJER8FG5g4xyJr4Q#@Xv7?ez2^`XzQL z@#J8_9%JQ6D&RpJQ(u&^Iq(kmy?8>wL3iFd-x_Vb9%k4AC_6_^(-{Mr@%q`ZFD;+# zI?aCU)%1numuHnXO5c=wdH0rQjkn?0juB^nzV-x=%$ov94(J9eIno+(K_cAm9{X;$ddb5QM`LU+F&~q$e!v7nEs#Hq!crYAm4w;qkq8 zF%8iwU-3P^V+HX1COqI8kQYuJeg|=_c_DO_gEQ-rL7S&U3LUI0J^3AmMo@yrGLX1+sK4^aqS&DBX*-&Vk=MCXi4rm)?H~~X)mmr?u_Ss8> zmCt+e0j-RFH#0AQy8+fCtyjdZ=X~!+wU3G~IN4gyFNj=;W<1n>Ktv7l_aLJB7eM4s z)YRXBA##6~A^$39*lB+09-0q{W9;_FG>y#KKQzs@1brS}#kw3a2}$0&LNOGLrYAw< znYODdZoEqTQ)#z|uD_tByvC~Pa;Lnh^)CBQ_|Hi=J7y*>2bs2}-EPrR&Ce1gU`p>n zkqA9RGq01+uX14Rv1sh~ojj06Sz>_wFk%Hp02=e7to!|W;RlBd65~pseA+R9KXWbR zR!tGJo(0q7xLv{g?ZLf=#mgQ*K=j2O5@%gw6s3-^XGESMWeIkG%D@uIoE)a%)4Yho;#|sACY!`@e+P@#U1GaNAl(bIb5ce|{c%YgWDM z_i0HrdV}x_PRFb@&AS}=XbRIxayR{g+pdLz)mX&k zFRs3ai;tgcPSM$dN7yAd92L3gcM}4S&wXCar5V#*H#-|C`po4S+9p|Ad(_|6;mTgr z;rU#+lV_O}sfaa>ki`pf#&r;2IS|PGf!hGI41;kD=YAsCbh@~mpilxJS2s(;`Am)~ z%o{?CVdAc+*Cyi8#YbOmnkPF9tz-#JSS{y<{CZFM_B0KtQGrB@KV+2J4=5{Z7K48?D)1-3=lFd&9d20UQ7^U zk}&OeN)mTVcw4dC9BiRoK9HZFiGoXWj$WHvcRfhvg@?Xb>p&%%eB2<(FdS}95#ZFGJTa*#;$E(%pPpcLoC09hG=wiGhy1qnYugY|o zv&vjtXK^{kIPcUm_6F&- zdj+|xllOp9^mS*M3JUoU!%*9R4_n#*FYr6k2cQO>o`TrHGLC|<^EB6rpb@84Dkd52At#Kya9<`z8m&H!efon!PU`j`;rX6wdhZTYf^jVwXm5~S4nYCR!nXy@?n#&oRR(i-Z%<&3wW-z~MB8GBsdCcZ%7eoN=0>k4zdhMi>3A_tvqXb2v%TVlFd`!_$qe+$u zGW)rE$1D&L=I-23NvXhbQ7CuHJeCYtLM+argYQ@xRr;t_Fac+g7BYVC=ikaRvbyL< zt6F_Nlmu#r`KiQS8($i{GUgf!4`dmrOb`hg%)22?HvbUzI_@VMBPR>lb#t}d7E(*C z{Us6GU7nyPqiF2go|FcKQ^HZ{tgsPmGAg6@>Vn^rW`Szyg|11oi7~_dTy^u#>r--Y z)oh)JRA@}wv{&5|jjxIC0oe8XFLe~$1>^Ma0VOQx-&03_1(g0|f&Lw!r0|z3q(9=d ze)WBj84$YfDO5PvHkx<*T9rwXiIM~O#Kg)PCOlR#+|P&ZL|~Ok-UcmiP(1*Ypn_HH zHpA>)8dpdEr~tZ7*Z%YOou~}FtQP`UFOM{rxe0Gq7ev?d$9th7^QdSN& z{%03M)me&Zs(~;L~AHG!4{CXX5 zrF4s6mOCrKZxP*~t04eZL1g!;2qtk7rAj~UdoS2xi=SYqe;)E=_RR5QvUO%+kxS+W z6t*$g;?^aUJ7p_5WUkuhBYIArr-@~xe9J?#%hsgo;QC={thO75QA;uD#MdCT z?G_icy3M&#kSi7ogSarl<+I6q^!fO*sEWgt5IpMpqvs=J@@A`Vjl$y1xK1_7Zhii14@n2FTqutIjel`sqiZ| zn`wZp6Am5BLH9-S$}i$HTyy4PTSTg)TX9CHETQ{vJ(=BKs+Gx?OdLE{njQtfYWC*z zTEf0gAR@#C_z+(bTyr_VH|TETBc(J%`L&`12Z5GUl#3f>JOmAyR15d1VF#H)&J*#x zF|BB5qfW2*7FLh){vy!JczE9K2Z1bqx5=aZe^VCypQ`ciz##QM%b@?vT^1S}TPJf9 zb3^@K?PnS*TU)z7WY;!q=IK$orxn#UtUIib*KceLv6xdS7Wk*gpT;U=h60z~Eil0`!Zli2#n^5JlPF|B@tKjC4` zc9{T6-|(a;cwB+}o#CIN66LNb#QJw0+6ym{46Tkn`18OJ%Wns{;3sXs*|iHk;rCOz zpJt}ox(7BqSGVk!F8ZvB$WZzCp^Jop;)f?NAVT-rWO}bzSx4qUZYCsqCbmj-5Ao-8 zk4eSp<|}W!-Z(ygx|TiW7^bBU8KqK9@)-ay;n|stz2QQ8m!bP{0k85lp>YAms^8DW z!^6WM;c>|=;E^AJk=jLgeEzxHb>_4~Ev74M_L(k+d)@m7xor9#i*^Y--2J_4Zr6lj z3~{O2#ptoo0L%tUy2oQ~ z?YwfWR|{ItOm^XW*op?U!Gjv(Ho38w$9PM4up7mw0loIJb9twD%I=hL*76*|Rs<

WoI8wwnEiX58-w#OvN+s(8C|6Ktz0 zXf{nX0XEu!x5`Iz`P$*EG%DrwA$X|5tLN1SC5t-_uM*Y|p1eG(;Jdf%XbF^rOeXa)xu03iK$Rg}?Rz_9;mHUAw@ zruf&OjDyBn-^Tf)hwW%=WAq0gHl!kL`!PrBdRDEPv(#=uMR(vw-1ifDq)aZ8YtlY5 zZ%FQ9-E>~?BWl|BW51oMB~Rv4M%<>WdPi(*PGtWn>XE+}$IjH)c=>sn$1@tH<(yp# zWw05&eJ({Dq0Y_7mgfsF8PdTTQjn=StNj206ez?ZsXR_Q0V%GHA}vaY*(Ok>QQ9Ew zjNye~D*H2%!7)9)Og1itf|e^#4I?z}a5(xkAw++H+3GAqI1j56iWq5jnCN#$K&1c) zB2KUGtx^F_M*XNWlQgA};fe1vau387Vd)Wmv+_IoI2_Cw4BX>c}Iw%N7 z@wh)jaHD%;1>vO?ftLyQf~H1vxQAbY2P-l2W7eId zJt8$^VMiEV_}fkHR7Xo&TKSo@y7Dnxj0=CqkFqn#^{v^+%JDa0rK_)=tyS*R8t{N* z2yGa=$tmA%CW-<+xQ_k)8ajy@`J7jljuwvHGhTq<8U=|WY!p#?(*w51-2qdZM6pfn ztO=x5QA==XR6YR2gM2{{wQt2tA9SBmiHJ(=7d5+GwZb?GHAy+Eth6@5I%`e5F5oVL zWf`@y#2~~dA9gKGTmm+JcFh&NBnGb5KoVpx6)Mb)JUBdzq`i`Jw+7Kk3Bj!D>L(c4 zXi42Jvpkkj?l~<}Bj(kUFeKP67q|a)h(`CW;#OGJ%%#@_o|(oke?UGQxtNkBY|p#T zOOQfvE}gd=Mac24k%L)(-gujWCD)3!Kq&d(&PTgx*@-(a@QBjQ;=Bo9%c`E^aadGY z-tJSi9aEfyO z7x6}kEYvG%h=nuHV43L6RI0@TU-hBv&vj5$lhBfEMfTp6bhJtf9)*ul)mOETJk(vo z=ML$HNe@KSKdRs8e(~+*RiAe-!;CELGt?Eb%O!2d~? z{)$=ra)}G{zg%L$XV=qayPW_8>tYFIet{2{$Vis%68#~~rYa0kq zZ7$(h*j42FwO9WRHjRZ$B{jJsWRZPM~nKF?0Wyi?YeEkC+*g~#ltVh)RdUC=C0!w>H*Ba0^W6xj^q7ljo3 zEQoCK=`%uu9AY*+1OcDx#lBTM9K(5RFy5d`=D(23wjCFC$p$p3z zhYoSpwxvXV<0MUznQwX$YN{hxxAAh&{&4ctnD>x{m+kLO4wv%fI`XPpR?gAcp8mj# zYcEcNYjgBn89x8?uKsecHu47ii$ezf4DiPvUXky2b(Y3oz@a}^kbegT{i5)HO+oyj z48(tumJIYXPR3TorVjenA45H-UoU5ndVnYOOodtQ6)-2jrW zUpG0rcU$7H2&nu0dY17mlhtN+#ez+&kO<3kV(!Tdp>a$yA{Y{vy3|UFdKA&*h(6q- zGpRwf0DTDcU3j2`WJCn&a+y#lpA05AIJ^vu8L}LlX`iARg4P?J!08frl6$-fbR1r^ zVJ$UI>mbZ27+Mqy|AfJJDIf;D#58I=&>DQ?v>o9@*Y9wR4$g{R3ZRqdsy{$6Gg|9@%eW zv<>4ol+OWql7k+#<5Yoibk7lCykVW*b01im#HzjxXQkF8)XKF<6Q*ExpGmPpF8`93 zA^Tj-i4(z8{ znl_R+=obn$@o#Ai=&iIkOqM$xMsUHF`ft+Go~uMMZHJiNJy|tge%Jsc^?Tp?kWnkIJ1Sk*nbV?dBJ zA3JkQc0;`>67kt7MVy2OLnNUQP#8$^u+dd76LZlg#S%X&Yfo#x&YeghqAa9=IVHOa zB$oz`Vs0&fnDQh&A$f5q<0z)^WBu0z<&U zsDx5mozGj|cLj5wyk%2B!9$;)J8HLR6TldeiTeu)ROtYWdeik37<}bXLOP4Y=71g< zU`dteByk!6f^4y@Y;Ba6>(Pz#wF2JL1Q=O5j()jN&ZpH`-v%b{Lf_-Iw{qX3tp~4N zquj>pGa%$^Zl`@CQ;a7AyhcgU>BdN}mE`WF7BbJ6V8_?b&l*l6wD{kS`9brBzf~B< zCIqKgD;S^+iH~$84n_+n*rT6EJ+G@zV;7{!QO+GBt_o=w|lY+KeTfbNLQ$>gpZps->j zV80wrIWN#urSUymcYtkLK4}7EoxwkHpKT* z>B|i;Yi+7S?X;6MJ+e^DPr8I3fJzOPTTHyXdbl*5SAjvvYsfV%yNVZ%_d`=~)(rZ( zgGZxQ)2d~TN1MzTfV(mT@kkyq2J>hhF@y| z7Q*_wPDCy}z1k|7KPH9dP!ibK(Dtjj_`h+FIM$+8En7{gGUF^}puA zYt|xw$3TTYI7Y*3{SjPfj{Gd%tZ|vK;cUjo@daJS|DF#*#vAM~I;|;tIp#d9c@M$T z)Wo#gmiu~?%gE)(GFfBh4TQvu?B%u8r))<^JZ{M?M|P={Q2Yy29|k8^k(LJY><*&{ zX7UNbQ5rNx!uNGQRzPGsT%5kBoh~Yf>JAKg8KOy30!YaO<>6iq1b7L_X$;K~NYR^nvL{r#SHm*$EGdGNVQ(E?5K%|%>N5dPuxIYz=xTkF42D2LX zcXW1kGD>)CaSMROM_{G~5@OF22pFRJJBs+N8_>4Zb5jchg-M<;3u|DonDp~qKquo|e^^3V{IhdUXmIAQ-XJOV z`Wd~v9U`rq_ZPyT-;y0hEsnUJ>YIp#W!p6ac#6u8iSrGx%AF=a-l1lF#Z1z3{E9Em zF{Ex7S_-_KOQQrO?b|pFQ%>qAwHuk~VH~c7)ssf;D!!<*;Ycqt*c>V~V4SeG$9<_! zG8>y8!Wtl}^fa!-)jacfShVE&Tz;hF5+`3^CuG)t<}{$%4YTgUITQzbB!dD}GC)BI zNm~n+lob#~=Lp7gl2B`sXNuE(HYAUYaw5(?)YkXYzG9)OTcPB3VO%LJ1s%K-G42_C zKXPMzZR3FFwzALVvmJ%scC%ujqoF26*f#QL&~7F%rV^zUVfkun4y&n)Iu?}HByFm= zh2{JsdoV>J_0n;@29c%rbk0~rKsW9!Oe+OpLyoe9wPiwChLrKdm^~i zVvdMV>09eoe-+@aq ze^zGw^8>Td7#KU68-1Kx(YG`I1C913h9{UQ?DG+q*Tj*0W^{WmpPtJjubBIh7q>EH6Mpzo z0)8e2ZZD2bumMAQ!IUckj07>#@&tnOup$j%J(z5KMOvB+v-D_r5o1muj{(pqF*kF* z%s9waXjwfOhD$V}QzXG*@v2805`FV0H3lcRAU(m4R5<-U1q7`>R-L-UAzgnMCVl>B zE2xJX${iu(IJB|?wOLgG5s|*ibw?nmBnXjoIs-!Nh-fxH!r6KJHOvjs$a|IQBd~hy zQqK}q!d9*C&h!?^d&gTm@80{BC!^2%fpR>3jMcD^owKvEWfDv`co2+1GCeIgF{7LJ z)5VR!i%Z?*1ZitZdQPll>}ZYo?yH@<3v2g-QacVfZ7H)n1G_1V7{zu1_IM$qP*{A~DXx|(^OUY@Y&~PvA-}G}S6Y2^3*0Y36f-%eXF!x%!Ds zU_W#DDg)+Z66>wnY>?u%3qPr3UUXi++=leYSf&_TolW7!@TuTg-}=Rg(iWf98Nsg7 z_Uv5J%1THr7L7&H6ur?vWJ0uwn~j^7%!Bq};lrtMVmgAR&U%Fm-?pww;^xALk8AXE za*L*C4G6sw8jD-p5RWRn3OaF(`b{tfPqI`iA(|f8WaE^;YL<2v;M5tEbB^OAt$n&l za}&cff>Ux^m8C&sb%FO-4c|>g$KK3yT_sQsXOoIVEbC{k%QcU!&1bf)j_2z0`;%t+ zdyAIg5latp?-mlE`^M1k|y2^WRt%#QNm`T7N;m#t@+Ov!EB33Wev+HJ{0miNoAj zzBx&AdkmC7j4>m4ts*iI`I&f&7%5(h=MH4CSF|;Ec?>G_&sJ#*3_ojgGW=Rrq64h;O-KiY>%lwlH@bRA4zhqApxqm zNSuGDz|E7gyWA2H*Ns^Es<>B*s|*PGvqG=^tl(5 zFD|Vd&v@Q9b1{88T7>CF)n^KaY4^P=tdUFP+Y9cc@$G|^5TPHzA>P2-^(){*R+$#V zUdSR>*@I?OsU3ouJJ}q5UbQ+vSd46Y*P~TdfJpodmXde`P0~=ms{1|^#2Y6e3lAr_ z>~15XR0qLW5qgffLiw!x_>D@fCSQI?30y@zQbPz!2tg8u9E*vmm4=)bl^KPzH$ii? zYTC_s?IvTPMzoKc;tRR2A98S@ar6aTS7u;){qS)#k~qec@y{zIsD_tT_Omsz*_zEo zk5hA2d}u(J>R^j3QYLWzv)MSWxvH8d8Ou9bdW30CCR{=6X1V11UaK!{VaSSDYo2#s zfSkEE;9GLn?DE@C&rV=zRlnUZl3S?QTA0g6&r;*Jy0kUiwbwZ4r)sUt$AvSW#sR910X!d4<|St@ccmKI4?erZylM7CzE-uJEvwq~xA7!p8k?5S7u zS$!Xv3!Or)aXi7|1qbz6d;86_u}F1$!+nS%*xzlF|J9MIf2(l+4!F|#v&!fXwc!59 z!QRrt@L%DY6|3_kti-%Pbp6T5z@)qc zpG37jnI}4l50NZ|mUP`O-)C8F6!?-^23&+t(rYIQAk+b~{t*zq=e+yNWY|ZH!*(Yz(@)WZjZ|p>T-vt-B zoO`~Jefr!b?MqvO_U(9bhbf>2QBo$NgfNM^n_!2H=rY&z84f6uemgrmTN}e_UoDNS7Cy%T(KIddQeE^`L|nU3XigK>BXK? z3pthIeXnX1g<<}X`u=B;k2IBK+fL9-@DT{1r8;x5UO)>7U1Vdkhl9CoC1hMU0(^tp zqNN`-FWr=(cX!Ka! zlCM#UyL`$b6|;;Dc9qr(!b<%E8Y^Vy)+d>_wkN&29y4>n&SNxp3SSBr4IJ7st;hte z8Zuz&W^F9OM8@rN+f=>VFZK7Mcj7X$g8I3bCAQnxuHNnuk1cFyRS-?-1d z;OXQi>+mLZ1g`KM7LJMqaq@k($4^R-xFJTmU`nqrdl2N1;~@g3C%sYDV1z6mLW=P{rr;@te*cUgE9Zn8 z7$iC$OB#1!qNx5L^O4-)I>5#zq_>#By>PKu33G}(X8gy2n4zVlVo0LNv?T=i5zAyj z1S_k!RE{!pIWNK?>7S_Y7ZF=VZ`_C?$jVMPq4bsd#pzHh4h!4zc?=xN>fW+ePwLlLIsIe*fZ^fXqo+m( zJX~z(&G#Q>J)CC8_6!B(QGHK_e9aW-TG)7PaU|lECNntU1`C*y%t_s15lnc2VQ1Uf z)#rL9^(ixXYr>AE#gNaI}tq8ZWEM666*cD z0xv(>U=@k!7dA_VJ1-?FyBJ!+7Ijo+&1xf;n%g~yZ2%1)t)ffyZ2?Y`hZCW2k!P1v zdU`mS^)K7f75Ws&0duM6svLeanjOwg6=g@}N>k;665nW)TLi)rO_9K%Po`nkDmbr(wSyJna?~Q%DHd<4Cb7pMV zt9e_(?8)*~-e!Asa%uY8^zw9DW>e}tl4B38GVBkFL`(iuo@7Md`7&p2ZH>hxJ=+4A z4UGu1McU_d&`H~8Zu8E5?%h@Y#fOYfKeBJ(f7!qdk7^sp4{de$yVTPC3#j!!sM@~+ zt$uBJ`L71}KhEd<5$33l+pLM8Y&=te9W?`U`3$3xVh{=wfOewm-<$G7tS#!-aZXgQvsD=aDPM<_4c|;gYB=M^PJp!-*0dEPC2cdU7p%NxHW%b?MyCfKW`Eb zK`gl!nPdF?=0t$Tp0Y_1euaV1Gp^RWknd6GN+)YnrBfjo0>QjMCB>|CPRX5`WK9doLv;&vZ za`fn=mg=_RqII#>r_L#4lC8i|$siN@lUMOkMMlW@x1f4_n zUVSR*xNG`S!&2AAdT)ts9!O)~zYaR4W4tRb4_#)oj_|3HcqtUVHM5vQvIbweM1)u`#H?rihm9PYnQ7Jz)XvqeI6@K~U z;xcyHDnBIbG;-}nnb)EdPK!y9QwTl$dA#z7BkxBU+eNX1yDD`zPa+kVfZWi~wqU0n zw*txKs_0ZNcwP{Qr`|iG37o;Y-gB=#w~JPTM@xFM@7QO9b+q!ZdEz`Q&()Y-sif?Y z+-0rtifG4->&htFyn{n~)+wFRjAmYj%&?7v_Te2xC^DNR+1Ck&kBRnINT9D!`HONI zS6Su_+7>&wiDY~o3}$9O(7y*jKC6RGw0v?+BzzCUZ2p1My|IAyZ7u?CaOKt!;h53) z08}?tc^cb-)V((KEi#juPVqz)DddX2p-_T+&J|H(#t`=lW&TaElYOsjOo!oWdz5MXmFCx4iI-5xrba8^Cu7v&gxOMY{0gw2*Vp z1`W#l8Zjk?*^9^NTd_^utxnSo-7PgwZZvsH@TbfLq{tkF9b|TtY#(kR(>z?466)nS z&UwwTY?q?VN5Jr^SWdo$=>4tlD(M0o`MR(qk63g0M(`f$WNDJ-RmZZ~dx_g#xu=S% zih(>GjFgQ26x9|$>&WiP0^vSBF-{eyPcDg^(tb|qksqm!ET8icTKA556|Ug(1)LDg zcKI-AAo5i+lrrq(YAG?*s5%1?FQ#BHJ3lkaZ7W1Bk=wgK(;I3xRnPvOU15rtbZ?nV zJ+jpEv}*`+Ayo>E&*kq6kw-V9W{w$@m(IDY1^iO6-CNC0m94oorENQ+id{!Pfi>93 z5l35^J1o^qqLni4@PFNVIA-9L5J3R|AV0Qr{r3y1NPqv{^T!zccesPd|8MRf|9+C~ zUv_Q%k#I=$KM#Xb*M1xZSF5iihbDmvt3ZOtKi1nK3p^P5br!rqFL*G7_dB+pd|!y~ zM=O!*C$Y?~C^if9T3f8+bXT`y!l^vU5E6G}uF$uKs4b)ezbh2jpJ!%P&If%lirKC8 z<3&a;JUnj9CgFz~ZEm#_vvX#kW1-ZB&OlSMD~S7Jh4E+v%60SU(tbJ)fP`6DTy-(@ zfU0{SCMff~{5yg?`rHyUx&9Gp4Dygt0fqssgMrsE7&d%%pbP%fFxj8U@Q5&;Q!6Kq|{m3i#dbJ?|h!Eeg7Y?41Lc3tssu_wjQ7em{2q z+l%fSTmN|Ni)<@x&pumU(v}cEmei&yz zg*7Si3v>}Y#7TO#U+MNnHCox1LQ|?r839wx{E{BAaLIwtb{xe~CCzVcpk{-Q_PnJL zqYmNNd~1VXWw42B1>Xq5x(UE7XJ_D32{^x?~PYuw914f?2`jH&qrz#8lJwFNrj>D=EOzEF&fC*4q79Y;kqKG5r#w3 z_hzXqY_C4jq>cOx7f8loVIQ)@yw}UPHm|a>1O3vxm8=Y)N_LHH`G&x#5=etpT<0QL z4JS-BdRwkBs~3B>W!iv^nQbs%@9voi7D!~r+-nUShv?@`!j(FHUn+|8c*cxdFf8~lOn6e3-~W?gg>AF z&U`rS-QU%$zuIB{)6vC$a@zk!<^3ISqw;5Q^RGgkna07{#>w2;_}^JTQLQp7fy02} zeNPqQ?Gha!>rGKi31I+TEJuzsmtL8fU{oS*Vo&uva|i!K>Rl!$wDz%lqKqx^>?|rX zU7MfZw5yGy?Qn0C$+Ih&gcvdNS_XY;f>1hs-=WF?HPM_r_;BC_rABFHHa^d( zBK(BUpkgRg&soAu_y~Epm`Ftk_kl8jWl^f6A{ZoKPe^^zqksE}6X@8&Xi!d*t|pPO zpJ2c5hS%->YU6)24k7PxvwePCnb;_jdxfk`hLf9xJGYxSUue=;nNcZ8d0mA@4@^SX zwljR?6i*TaLv4N>*`wFb=cs!UV49}@Uf0sNmK6Jep2n(oNl1?anQ|YpMeAE=-***P z@mp;C7I@x@j+2sh-v^xy5{w7cSNDeyj(c&l#KD%)ahKy6zm`@ZV-4b@R0}=|DZYyg z9x8AU<+c>5AGL9xxxN@bAyGS{Yp|(=aTRk0vWZNsPh~`>)p2(tYnK-_u2NRu!iP2q z>VFsf-dUbj?v!9T->wAnbW&!(I3Wscmb?ab_ViF~xIE1;<`8TeNm0Ww9+3!?jLOkW zM3a_XrEu30fhPDV?MwfrJN!>#Ju#&S-1H&IE3zc{Gf`8I%wsHJjaDP3hzb;Dn))#rnON=i+{dL|**A6H%=L`--|%EU{A1`>BQXDW#})d20iOOxmHKyJ z)Suqf_0O3y2aSWVzLB|&DUGdzk+H)cu;NWB(jU9JP&S`Y3hPKQvU~JwJwNJnijb{& zS2IGl^8!I;gufkJcY~oha-2}%2EqmKgexUbLe9a7RVafD&wT9ankxuXc{4LsDk07* z)#~*N3I+QDneKOO2Tq3aIz`Yh#qiPl%aG+mN-4QV6fEUKVEv+31*w=5@UaR9Ftga{ ziaII{5IG}C^J7<6KD@Zv=Z`br5{9VBXpoH=xwca3LCgC4_$|Ze@3I|MnI!%qM#SGI>o*~?QhBFY;8|V-n=I3 zc9HMG5@#|X;(ToC!Xyox1|;lKBaIsW*wm$S(Y^T@qx+C<{Sa2}TAJSS8EuL#g~(!xfuvUdgN;s*JG{?7~^en1Qj%53^RUj7#$ zNa}gwx`oLly&w0*DEpE0O~r{UJ1j-jy&8j6IcL=CfGV@9-Nny=nGChnz8 z1h{8*44PmhUaKy)7$cX~GS3bVEL_?VdgDA7zPpVj*Vr~TB7UNN;)B5#C(}Zfr0*K4 z{}M+#%$!?^+`(5Z*tU#BJ3qmC_x&e@E_lwQB2fT1hxhtB`unA=-=W45*!$W-NMxw* z+xh)vPbwfRoRdQXnSW?1>I9sZPf#U&4c|)t@u4N`xA7Gd-41t6jjA0R^SXo{nn)SA zj%jK$o{f9?-B`QWOsJ3P16a5%??0vw*_w%=zv3J;zZ>WHD;D4U$5EADCMfnAyb#FjJ^OZw(bU310i3o zG-Eo_jkwF+F=~@lEan6s?qb4y?Y)~WyF!q-A!i&6h)SkjC8%9Qp*U~nNv9Od%pGh8 zBb8>45JWOH$DK$p8Mj9n$^YBb0qbMx09xpzQigFvflf~{D+wzhD%I=m1b`fII7PsE zr#Hwhj*{y~LOp$mN&IWL&U?!kf_z^5G6HG(N&F8&vKC5jaczIFPj%QvaEL0QJpccKz znCMzbJtijc{&4>Mtn@}nH@m3ogXy zVK@X2M0>WQH@3~VM1kzVQ|zK5K;Hr+WOaNo?N!>iX;Nc#2BF-MsTw|> zBkaI8u%v#G0xNKQkyEJ)G$dVbC|Crrkkv0J_h2~kNC>Y&n~92 zX)|9f6Vrx7>mrIK;MCblCJC7QUeNtbS$tV*bId1SosNYSlpY1C!rn^i6X>iLNqSup zB}t&jE$p5&8`^-$B4x8Y(u}<2O-KM|WVmcif3!*@2nd*>5(5u7&#@*PP7rD*+ zjEYxmSQTd7q>Gp-;j_wIM^bmw4Yi47Mi-G{x@Yk4?9Go3R6*XaJ}IBMU!}UVQkU-{ z<)zzI<8aQM3zURk66u}$s*%fBa4#lXRH{;lIs=S-(fOaPbH7&0rU};Innde*An|Ix z|F)d`s>rzq_G9jF_PZYLuMkQ9quTvDQ0v$E&;L4k_(Of8f0CM&#?0K*jK<2?#n|fK zjiddiSpKkeF#BErQPYkCcqg)w7yHFqClo@X+rR2nzB;vhJWC!F=tG z`s`I&q)Ec~--7ujJ>hI4R$o=kZTKD)caq`MJ(P_5~bxSiI-~ zhD2Z8<^SRCoxk%?+il^-jqNl}8r!yQ+qTiLabu@pV>^v)+l|%OK2N&NK6~$T##np3 z>+Ltj8sDFA|8UQ7UGtiVqpySuGz11&+Q;9*1SnxG=-fq2;RB-0C;Y|`F;|!19-={a z;HAGMPm{rF3w1?oqQmb}A%-v+Y6vos(kewg0kU%V;Ve#2b;Bxp;T61yhR1u2&ubcK zd}4MAc0TX)?|6DOQu(0I=iLRstByUcrj&;b_tOl6V)q5QIyg9#D;~67zQ+_c?`p(} z9NZsVt7+{XoSw{QP71*`@t`B;=HUHScY8ni^0Iwqd{Eufm_9`u*}*}?_Z2b;a4bzE z5Fl2@Hj6@`Ka7Bc9YfE*h!DjW^mKddOl+u>`*5L67XiH*{L;tLJ9q!3ZKlIoKCQkp zx0zLNmHcsf759q3Sojo{g*3iM;w>TP`+RM15jloMK>_^^r6~z(Q3;t>IW&`%WrBsQ z>R^l`uBvki%$Cx@Eb&BO25%y7RGR>k(V`_CsCsLYGBGT`ZG+n6o9*d@5h;m>n(aLp3aG+C;TXn#@;X z9yP#}zxNg+%(W^P*?v?S@VFHaFLiZQ0eW2;>WjfGb2-YEMeI&(6hwv9cCuJV@pRUT z-RE16Y|re}#yK&X+?=d950e21VFd&=ToDC5T!8{oZH1i<*L=`)F6VvlSYMQGn`rpW zymq4RUarvJ*d(xiskl|ZJBw*s?~rB(eumUNFAa88JGibIK~Pets1*pV-@2pL05Em;)53O1YC-YJW#qAG%FFH z_X9$1UQ<@@N#>EqFOe%}d=Is^T)n~zfw~Ns?iTH{j4k*f904)y@Nk)+F;ej;_@(D~ z%9Ix2nz^+R9T>46kl#|;Q*z)~7-kWpF}HqnbxVRQ1;%$PyFp=g?qm{F+jxtmpj#&T zofRtRB(OQb#T&lq@#X$^N_(-`4Vx2K@LQ&={fd0Ts)Ch68HH@RZ?Wg0hcZ?+|KYSYs#ByHRLtNK!}u~s$pan=$vbZKcZocI&n_x!|W&C7e%3o zVc~eehU8VZ@S&iB4V3YjWHEy4!pAo1>WIfC|44A$UQ&_2EJ?wPaah~x-`EdSLM+)u zvXb@Lxm#-FOYkb1QgdsW=Ajmi=K2?L#Ew7->phdx z{&LdM;yTEarJCV)eH7}3WR#NF{Lg|OOX~DuXN_hBky66RR z>30N|8U|}~jXueF{;V^^*`GCQa8ZVvDmjZnDlK(LHxM4dB|eJdlBp%!#w~U>03X=p zDH*(JxKMv0Nh^H;enX}%|CfO)05Yxr>5TL{;vxRt-~1=Q(Qgrv{f&hVFc!(I0CH*o z3*C;ydwdzsA~|$oVhPQ<1PbMW#=#COb{Pv!%KBN{r8XehDZv;D&|}I#)Y>U&65q{3; z`duA>Wlqc;>en)tIJGE)zyQlJfyv6p+ThPa?B_Wl6viGITNx6PBL8GyIA-7{rkKwx zWO$)s{KFj}({~29IN3=eZXfggaqH?Mc#(P6*!K8!eOvYZc(vgvENesd<>-X6ZzZ-` zx~J|yJ;s!k2@`p3aB#3mChxYF$Owgme#?Q0GceA%?=f{bvLQH%Lqfe$ zXX6Om_6FTEm>3qc@`h9JL9;FeRRKH>J0?1~0`VX)Bh*CyFlY%EuF=$}ak4aCCY%UmdSdB>jd5`}@Bo>#U5nY!h*QGX zW@;2vfPWD+U&Rubb&O*_uN6_$8lOyh0|f$lZy0LD@caCbeMQi)acl|#HSLKsQPvsl zkf%;U@bzx$4fI&$_5w*C-uRmTzI z)Rd(jo{ZQ8Nc3R^wI<~f#VHBB=jz=M*rL~GDX#CCb%NXijC4jv*U@7n-e%H|=yi_D zn!_4tXEFp7BdrG8X0B)6C|f>b@HM!btKBUDo&nzNdI{3|sMPbp1RE5DFXAmrKZ1p< zvbI|9!NJN9C&?{tYR(R2A3e1^SKT}7x=YW!CnL7V*ml1Yngz_*1_7cT33r z#XtK`z^cFPC;AU~2Bg?Hn%O!yQU8bN;jc_jtpH#3Tki56xr(RFck$j(O=1cfl+YYp zgkmaJ*HnzBnuWE(?65$-O-Q$B+(IP^4V_MRqQ1u@>FQ?0&q(CzrY2l3ZRaCNTJZk( zD0=31T#bFqKH)_`T}VuUm$}(0DPY{`{-DzLc3fDgDN`o;(_H>L@=rlXL)s z{q~2D0TDoOjr@?pui%=R_>oNEuK}S_eN@qtY=^)osPH+&y3s0>sKHIULsQx%v-8zJBYkx>+h8+@lzk+ugg15G3v&#K|XBUL+ zv$^GSJ^Czi36g57vc8(pY+3F1&;s6C-gTW+PNt)JJP|%Sv0bFT!LDG=&;AHA_{uh_ zzzrtpMYR2_wiIwU!ZD>;A7%T%(*OPadM9$?*yV#8g`pDIbfXBJ5T;QO2R^dc7aMtw0H!Hd6bFi@Oz3;z&yUmMrnK4A65d_%3`dAx{59J@ZPPy! z#(w^Z7#o=kM}Ji=Pud59gdIW;8Av)z+)yTO1+h#{sraqRoVQc;3Jg-( z-&X83@tooK?h>^Aw_4c)<_m+sG~q^?&rm42s>*K3KY&4Sl{__q7(GNQy%Szzg;D+?gD&$zt?Z?VE^*SO|>_KD?@y}hsFL%t0i`{kMdjG%CnD!myO*F?H$_wz_VU7TwAA!eEJ zFl>;FsEArEX=GhTmdz=Dl3FvDLpP-tJ)s+0Dg3%6P&zF7i#B_p*w#XfD5Y6^JnFOs zayf@?!a|=i>wU2`h>|2f(}`2fT;H@6*_p-uEZudIYm#3cjq-8)Lj3XWcd1KY(%2a$ znYq`Slj8GQ7V1sAk!6D|k_j40+5s0WpIiAR`kYyDR@;FLld@^#mGU2FU=55`7s1pk z+4edbD=e~3Y&PiaEWsrw&B1xSLBl#`JIM=2|3u}U3noe#N|59We|R--cJ zp8_nK@m-r;{VXUUT$$H@Yy*;MSR2~SZLiDRc73}&r+MFos5+vr))astYUxjdX?{N+ z{x5#)e*&caZ3gPUUjqI!m-K%=-~A^EUV5eBy4*$H@auY)Ac2o!4Tu1=s#{}jJ}S%} z@KU;AYGNe~Qu4KPHRSbucc%w#EKUl@Dxx*T=8iMxFQ5KhVf!YKwyT5pQY!~++H z2TIMXDYowtm{-X@hggjB3i&PRZ!C&D2~E0Ite-4b;RA5%HgGUc6I~XpK5+RU`3Tvr zHouuRq5jGjrcA#p_1IE`P)8|*Xf?XI=>L*XLrTD?7b4yS2!Rm#o*ca?l7QlPnCgH? zUz4hfH=<4zZQd2(XSUxyOYXL|_VtwmjQh4403ACG05xOMPurXR{^9YT4b3#|CJkfp zs}F_>V?iq@@Zt7Rc1TO{khWa7x|k%b*yFblzrty9zSKHo>ZSu2DtFyRElDjIvr65ePON-ZAy=(jCS^f;7=8UBm)N z?<6lLyM1b$$@E)twZ5Q5;+Mh5?%DhCP^CO=ehBrWY-5U6M{?3>9*isfnpB?m`k-+V z{l8W`j67ox;Kc8@#t0{ZHo~4nxl(+pnxR9Qf$$gYxz+FEHk8b3a9L9AG*-rnjOe$W zMJ+#BQ?weLiVEEg_tzXogBSoflHa3+w3I) zmjIiF2q%R7z=N20?QD-7k}nIw2B~-63N@7TI*W@TW(l~rnr_$4%~2M32&OA2Ua&rD z;!hHPs4Axz6oGyK1}ddL9jJZ>+w}MT;XeU--hy}j)+z44Kl%UJUH{rVC2I??SGV6P zs1|bR>9PA*qxz?S6-eXY$ezGxGxA*(!{zc-Mty1c$9|H}j`z+VqNP;m&PqFL zY7_8642%L5(@buDjx2h~I&5fKp=wk1Eh#z7998$KC@(oGu!fmPp8`fDKEnNuqwnp7 zS)tFj+0SoK9IoZiwU0i4dkQ1Hjlon8@4;@pW)pg3WoSi~uZEqk=CJioB>|>KsnW;rYIX2b%TgfSkx+r51CIT++5dUO>Lf}S?fr$A-B@EDz z(t*+K4gdW?4x!tbi1HtykQ#!PU?1&~D`N4ltiJ|nIt<0>GrFl9ux!z*6(#nWTnY`U zb=azuB5xAyj)JbBCiGQ>>aBiMuZKZMfG!lS@rpI@V3e#`W?BkNV z5U_@m)J@CcxrbJ66$R&{=TQ0QWz-XKEx84!Vl9nzX+ za6k$~&7neBVAv1vicVCZ1O)#Js6lM{v31hr9&Na0Kp1JJ=`OZs+t1m7%O?z&YdkmA z#=eGV3w$bp0A5}U$`mZQE%Ntr@n3G?`eR_O+2XrC(JiePu?(`s08_hY<`})#h`R^U z2aAZ8x2Q}kg7TBXfPjV{V80mHPU`!(0zoSO$$TH?MqBPN0zIdN}mtDwI?RQ52-n1mX_-DSp!tQDW~^|B@| zE_WKeZW?X0C%%V);sG7VAtXg_sj?E>9#@rETw{(WTT9SU%b<%8Ase=`y?I{gOBLCc zhw@7r%1oEZVB7ZmVp)>+Ft1U=;+LPMK9RJzNiyYs~r30oB!pX4W4V;^F9RKbT?eStSYQ0R@XX+W@M{gQ0~6}(_b zYolv?duRnarJ)hZdE*DXl&nk*$f~G*8nRzg5*22PlW34Zi*zF!p$f^eXQnIrFwx(P>%rium^N7W92%?bhA9mSrBA+u z%J$afJGC!PJ zVZ}#vEi*cmS1mi81&fZ;du5zsM<;Y`L?^~N(9RRo+q9)Iy4br^>uepzehq6A^cezg zBq{7@G%ozKLL~fQ<}PWs;es)?DCig2$q5=AiA<4?tt3}At;oCE?|#% z4dz^MI71r*asZL-?wpq9~>6pCGv^F?j!i&J)DDSv{?ARtCW*onF!uNKk z2Xa8t$r!NTB=~|juL)926h6_NsO1~MXv7Ty>33ztD9I=4Q9Gi7H0j~saB<9LIRPkd z5n4Tgvpa~8NX|FPJ4~7nlxf(X!)_aAU_c1Gc2d3%K>xg()Vqj~`YKco{^1}U6W{Yu z9xuDl1A+W5o|u6Kk(@b9`$WckC@GM!n7J_uBSFwwGDXCQ3q11X*3>MWT~^F6PO;6x zlu&Ufu;g-Q@+dd1TXi@KH7+rrh24rHJ~J-i_4wfYd}FZr+jLAHP_z=M@hegXmI7%q z3zd#Po9q#xxQ=~$mX;tRjeRE)LKXBI2vzp0#oM>$yplsOJFEYMZ?1H`nOg(BDR?$K z4Xe0mXsx>KZMj1Oh|AfrY{T8%L!2+O*6owW}#c-*EvH?=dM)sunvie+8)M9>4OG=CWHF1Qws2Wmu)N?h8 z)l?X)s-h98&@6NBc}*Zz%xn8Y)7jyYUKn~CZL5z!goDH~nMN}atmG=Kg6?tj{wz-k zVaWbOPMU_Rtt%f!M^V`KG@sl64nHhY)vTpQjuAebctn|d1!foyQ6yb zd`L_G0xKtgy8!$_YMj)reNpeZ%p)-qK49?|$t|9+v(yj3nW#V2CjC~N`B#73KLKa{ zc1Og2G0^?pKy6KF`quZij);(2g}h>Xg8!Y_M^)-N zdcwh^#E#zyeMZcELG%N4h1ForlGDY&R;frx!fJeE%xC@Q$leMLXeSw%py-zX?3Vt5 zWWdnF-)-iOM3I6mw-FHv>dUr&c1On4p1!cZqh3XT3$Xz(uD1kpM1%=R;KM)_m zZ&}SnAcet%lvD*b$Dm4&khT;oS^=1T>@>49$`){Y{%P5qz%L~=)22&<@HoIb)uu7WcPmFd^)(w zDUy9jv;rQ>M@M#G;pVkQ)0~kS5vPc&{sf618V{Kd8-9d8HXTMX_~8z72P^dwi81k0 zh_(M#cP=>3ZcfAz>NKEV>e7% z@^fxldxnaC-sG~rE;1K+)qkd5by^#f23t(22fE1V=xQS5o2iK~sC0=wMnjBEz-<>E zA)Ss!PGf5pFA( zd^Vr@GGs0xP+3+QY;CJUsm@42xYyGEg>e$Hh;VL{-v+wF%@f0WvszZi3M)$kDyK?w zL?*Rkj>oQbd#JKJp+3d|M7_DT%%z4Vt@?CT0h}&oCx1EzzQj;^$=Om-XtL($Q=T%N zclB=J!#e0~xwGkFRtsB&smSMo8P1$Fo{*vb;Y%(tG|D9^(%lc5?xM zr^P=VgMLR##Bcei{{*P|+vN3sTp{V00X>1{Hq>_d4u5?ivv`v#oho8v*4QI0Nz#%` zOh_u4Nx*#r&0dJpuB$GUxQMl05L^<3KR~`B7tkY!CmqLcmlu7}^sG@K%k!*q-JRZl z6iJ2Gjqt~p>YO+ew(~o^qs_;9FG+_mcGE{O3|n{(3Q9KA&pF;tZfrnR#K5sqtZGy= z0{VVyPAs7}i#g>OkrW18Tsa5mh)R_{nz665GuIGcM2YWqzk)IWP4e|$X#4||V1)R- z!5ntQNaBA$#+(oljTQej4LOLLj1zw36Xh@k9~iS?5+WsQD}#FXVXeA?bq(gQI@dIIyr_-Dy?%z1A&xRpSLsyr6rt^itp8g1PXxIkmRv=?R#KC}B`|e>&T%d(|}fX@5`JG?nv$ zM{w2*PP&n`zpfs}Tl&D^AFQ!st1?@jZKIENO?h#}QCU5p1i&Sz!Pg=HE`1_6aU0fD z>8G#J`K}$%G)uE;R-+HUxXf0H{PFljsb^a1U<}|-T^<=pf1f(1+OBv;pvVhYXwvTC z7*6a&A}$j~ulR@=y3+)RnWsN*m)PXON0a;GZkO20zW>@-lXUH5$Z$-J#=eJr;im2x zja6mV+{TlxdE~f>{nRhAo&Z$L$j^jp%}!TW#fifE?R<}~CX^2v+u1CL@(VM5v*=0_ zCe03%4Z|~1N8pI`DGPU1cdavehIUL}u=VHB{QN`ubcwS5+}EnRyc^N6$bak|y-O<9By06N;E=W41)DzWT07#nz?jsPQ;7po*5?INa7 zMo1Sdb4!+lCRnTXMg3P?dM6l+xSPSRxOAvneF^(j5}`R-7|f4VfVRHCZwFgZ*$~lz zu+$iqUGW9Kx*SZ%Guqx0nREn_ZlUdu*(~%CQ@wRLT+HKPcpw6=-V)S31*bgS&mMlbT@^R%bPHoA&~am- zh767!KzTblxUq5gsPeUG()0ro)ZOU7t$2PVs1pi@?0m8JOWrky=MD|fk+_f;e%pC!t zpCr*WY}z*UGFEXK=uO}r9{`D@^!>~7$avBA#b-Vf@r#2T^9G4#xK94$mSi5{Or1o% zao15w5O~_=?uN#sJ>X%gHHpz%mky;zu`9)v+1mT73b&f?1PP{B)}PV7?LFeykLAGk zoK+ch!P9@7)=a4ka&q<<-n!9mmmmG4iXJk|RFiOYUiuYSIy zKUr%SGrimR2k_r@gUb#A8vBNfvB+*G=#s7B6Cz*=H^|X(dAugNC*!h#@JPeJx{=L; zskQ?|?^Q4Z0UVHvV__b&#`Ge~4uAs!WL@e}6YT)k@l&t3=kl9>zPH=`2{54D-2T97 zUe`}|3mfM{Kno^@|Ebmwy2SyYfB<28XHD;lJB0``xLvGBmnIQe`9w8kun9gs<|y1b z9*VOHgN~5-)U%uVwG-noly%Pa7QT1T>|iEbB{!>W=M>rM@&F%UM!ZxNzBcM;taLwV z^E$V{q|c4fJXl-K4ahjxm(Sb}EPwa7)vf)VmuG>JMRQI|$_&4?_7koi5)dH0^Mr=K z4R2e0ij2s2$P2dDJ5&+SZfyOjY*d~f&yfD)2=x^nv9O7o5AjJA&`fgeE`B!pI^ifQ{_obw2X$Vdj(S6&`=CrFG==NQ{A^TB0*^4?Q0q z=Ex0e@EgE)#Y6W>wkuFLnA*ufv<*&U2NWSw44R}e=djNjcx&Y-k3aeFQwEPgUCm@k z3|p*HY*a%8qDxq*Vlgn5xnDjCS?4H%&OW7px}$iGNUVMLB=_pY4;{G0eqy6X6^l|s zxos>*589&9m?;opfuW-Yn_ZyFM+;s!j44g1zMx6$(jsg3tMoelW>Z6hU42kM24;sS zl0TIVPvzOm9*zW^H_MkR4CJ_`O_98__AKdex~W=UXCZxPo!%5&WSQLjGI*5HI&@XH zFL$^9@TQn|piJr#Q zhz}a}k?o@E1H6sl`7bM5-^=>u9RQrr|3ANu{hJ^4p8!&SyGZ80zMcMG%SBp#Tf_j< zQL^`mNZLd}Tl|zXKEjj$If{gwk|$EhKrF?eWPK-mkPm-*9&Hdy>$Cr*=!g50$YW_S zkhJTuospEu{hvC=pq*4e{U);hlwN(Z1T}o_fx(LwzBWpS9V6pS5oek2ICX!H8tQfR z)`%+mOVq~VXUI;91nE(0A1l&)z%mb&gV0P!MJW7yv9VnTW(bLFC!ScDlME;i-MfU` z;y1d3GU}*>qtM&@fF2@=qh=bqivI;$50p&q}ek*6GbVJ0!E?0ecvp06PgZr zUxnU2fQK!5O_@T8tYYbUsy_erd$<2wo%`*U6kxb>7k%+={h-07}1D z)FckUQg#@k4x)yNASn1WpNPhWjNGV}SNqJN(%H#02BHm#r#!yYC6tj)(vozJeun}w zVOaPUvzg=fIwa<1T15izr^fBpXbM8hG3QHQ)~M!?ZWi}5x{lJ=naztvO*%i`!Yr*a z2N?CT_(&AaiB)r#`tfG2?Fm;w#Ex$=+O~#xd4jMKb47l_5MdEw3cVH*i9=)gL62*> z$KN8M#5O*B&)#x%dPG(u23Br!0KLQ;_iAJY`EF2Obe0n`tv$Tzt@0|50S!)N$( zOb>2qW6W1Y6Tgne6iaX1b+F=n{xnNy$PefQZDpl}&-{R+d@a5nquKG&IZ3m~%eGR& z!Z{}uAx@Rs@(D33BpJX*L!;x5Z7Gn5LthXLF)Qtnh)@9|eg|Dn(?sMnyt1Ex3V7 z8E^H`2aoS4Ww}M7%F^hB8G?0^?*Llsv?$^ksS_wF8Q2d&QV33>B{iv8Ho5#s52I`r z1*&(lLX|)n>#HR>WsvAR>Z93W?6&ItewKU^J*5_*#-5lovK~p!*C|Pozr@xz8BKA0 zj{Uo++Uoo1)Ltzf@)%-=*Tu}`nhxa4Yg+7YC;CVeU%jN#i!lpXVJzw|+WN^P<22J$ zwJz;uC)z*z>J#Q>*VDU6>kWU*W8bf3+eUOkNe-iPSe3=k=HK{uJfc*TxWmp$es89# zh+o(D3>vdJ8m52M^Ro` z{nL@?cbn7x#n1Xr0I4^G{tePbw*Ng4Q9C;6J2^WV|5eS9wC%47V^uXCR%cCnzCYrT zJ{3~<$<=B6G_N*uwZ0*;C?w?f%tLbZ5e_Qk!+F5|>Dyy7=kn9&I8R}aWNc)4@vZa9 zk^a4Zv|rbTkDdP4(FzPnK4N-5yJ}XHA{G2#ajfC&nFxLQ4<}r>Q9z2!xDr7LiTK@R z4%S1}@gS-$&ZJWqc|vjALX8ak+hNLjDHezz97HHoTpTg@MuFt%qMzybP3}cQ614I3 zk%;}JK0&Yz`&Zi;ArmRGD&QwXFvJ3p;6#IdV`OqiQ731JO(o;wY?epQ9`MeNpC+%C zp!U}%8MwbeVbnkztBlvf&J7G^=nG*QaI^BL#B1SY?o1gCWK+SK7FLam*Y7GD>sFQh zQW6#=f+;+{*5+e>_GG+@_Y6e+?hk?EnzFcL${C`8Im4+Aum})Qx|r}Lln^;33E^>a zranbB50#Gy(vK=?09&o-$XZ92?ZE#M2Tottyv=)&_GJ6=u^kqWbYkqIsD-Awd!QNp zI_A6M+MD!5^Qx|ez8>&2M;LaL)d&^18%F0gMGWtJAB<(2GmIG!h?)F%2Z6-4TsNlMh!a#Vr+W`dW&IgJ~r*{_!E|-Z#VL z@*i33^PImL4Zlky7oCDh)*wd~W7zCdfq<3S=(c>1Y*TZ}(-7R&U9=mD z+u#t}s==z%EOYA7yPEo3oaA)dq)y)6KdA-splu!1R8VtocEhQqXp=O2UtDhAjF#Vh z{?n92&BtN=vfVvk@t6N2zT`{t3t)`m{!^SX`t8ETfBnDy6Ts??U;7PU#Z3L{(r*sv zjxo2jp|-NMwfl?L{$W7lI?5`balI6vFw*NT&!LJY!!MS=SBeCGB*kQcXJm}RDi(WB z+{1c?iV9pLXXe{^PjqsJ%6Uzs&XmS>`?ZN@&uy0t9b_CEs?zChpt-~H2~`dxFh~t! z3{FI&7ww8n$qzF{?S1iHZtG{FA}Z{fPa65#A(W`Ft{1ZsLK6P9Hr{#4@A{$_f%K;g zVvM$+D&?!-K1EvjD<@ZXMsO@Adv+On`LPf zK?S4<0;W`_-t#dg8hSZno?j%n?mZR-e~J^w7acAha#9nf3kvs(hn<@4f^kXTO;;l@ zHg;|v9O5rJqwY=F#2)uCS< z;H@QmB>?Akbro-;Hv0W`_Wsm z{n7uGbl&Y6KBm2dBCADKSS44RJJ>j}jy+iWiZAYQ%K!4)l)u9bV%K9!_&0!0q_IEa zq^aeEqeDNZ$c#Iaym+Wkg?3Q61Zs zX&L2}?`zVi4VE^FtEJ7F?iDv-9zEY@EYYACB2Z2YkmNaAEd_6`=)Vo1@VnyJpYJ#_ z>-(+SjFrDnQ#Y1JLt5#j;b^FAw%0;z+%Zq2--Gq$s%HjpP4Ugf+{HtEr1T5ufi^I5 zxy1C1B*z)_U-gkg)p-i-u*!8<&~l396OMms*l0{I(}K}q_SUO&T}$s>Zb!P19(%oJGQI&&x4$~ijfjYFRB z&Ije2jF-p{R4>0o+1o+S5YT`b3-3?8YbL)PyZ+Ai{U@N;-@eTKcTGC$zamg7Q~A#c zYu;ItfWV#~b?1{1ki0T5Koz+VXQa#AQYMs#HQzZt-%TN3Xin^=-HDOY^A_S%JfY!%O(QoSkH?Bh@ z62xy%C7%O`!TkfOqEVPBD&>o!enAyH0IHA`;Py6tK@~)d^O4|Ci`pAh0Tw|tIBf%e z=U>&vZ>nqnRGABy+zJ!`PIblrsPb75C8NR>66g6SlO_1xf|+wYL$Q;x3z8XJi?>uJ zJK_zhq&xMVMlk^rfUW6){P>DgOv+zS^_7>Shysmih|K-zuy?xqV4-Izsklizj^+a3?WiqA+TRqr3#Md8d~YAO@gvJGmF1NLA0*wPH7_j%>?B z_(c%PMQQUX$@?}@SBvHG*w{BIv&K?r#fTU29%8)$ zk0nJ=yP4oyjj(2_Qf*O%WU}yT>I#W(DR~0g+y1xiY%F;VN@XvavR=S&qI_+c7tT~~ z(Wi-=B3itvS;84|XZ%pQD`?E5yu>5}9k5_wvL~bJ(nQFvDhud<=x!PYSU%dn848U^Y;ApC5-bHH?p9xQ{9)ksQSy2(HD>jz+@%t9d;DZR>R{iNLoEAqJ^0yB5rV2yb#Io z22(O@7Iqh^D%J$%E_L>!T0_c5561&QQlv%J+M}E`#osq`s_>BZ7b^SfB!UIUlnZg_ z?w4yD>T>2qF0A_5;9!kz#cp7C=BlhB`M&gShXSRM3%L{@O|zC(${My0y-qacI}HR& zbb_cTiQ(4g;y8Lr9vX01NwXV;bJx*vqwN5i0vtPJKLV3+N!g9eW)UB;S?zi zjCsHZgjB9^cS~*@&IK8D{satH9thRIz#l!PV(p0IGE1b^Q&qTF*U!(bnd{>RxGA{( zBIs~ZT;O2AgLh|SFKqfWXe{-5`Tl|^y@5wm^HA~Fu`6b9b5jTOs6*MIDyVcrhh27A z4FX-!#7W7v$fO%Q?0)3EEu25bK9WjB&xDYZbzOL=)1SiyZXiL-EfS-%i)DY(uoIRk z7)KhTTIfOR0^;V9c!(wj^t_RnGR<-c8I54t`_dVv2<5TYpiL3D8$zYq+I~q#*E5m7 z_dc(Cl0;kY%6-y)!4Lm@F~2E!U-MMs=7uXEx`HYtGCx1>s#3D=C^UdSi-~MOM;w4& zP$5GrLJRS@rqyYYd~jcQv9K9j-daIBJ|=>0OPM4}JCkg}0d^_{^m#B4X%12+NGxTx zW(s((qfnES8WeB-P$e&`QI>~;En*kfg3kvy3etReg7x{>Z`-!6O3(T1&7pOJjpm{JTEMM5iY zJNJrc(SPEuGAK>HA_k`mxCYzC*Tow>q-tG6x6tM}YDJ)+)!O=*nODbQ+EyIg+c0z; zdP2WJ-8=6HG7I!NtV;AvRA6;@rEZKHdR6T}MtzoZm8c9#10vr>X|>TKrmpf@vOIW! zvYFI(bqX4>c^e(rMWPaQl3egLMRc^_waubMXe_XdPtEHK#gpRMFR`O~6BD`V@w7Uuu9iM@sSJ1x&x>nFg5&4j@U zTVz8A79Y&`NasiN_W@QhIpP@_JrIZ=DB1{o_(P~avCmBaRq2QJF=Xn*bC1t$te0(W zky7=K=IQ2Qk3`YY43q0#6S7lxLVVlq-bg+2NRrVWd=pro6r8H1n`X>%j7dd`*d#%I zMfu--hEmvJ1loInlOo&A;LnoI8E1o3_i(OH=iUe7<)D4&#l631xGpYV*+YWa;Z@MQ<9~$LPjAv1+vM@m?N1S@MkgZd^Xa zlrh6N0kUbmyu9)a4qC6@9|YO=H2#DYJ3T*{UJclYTl-F*)M#n)otKK6f-_t4w5GeY zb)z$U%6Q+NJx3nL-#+-06%kF-6c?FbU`Vn41Pq|alN=eUls06C9G)MX)ZNl>It{ZB z?HevQ$MigJs|z`xz^j2C5| z>VseYE*C1Ak9k?%T2>fSy+*;ey0vPPx>n03YJ875cO?RS28{k9jdbKxyAdtfA|pgK zJJE2561Qcu`RnNa#(7z5YlkEZU zXZcT+N6Nop%lemp;y(d*{`NWlzfW!qfDy*V=r6HA8Gv9l0BH?S8c}81H@ta1{&S;h zUYItDx&6HAJR`R=m9#PB_m$!t<^-GmsND)_*?dWI>i&K=Z81f*DMLt}s-x;o*(rSe zyggn$i%U?Di&rLs0wqH$kE@ z#3j8Fs5s!(UG_UW2mMa9E{8^f0=k0a7Z8QFW4^q}9ga~?Z4?&Zn6KDF0#{liDEtPn{d?`*vC{_5l9xJEd~ghlE7xHJ72=Zg3J9%cQ2;>XkG&!5|u z^K%E}j_ltAjAySHI^aN)Rye-a^SjfeqM6Gxwwp8som6czkMrf@{@DLfxdmud+j9|q zF$FT&D2Z>!J00?szi()v#T(+?dEU|v9IrsVh$s)y4Jw%@5Z>nl9&4>xppW#x72M*Z zWii{Y2{EWv5~)mo_5Znu5S2pCcBq@J5!4rji=-uHTo^M?#UC@VHW!XPZLAtK=#(D; z+ou`Cd4i_IFj;E&u1>o2vj$$1z6UobNZ9^$L90QHb|Y(1P+n@&B2VZj^beqE%w5}W z55uH@^F1NI0@^H*`S6DjpoNDP#<0hY9V5r`vO*_G>Ts^p^R1imAST4&6JgfzDo3uJ z8P^ZZpMgvg^3dk{tUHAgWl0WaiGQF}fX@2C^<$Q%ySmr%1XTbx&ID;{PCtWvlhg+9 zP%DCP=hMWZFnmyGV9aTH9I>Z1l*6Jpy@9>a-B|c=qqDh$1urHN$3ce8{Hn7FGV>Wg zOW~R6h0a+QFQltE$i`Kq)RX5h=KrVLB_Z078jl);N% zymMvfo^>YxRWSZ^L;4-(`@i+i{t3wPwD$8IW*pV=D z#^vJPqfAu0QDj6zbEpI?@hVUf!3*TX>gc0(w$e{`ZKOgn0FWHSu*n0NN%t=ULiPz# zD}>@z%#q$Xmw5L0W)n>EAlq%;>Py+L(u4LyT|(P zm6gR5kP{=1`_vWObiGvW8Qriqw-VRD_vkE9KCXUU&U9DvmV{tS2lF};r zlNDy8TGq`mm{V&}H-xRG9nmu;!3`lf9`ba5e_xIAEq4DPkitOA#UpRp_vuXCbhX!k zS~%jQ#jE;N?-XD5;EI`gy4e%L`+IXkyCRiSbra5%SkR9P0zGuXx1iYp0s$f6II}QV zzL`&uuU_tt*5T&) z1uiK=K_m~>oXS)s@g7iL=#AA`CMrz-Y#R!uInM-PdL3%HEP5Rk3d3O%^oi@bnk)Uz zPlI}SNZh{Z7+rgvqk$4={33^TZ5s^ZCi&M|%L{8Au45SXV`GQ=elUhXAi{BxdN0*)K3yMXTe>8=*xCcc)_Yl4ck$H?<9 zf7O2iFiHR0tJZ(>lKs!vRHxDjs7^y@eWX;`kf6)DiIqf!oRKU7rT$zjFl+!nICWhP z$d(c-!7+p9o}k@V&5{r+r0@!O7R{)W282B-QH&Bq0eIw=lttEatQ2ebIti-%4Nzh; z(%`i5&xl(N7>w4Dd$8hJIcflVhmb)TFdzr5{#OnfTLf7y(ua54JHR46yi8e<(CYT?(Uq&qJs~^`oK@GaZObJ7ipMh$ zMqr1710$w$cy+!RVoNo^*_0+^e#FUF%T3BbfbujAuxy=oHh1kDZaD}Lq53-pf7%hz zaxiq4;|mNKvY7y-6b39?;10T3+i%O($*hu5A-CICq zoo?;JG)PK=N_R@9A|Ndw9SYK2(jc8u(%mg7BHhxR(%m5?phyY-AI|%Fd}hw^I1ha9 zn)QuqW}(h{xVY}U_r3SNcdX|ERmi78>F#0Kp|dO{`KIu;4tvuVUetaiT-HZ@rr zwR3m7ooFyg2p#sII3TLrWDji>jW>I5&oRuq-l)0xUM6*TetbV)z+XE zlgwnYljUUS7Zh{+rCqZwIM2Rq)Q1?my>*(#B1f+G5p&Ku`Tmgg{0(K?G~f)m{W8S5 z>~6T~V%Z-d*5A;;e}c)81lQ#J8w30Ix;ec2EtkCyho0tQB6yd|AOg)Cg>2;&1$HAd zQU14)zhzhq+9Q}ji+`vtdh43eC-IJc;zXQruklI0E9*h;Rv(qdmcz5VP!F9R*CMGc z6}bbA^+FFVUJNL+FsGi7Q3{?drk;AWyD;iaPxUUa1Y|*IB|a?Bg?JLN@qLVk?m6At zXn#caN`BOxhN0Bb$J~jh4`VTG+~7Sd&-wJ8<&0x_i!P0KL!X-K1X;R3PZ~bZXZ}7( zNL(^I#JT<1DUTLhhvu9G>9PSDDQrrZ3>*z)9=j`@Oqhc6O?)<-eSZDOMl3k^ zF)ETld%QohziuoC6AV46wx?0EC$`@Kbx}Au{xSN>t$+gzG8|6?HTQ3I0ze0cY}=Rk zi&L249=+nZ?X0@uhOM%Svv@{}x)rMa*-4*oMn&5e&a)2P790Dc&tBLSpP61TJRm)U zk001ZVtm8Y)O0S;67?-`Ji$s)W|<*Mb*eF#P+#5Dh!pBAL%=-+$JobW*s^_m{70dx zD2h5vEi<8?vsdk=b17-=JvT@yGM$lB-^(!wgYHA*P=LYAwb_Ur^fPGb2|~EF(yV}3 z+gtO>5%a6vVba+nY~s-krTeNkwdnVT!eZk)?Pw;%Q~N@1c$Vi`K`mQz>qCCL^|Cl! zRzs{=gg(_*JPdK?8P;e?R|_?{Lv!Mh8Ks7}CbJ~zLajd0>ujh_^n*nh&L|ywYqcqb z+($8Lc$Xdad-1V_Ov#&dG3x0BC%h?=C*k}KwXeh@el zs}zi4Z+wBlAgfzbpP4rKPZL&VMP)2a6yj|v^z;*6mz$XHGF3&<7|EpCWC;7b+c)0) zm{(9(zVmTMVNS%y3^59KGF?tJcUvM#d#6arR&q*_&c}vY8TLc!vmMsC2{pa`&nZ)V zXWzrK3j%AaGr%H2|FSGd`5G(|7z+ANFi4kMzQL*l`eA|p^K!J`F;Im{-9Wn;*32oL z_o(c$_mD7W>%f2%&|Hs`<*h}k{`5nz{%~9vV4+<2AEax@LNTU=e8ydV@R6X7zB_zc zur|zQH;Hv^I?n0Smk!HmJY-uU?y;j_4agCG6+cLO*DV@g+Sx2J&{|)&_wcTENyics z{EjTPP!GSR9PExjm0FuW7I6@)SR^vP3CjaYNj&6ms3O`?7DdQVnkCKdZ`LRhr;*K3 z7ci^9+z$bpn%UPqH?R}Do*Ra9QM|Rl?C3oL>a1OV)LHis9Vxv!v<+bEJnGmbTgC-U zl}4xxoTD&MXRZ7a>DEEO<)G`S+Zl4yI?Nwb@P$&D&rhJd9wk`P9Qy1_={&@jr!44u zP1XOnkFuY3z*C$|;F;t{)T|iY2scO97d+ffiWCe+l=|e+TC)u|WghmxeDH-;L|?O{ z3D1Q6O0#n7;}V8EV5R8a4=z;dhg^;uO1of$Eqhy|t5ISxfksthIjZqa@sPEq+m(B> ze=}tB@g~|)ahI!sz4Rgc1M`EeulH;c3JE#=AEM0242@+hFk-uWG{MxDtt9Qc$szdxl44sDV*Q(z4*i5eLz8y>Hzw8K$*W%s*&*#|1-cP`W<$Q|Nry zQ&FSWbQ-z4MPl5$9ZT#pv@~?lwrf)d4g<-dX{vLa+cC)*d&<*EJF*zR45cE}JKUDTsJ zw{iy)+1=r_iD2=MDOoNbO6`-&Df8M<_FLS^u+n)(K5yX5m1=x=kYl`Y%PLTA)?Eh+ z>ZLka5x!k;t!{{u>Bwg;zi$kp+ZBs(7Zmsm7vC2TbqHiYU-oot{n8IIxCX0p4O;k5 zutJvx7%VFUniTtMG3I}d$^JE(T4|#!cPaq7>-%!Fl_CY8u;(%jo&Uf48Oud!E!Svh zgpBhvuBei6Alc zhsS*56ub^=`ED#y`%{Rq68i^055xyo(8Rz=4QDk{6TGH{c+mrk?B|v$V3cx$>x;dX zl;*JSmT zwPV=x6Nz^k6a8D17vVFy5B9syZg;*h6LJ;bM@pA7a)1d5kmU6ckNXrH94u`^U)N7a zQpXgG7gGnhv0d*_JNLAL1HP(skjg@XZ_4pxy2|FnLuu!mS6yAw*luFC+>(`81{cgG zGGrVOo|!q!3j*Pph)iw$&5U4Rz3h>v3gN*`T}?C#Gt(FHNTu)VkbEuEa6Q~g&5CW$ zOIWcTo{nd~u{2tjHgHpW8GqZGkGycb4yrwqMF}1A4Ac8-@+1>G%){;b#*(M?Zzm5c zD<^nJRm~|^NNny#7i@KxnIvNf>Crs;9B}cHf{@Znw&3$w^1!mOd?zV2F<~DoeMUXD zJ?}o_mehL8UO#?nvxE$$TBsJr((-_J+#n0KJsLHhjW@}of`Z^9bGfoPF-tN;WslS? z7_vLJ5((&@*>4O>1jqIDeih0VEO4--z=1-%D6RdlQm3IY{oam!V-zz13NH_Kgo{O= z0@y7}4eXXhB(IbBfI_awx$1SfTh=pK`JhWLJbqGh_O)OX&Fceg6{oBx846JYlPg`a zCfHvl*ru~0%8qbm)?*94yb#;OvD?);pnS8VZRUQPJ&UR0V*uIs`z`6|>WP`QqE}j& z?Xc0?)$-wHBZQ(AkK6+M+=fyWpQ}F^9-J6;PO2`wIhZ4L$od6XM&zR6L@}{6sWp1k zMY;FwkCYKw#E92rEn@jEQ%2g?V7jiRy8i^L1$G_c539||psiw9-#47=K?`rF4eRiN}G zv5`XZ$XFER+~4km4zU2Mi1ve+v326Z32Nb2fbH?F@qh!G^;g^;sBTCJ22F5Z5 z0Am?R<&4>DxStJ1j=5uhuR`ogeV5gvsap%-b=WV@_9lrcv$&Ufj)OIfMz3kl+2wra z%xb?}`U$BKcgIWd4{2NRrr(H)7#S&JQjA|i_qHTvve2BwKv;>zX|}zqL|wdBC>CDO z!k014&&tT$j2I5lfQmtAA+afcogm9eT?Q zYI7kyQM5L8ErFy;Ga3^c?K~@jr}EqdK_9ZYu=fOwKNxe}Dpu}!EgAqaN4n_gsh%hSU3aa)Uw&e)ku8D+dg z7*rON$Qg1Dy`OTnRjD=cjW9yR%EWC?zk?=E=dLl=Ym>X5`^{Lk5nm=Ke9%4g+<=q! zW$n~62m7yCZaOFSZ58avbsMI^qBjuR-EXnQ@|JH%e{p?NXX@hY67(&xuHfsQqhdz- zgVZ||4O(BQwSBQO5gY}Dd6)?)EE~QUel2vyabpwNbh}JYbF9xMbpei2`7a%%>!>dT zQ|0~%X6Bk+=6{qs|4pCh%@pDd8e9cgRI$hgU}0?DHn1?3;j-}+6@^-EgtxyDnu|KoWp7$XUB8SVcLq+W}#L}Hph6D`-m00zPnMbNIVFF z82N1S7@6DQlKFT+Y0c_gS;ClKUNd*)sI~Jusqx1MiNclo$GVpo68U2FCkdL)H2PVF z8}h-3t3*q&iu4V(dxyd5NJZ`;1J7tE_0op=M_NCqsqK1*5RYK5|w0 zMXL7pmy6J21FNdr_=hO&+Mo)&Efz>#Nfi~?bF`9Gi&%VWsd`3Tj};Svw3xsjP^7!x z=@^)jd32xq?i;4X>Z9PWhEHEd>R5W8nOakNMnpu&XXt)nCeDn=iL{*92=6nT_Y_UG=;$ZXq?bov?d+ujyhemlA&--9P^}8rIqucp}{7OGU z^@fp%e2Ha}InkzYx(A70)6DyHs&O2W!E)D2Pc2q>epl_WTGEA4_noTzkNcy3Y^C~U z*3M4xHC}wW1smIGZ9#GykvGmE!>4*p;&!~UcJ}alj;l+Jjk)29_ZkUpOIL~1_=|V zi@4^g--8<6c={~k<^ZHG{oeDFn>R+*n7e}A>-CMOqgL({vUW!y`^Zfw#TRG`2>Zix z;c*d3$KV7?ml<&^u;6O91~%8;lsRc1!F=*;thaT>2-o8a%e)*!GsSB-`1fxziG9CP zUB!+X~9T6<|mB_=yNurdY}}RPQcL&Rsxq5_&hPHr=d9>r^C_mAzV`QF z7YZzwVUlXG;4o}*k;u(_(-H7|tH&j2!YOFT%olPWwllg!q^k#f#$V?AC>zc|6CFhS zMf0J3dre6DDGgC*Yv;hn9xsAEeh)n>E*|{&o?F|*0lwaw!-lY3A^yejUe-32f5BXe9giDXNz`wDlQ$H| zIap>Kj!hF18%o{TX{mn}IkRpKckH!j^kwBY5Wo$HI}%ADR?oG%4ptUTjY z9f~{URAm|(r`R}h5D&k}yfjb@GPQN`#dB;v5?ySOWX6wId5`?@QLk5Szo}D4;~k7L z#?lws-Yjtz$gKyuPZ^$>ebA0ds&zRjMUvOnGX`mvn8_;HPJ3*R>!NGJB`fc0U^qk{BR zizA@^c_6zf>L#kj4&p`b+4sjW!piK)YQWd|@XPw=>v)X++sgG%FeTUWGWIvB4}rXo z@$K(xUBADKCBLAPg7OH(kw}yAOy3DM!!FE}c!J4!baUP5GxiH3@ed8kD!@e7)3vg? z8fjv_@y*Ku#KH9vi$er_^7-R=?y5$EGaO5J$reMro?u_4*MwWo=@o)3Fs7f|u-T+8 zHoD@!!OXy>Cc+3BLFa1M7nP(A5m8!JZj^q_0fpl($mO#6o~MgK?SoD%v*ZOr7}{|p z62?pghK`|ivW?Lmo# zuH&PDv%57xCCi!AFZ2W2rpixCPgf*cPikhouRug9_m9WXy$7nT6y~ zSM*h)c*S@$k?#B9Gl~wR^olFdD(qHEWSQ8n0;Q`4Qd zFt%BE?9K7aqxy~oP_hVNjZztfWLB89zCqcW}mFa56n^gSrOV6#F3HMgfJwGU=YdGwO5-gVBd?4XpC>x)0rsX@hc;FOxap|$RkJn%h z047HKmmbS?zjpnm()|;R4A`$-KfUh#=Rx=XJ+LbKpOWWO8X(#HW-36Q5g`niD1-eQ=kaufbYG5@8wiMZX{{m%QSaYVrE zV;mc<1(rr4NXmQTXbcFk#?iiVs(h;67Ll&7KjJHbKjN!{hnMkHp_NvoY*nyFwev%a z`@sI_78o@VvRL_h_K?N4@MLY`>Bo1-wN&jQn5}|oD1+$nOwxl4zE62w#ZQ{^*Vcb8 zM7f5uelD>55JM3+FH>bes8vs>t6(+82`L&;D4tn|7(e_q&r9O*36c=&fxy%wAz(rV zw(A28H}Wx}PrETdq~*ie8nQ_BWG-WaH}}@VHcpfb#pX8qZndx439RTr?Mp~NY{f{d z8w$i$+<4)Q>kHqgywnZy`Nue3d_Ei8sEa7+(%X+IwIoVOe6_yUxgqN^u(xC-As^*_ zK;>>D&sbG_?~S0h*rxfwojC1b?;Frrca^M~Fhh%Zo!?dv(G!efoFLFIHQ5w5*wtCu zo>$#RaaNwBuqd7wN}r`vG~2hkG1H;;;i*W7QPvO*<{1O|1xc0O3&iMZcw?r$z@d*@ zGtjnNJn`>d6{fV!|EJ#L=f7?0Dn4?P*S=ncQTUR~jzGg-9 z7sx|_XV7(?uk5JqPceB)viM{Ovg#Xb9_0sT$PD277RXwjpxn=9LX%ROv&o{K*I+S6ckyJj^0Q=y=2e4Vx|*<9wqZ9!KFm&_AGGm_D? zRosa9G-VlD7MFB6k+Z_Lri+`Hu`H>|x;*GlecD{21x`P@_CGB`LaWT>$8&xie&qSb zfItHNAr*6$Z$^hI!0+S)s1+_BIxlh35FfvRGn$6osTA(lfORVXcHL=K8IT) z+U~MC3me~uQz!Pf-W~jMU$nZtYVwAsER=6>GK{jrs|HeF`WYT{#_@tmXOH_W4JPy@ zc=-FXZuj7_GKZG@Zgs8Lls;vQ6sLtn(22>G5CLZ26JY?e@BQ;j;Y{Lk5&Rg878XoU zBwj`~>v4H-H?HiGu-LhXsotdHfJYx-L+NTtlaeepH{`!fkWCNU2XhmJ@=@oRtfAw& zj6n~?!~=xWTZl8bVV-xz=rf?gWHQEAW<4pLXP!%Z-$0EYS?p~jB*Hp?=jIgLnAIC( zsLRr2BCZoBLrLG?8Msz7imiTIFY->EqvOfea={Rllc@3gz0L{mJ1L2Tih*Whl9J-2 zOM>t5LWP=u$9Z9sn``2o;ks{*k%0MUrxc7T$fWOJQ4bIE4~ud1)W*KKb?`H6sqfzv za7}P){pxbgtK!nst#Pb=PWG1Qxc^MwRvkiVEVk<5z*pi14VONPeT$=|L!%O>oR6IA zHni-iQS#knI8dR$@@XmPO~hP`t_e}U3sKvLBUs4AyiXI~vOGgJVt%ngu0+QqKUa-k zSYxP_@5@0qTvx{OibGWIsP%zSFB?4OlswNTBr6gChoPsJWgS+hQ#N6 zRKQStizm!-HmrTaSU{rX-Q=+pRW63xlH5Z+y>5sRxtp)ryG^5RY`MbheBw^-F4I%) zhk-VdPis3arFr^plSC0BR*dxn&j&PPKgAKfrQ~s;b}6UY;;o^zkl@@4|NVZsis&yq ziep;SW(H2#)oyQ2siq!G)qR+`6-Y=$he60`&0@1pB=`Qc$79$O)Q1udrQiYj1L-lWlR{wXes!pl#@=dI6lMZL?mZH#{++TVnA+HppP z`M!1P@(B!t&#O7E%y0CP?Ks=^qCWh{-U@wg@r33$S}iuJg>#wdE~Xwb=-dwY9v;Y}x+=tGuS{gvyV#SA_zPUQDhhv}&aKNT)T*@pqND3G!dqG&4Q;#b z!RGdbEk@Q5-?4T8T3h4s3urz=8n)dp^ZS-W6YYPnyQ#RW^ETEn>$9=(=##Pn^H+Kg z*`rA_(UMTx&{;mmwafx_FRq%6fEM zS@X}>H)S_+_Y(7wy_?|U-;b>lU50rEhiJ#_DgY>_5R+ft_svty=h> z(D%QasQ>MC{a4_ZlYS?Z+ARwMK{25})@2}9r zOosc%RAKpu>kH0v$~8v9DkH!_r_D2Ry`*?u`xK$@5wf>#SlFWh$;=Hn=I6oOkZ?Ey z+M!)ok;CuNO{4c$N{F!#@H8nIJ}pIP`iaZ9eiF*ZwkN3aQ&Az?4OSvmYGK3nyD2px z8sV`H$&2Ej+>s7Yw91HooJ{Bdw_T^ZSvPkiunnN1vf z7H=Gt4T{c90#Iim+3>#hXxbpI+&O9I=QHm8L^Y71kQA#zeN2!}1*M|3s#%qAPi{Y^ zN#c;S08#sPPuo{G2eTQ4I4s}IJnw-8Qsznm9dyGibxQ_q>bz$bBzFEbIX0chgBv#| z)a)Tj5Bfgx@`83w`6+Kx2*d6(YQ{8TP*6 zi`gBa(zSAK%&C##I5~p5W?FQqpNjI=O6hW%4~NjYZPap5pY{;3#R7AA<$UrA^;?Rinz*qP1l*ejx0B!7wwwXU+htRwijSQH=*ocYtxwh= z)4FUUHr@p4yc}1x6`)Hat!%V-F3eBioq8s?FB%kK6Jfe!h-QP9&~mWlXtCwk2^Y7G ziWzlF%oj5>l!tWKr_EM^pIiy?QnkK;_xFjQpz0%~p3xozOJZT7F?xBsAO*ZnbJxP8ZhiG{>K(q>$dNDBX zV}5VV#126P#peW1btt^@dn1*(!kCJ?uz~1n^bW#oK)abKIueW5WDZKpmsQ5cUIgVx zWs=o=Pu1FTjS`dLt>TTpw6feCs*D-euvS`p2Wrt(&+U%3<` zDlZ^f1MdRe-juU=>E*jL)s}siWGCmf@u#}woPNzh5AS_?_!vb21BN~s&CU*9UQ_Tf zfdPLllb_%XIW%#smxR>922PQWUQxyy=tLq$j6=U@f<^XsDj-&3#C*O=_&!K`md0U{ zvN{O!!76L0xA35g@E8xJ%D_l!sTCQa$2>+3RFaU*VaJzPsFgf#lT_Xs^V=Al4FfU( z+-0m2e(oEwDQ5ku#5avvBB9*GW?OD>^^M{Kj;wNEYk!BEPE zvbD(@|6>!ghQSvRuB>i7QB|$)13%YPag4cm(%`Q8jyqc$?G$vYWv%IMtmrbvcDq=^x(6(gFi z7)L#OK@-Vh5pdfpPzScSYp#x(F~nEWJI8SkO96`IBHiKHCeJ_-VYQv@#whMnpsE^P zu@bdf$&;EdOmf_jmAq~QiT`0KscDtasA;}Ji(6TwnutFm!;BY=(x64Lkmq}2nOj-; z?`Ie_j;9MP+(|Xb;velX7|W=xyH1Q-oyDVSwxiQ;+hj=St}119gmLnlL(ag~;5$%# zMm(~^&V6qrwIdVRi)fSg2&dSiX}H^tMha&jmm|tgq_w!gN4|dYLUyBhDK!6%cT*9E ze@f~f86?yix^y@oD0}-$19kmXM8B!5{{-^{b};s%(BWSr&wi)p?9xa2J}sZ_a=|@A zVr8nBf*Li3@O@&1!tz5lRh1%O*EBFJKkX0#_Xwgs9Ucln=ot1iB({veAZh$|s05?s z|4egD?DkkYW;Xoz;1lB>zMGE%q!v2d*+!!bWgHy$9WMxRV8Q(?Q&cDZ%kjC~1t3O) z^5#Hd!u6EXeZe0)fJZ)ZLZLzthwPEaiV8=VNF7R>dWX?dl!>D94BLCM0FC;9v@@Id zUVQd5buOkG%jwW468Xe>G(cM{^?<5G_E+fUXRx$7w}4Tu1ESP9^DZWb0?Du9QS}UTqugArY}j~QizROj0sA}>h4d~+`B9iLC5>G%0e3xf_6n zr-G&YY_GVo%cAa#Q{-~q+SHjzeFrdaZ81#>*fmXm-zCZFYu-mCjS{B7eTph;d=(XP zmh8kjpY?{wF@<0OOzZL$?EIzVI&m)!S(696<`y#nG4xNcc@U0mPf8brg}KBt-$~!} z8h6e%5E`gVhR@&1_T)qPMtfpwLo<=yD(5Ap^Khm`K*-3GGcZ%(F^8Vwnpe31CBkHf z^3F~4TGF;xqaPkUHa4&8-~xKjR?G#ATWYyOzNpTsrqIPaHnm2Shs%+Gk#$&KaUZ!0 z>9uIU=DbbAfwS%a9T?s4P8TKD+1*TQq>8`15VC&QZJjPjMa zrP)grck3B1puWz{teMGfsU&#qZEBf>lilvvW5B24mRH~1AmDZUJq<*baz|haaEWAo zX>qP2E(1gV{t5O5?0rI@ap<3xl>B$6s7$%{a{Na&FNQT7vo60Zmn&$T(&(7cH%V!ChRYubJ=h17RUbI6TE7#{b}C2K zK^Zy}RGy$kg`zY#?2}Irw{K#v#d?0}jL9#!(P{7t|wG81X%YKt8h1pFdWLXUn}8Cag+ z_0RrGEU;a&%%mB-HPW{+s7_PUJ{b(#=#xTaQ#6bx7rz(HM3+abh2)NAKCCDco^2yG zP}*lzCFj(2tUIf(ee#UbEkdI+MOPrab>Hfk?6|I0uoBsRbF`e4&|0s96ClU^Lp%Cjk~P>JH%DZp}eIz|Q33#3BP$F!rv@ zY!jH6yJuH^6=2=Tx1CQxVbAU(dn?bT8IbTf%k>uC$7O1r+&J>jT1(-4JPwldg7{1+ zZm_!znPZZ{0`dov*xBc?PhQ<`&7PrF^J7s>Xf|o^3+aTV09()=^qi{GCNL zvsA2!aq+vhDXRl<&#BTB@n0nFFF`I zy4qp#y+RdIMg%Og4}mwX57#K*Ey?YzG<)QUP~pjuH2NjUkD9*@jNX2q?|GBHgF)Fq5LsB_SwGY3l6}E;{4@={Oj04bOjavCzv*{U8$d+AAi$z zyj+o%^*`-sn>4`Fn?b}t#9fNv8!$tqSqxYbDi&GdwOVEQ#y~sTUfKZFdc?Bax|@ao zV9+GqQ3yX-!0@7Qa;-nMV>_7O)wSf3w$&#g&_Kjq5cb61B??-5pOpmP80*a=T?(Z~ zMJ{fO(Dt^K1hXsMKdK5(&nDXUz1q3=z!;p|!z%CFJU+0^wI)DjJ5w!`8XHN*o2v6x z7*9JklpL_BBi;`tQ|3MLIK5V&DBCg|GJD+H_lIaXAvYK-BgL`qXc6H z#$P)(jw6#2lL?glcen)Ai&aGD&(P;Lw9~wcN$DSE2IV)GAfx%p#;Dz*c1}}@A%()O zUiPZ{rnypyGyGb!Dm1(ITb+qd{z1b`&P25YYQ8}IYcj9T`JgmZ4)x$sfojvX^HgTuROP&BaMjnL z=~?+?KU$Ys#$sGib!x1a&x0}Dz2?cYXX?s&Oet0L3JTqu8uF4yzhO_C?fSYE zzf_(QfM{>kgL~O%N9^ZxGxH9%{kmsg&Zr`i_)J;v9qtk@V6tEtJ`Sl5GZ%xfJHrIg^ zMEP*0BP!8_2jy;;`K9@i;ldffnVR|kJjo4)2L2N)4%p7r59jf(Q@VdAh)Ysz4E_Kl zy1&w;Cvqm(wfZAH@yEu+@fUXDH`H@XGBSC-rOB(;orlq#v^yUVdNc9J_j3qdyLf!5 zxKdV3DXYb^*`A}SuMxxu@^9IkZ%r@RpS9*dHen)r=a-1(PkRRA5DUnoOBoElrYJ+_ z41=s&L~e@6lgx?>CoZJxDb?0QR!u@@WPtNu%WV`{iHD4{hD0UQAdBC8SYBc*0NiVK+(+8fZeI0);Z17LT9XoK%&OOw4<_b za%c4CrbNkQBLebs;k;~qd$LDb$h}Y{<4Kh5Ks=LcBLRDX+3{f0~_}Vw8*6gInrShT2(s>mIUuQh-bdQd{CB&6-*np=S zPBV?tnWIkFwa+T35k}#Oxa|TzWz;j& z|2RfX=m^K_@GF`N3Mud$@693(3_xomS7d=H+&Bxh(i#v7lnfeTktdN!xKG(ghav$_ z@0*|rWgXx+cJo#O9+Na_>l!h_qYv2Hngq%Scz6RM@HCG}R-tm>BC>4GsS)Df2-bsc zr=G$K5JjXOrOLG+-Rc|=CI?p7msDtq2T96jvkU3$%jwNK^71Y_!Wl2Dr0mZfe?7B4 zXKx_;O0?HqaRy)2Kw)?uF*h@pzM||JGEf1!N=15!QDbmY>aOV zNy*-xBYeud0W7{J#38XvjC_@fPl%Dhs9Ml?EJ(xX2t!)h3GZ||J7i@$Or?nzVjFSF zJB9Of&5cK%xk8b_e4ChH27l}EVA?EP+HJJL^=5QYAri$V?Q_EPm#yrQ>K+*Ch%c6raVeNE7bI!xcFK|1rs;DuZ&W_PHSz1+XMk$PdO|+RHlUN0 znpdToid_$tPQzNVE!Rc382#)7!~hg9>W+V?O1=RY?g@P7PuTj27`KhGbsbwGlEg!uvq0ReOQ z5sC`15RjK4kIbV#J{181;rpi=Vv=(y0slh=@b9gkKh;AT_>&)lE*Ulc^bLOZ^EV6X zT@QhyYy;AHQa^ourUx>B?N1+i*UG}yM$bya!ratR<1&`juw&6M)3UKLasa+!_~UOG zem*l+1}&Y-?Tyy|Zd=H2{KzUGkdk12`jP*PjZx$O1l_)9{814=mgq0l(mfh=9r06~T2dcual*=(@Nx6(Ha)W1c@_`r9YS#qd3) zVq~tX=K!XNJq1B!f^v1repUc50s7P-+Z+M3-MXv{2LWh|3MOr!xu+jl7;q&Glr{*A ztJ8K30MEMpQYW#+g(*=Pia{KBGUMJGeUqmxF0U{BAY_dEEQt3O_LL@hX znU=Y&mgyh6aKNMR83-^+;_IdmT#VWt%xD{c0`mh>_!tBuH3^vH{j44Ta!3A-YW(bj zJplprhWzTpT^*nNw>09*JN5*ydY}heKmjIcAPVtwPqLA@jh=zk_l?~DzRmA9^w$W4 zLou4Gb9n7=nP#+Ir~xH*0hCw~1g;|Obx_I#svzJ>qb3M6V#aG`@(L&|cM6Ok0Rjd8 z5?7Gl1(U!Zo+uZCj)mEC3v)elo9l@y-m_etxT~VOi%n281Sl~f;1)}R9BVD>RS5$f z1PR`a0qPUba$X~2;KE~>Puyvr`-U#p2X}cDP zSbPZIP62822h>vyMA}C0fl1wO*$Y1HRwly=;vT_77 z+@}B`q43c!N%;HU%Kr!p^0IAd36KO?kZ)xt`PU!ixAGkzvdVOI7Zz0CS04Y8f&Vjv zMs1&3FD+6UV9b?3h+B~XlenLyla0a3*4)O(Opn1(Ps`NC5NzjF3j~|D!qwTkHke6I zBVJy*5Db6GwfQT8N#PH#hMU1kPfORx+|ScOyvVj8Xc=#oxE!RxSwg;fC3or zEkI>KCGSWTOxi$I_Ajyrp7{oqyj=CGlXq<}VcR7mE+2#(0m=JQg!~Ll3V$5zf8GEC z9*ue+3e2i~bsDb~YLn-A$7g`bIY1ggGa&bLu1Y0H-~?{W33|T0`q#)G*!WP;Ll)ox z6}|~v9-#hLw*i=>{n9FfCwZX$myOBQnY$*C%v7IAJ^(UD3dkI2AZ2d~CVl^_6F~0B z+R(zv2H4K}ht~$K*ntL8A1$s<-nBq1BTF`;1tf10NECry9-Gg>qz=?7|0xOump;(T zqsr#$^j#ZFpmGIr9*{nTzgWC_+iRilUoJCvdJAgtcpa~sJ8ISIibFkz3{(SzBN}cY5ZTa!u01(Zg2?%wR{Gi zS10gVAc{w=Otu5m1p_`G=%r!kbye#A9Bo_=b^X5ANZnN+dcp-9?gP|K08$6~U^DO% zOzM8}1b%+5F}JWW(syLAx3Dq+f;Mnz1bwhE54<{!*ADlqe1B0tKAOatUo2Ma zF85ek16C09#S1q68fd(7g%jwDmsQgBk_Q&N*=>CO%YmW(faHP3xfaRSK-o3L8lZ75 zdiwPecLk7<`602Fo4zCmGvd=g8%RP=n zK-3Frq8ndd3z7e>SPWb$^+5s<+x+XM@~T*QPz0clhx!B$0k|Bp0Lnn6i?JR|%6|4b*%?eNES`h;00}BxeT`SA>q^j` zzoCqq2BgakP(;w~oAxF!srq3cK%!RgbP+VM$k%ptwyuiqg23A93?K{|@ZdnZZ+P0l zB<$ZDAh`D=X!p%P*VXyDBDfBL4Cu=cYYUJs(6W#2ZZPTkaf1K(T^3yWK+C*D`mavk zHG}X5@%XY%@Rf^205!3jSCCW$|e8MKlVTsZ`F zcP+-R&fYZu{CQt2XtuJ% zKR@7rCu^Yhs@BJArSCex{=5eXw1~oV^Xhc|=6 zT?2*x=1l@TSp=o9?%;YUyb{cxH%@@sz^2b&QV4p5{pSHPzae{|Hjw`4>cm|U9LQ{Z z5I>IU7)-i;Tw#AMod8ePK>fJlv#V2f4FG?h*bVB(z5NCzZJ-DF<6#Lr(m?$d*#diY!mbGJ=W(W>kAw|yVA2J8gnxR0 z15eIC9|>a+uTI-Ff&6(UBdD~+BY{cZ&)()0)e}_O(9y0=+ZDn6JcABY+K_L8N!Jhg z|LZdhxJn8tZ8Dfwr|p_R{ya(xG)9%j0+YU<5A;ed2WX7ifqQk*{w6e7IAF#Vgfs9< O>k$M*BOWC1yZ;9vQt`C_ literal 0 HcmV?d00001 diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json new file mode 100644 index 0000000..a474862 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.json @@ -0,0 +1,99 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-01-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Кратко объясни по документации, как работает `/health`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Кратко объясни по документации, как работает `/health`", + "normalized_query": "Кратко объясни по документации, как работает `/health`", + "target_terms": [ + "/health", + "Кратко", + "как", + "работает" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/health", + "Кратко", + "как", + "работает" + ], + "file_names": [ + "/health" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко объясни по документации, как работает `/health`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "/health", + "Кратко", + "как", + "работает" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/health", + "Кратко", + "как", + "работает" + ], + "file_names": [ + "/health" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md new file mode 100644 index 0000000..3da6762 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-01-health.md @@ -0,0 +1,109 @@ +# v2-router-docs-summary-01-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Кратко объясни по документации, как работает `/health` + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Кратко объясни по документации, как работает `/health`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Кратко объясни по документации, как работает `/health`", + "normalized_query": "Кратко объясни по документации, как работает `/health`", + "target_terms": [ + "/health", + "Кратко", + "как", + "работает" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/health", + "Кратко", + "как", + "работает" + ], + "file_names": [ + "/health" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко объясни по документации, как работает `/health`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "/health", + "Кратко", + "как", + "работает" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/health", + "Кратко", + "как", + "работает" + ], + "file_names": [ + "/health" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json new file mode 100644 index 0000000..0e631d2 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.json @@ -0,0 +1,99 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-02-send", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Что делает endpoint `/send`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает endpoint `/send`?", + "normalized_query": "Что делает endpoint `/send`?", + "target_terms": [ + "/send", + "Что", + "делает", + "endpoint" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "Что", + "делает", + "endpoint" + ], + "file_names": [ + "/send" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает endpoint `/send`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "/send", + "Что", + "делает", + "endpoint" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "Что", + "делает", + "endpoint" + ], + "file_names": [ + "/send" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md new file mode 100644 index 0000000..84c294e --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-02-send.md @@ -0,0 +1,109 @@ +# v2-router-docs-summary-02-send + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что делает endpoint `/send`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Что делает endpoint `/send`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает endpoint `/send`?", + "normalized_query": "Что делает endpoint `/send`?", + "target_terms": [ + "/send", + "Что", + "делает", + "endpoint" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "Что", + "делает", + "endpoint" + ], + "file_names": [ + "/send" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает endpoint `/send`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "/send", + "Что", + "делает", + "endpoint" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "Что", + "делает", + "endpoint" + ], + "file_names": [ + "/send" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json new file mode 100644 index 0000000..163fe3e --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.json @@ -0,0 +1,99 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-03-actions", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Объясни назначение `/actions/{action}`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Объясни назначение `/actions/{action}`", + "normalized_query": "Объясни назначение `/actions/{action}`", + "target_terms": [ + "/actions/{action}", + "назначение", + "action" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/actions/{action}", + "назначение", + "action" + ], + "file_names": [ + "/actions/{action}" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Объясни назначение `/actions/{action}`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "/actions/{action}", + "назначение", + "action" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/actions/{action}", + "назначение", + "action" + ], + "file_names": [ + "/actions/{action}" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md new file mode 100644 index 0000000..f40b533 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-03-actions.md @@ -0,0 +1,109 @@ +# v2-router-docs-summary-03-actions + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Объясни назначение `/actions/{action}` + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Объясни назначение `/actions/{action}`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Объясни назначение `/actions/{action}`", + "normalized_query": "Объясни назначение `/actions/{action}`", + "target_terms": [ + "/actions/{action}", + "назначение", + "action" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/actions/{action}", + "назначение", + "action" + ], + "file_names": [ + "/actions/{action}" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Объясни назначение `/actions/{action}`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "/actions/{action}", + "назначение", + "action" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/actions/{action}", + "назначение", + "action" + ], + "file_names": [ + "/actions/{action}" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json new file mode 100644 index 0000000..c3e16d3 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.json @@ -0,0 +1,103 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-04-runtime-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Что такое runtime health в этой документации?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что такое runtime health в этой документации?", + "normalized_query": "Что такое runtime health в этой документации?", + "target_terms": [ + "runtime-health-entity", + "Что", + "такое", + "runtime", + "health", + "этой" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "Что", + "такое", + "runtime", + "health", + "этой" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что такое runtime health в этой документации?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "runtime-health-entity", + "Что", + "такое", + "runtime", + "health", + "этой" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "Что", + "такое", + "runtime", + "health", + "этой" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md new file mode 100644 index 0000000..dc1d626 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-04-runtime-health.md @@ -0,0 +1,113 @@ +# v2-router-docs-summary-04-runtime-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что такое runtime health в этой документации? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Что такое runtime health в этой документации?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что такое runtime health в этой документации?", + "normalized_query": "Что такое runtime health в этой документации?", + "target_terms": [ + "runtime-health-entity", + "Что", + "такое", + "runtime", + "health", + "этой" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "Что", + "такое", + "runtime", + "health", + "этой" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что такое runtime health в этой документации?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "runtime-health-entity", + "Что", + "такое", + "runtime", + "health", + "этой" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "Что", + "такое", + "runtime", + "health", + "этой" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json new file mode 100644 index 0000000..039b19b --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.json @@ -0,0 +1,103 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-05-notification-loop", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Кратко опиши цикл отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Кратко опиши цикл отправки уведомлений", + "normalized_query": "Кратко опиши цикл отправки уведомлений", + "target_terms": [ + "telegram-notification-loop", + "Кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram-notification-loop", + "Кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко опиши цикл отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "telegram-notification-loop", + "Кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram-notification-loop", + "Кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md new file mode 100644 index 0000000..900a1ad --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-05-notification-loop.md @@ -0,0 +1,113 @@ +# v2-router-docs-summary-05-notification-loop + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Кратко опиши цикл отправки уведомлений + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Кратко опиши цикл отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Кратко опиши цикл отправки уведомлений", + "normalized_query": "Кратко опиши цикл отправки уведомлений", + "target_terms": [ + "telegram-notification-loop", + "Кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram-notification-loop", + "Кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Кратко опиши цикл отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "telegram-notification-loop", + "Кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram-notification-loop", + "Кратко", + "опиши", + "цикл", + "отправки", + "уведомлений" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [ + "telegram-notification-loop" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json new file mode 100644 index 0000000..18d10be --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.json @@ -0,0 +1,115 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-06-architecture", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Как устроена архитектура Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как устроена архитектура Telegram Notify App?", + "normalized_query": "Как устроена архитектура Telegram Notify App?", + "target_terms": [ + "telegram-notify-app-overview", + "Telegram", + "Notify", + "App", + "Как", + "устроена", + "архитектура" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "terms": [ + "telegram-notify-app-overview", + "Telegram", + "Notify", + "App", + "Как", + "устроена", + "архитектура" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как устроена архитектура Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "telegram-notify-app-overview", + "Telegram", + "Notify", + "App", + "Как", + "устроена", + "архитектура" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "terms": [ + "telegram-notify-app-overview", + "Telegram", + "Notify", + "App", + "Как", + "устроена", + "архитектура" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md new file mode 100644 index 0000000..da255cd --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-06-architecture.md @@ -0,0 +1,125 @@ +# v2-router-docs-summary-06-architecture + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Как устроена архитектура Telegram Notify App? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Как устроена архитектура Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как устроена архитектура Telegram Notify App?", + "normalized_query": "Как устроена архитектура Telegram Notify App?", + "target_terms": [ + "telegram-notify-app-overview", + "Telegram", + "Notify", + "App", + "Как", + "устроена", + "архитектура" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "terms": [ + "telegram-notify-app-overview", + "Telegram", + "Notify", + "App", + "Как", + "устроена", + "архитектура" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как устроена архитектура Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "telegram-notify-app-overview", + "Telegram", + "Notify", + "App", + "Как", + "устроена", + "архитектура" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "terms": [ + "telegram-notify-app-overview", + "Telegram", + "Notify", + "App", + "Как", + "устроена", + "архитектура" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json new file mode 100644 index 0000000..8720862 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.json @@ -0,0 +1,95 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-07-worker", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Что делает worker в этом приложении?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает worker в этом приложении?", + "normalized_query": "Что делает worker в этом приложении?", + "target_terms": [ + "Что", + "делает", + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "делает", + "worker", + "этом", + "приложении" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает worker в этом приложении?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "Что", + "делает", + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "делает", + "worker", + "этом", + "приложении" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md new file mode 100644 index 0000000..64e5208 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-07-worker.md @@ -0,0 +1,105 @@ +# v2-router-docs-summary-07-worker + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что делает worker в этом приложении? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Что делает worker в этом приложении?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Что делает worker в этом приложении?", + "normalized_query": "Что делает worker в этом приложении?", + "target_terms": [ + "Что", + "делает", + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "делает", + "worker", + "этом", + "приложении" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что делает worker в этом приложении?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "Что", + "делает", + "worker", + "этом", + "приложении" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "делает", + "worker", + "этом", + "приложении" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json new file mode 100644 index 0000000..00bfebe --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.json @@ -0,0 +1,99 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-08-health-statuses", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Какие статусы здоровья есть у runtime?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Какие статусы здоровья есть у runtime?", + "normalized_query": "Какие статусы здоровья есть у runtime?", + "target_terms": [ + "runtime-health-entity", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие статусы здоровья есть у runtime?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "runtime-health-entity", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md new file mode 100644 index 0000000..2aef934 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-08-health-statuses.md @@ -0,0 +1,109 @@ +# v2-router-docs-summary-08-health-statuses + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какие статусы здоровья есть у runtime? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Какие статусы здоровья есть у runtime?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Какие статусы здоровья есть у runtime?", + "normalized_query": "Какие статусы здоровья есть у runtime?", + "target_terms": [ + "runtime-health-entity", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие статусы здоровья есть у runtime?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "runtime-health-entity", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "статусы", + "здоровья", + "есть", + "runtime" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json new file mode 100644 index 0000000..ea42750 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.json @@ -0,0 +1,107 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-09-manual-send", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Как в приложении устроена ручная отправка сообщения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как в приложении устроена ручная отправка сообщения?", + "normalized_query": "Как в приложении устроена ручная отправка сообщения?", + "target_terms": [ + "/send", + "Как", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "Как", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в приложении устроена ручная отправка сообщения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "/send", + "Как", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "Как", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md new file mode 100644 index 0000000..c808ec2 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-09-manual-send.md @@ -0,0 +1,117 @@ +# v2-router-docs-summary-09-manual-send + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Как в приложении устроена ручная отправка сообщения? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Как в приложении устроена ручная отправка сообщения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Как в приложении устроена ручная отправка сообщения?", + "normalized_query": "Как в приложении устроена ручная отправка сообщения?", + "target_terms": [ + "/send", + "Как", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "Как", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в приложении устроена ручная отправка сообщения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "/send", + "Как", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "Как", + "приложении", + "устроена", + "ручная", + "отправка", + "сообщения" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [ + "/send" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json new file mode 100644 index 0000000..478e2ae --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.json @@ -0,0 +1,95 @@ +{ + "meta": { + "case_id": "v2-router-docs-summary-10-telegram-integration", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_fallback", + "llm_router_used": false, + "confidence": 0.0 + }, + "details": { + "query": "Как сервис взаимодействует с Telegram в целом?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как сервис взаимодействует с Telegram в целом?", + "normalized_query": "Как сервис взаимодействует с Telegram в целом?", + "target_terms": [ + "Telegram", + "Как", + "сервис", + "взаимодействует", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "terms": [ + "Telegram", + "Как", + "сервис", + "взаимодействует", + "целом" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.0, + "routing_mode": "llm_fallback", + "llm_router_used": false, + "reason_short": "fallback to GENERAL_QA.SUMMARY" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как сервис взаимодействует с Telegram в целом?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "fallback to GENERAL_QA.SUMMARY", + "target_terms": [ + "Telegram", + "Как", + "сервис", + "взаимодействует", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "terms": [ + "Telegram", + "Как", + "сервис", + "взаимодействует", + "целом" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md new file mode 100644 index 0000000..257b5bd --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-docs-summary-10-telegram-integration.md @@ -0,0 +1,105 @@ +# v2-router-docs-summary-10-telegram-integration + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Как сервис взаимодействует с Telegram в целом? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "llm_fallback", + "llm_router_used": false, + "confidence": 0.0 +} +``` + +## Details +```json +{ + "query": "Как сервис взаимодействует с Telegram в целом?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как сервис взаимодействует с Telegram в целом?", + "normalized_query": "Как сервис взаимодействует с Telegram в целом?", + "target_terms": [ + "Telegram", + "Как", + "сервис", + "взаимодействует", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "terms": [ + "Telegram", + "Как", + "сервис", + "взаимодействует", + "целом" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 0.0, + "routing_mode": "llm_fallback", + "llm_router_used": false, + "reason_short": "fallback to GENERAL_QA.SUMMARY" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как сервис взаимодействует с Telegram в целом?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "fallback to GENERAL_QA.SUMMARY", + "target_terms": [ + "Telegram", + "Как", + "сервис", + "взаимодействует", + "целом" + ], + "anchors": { + "entity_names": [ + "Telegram" + ], + "terms": [ + "Telegram", + "Как", + "сервис", + "взаимодействует", + "целом" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-01-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-01-health.json new file mode 100644 index 0000000..c5dbf06 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-01-health.json @@ -0,0 +1,99 @@ +{ + "meta": { + "case_id": "v2-router-find-files-01-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "В каком файле описан `/health`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле описан `/health`?", + "normalized_query": "В каком файле описан `/health`?", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "file_names": [ + "/health" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле описан `/health`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "file_names": [ + "/health" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-01-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-01-health.md new file mode 100644 index 0000000..9870147 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-01-health.md @@ -0,0 +1,109 @@ +# v2-router-find-files-01-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каком файле описан `/health`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "В каком файле описан `/health`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле описан `/health`?", + "normalized_query": "В каком файле описан `/health`?", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "file_names": [ + "/health" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле описан `/health`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/health", + "каком", + "файле", + "описан" + ], + "file_names": [ + "/health" + ], + "endpoint_paths": [ + "/health" + ], + "target_doc_hints": [ + "docs/api/health-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-02-send.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-02-send.json new file mode 100644 index 0000000..1a2c1aa --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-02-send.json @@ -0,0 +1,95 @@ +{ + "meta": { + "case_id": "v2-router-find-files-02-send", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Покажи файл с описанием endpoint `/send`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл с описанием endpoint `/send`", + "normalized_query": "Покажи файл с описанием endpoint `/send`", + "target_terms": [ + "/send", + "описанием", + "endpoint" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "описанием", + "endpoint" + ], + "file_names": [ + "/send" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл с описанием endpoint `/send`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "/send", + "описанием", + "endpoint" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "описанием", + "endpoint" + ], + "file_names": [ + "/send" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-02-send.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-02-send.md new file mode 100644 index 0000000..47e2080 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-02-send.md @@ -0,0 +1,105 @@ +# v2-router-find-files-02-send + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Покажи файл с описанием endpoint `/send` + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Покажи файл с описанием endpoint `/send`", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл с описанием endpoint `/send`", + "normalized_query": "Покажи файл с описанием endpoint `/send`", + "target_terms": [ + "/send", + "описанием", + "endpoint" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "описанием", + "endpoint" + ], + "file_names": [ + "/send" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл с описанием endpoint `/send`" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "/send", + "описанием", + "endpoint" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/send", + "описанием", + "endpoint" + ], + "file_names": [ + "/send" + ], + "endpoint_paths": [ + "/send" + ], + "target_doc_hints": [ + "docs/api/send-message-endpoint.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json new file mode 100644 index 0000000..1204332 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-03-actions.json @@ -0,0 +1,99 @@ +{ + "meta": { + "case_id": "v2-router-find-files-03-actions", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Где находится документация по `/actions/{action}`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где находится документация по `/actions/{action}`?", + "normalized_query": "Где находится документация по `/actions/{action}`?", + "target_terms": [ + "/actions/{action}", + "находится", + "action" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/actions/{action}", + "находится", + "action" + ], + "file_names": [ + "/actions/{action}" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где находится документация по `/actions/{action}`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "/actions/{action}", + "находится", + "action" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/actions/{action}", + "находится", + "action" + ], + "file_names": [ + "/actions/{action}" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md new file mode 100644 index 0000000..e25674d --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-03-actions.md @@ -0,0 +1,109 @@ +# v2-router-find-files-03-actions + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Где находится документация по `/actions/{action}`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Где находится документация по `/actions/{action}`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где находится документация по `/actions/{action}`?", + "normalized_query": "Где находится документация по `/actions/{action}`?", + "target_terms": [ + "/actions/{action}", + "находится", + "action" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/actions/{action}", + "находится", + "action" + ], + "file_names": [ + "/actions/{action}" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где находится документация по `/actions/{action}`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "/actions/{action}", + "находится", + "action" + ], + "anchors": { + "entity_names": [], + "terms": [ + "/actions/{action}", + "находится", + "action" + ], + "file_names": [ + "/actions/{action}" + ], + "endpoint_paths": [ + "/actions/{action}" + ], + "target_doc_hints": [ + "docs/api/control-actions-endpoint.md" + ], + "matched_aliases": [ + "/actions/{action}" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json new file mode 100644 index 0000000..7bccd5a --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.json @@ -0,0 +1,103 @@ +{ + "meta": { + "case_id": "v2-router-find-files-04-runtime-health", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "В каком документе описан runtime health?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком документе описан runtime health?", + "normalized_query": "В каком документе описан runtime health?", + "target_terms": [ + "runtime-health-entity", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком документе описан runtime health?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "runtime-health-entity", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md new file mode 100644 index 0000000..ad030e5 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-04-runtime-health.md @@ -0,0 +1,113 @@ +# v2-router-find-files-04-runtime-health + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каком документе описан runtime health? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "В каком документе описан runtime health?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком документе описан runtime health?", + "normalized_query": "В каком документе описан runtime health?", + "target_terms": [ + "runtime-health-entity", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком документе описан runtime health?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "runtime-health-entity", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "anchors": { + "entity_names": [], + "terms": [ + "runtime-health-entity", + "каком", + "документе", + "описан", + "runtime", + "health" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/domains/runtime-health-entity.md" + ], + "matched_aliases": [ + "runtime-health-entity" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json new file mode 100644 index 0000000..d05481c --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-05-loop.json @@ -0,0 +1,91 @@ +{ + "meta": { + "case_id": "v2-router-find-files-05-loop", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Найди файл с логикой цикла отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Найди файл с логикой цикла отправки уведомлений", + "normalized_query": "Найди файл с логикой цикла отправки уведомлений", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Найди файл с логикой цикла отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md new file mode 100644 index 0000000..6736e8f --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-05-loop.md @@ -0,0 +1,101 @@ +# v2-router-find-files-05-loop + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Найди файл с логикой цикла отправки уведомлений + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Найди файл с логикой цикла отправки уведомлений", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Найди файл с логикой цикла отправки уведомлений", + "normalized_query": "Найди файл с логикой цикла отправки уведомлений", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Найди файл с логикой цикла отправки уведомлений" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "anchors": { + "entity_names": [], + "terms": [ + "логикой", + "цикла", + "отправки", + "уведомлений" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json new file mode 100644 index 0000000..8dd2948 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.json @@ -0,0 +1,95 @@ +{ + "meta": { + "case_id": "v2-router-find-files-06-architecture", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Где описана архитектура приложения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где описана архитектура приложения?", + "normalized_query": "Где описана архитектура приложения?", + "target_terms": [ + "telegram-notify-app-overview", + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram-notify-app-overview", + "описана", + "архитектура", + "приложения" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где описана архитектура приложения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "telegram-notify-app-overview", + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram-notify-app-overview", + "описана", + "архитектура", + "приложения" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md new file mode 100644 index 0000000..4411a1a --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-06-architecture.md @@ -0,0 +1,105 @@ +# v2-router-find-files-06-architecture + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Где описана архитектура приложения? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Где описана архитектура приложения?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Где описана архитектура приложения?", + "normalized_query": "Где описана архитектура приложения?", + "target_terms": [ + "telegram-notify-app-overview", + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram-notify-app-overview", + "описана", + "архитектура", + "приложения" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Где описана архитектура приложения?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "telegram-notify-app-overview", + "описана", + "архитектура", + "приложения" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram-notify-app-overview", + "описана", + "архитектура", + "приложения" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [ + "telegram-notify-app-overview" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json new file mode 100644 index 0000000..7976947 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.json @@ -0,0 +1,103 @@ +{ + "meta": { + "case_id": "v2-router-find-files-07-errors-catalog", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "В каком файле лежит каталог ошибок?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле лежит каталог ошибок?", + "normalized_query": "В каком файле лежит каталог ошибок?", + "target_terms": [ + "catalog-errors", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "terms": [ + "catalog-errors", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле лежит каталог ошибок?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "catalog-errors", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "terms": [ + "catalog-errors", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md new file mode 100644 index 0000000..8175992 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-07-errors-catalog.md @@ -0,0 +1,113 @@ +# v2-router-find-files-07-errors-catalog + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каком файле лежит каталог ошибок? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "В каком файле лежит каталог ошибок?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каком файле лежит каталог ошибок?", + "normalized_query": "В каком файле лежит каталог ошибок?", + "target_terms": [ + "catalog-errors", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "terms": [ + "catalog-errors", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каком файле лежит каталог ошибок?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "catalog-errors", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "anchors": { + "entity_names": [], + "terms": [ + "catalog-errors", + "каком", + "файле", + "лежит", + "каталог", + "ошибок" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/errors/catalog.yaml" + ], + "matched_aliases": [ + "catalog-errors" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json new file mode 100644 index 0000000..c1c5b7c --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.json @@ -0,0 +1,91 @@ +{ + "meta": { + "case_id": "v2-router-find-files-08-docs-index", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Покажи файл-индекс документации проекта", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл-индекс документации проекта", + "normalized_query": "Покажи файл-индекс документации проекта", + "target_terms": [ + "docs-readme", + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "terms": [ + "docs-readme", + "файл-индекс", + "проекта" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл-индекс документации проекта" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "docs-readme", + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "terms": [ + "docs-readme", + "файл-индекс", + "проекта" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md new file mode 100644 index 0000000..1946d5c --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-08-docs-index.md @@ -0,0 +1,101 @@ +# v2-router-find-files-08-docs-index + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Покажи файл-индекс документации проекта + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Покажи файл-индекс документации проекта", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Покажи файл-индекс документации проекта", + "normalized_query": "Покажи файл-индекс документации проекта", + "target_terms": [ + "docs-readme", + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "terms": [ + "docs-readme", + "файл-индекс", + "проекта" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Покажи файл-индекс документации проекта" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "docs-readme", + "файл-индекс", + "проекта" + ], + "anchors": { + "entity_names": [], + "terms": [ + "docs-readme", + "файл-индекс", + "проекта" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/README.md" + ], + "matched_aliases": [ + "docs-readme" + ], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json new file mode 100644 index 0000000..42be420 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.json @@ -0,0 +1,99 @@ +{ + "meta": { + "case_id": "v2-router-find-files-09-telegram-bot-api", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "normalized_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "target_terms": [ + "Telegram", + "Bot", + "API", + "относятся", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "terms": [ + "Telegram", + "Bot", + "API", + "относятся", + "интеграции" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "Telegram", + "Bot", + "API", + "относятся", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "terms": [ + "Telegram", + "Bot", + "API", + "относятся", + "интеграции" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md new file mode 100644 index 0000000..2f1b0c1 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-09-telegram-bot-api.md @@ -0,0 +1,109 @@ +# v2-router-find-files-09-telegram-bot-api + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какие файлы относятся к Telegram Bot API интеграции? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Какие файлы относятся к Telegram Bot API интеграции?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "normalized_query": "Какие файлы относятся к Telegram Bot API интеграции?", + "target_terms": [ + "Telegram", + "Bot", + "API", + "относятся", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "terms": [ + "Telegram", + "Bot", + "API", + "относятся", + "интеграции" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие файлы относятся к Telegram Bot API интеграции?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "Telegram", + "Bot", + "API", + "относятся", + "интеграции" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Bot", + "API" + ], + "terms": [ + "Telegram", + "Bot", + "API", + "относятся", + "интеграции" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json new file mode 100644 index 0000000..4b2866b --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.json @@ -0,0 +1,95 @@ +{ + "meta": { + "case_id": "v2-router-find-files-10-telegram-notify-worker", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "В каких файлах описан worker `telegram_notify`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каких файлах описан worker `telegram_notify`?", + "normalized_query": "В каких файлах описан worker `telegram_notify`?", + "target_terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каких файлах описан worker `telegram_notify`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md new file mode 100644 index 0000000..c0b6454 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-find-files-10-telegram-notify-worker.md @@ -0,0 +1,105 @@ +# v2-router-find-files-10-telegram-notify-worker + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +В каких файлах описан worker `telegram_notify`? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "В каких файлах описан worker `telegram_notify`?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "FIND_FILES", + "user_query": "В каких файлах описан worker `telegram_notify`?", + "normalized_query": "В каких файлах описан worker `telegram_notify`?", + "target_terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic file anchor" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "В каких файлах описан worker `telegram_notify`?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "FIND_FILES", + "reason_short": "deterministic file anchor", + "target_terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "anchors": { + "entity_names": [], + "terms": [ + "telegram_notify", + "каких", + "файлах", + "описан", + "worker" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/logic/telegram-notification-loop.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json new file mode 100644 index 0000000..9eef4cc --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v2-router-general-01-what-is-service", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Что это за сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что это за сервис?", + "normalized_query": "Что это за сервис?", + "target_terms": [ + "Что", + "это", + "сервис" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "это", + "сервис" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что это за сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Что", + "это", + "сервис" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "это", + "сервис" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md new file mode 100644 index 0000000..e007ea0 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-01-what-is-service.md @@ -0,0 +1,93 @@ +# v2-router-general-01-what-is-service + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что это за сервис? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Что это за сервис?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что это за сервис?", + "normalized_query": "Что это за сервис?", + "target_terms": [ + "Что", + "это", + "сервис" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "это", + "сервис" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что это за сервис?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Что", + "это", + "сервис" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "это", + "сервис" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-02-purpose.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-02-purpose.json new file mode 100644 index 0000000..9aed4f1 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-02-purpose.json @@ -0,0 +1,87 @@ +{ + "meta": { + "case_id": "v2-router-general-02-purpose", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Для чего нужен test_echo_app?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Для чего нужен test_echo_app?", + "normalized_query": "Для чего нужен test_echo_app?", + "target_terms": [ + "Для", + "чего", + "нужен", + "test_echo_app" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Для", + "чего", + "нужен", + "test_echo_app" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Для чего нужен test_echo_app?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Для", + "чего", + "нужен", + "test_echo_app" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Для", + "чего", + "нужен", + "test_echo_app" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-02-purpose.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-02-purpose.md new file mode 100644 index 0000000..9bcf726 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-02-purpose.md @@ -0,0 +1,97 @@ +# v2-router-general-02-purpose + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Для чего нужен test_echo_app? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Для чего нужен test_echo_app?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Для чего нужен test_echo_app?", + "normalized_query": "Для чего нужен test_echo_app?", + "target_terms": [ + "Для", + "чего", + "нужен", + "test_echo_app" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Для", + "чего", + "нужен", + "test_echo_app" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Для чего нужен test_echo_app?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Для", + "чего", + "нужен", + "test_echo_app" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Для", + "чего", + "нужен", + "test_echo_app" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-03-problem.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-03-problem.json new file mode 100644 index 0000000..0d45adc --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-03-problem.json @@ -0,0 +1,91 @@ +{ + "meta": { + "case_id": "v2-router-general-03-problem", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Какую задачу решает это приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какую задачу решает это приложение?", + "normalized_query": "Какую задачу решает это приложение?", + "target_terms": [ + "Какую", + "задачу", + "решает", + "это", + "приложение" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Какую", + "задачу", + "решает", + "это", + "приложение" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какую задачу решает это приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Какую", + "задачу", + "решает", + "это", + "приложение" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Какую", + "задачу", + "решает", + "это", + "приложение" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-03-problem.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-03-problem.md new file mode 100644 index 0000000..1a3c320 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-03-problem.md @@ -0,0 +1,101 @@ +# v2-router-general-03-problem + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какую задачу решает это приложение? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Какую задачу решает это приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какую задачу решает это приложение?", + "normalized_query": "Какую задачу решает это приложение?", + "target_terms": [ + "Какую", + "задачу", + "решает", + "это", + "приложение" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Какую", + "задачу", + "решает", + "это", + "приложение" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какую задачу решает это приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Какую", + "задачу", + "решает", + "это", + "приложение" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Какую", + "задачу", + "решает", + "это", + "приложение" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json new file mode 100644 index 0000000..f57afcc --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.json @@ -0,0 +1,91 @@ +{ + "meta": { + "case_id": "v2-router-general-04-docs-contents", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Что входит в документацию этого проекта?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что входит в документацию этого проекта?", + "normalized_query": "Что входит в документацию этого проекта?", + "target_terms": [ + "Что", + "входит", + "документацию", + "этого", + "проекта" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "входит", + "документацию", + "этого", + "проекта" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что входит в документацию этого проекта?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Что", + "входит", + "документацию", + "этого", + "проекта" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "входит", + "документацию", + "этого", + "проекта" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md new file mode 100644 index 0000000..cfcb6e8 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-04-docs-contents.md @@ -0,0 +1,101 @@ +# v2-router-general-04-docs-contents + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что входит в документацию этого проекта? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Что входит в документацию этого проекта?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что входит в документацию этого проекта?", + "normalized_query": "Что входит в документацию этого проекта?", + "target_terms": [ + "Что", + "входит", + "документацию", + "этого", + "проекта" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "входит", + "документацию", + "этого", + "проекта" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что входит в документацию этого проекта?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Что", + "входит", + "документацию", + "этого", + "проекта" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Что", + "входит", + "документацию", + "этого", + "проекта" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json new file mode 100644 index 0000000..c697753 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-05-main-parts.json @@ -0,0 +1,87 @@ +{ + "meta": { + "case_id": "v2-router-general-05-main-parts", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Какие основные части есть у системы?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие основные части есть у системы?", + "normalized_query": "Какие основные части есть у системы?", + "target_terms": [ + "основные", + "части", + "есть", + "системы" + ], + "anchors": { + "entity_names": [], + "terms": [ + "основные", + "части", + "есть", + "системы" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие основные части есть у системы?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "основные", + "части", + "есть", + "системы" + ], + "anchors": { + "entity_names": [], + "terms": [ + "основные", + "части", + "есть", + "системы" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md new file mode 100644 index 0000000..a3ddb38 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-05-main-parts.md @@ -0,0 +1,97 @@ +# v2-router-general-05-main-parts + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какие основные части есть у системы? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Какие основные части есть у системы?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие основные части есть у системы?", + "normalized_query": "Какие основные части есть у системы?", + "target_terms": [ + "основные", + "части", + "есть", + "системы" + ], + "anchors": { + "entity_names": [], + "terms": [ + "основные", + "части", + "есть", + "системы" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие основные части есть у системы?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "основные", + "части", + "есть", + "системы" + ], + "anchors": { + "entity_names": [], + "terms": [ + "основные", + "части", + "есть", + "системы" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json new file mode 100644 index 0000000..16bab4d --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.json @@ -0,0 +1,87 @@ +{ + "meta": { + "case_id": "v2-router-general-06-high-level-architecture", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Как в целом устроено приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как в целом устроено приложение?", + "normalized_query": "Как в целом устроено приложение?", + "target_terms": [ + "Как", + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Как", + "целом", + "устроено", + "приложение" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в целом устроено приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Как", + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Как", + "целом", + "устроено", + "приложение" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md new file mode 100644 index 0000000..06d558a --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-06-high-level-architecture.md @@ -0,0 +1,97 @@ +# v2-router-general-06-high-level-architecture + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Как в целом устроено приложение? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Как в целом устроено приложение?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Как в целом устроено приложение?", + "normalized_query": "Как в целом устроено приложение?", + "target_terms": [ + "Как", + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Как", + "целом", + "устроено", + "приложение" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Как в целом устроено приложение?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Как", + "целом", + "устроено", + "приложение" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Как", + "целом", + "устроено", + "приложение" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json new file mode 100644 index 0000000..f451d58 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-07-besides-api.json @@ -0,0 +1,95 @@ +{ + "meta": { + "case_id": "v2-router-general-07-besides-api", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Что тут есть кроме API?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что тут есть кроме API?", + "normalized_query": "Что тут есть кроме API?", + "target_terms": [ + "API", + "Что", + "тут", + "есть", + "кроме" + ], + "anchors": { + "entity_names": [ + "API" + ], + "terms": [ + "API", + "Что", + "тут", + "есть", + "кроме" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что тут есть кроме API?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "API", + "Что", + "тут", + "есть", + "кроме" + ], + "anchors": { + "entity_names": [ + "API" + ], + "terms": [ + "API", + "Что", + "тут", + "есть", + "кроме" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md new file mode 100644 index 0000000..cd93ca7 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-07-besides-api.md @@ -0,0 +1,105 @@ +# v2-router-general-07-besides-api + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Что тут есть кроме API? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Что тут есть кроме API?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Что тут есть кроме API?", + "normalized_query": "Что тут есть кроме API?", + "target_terms": [ + "API", + "Что", + "тут", + "есть", + "кроме" + ], + "anchors": { + "entity_names": [ + "API" + ], + "terms": [ + "API", + "Что", + "тут", + "есть", + "кроме" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Что тут есть кроме API?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "API", + "Что", + "тут", + "есть", + "кроме" + ], + "anchors": { + "entity_names": [ + "API" + ], + "terms": [ + "API", + "Что", + "тут", + "есть", + "кроме" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-08-components.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-08-components.json new file mode 100644 index 0000000..e0bef43 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-08-components.json @@ -0,0 +1,103 @@ +{ + "meta": { + "case_id": "v2-router-general-08-components", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Из чего состоит Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Из чего состоит Telegram Notify App?", + "normalized_query": "Из чего состоит Telegram Notify App?", + "target_terms": [ + "Telegram", + "Notify", + "App", + "чего", + "состоит" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "terms": [ + "Telegram", + "Notify", + "App", + "чего", + "состоит" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Из чего состоит Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "Telegram", + "Notify", + "App", + "чего", + "состоит" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "terms": [ + "Telegram", + "Notify", + "App", + "чего", + "состоит" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-08-components.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-08-components.md new file mode 100644 index 0000000..73958b3 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-08-components.md @@ -0,0 +1,113 @@ +# v2-router-general-08-components + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Из чего состоит Telegram Notify App? + +## Actual +```json +{ + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Из чего состоит Telegram Notify App?", + "route": { + "routing_domain": "DOCS", + "intent": "DOC_EXPLAIN", + "subintent": "SUMMARY", + "user_query": "Из чего состоит Telegram Notify App?", + "normalized_query": "Из чего состоит Telegram Notify App?", + "target_terms": [ + "Telegram", + "Notify", + "App", + "чего", + "состоит" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "terms": [ + "Telegram", + "Notify", + "App", + "чего", + "состоит" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "deterministic signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Из чего состоит Telegram Notify App?" + }, + "output": { + "domain": "DOCS", + "intent": "DOC_EXPLAIN", + "sub_intent": "SUMMARY", + "reason_short": "deterministic signal", + "target_terms": [ + "Telegram", + "Notify", + "App", + "чего", + "состоит" + ], + "anchors": { + "entity_names": [ + "Telegram", + "Notify", + "App" + ], + "terms": [ + "Telegram", + "Notify", + "App", + "чего", + "состоит" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [ + "docs/architecture/telegram-notify-app-overview.md" + ], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json new file mode 100644 index 0000000..cca6d29 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-09-reading-order.json @@ -0,0 +1,83 @@ +{ + "meta": { + "case_id": "v2-router-general-09-reading-order", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Какие документы стоит читать сначала?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие документы стоит читать сначала?", + "normalized_query": "Какие документы стоит читать сначала?", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "terms": [ + "стоит", + "читать", + "сначала" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие документы стоит читать сначала?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "terms": [ + "стоит", + "читать", + "сначала" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md new file mode 100644 index 0000000..02662d1 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-09-reading-order.md @@ -0,0 +1,93 @@ +# v2-router-general-09-reading-order + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Какие документы стоит читать сначала? + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Какие документы стоит читать сначала?", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Какие документы стоит читать сначала?", + "normalized_query": "Какие документы стоит читать сначала?", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "terms": [ + "стоит", + "читать", + "сначала" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Какие документы стоит читать сначала?" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "стоит", + "читать", + "сначала" + ], + "anchors": { + "entity_names": [], + "terms": [ + "стоит", + "читать", + "сначала" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json new file mode 100644 index 0000000..ce8e869 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-10-short-summary.json @@ -0,0 +1,87 @@ +{ + "meta": { + "case_id": "v2-router-general-10-short-summary", + "component": "process_v2_intent_router", + "source_file": "/Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml", + "passed": true, + "mismatches": [] + }, + "actual": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 + }, + "details": { + "query": "Дай короткое summary по проектной документации", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Дай короткое summary по проектной документации", + "normalized_query": "Дай короткое summary по проектной документации", + "target_terms": [ + "Дай", + "короткое", + "summary", + "проектной" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Дай", + "короткое", + "summary", + "проектной" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Дай короткое summary по проектной документации" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Дай", + "короткое", + "summary", + "проектной" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Дай", + "короткое", + "summary", + "проектной" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] + } +} \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md new file mode 100644 index 0000000..be3dbe5 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/router_only_docs_v2_matrix_v2-router-general-10-short-summary.md @@ -0,0 +1,97 @@ +# v2-router-general-10-short-summary + +- component: process_v2_intent_router +- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/router_only_docs_v2_matrix.yaml +- passed: True + +## Query +Дай короткое summary по проектной документации + +## Actual +```json +{ + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "routing_mode": "deterministic", + "llm_router_used": false, + "confidence": 1.0 +} +``` + +## Details +```json +{ + "query": "Дай короткое summary по проектной документации", + "route": { + "routing_domain": "GENERAL", + "intent": "GENERAL_QA", + "subintent": "SUMMARY", + "user_query": "Дай короткое summary по проектной документации", + "normalized_query": "Дай короткое summary по проектной документации", + "target_terms": [ + "Дай", + "короткое", + "summary", + "проектной" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Дай", + "короткое", + "summary", + "проектной" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + }, + "confidence": 1.0, + "routing_mode": "deterministic", + "llm_router_used": false, + "reason_short": "general fallback signal" + }, + "pipeline_steps": [ + { + "step": "intent_router", + "input": { + "query": "Дай короткое summary по проектной документации" + }, + "output": { + "domain": "GENERAL", + "intent": "GENERAL_QA", + "sub_intent": "SUMMARY", + "reason_short": "general fallback signal", + "target_terms": [ + "Дай", + "короткое", + "summary", + "проектной" + ], + "anchors": { + "entity_names": [], + "terms": [ + "Дай", + "короткое", + "summary", + "проектной" + ], + "file_names": [], + "endpoint_paths": [], + "target_doc_hints": [], + "matched_aliases": [], + "process_domain": null, + "process_subdomain": null + } + } + } + ] +} +``` + +## Mismatches +- none \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/summary.md b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/summary.md new file mode 100644 index 0000000..966c540 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_01/process_v2_intent_router/test_runs/smoke_v4_pass/20260407_120104/summary.md @@ -0,0 +1,36 @@ +# pipeline_setup_v4 summary + +Passed: 30/30 + +| Case | Component | Query | Intent | Sub-intent | Pass | +|------|-----------|-------|--------|------------|------| +| v2-router-general-01-what-is-service | process_v2_intent_router | Что это за сервис? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-02-purpose | process_v2_intent_router | Для чего нужен test_echo_app? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-03-problem | process_v2_intent_router | Какую задачу решает это приложение? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-04-docs-contents | process_v2_intent_router | Что входит в документацию этого проекта? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-05-main-parts | process_v2_intent_router | Какие основные части есть у системы? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-06-high-level-architecture | process_v2_intent_router | Как в целом устроено приложение? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-07-besides-api | process_v2_intent_router | Что тут есть кроме API? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-08-components | process_v2_intent_router | Из чего состоит Telegram Notify App? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-general-09-reading-order | process_v2_intent_router | Какие документы стоит читать сначала? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-general-10-short-summary | process_v2_intent_router | Дай короткое summary по проектной документации | GENERAL_QA | SUMMARY | ✓ | +| v2-router-docs-summary-01-health | process_v2_intent_router | Кратко объясни по документации, как работает `/health` | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-02-send | process_v2_intent_router | Что делает endpoint `/send`? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-03-actions | process_v2_intent_router | Объясни назначение `/actions/{action}` | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-04-runtime-health | process_v2_intent_router | Что такое runtime health в этой документации? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-05-notification-loop | process_v2_intent_router | Кратко опиши цикл отправки уведомлений | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-06-architecture | process_v2_intent_router | Как устроена архитектура Telegram Notify App? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-07-worker | process_v2_intent_router | Что делает worker в этом приложении? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-08-health-statuses | process_v2_intent_router | Какие статусы здоровья есть у runtime? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-09-manual-send | process_v2_intent_router | Как в приложении устроена ручная отправка сообщения? | DOC_EXPLAIN | SUMMARY | ✓ | +| v2-router-docs-summary-10-telegram-integration | process_v2_intent_router | Как сервис взаимодействует с Telegram в целом? | GENERAL_QA | SUMMARY | ✓ | +| v2-router-find-files-01-health | process_v2_intent_router | В каком файле описан `/health`? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-02-send | process_v2_intent_router | Покажи файл с описанием endpoint `/send` | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-03-actions | process_v2_intent_router | Где находится документация по `/actions/{action}`? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-04-runtime-health | process_v2_intent_router | В каком документе описан runtime health? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-05-loop | process_v2_intent_router | Найди файл с логикой цикла отправки уведомлений | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-06-architecture | process_v2_intent_router | Где описана архитектура приложения? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-07-errors-catalog | process_v2_intent_router | В каком файле лежит каталог ошибок? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-08-docs-index | process_v2_intent_router | Покажи файл-индекс документации проекта | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-09-telegram-bot-api | process_v2_intent_router | Какие файлы относятся к Telegram Bot API интеграции? | DOC_EXPLAIN | FIND_FILES | ✓ | +| v2-router-find-files-10-telegram-notify-worker | process_v2_intent_router | В каких файлах описан worker `telegram_notify`? | DOC_EXPLAIN | FIND_FILES | ✓ | \ No newline at end of file diff --git a/tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/router_llm_first_v3.yaml b/tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/router_llm_first_v3.yaml new file mode 100644 index 0000000..69f9328 --- /dev/null +++ b/tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/router_llm_first_v3.yaml @@ -0,0 +1,147 @@ +defaults: + component: process_v2_intent_router + +cases: + - id: v3-docs-summary-01-endpoint + query: "Объясни по документации endpoint `/health`" + tags: ["docs", "summary", "clean"] + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v3-docs-summary-02-architecture + query: "Как устроена архитектура приложения?" + tags: ["docs", "summary", "clean"] + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v3-docs-summary-03-process + query: "Опиши процесс отправки уведомлений" + tags: ["docs", "summary", "clean"] + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v3-docs-summary-04-entity + query: "Что такое runtime health в документации?" + tags: ["docs", "summary", "clean"] + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v3-find-files-01-which-file + query: "В каком файле описан `/health`?" + tags: ["docs", "find_files", "clean"] + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v3-find-files-02-show-doc + query: "Покажи документ про runtime health" + tags: ["docs", "find_files", "clean"] + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v3-find-files-03-where-described + query: "Где описано `docs/architecture/overview.md`?" + tags: ["docs", "find_files", "clean"] + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v3-general-01-overview + query: "Общий обзор сервиса" + tags: ["general", "summary", "clean"] + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v3-general-02-what-is-service + query: "Что это за сервис?" + tags: ["general", "summary", "clean"] + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v3-general-03-purpose + query: "Для чего нужен этот сервис?" + tags: ["general", "summary", "clean"] + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v3-negative-01-operational + query: "Почему у меня сейчас упал деплой?" + tags: ["negative", "boundary"] + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v3-negative-02-meta + query: "Как ты выбираешь маршрут?" + tags: ["negative", "boundary"] + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v3-negative-03-non-docs + query: "Сколько сейчас времени на сервере?" + tags: ["negative", "boundary"] + expected: + router: + domain: GENERAL + intent: GENERAL_QA + sub_intent: SUMMARY + + - id: v3-noisy-01-colloquial + query: "Где там дока про health, покажи плз" + tags: ["noisy"] + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES + + - id: v3-noisy-02-abbrev + query: "Нужен краткий док-саммари по api /send" + tags: ["noisy"] + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: SUMMARY + + - id: v3-noisy-03-broken-phrase + query: "runtime health это где описано в доках" + tags: ["noisy"] + expected: + router: + domain: DOCS + intent: DOC_EXPLAIN + sub_intent: FIND_FILES diff --git a/tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039.zip b/tests/pipeline_setup_v4/cases/suite_02/process_v2_intent_router/test_runs/llm_first_v3_suite_check/20260407_130039.zip new file mode 100644 index 0000000000000000000000000000000000000000..aeca4cdf63e78e9e67ea7d617a325fedeb58873c GIT binary patch literal 45169 zcmdSBWpJG9lC3FbX0jM8W@ct)w3wO67Be%0Wic}|gT>5D7NaFwaLev9-RJb&c6+;f zBKB0M1V8EveHF2u$~V`_RFDP*Lj(HpKs681`T5H~z99h-0x>Z#u`#ePu)kwuW?*3E zq<3+L1p)@U0|o;6`65*ncp%83`8kUt!1KpXg`Zc00)qN~T@43twRi7i1%>66HR$Qy z{ih56>bg1$a~4MW=tgGxhWeMXGHREIYM~0gAhB4W6iB$h4n#-+4-wd*Akjobf(qmk zLvVx#V#>XtNSLw{lk?IvZ-*u4so##$OOH!`mXu<4q#z9mWsXY9 zp$53)Pk`rt{of1zU)~ExI~QjY$9LA&Ht$R=9G#rsxiSO3XpQZRoM@d~Y-|i1J!l!2 zY3&{Dj7*%I=xmJttD9W@$D7xnwr)GifYmXntg(L9nwSJT*B0jJ*Z+W5G&wx_J+Cj(fE{vSMsi3oAyKev~=6Iq48R3(s`yW`uoQIWe19 zV$rmCVJan->w@GgNjfV7gJdcol_=Lpi3veeYHTZDkeJ*O?u&m720^;EnCm=@;*N@7 zAmp&lC^AS3hfPtlgNhVrvMf3{g)E-Rz>*tgNiyD$UJ94%*iKe6T|WYQ7H0?8qtFq`KMMYu6p|JG6w}N0Fk;eG?(}h|gIC+T zwkRTD0J>)g5&xTI*K*DO1W$+PX`soi(joR_7R=WVAm5ppw0d%&Z-0BQp~(AhAJ ziH-|&2Ai+7ZE@LIW7;Nc+G~=4f2rlQI@kFnyz;2yd3`;rh#qECc3=Qm)&wrvd3V5m z__`kr7~!q>q=Q5xBS%3IF(rZr9I+#{m$uutjxR3MsV#-iaKa3c6s>&yRuu7NkCR*# zVh&l&dr2b;=JTa$9~V7aVug{>I<^-WD`KfkpnYJkd?ajBxj=*+5S63C-g%-qMAE?~ z#vzocmTsj;Ri*~7WaB5jVL*;5m>F9agxcRXl>(RUVQ1AMcUF5B5)jH9hAYf$I+)Vz zD8gfNge6Q@L&-diRUjIawR*A_w3|X7KAf-z6LBFz+kI2#*lv|st?5IO(Z2A7tqC71 zJ;YLFrYr5-oJ`D=$IH0MT|kol@P z?UO|-Ua#%dV5dqrbH!?udHodfvHIo0b*{ygA>B_>X6iP3+hWunjXiSvqhivk1sZnL z1kl}DIo3J7l3w6g5+*>6w%1;*CL`PFK;z#IA^}?|%E&kr0_>^j8hmx6D z{0&Afyt)V;6*q_y`Wgd~>%2kECO&BI=U#=x%ZMmukW!5$fmyVXE>Zy-9qsu#T1<;H zP|=v*GL=q2PdU-$O7Ad(uJp@vr#wKBqwUfW*3dDSX6EBiOZHxSXEVBXL!l00M6xVniJ=BW)DwrnWYMt$sg1ua@ea( zJi(H8YE2-VKHRF+f7&H>J3A?N2`V6?LDx7*7c^FA-;WAt1tm|YnK7-QG8a;6>Bx^a z*~-A7nc=Xos|}EG3K|o1G98Mk_Uu<7bB?5onTlLCjw~l`ky|g@(%FuHCx#_jP*{Ve zM!?Tm*yXKxbW?XTOlWU}`8)tB+@TO4^X*w<2!&_j5)VDvVN=1%qgZn|g}O6$BTd&o z3Dl+~Qs*EDKKaY?p5|c&9hJd$gOV)Qd#N&~4mLd7hCXFHh)VcU3$+Q;I~M9)@rF=mkOCKs#Pth@p0!5DlO19*1rjD6Ev!wPXc?Gjoy_gr ze$*bnMU8RWIR>Q8L(1~A28-lm(9;S-?GhzQLIEKm>P6Do!GW3p9}E~R=$?Q}7(5^% zuzmCycEe0#_7T@Q^h7)qlMj58-r18Q5NYRu6guSYsQSIzuI5U2Trw(nU_@c6$<)v@ z(Gr!aaD!9FZ2L2LVV3(e=8;UJ$5_SUSaC-sz&6C>Te2*{lmqR|p%wCxSQKFg%CUj_ zk9dsN(aK%*xgvq#;_k(PzQ;$)36IzjziN3<^QIWUe06-RdC>Hx{h<4SaNuI>>j3z) zoK`llq#txf@^V{^iwxM%(2$wf$d<0aFrgy$t|J3+z*T@(3}nWJ+PwPe(MDZJNE@Vh z(pWQQy~70oUexhR&$eFHk@og=qA3;d#aCW3``*lIRbTeGXRcE?Bbr9FRzos*cMzug zw7!Zqx8SoAHHI6P6r0E%COVm>81-!It^@wqS+tAAd;1DKHKh9FyzqRz=&7hIE6-g| zWC^M)#-2@~>vvl;vqk!pwsNLOUpy>Cy^>VKJxoha2Nn7fs}gV`M>tehXdXmRQF_lf zlV}1^d}@I%adb=|)AnFW@;U2{Nat$D-Wf#dwcPX!2ie+HyiVTKD(K+G@1yNo z{Ipg)MR|T?sSf9si&7fXDLiwG>)@~fThBWAb3D^=8T&Nu)s^QAsrukFT8!?y%JOQZ zvc)ehmCG*yHhe%c?l(8d=L_b*|!N4QkA< zn4a2S4sq5SIP=EpX+SIH^(hPs5T03KSLA(i>iPJ-wv>dkKDFBhr6Ve*BTd{tg)7`F)K12P>IqZA_dE=q#P=Z2!BXN`dNn_^bd{$AxmBjvaf$ zoltw6e*}Bw)~H@6O<$_Fjd*+-2Q&0Sfx-f=!F!M#Lv%1?0%8x6E=h8W8S;{;HPYva zH0I68%;U3Rhcze`mmIF9ho~;^Qr~JIP+KlsCk>@>B`o>EU4J)IP2zBH$VzznxKN6!=Np94VgDfgqm2fT5+0mhiVMzsuoNGlcNus1CUS%h{O3~~uI1Hc zzGPoKaT3+^J{v+|L*@xkFiH}5kz4GS1X>U#lq{yis&`6YiKRxVr03V&utxP#&8AX; z7rN4-R@a1kTvkX|QDzt;3D5W(wo@P2ezQC~lRr&1eezRl zJP_oVPy_Y85s0IW>*r20#AO1CuCa@(Q?m~_&%+-MwIiQLyAC!pPwnnw?XH|Md`2#^ zS#N^1DikH&MFeN4G?r9JhZ^q3XC^b3+7prB)J`I0Ru+`#_>*%a7jv+(MGt?J>KM(X z6iZ=l7{qJ^lTm8pU*isQ|L7u;>J1#?G&wWbOy(R-8I=qvDG9Fz~*?kplu zZ7}Hh-QJ|zbBhPM4*~CRB~N3pknUj^nQxWf;8~5+5aScD3bY)WYcq$LYexV(qJ;Ce z;<)s-wg8s?acp)7BSMln7s?f30*Y4F�f(t*mjlx02sz-+rGeWZfF5t@X1y;cr_e z{`##z0FqakiR-;lcE$pq?hBA(;MX;?0XeK&Yd!hq9N^r<;eT4 zQMao@wv{K)AL4hl0n-fxh#%vZ;urrT@&9FE{2hcZ^!vj9FW~k&@~=?+(WyY|+*B6n z&^xSk0A3?%luRh}3yh7OGERH2W_&<=MH^K4SwQFj2|*1~8`}lGY15oxqlI#uCO!0i z@t#PzX-Ux*WklH;KGJi*&hFEeq|p}>)@NDA&0&=6LxkkcK8?01(2FUd5?{qG3sghN zk1)4UfnL}-rZb%hB4iuoW^k%j-AME$(G2`Vfe|Sh*oRw>sEn7~?qCAW)}NCVyhURwmhYT>iThZL5;(H7_0k6!a~NsyiZ=i$Pw-}w zpUWcXYVrzx>+;B$fB^puL4AZ#i%hoBNApiQy8b0M!UoP&7zF9q26!Q~~>t9lsUsji;akJkcZNyve9O#-i|A4v}I@DOq& zS&R~Qi4rgxhl`bWj)IwV5i%R=MUs=48b3KgL4>8Yb;pPD)V|3(>Y2xmRVgE6Sm;-k zUe@v90JcXLc*alPrl*x6Sjb!J=1}F8yE}#AvQ&32NoaYC;3=2^Qnm+ovnvq?D*%7ElYRA4d-86rhXLeEX>gS=W)6 zFz=BBS$D8ivZg-#2^*p#i_*h9WqVSzd8l|xCS1nDSrh=H_68eR&LCK$1YZx3xU zi|`{a7K0q|fD=++!Eq*IbvG6?DCo)&;XY-*4$!=QZQ_BOf2_rn-vk45YX|DB35p6L z&JgrLUj4_%^Myn*#==yl3L>0%Osc+KHn!n9xVbs%PISxxbjr!G$$d=^ttYxp%&u@) zC7r~g{gjDjnhL^p=rHIzZc_5-&GLXOnH z$QbRx`SOLi9Q8dM#+O`$aO4<)!27-Xg>_v!(^+TDivR2vEO{nd`5cKlw(7)oR`2Lwdl_@9DH7_q{4rCA)i9MtOHQB*x6A4ku0 zbN9mIxvLBr6K6^kU@8luHYR0IqSFAU3{Lw`NVSb25KECE1QvdlsWfm=Y&JXs(@hWJ zbO>xF#W{hPC+O3t>BpS8oSqv(-yXwLnb>|-LxKNNHwFaFybUJqpHKsvH@=x)=#;J+ z{Ya;&BN{hw1ry#>xxaO(xju~UXVYlskz>9%x{wVSoSu(Uv}fCPhQ-LV|B<#&lz_&q zz|VQvZ$PACIosxJWS@4McwA-|Vy*R?)y6V0F?lsgtrPrOGt9wBu9?{af>rv`<(KK4 zK2O%8DO_ib$6L!97ff!}4d{;|t)HL;c0`e|ALm^bGQ{R)vl-YWQtr0>Y<-Rfxvww+IqM@ug6(#A;e>UaF5$7A#t>rkCOl2IyoI2Tc zBlD^WmqEIf$d6Z%jCB=Isvu?vrbBp}fHurE(hIsA`q{(TK@0=I)PO_T5Q4UCz|{YQ))Z4=@6AOTiN5(6DK=!}QM z)0YS5huXTst-LiH8TsI#0pkk`llSl0aNy-PF~}FuQ<&3>u`;I{F#8fsdNB|X-fB-) zOWxKj6|jp+$$7vrIZ}WBK8f)C?ohJY+2lK2bT^>WQ5S_6O`3AU?@@~5;L<$R(8=c1 z5LMw{HSYWoUUKSIQF={OMj1$svu(Ize1ub|l{tf%^dC!C{ou{UJ{ymLbN<9ML# z1(n56-!2n#!nBS>-3Dr4tdcE#u`%?6;oymY+(w3dtV5|iv-#-hQ+9YBCk}rT2o`gD5JT(PtA{& zhb{aw?^rHhn}d#5L1Z&!IKub;ty0b-(T;Q0#IS~%c?~3k5KUk0{S~3g7^0k zVP;|ruuiOhnkcR&j;=;RcP=z@dHOh#P3KsT15Nir@z8Cmu)(kD2-PAtLQiZ2j)#pBtr~c0_|h zf8aqDatIa!nugJIP=JHf&KV?o@hm<9?6!BT)6A{RZu$Lvh%w@_?mf4c#(Mnx;_2cS zw(n`{yIlk=-``e4qiz^8wJ=I~zT*+%`WTLtl0|gf&f(+ofzxxD)A1m$Fg;B#5~iQ@ z!Xl`%6DLMI#SV5jX<|Q8j0z006<;W|R%EHS2Yd7d%(L2 zJ0H3B0&4Dy9XOiZUY6B|tyFun7g%i7hI0nYchn!)iN3$3lvo~zHe4zxl&?Z0DVRY< zePRxL#kBhY1PM1|hI?IG(Kc8b$HeS{3JJC4#@d5}6DIbA9smrs5oMS7nqa9k!5$qJ zGeqQ6+D-}kG>9BnOkF#Jk_JMka-E!)g-A>TIIsP0IdoZj8XDQuDN%{=Kf0U2hv2sp3e_bPg2MCD#J_P>x@Wn{$W^Q3*{?j7)t)}L`bTv|JcR`v3Lv3dA zEeMH7Nm)F|`LyApZLEtJ3iSxDz`RgwV;>IDYuR^}9A@&RS0zc5GWNJP9~<}&9Z4j` zz&W@)Q+0NjJ5A<5w&DDyo!z_#$@=(#U3r%AyCyx7Ll&n^jmv}pMu|r!8x^S4h;xYj zF%qd*5`v6yV<`)E>{iU}Z4kJTGS!xFE2OgjxgDX?27dvMK`_9IR5>Aqkn7mS+bu*W zuPZsg0pNkASt;STV-C|!S=$lPxHf@~`fY`sNGM1d<3il=`2skth;m8cf`5)5Gnq*F zR%0&RSP${b7qFhRrbzPxDXIfdiOx-{={x!-s6kb@cM-Sb|Dn=q%;5x!D5Ep1oyEZoC3BV@kdUG}v1ndxX;Rl_<5 zqdRR+aU)BG&8caXDkYf5e0nbVK(?53b>($e_bq+v`{tL`I|{H56h#&YD$P%~icOB@ zyDnPTnKS8}^9fpvZ%OrUg4Y_XBT14di?;~;o@30T)1BS<}$&S}<5{TVP8mrLu|k zob;Y;v^)Vc0fAIA@4Lo4)!AZJ1s|my<7a$_61sr9LN-vI;z@n%IrB5-TxFlE+fnQp zD~9qZ>uUOWn_In)>v~1J-i)7d-at-N)bpTuHxz=JL{)lalC9h?S{q%JbcWD>8$A7K zr^Z-}3AF&Qf%?mHhWsC4m^ny_l+Hu{*yJg7io}f!uDWxH*WO156crYwZoe72DVGi^ z%|)6lC42LH*mr0eg{IvZt26#|RX7pwQY!e3wm@)gzy&iwkK#t{f;o*O77i>7M*eJG6cDDzrf4E$H#Lf7AI6UJ z+_+o~JTYvJlQCjO#2i>(E$gH@-6W*i9gONcM93d}e(IgXmYNKEw5eoplLG-Kc8qQm z&Z=AD=HcN{RdOfb5fY1&!NU9mjeW-RzM5UDNh8fNXgZ`Sn|I^GZ9ZDbQz+ZckF3@i zW|edtZCC_q`Y=@a)B;8it1g$n=zWCaj-6ipjQbuY4bZ>1AZoRl zOgEv(rHrOiJi3b#Mz*8g{?wuaVP%k2OxsTHO)`ikcK%f`2?TXp#k3S3PH0K9(oCfq zOh*l}p<&;RAbPnF#Y{-Ku;@(ci&p93U_KRZJW*EO{yQPJxVpGo z4w+PhA`arrL|&R!Xgb75&s7opp~d`WjW^&FIqFfZe$prF4fuv9Qk_~}`V#!5_T;u5 zHYB0Rl!!J1bSa8XJeCp}gY!3a)eUEOQR6W7aR;re7uuwr`wn_Ty;F<+cT6v03n@wP z_z6k9;r9*o5ax?oi+5~u!d)mA0K-^YQn*M-xu$NYBhmSikT%QNH$7>ekXM_vsk-t} zs+23rr|`t(u+01fO--rk)3o$Euknui^$!H~FW+2Ss1g(&k_j($4}TsRA{Htg$J~M%Zv0AFVaRQ1Q>ZBC4GeSD6vZ)n9W2Z|jX4N2 zciZXf;n&xL49NaDneKD~b9H z*M%RI*L%EI3l@k51JB)I+iaz##V~i^^RcL?t|tk|4+f5dGB6*=C`FPY;~LR(q&(Vl z6?lzs(rNUy#L`z>Ymp>9MH7;@x#oIl?*p=KV%i7C$|tn~;g@}@`K`OT+DARhN4~Z9 zetCLhwSE4OLlliXs7YMF+Q?uNh^koZGivY+lZv`2BofRb7Hu{99gtsMsxh5 z#ZZGe(1yC2*_+<7_RrMqV01_|T);|U1T`32=>ip7e(@UkhUPVN*=>pPjqWy&e36O+ zAuuX-p*TZIoPLlW(*k=`l3WPT=X@DE^wtgVfo(U0)Y~@ zhJ2ff(xCg0T-0y%#vqCtm-mx#6$@`b6<$NoCPJ+i7d1U-HyPzW@`Z zDK_l0Rmk&XZSspZ`#I~c1Mw+^0>kw-og4h$69!^`^1BOS)?eXpH#tW!z7*FDI0oeqia$WpOvh_3?hQSuOoe&# z4Hk`3-+<`b9x>g35PleeJHA$Cl%oPJj#n5P(H`fMVvUxaM zO7>#)^kY>z4)iL=sTntfcW!ZfZRDbg`seZj2%Cx$i8p5_5vzuF-U@zK<`8Kwz&}n& zi#-LsvY`Udtsyk6mL0U}X{q8Zt8vY~Wg zKcw{M$tLE_&rK^N%hLkAiJI9x`tBT|Jxr6hu?hoW@q}lgq*_7xaN`J+DHyUUWpn<6 zZ$Bx$0qNKQ5hHD8$d&B|^M;Ei`jqMh|IsB3c$aj>J&=?}GC9=GNd}prTE83`CEIrk zr5HGaoW%<#@Ut(p%qZ>Dw!xIDqyld-65~Q%RKfCePv!uKv`i`^Qq(YRmjB_|SzI03 z?b=w^;nzn3r8NvU(pSy3eg5ms0r-^<=hQaJmPVTg%hck6t^pI?E=QLmc{aGHrnV zD5~4R>vV19>YI~T9KgY{FeWoR`|LCq(QDzBF^M=>h0E06$N#8CBKeq7BfKvZKChj+ z!hBPtm^rfwd_U!23@2v9zOY{NDwI6mZxs*&3%(8=LytvWW8)rvt0+Mzo0`RYIS(#Q zmCp?4u@#jDZ#E1Qzss`dO6SsqQz8?zbh&e?1zg~x*wkbs_;s~ymdsBNx!GI4d3KI4 zVIN|?1&khhN`_-_%>U_5)rd%Q(oVF4ncH`PwGN*&MbZ-YlV@O{W#9k|Zp;eM#mo#H zFD>i5!~Ps_n}$`OtMzl`_{G{wFbJ2*R8=4!>s(q^xH((BF1m?G4%4Wwo=ZJ(BUOH8 z=c0G(>)2q@`%zidz@Ce={;F&KAM)0lxPJQ41Zn(b6GZga^8Viu$lpQ!f5Djj_ZANm zp#5RsOltucM)}bVH8T0F9!Qp|Y|JbJQpZJAsG}`=fvC`qKUK{RpujLkgi=kGEUbt# z!u2txER&#d`v9q4kK&KoMf5Db6qZnE6JNU*@4E5%cKn9t>pcxrFB%I%4n)&^-7|&} zcql0wl4;!)43>nEbS{$jq4pUxgfD51WmUPSf|4t(3qq+Am0^72=dmz z7tNeR;hw|sRy7}P+LwH`I7UIG1F4|Igd|C9`P4f=S&JE6gVLVL+@gC(DNm_aLKv_iD<5;VO=tuC}#Tzl48~n3N_QjNxo3bX>qa~C^ zAxe3vZM-wE)wZ3(dufMvPa7M&R?I<#ouVD`i3XZf2H%`(inCPnLTc+>BFE5_ zud(A_OBOUL1xTn}wa)!xwDWb5zFp>(^wH=!m1uoi%6$`c1aHW37s0w>FhRKvRV`vq z4Tqvp6{8@}u+6BonorWcvJ0jOooRruy}~yBkx|$J(st66e!y&Ryqf~U&bgWF8TNzW zfG%QpICFk^?|$V&8}(LNTg_G>S9Cj@yOWDK(wVSzR%C!qQDxg_yGjPn3l@UCv_dMo zyL$ea>H1B+>|x)aQcZ~S6d!bZ`nE+-vXy<%uQd0b&W|6#Ab1paIyx`sK{w13E^frr zm`~%F_5bmG9_Y4JWRD`lN0oB4926#TWik@qgx%{tqnO?Zg}Q2fnx)U^{)ZfnI|!mFy#fJrvVMib3TO~LQf3)JBDJJsbMQQ1Z@BJJzrkX! z5J{vz`9F#CO4SQ3C$IJR11o;Tk8z9fzE!1%`bLSh;)ATSjnze5>Q{{g`s~fJ#qcS3 zp8+cyE)Xn;z<)O1XK$D|$sd$GnJy_*z$!imWe^@B3?&V?f!r#t1Zp^uO#gVh0HQ!R zy?gNzeGjb2CwO@2k;p`_++Gu3ff6)@qrMyNCK#fA`lB%l%AlV)LmKI0-PA&*a26w| zu{%y9I+_}NJSnBxr+T8tBX_~sR$9ph2x>n?>}HKoXDL}0$f&CrR5&`?nWDH6g;=dF zjr>H1)vc4dCNs=k_LF>7XncWz`%9NMmM%IRdL zvNc4DDvhchqz{P$-6Y&z?oZwb%|30RZB(znXg@0b)|+YGPD+%=xxzMy?Ay8wO( z_riPCeTGw8GIfa(xYAfda}&J6{S-5xd!?|}dE4g8)wHOVp}!uln%7_v{Ps)k zFcEimrcQAp`6+IH$b@xqx*t)qpM^)K4jwY;;-gh(RGZ6FYL_v|xtiVQuQ11Lm-&?; z*XDGI_xG>?Z&{gPdo8}mY!%d1ZbSja6m&-s$EQDHe8Gtk6*-Vt>7||=05fSi*a%$2 zs6s@Zj5mgiHY*Txh%{Nh#81Gp$zE|~KCk&S4y*zz$3mr(t;^2e-3D*Bl)nZ?d^PJl{M6oS-fW2VF=vHsxT2DJ z8skuPsqy=$dju%8^=go6v)XN(;0U!pcGwW-oq!Yipzhq5w6$ z?{E+70FVR^oNK;=Hc>2G!V?jRAcpA=la`5NXUvU~gHaQh07HTw#4!Gl*gWHsN6RcQ z7&4+D80HhpbEpwD6a1M15_a^ab;jQkUJm#ZO(2$8x^lvVfYH-4I7A8^>g=3Gdez<- zX^~7bguEUvZyEOU3z1ZI$NT4inh?Y;WkZlLJZFU_x78=?<)b%2q!(Gv+x z9yf$(ICEQ5#Ybu?AETZ77wyNQcDh%tqvx;Jh3y_Qba*(|Y7`wXXH&yvETkx=H4dWq z^}wX)N)G9D^s&4g4IeFGg16GHEOUkMn5hpS&iZdM>V-daae&d`SW?ZTskD;uLUh=L zKl_7i`2A#SVdZp1z(eO zS+0I~*uS8&!sI;#Yg3kA9<9VltnR48t!@{(Z&+{ogg#H^8Sbcwm2i2k*^nPDVPf+c z#-)vI3%y&}N)P->_2|9U^o`w84NTRfkr^>$xh7fTQr#$`7EAet;jC+puv!JftHol} zx$8<}#agh-_aj%0<^b&Kn(s7U7dD^jzM*bvzx)i369W}bbO7)H_RAi^pQS+mP*;Bk zdi({u^Udhv><{TsJ-bDq>v$6!ZT@gh>)A@jg!Jin7=Bd;%hK5q1Ck5@sHg~ty05V(U zss54Bgb?M*#@_S@d$QJebppX{4wxUC-Q#F>hsAKE2fbENN9)2%@&*N_x-B71BANS2 zWX1FuUcR6O%*Gy1_j9F>gUgT=$pk_m=J0V;Qek{gQM|q!r~?2Yd#<;6(HMb)kCThb z{iRk4qEbc&iEdV>QGhGR=}YZ5G@)Yak%~*Xd=4|pP||XI+lvdtj7hn5@o=MVCT6?6 z3Q%5X?r&8u-%l;?P40U(A5Ml}ubSdsx9y&*mMLCWUvJs#VqR8H>$(Q5S&61Kc|g*a zr#0)4i^tfxtW>Q7OoJ?S^9(S8ruL$>yK99k<(TjBXI>T7l->g;Z*g9G507$~N?BJ$ zW-dq zXLQ$l9EMONrbd^BfiIljSAGYWMOPjjgbqq?Ms5t%YAyMY`;B^~-fkceH7Dbdjiv8bj6p>;%#&OjYuV=@qL!-AGTr};K*W10S#Zm*?dFwX3! z%<&_YIWZZW!k%C>Fz?YowX77hho18tXUSTJB{A&|B;Un2vS+tGA*JaoMuNVN$B{Pk zT6Ic>vQ}g^BE*k7w15z-ZV=5jjhzU1Qhwol6|&_!P=BQN@2a{XctjuZ+4LT+8bM2~ zp5>#1<#|o_af`@#WY00;uf?7?zP-KeeT&_W2z5L_WuS8}me2m-=~A=mqB?I3x{qRD~k5GY{f5N*%K8Mdioi19IM3UEP0!z??>RfWB$E#GqsYcA1Kn0SzX zDv=tuWJl_CaO5tEC)?sqFGt~Ewd)le)Y=wP7(cC_$Q%45Qkom@UQWz4u%vAOwHx%& z1Dj7Hc}Z^PP6fJd8qE!yeMlE}{2*Dq?~D70OeiaLc7AX`6a6UBvnc!X0jI69X%U+) z4?`jjYcs(MPn!km$GHp{?$ORPJr`81srk=p8Hf6qYt7(gB;5rQ);4t)V)G`o1Ep|k zx@C2W8z#zUDD)C8>!Ahmi?^1xw2oGI^B>-{lX1sXNLC4CT;D7eMvi}+pSTj^^lVm* z-&i3YW2#k6ho4}rPs>#<+}I_^Z_RF$uHE>k+z1~NHRCc#T~-+?86d~Err!sEX;J1W%10Ethu_3zYT=Zz(^ z$)ZWRqMC$?df?E3r6c;AY|6{beV;jqb7_FWz;R!E?SP>3VWzKP6Zm(ccR5^*C}6*c z=B*vJn4M#rMMQq}3X7DT+|wMq&0pL+^OH#2>xB@E>1R?_@~sBVtB>r#;@bFhB!W86 z)RfCOI;=A!FzF5hio(mDE8DN+j{Bx3)o=s6e}O_QGC|~q5vn&)OC_>>7Y|kpur(uY z2S$m`7pJ-L6Y)#I)5cyyKm%Nm=U|^aDUpmeCcZ$+p9XB zd4K)%@NjuN)-pEPKfpO|3<6lAA-xs3Uy=psF3jm3O=1{1fDNloGk`5G(9c)bSzr&W1i-H;H(moG4@4IV8TG>0wy z$Sq;pQE&1Mk7i(Y3@-V-s>Zb5V9>zDEK_QjJ846Sga~SF_gNrJvS8f1;Jl%-n(@wV zA@sUWo|756Wu4Ng?y6JB2OAPM>=ONG^s{BS#uU)krf__$Ru%-KeV-c(5=;?rpZBsa}k2i7Ox4;1~DwysmW>XMxmo;g0+;?baCA{ zb;3>2(2yMq8nrnqw^NQY8L^m$^Qv;TN;(kppd(#z_?QH2^-w12QvAtA-HLjlG|}-Z z_neYDH=44kYiZ#dSG9#(!9&|1?GNJFU?M)v;*6yzBZ` z>b&xz1SS)|rCh1VB?bw&bZ{Y(G18_AMMKEdu(zM2K8M5e_Yg#i;e>r<&-dwXxGA0` zr;H#{x@kUKD|)|H7I*jvZT^M-zVh--mk?mu9SZ&f-y0_lg>gqL`AgkP2U4MZ0#%u~ ze1Fiz;0!5be4kde91PtcyAS|JL~v9o^vA@z8RZB8M4>%;aU@{kJt4O$H`hCsL#`U9gk_{? zh&sLBrGQcuM&?z^RACvV5T&$_>}`Eli^%Q@As@Vp*zVaSah$@SY`~=4yUgs#>_x#b z6g=PdOx8~$8}YO+Uv^HdU0+%uWE&#sC5VZ+Ih0+&oYDtc3$c{vRT|Yj-acfCb_?(F za(-aRYF-Q|On_nsj+k#u`iecAG@=1m%Yo(-o|8d;aBNc<(YEvbz{#Pm^$PtIKPL4Mf(xsID^&UcMqzdvghCKvBYRQdVDs&REFk9y#w7Nk_Q_ zNYXtyW|PUr&mTn8WVVnQpV1d!3&<#?Tv%^8}0n!}5$^MDsm! zx1oEhD_g{6x7eHokE_CR!e7pz%naa+L0qz0le^v1j~5I# zidr*rttiMArsC?}9jRu48q#aO;duM%&`#@EwMMf--GXx#pEclFu;_k1HmQ?R@uk(+ z+z*&it6e=h>8mg4dd)3>mB9rTl#qMNJGT;ZIw#ZT+K=@0`$=_;VL>!M8EZt}|@w>1t=fB@EM;T}+;0SWA2`rBP>C^|o!Y7eo9!+)gf7CIOnp?gn227eeP^dcjA7p8kl;q*_Z>&o(5i@a80~&wr`}a*~RTZ?&1?K?0Kd& z{{XheV9+xDZh})!$4x9UZo#=|WfPHi6ZZGhVz}iqNJEZ-!Xb-3x)SG6uvd_gtB&Mj zY>jY?B8cyN4^#^odsCQICkW)bEigQri( zYSL0FGKUf#fRWWfr%W_R*CHcaovhfq!C{?Hinr(87(KggckYn>F11;{jYsG3RVR?a zn)wh}x17axBzZ7ykUbT3Yt%68P5wdFb)r@my2};SE+l~`X)T`}SC`5@)xP_>R-xWE zkVCWR3We|{aNfYY<&9;p;3u55WSXYEmbl|&or}r)PH%$IhwV(S!On88-i>xUMpx4f zJKHHhR^nuEpYxy)#o$t#_$uPzXI+qLNNwp35I)Z@ozp+-P5iMa{tn{j{|mn9za_u_ zr8n`b!r(u;6aThK>nmj*uUm%A7;rPuid0gmKVT7tf=Qb33M)q=?kaV%<rWt83f;P&*s(QBVibvZ&_M;-JV8^A$lFb#Oj`FVr3?W64o8a zIa5-S75P>WqH7hDd>JNGlbAp&Myz8P43J0*>LEr4HKnyp1tzc|53@TL6uu-nKBVGz zN9sR#4M#@EQ%YaQj|-5hl#n77P1yUj1J-Xjm!^XJbU>(>yb@bmT}lBC2)Wm>f}q7S zVJ4=AYzchY*~MoI z<1^2&@CYh}u-VSz;p&Y8X|x%~9r9^+7Sz$%+Yu{3w?#%LR_Ne^W92#CM9F@kgM-4+ zXk}uyq{DRN3u?mGHiR=Wz!E95UYN3J{(1anUim|fhmjy|p zP$N@QIWXGZeLG}M*00(Edr~_@$fD!*tJ-C4p$)=)3XW-UluYGdpMWt#4E=sgk5FEJ z=+$cB>;ZMAHf)(QRqP*oOLNHU+V1iuWveE1cQv>EY=4!%{0KhX6;Gf6O=Q=@1HCyx zqB)VEyfmcRyis#40Yb$qxq`%%TzsafxdRk+G<~AMJ@pys7^A{CwS!`{yA*1_LL1X1 z;-u-6w{XP)53RDPGJLU*8sy$QCe+GXa~S{3Ob_4e@C6ZS6?Y+YbrljEKW{O#ojDAl zQ>ISva^p}h?}FqV{fCQM17K%wh-BaIw2jG|Uy5Fvsv91D=Dq7*r@e*&9I^bR9U}E- zZt5TC>+gV&ADe^zbL#uQh?V{GkPI^*du8HiLThZ|WaMaJXkz?}i1`1r{kKBx-zQPe z8!CmzK8}K`<|k1lfq;;bs@OCFMp0`wSlg^pd>xP2FG=tOc7z_mZ^S>Z$QiQNXn*{+ zCBa;0cfdR8)GmA-pxhPLM8cgAa$M!#K^o;zNH>3 zPs;>@MGZUY7^)Z)C;l=E*hUCYL~!_L?zB*cmUCk<$r+A2#R3*$pfEazQGx^m+7bq% z%0HKR)+HXu_l06Jd>jF+=37E+BZn>{pc3(~GdHsMP|a=@){U%e3fC`ut!B36!Ogwr z0^xa%z8Ow1APspu?xQ#xY$XKG(sl=eKTHdWXufzaa8aSukvfW`%^g>M=u!a zhC5Fu6JRuzSLjKDEK=G>;%R#9(C$eWvrMeq==R~ctnSn74V6i)bgNuWW_HZc$nmnn z`>C33M=4bFfH7_@Mi~uqYt=0f)_u4UgD6o~6DlRgUZdDJZcf0M3LZ-p#YXSA?hKZn ziB2k8jJzD);?3)==H$f+cRxfHEzVu3%JCc}YGGV^VGJXap=1Fn`2%Js0qisrFSzs- zB^kstU!r1U)AkdSw_=U~Q#z%M+KvI#veS>&rb6#rL8?Qe_RxuWOC;~jqsuxDgmETS zVp`$niSznmPD0`=gOQFX8mLsuWH2R7zBI_A``jjvUTYTNaYfI=JGKv~>2wBcjLB6& z^ZtM~XB5r3Qd#b2ddu~TnsHmNgto|KD_J*uEUqXV@BV$UHb}rI8bRG$4OPh1qMab@ zu~zInUvoA0nkVQt>Qrw&>&v!WKn+OUEXV1Pk9qXa5O${@Qp{SWZ`gDwq38Qk*d*i zK^L~_@#Gvcs;d!mO@$fv2`Kgf`{pN1POO^9er)Bt{pD#y>5pLYKT+D>0V;o?&-u@{ z`Y-dW|NW7q;Gaj+T7MWPxGdAM=`3;pp0Ko#KQ_5@G=^pM3UmnUK)VB`SvhWCmT|9E z9WnyhvZjbxEjnMHmfywGGOZG1JEZMM`eH}BhS)J>8^5rH2a_tc0QPacLDek=i~Lx} zJ6a$bicwmxkei}t5(nfWXoSMgtdN=t?T#z2FUEKdf^q_4G$^Tci7nAvuV);YwT<_4 zEpW}x(N*{*rP<{Q4g&}oYbjg5==+^cxt(u9LBlmEy&7Drn=QsI-59LQ5HpM(T8SJ> z3m6_cLJrufITCjr-y*v<=j9#mkY7KPeNcG^weecgsrO!B3o~sHo57&&SeL*vb}2s0 zoGVKYi|o@^WTF6-{m8MNR5)_P3tnt%?s8i?{oBjOPYD6LkPRb=^cF^ZTpt)diVsnQ z5KWEu>~oH*!c3e)NNqWhC#^dOd>;6MR2e4KRI*7ZBE>a5r4h%=dHEEJOsd6g zLgk8B!_u_zl{ZbE2ok7h!7{2s%#qI&a0Y0d2Snb@Z)*~Y%1Rtf6X3$cU$WZU#%W1A z*Ej(4tOMa*`MXhXc-ZZ!7Cpj7W*z#hS&hBJ*gUSm)V)kv&}J_ z`<5NA@J{`?`SCqwN7zISoTus>x^oWZmsS-D@-w4&wOgZb7b=y);!VXmp`uB z*hkg!bc*RVyoUF3X**ZU@T`@w*_|osgr2JEnpI+~$W|-*8C+GWZdD$1>m znnvjkX(W^`L0Upm29O#`K_rENkq&8T5dozU>F!P`=?)12m6TE%1>qmOemdj*t{;y6 z|GK{}UFurS?027Y_WPW3o@YNw7TY)!#N!*l90kYjl--d8W!-|5gIB{!WN!M3hfDjI zCx;r6ReNQP5E)7Msf@sP<_YK8`u|KpzFr0KvfsLEea9HYZew=W(DvuK;NLelT^2+V zL{p2bLE5I*jowO51%f}Gn@~7CkYAG^K@s!;D?A=^U z!o!p`UyYN3_^YLV6~sqzz4LxVHcu7JIL2blL%SFv{^SfMiAO?zq@rS znkSNiA2l#@^aB3uQstT2F)w?PJLz7$XIs3tVz1G>jjnDT<%JZ)2m2E=?F8F!NbE`AhHAa`e@6PGb+UX z@HQiQ!A(kWQ6cklvwiItHcocM$~cg_)!1fkeJ0KT73YzvXh)pIVcQB{X|?Rm8F^8) z&G>oR5+|49t^I-2&mv|D9nF+nAg!|6Edvwomt2@C7eWC5LJ%Rl8>@VVd zg#)u2dg9yVEVMaW?~3#BUJzXrJ>s&Yl9TL?a|hv#?XEqeA=yN`D2tP%DSxXORkN9< z01ceRQJ0?+&lv?Qp{81L@X&Fj)_;_0eNzj8smw7!ur4(D-PcejHsZ_@w`tc`WuA^+ZTqZ!W8xY;M$ky19W*NZ?#z z{{|ruKK=gY>r;L!j{o)Jk+gY)S1g@~fk?^OD3XuonTGUJTKLNei_}>+wkYrUQzJYM zdZP8A9^YuuG{UMF|9Xi(1Mkzt#W=SV(HRVHRSdt-M3lw-5NrIAE5Hyx)p~&i?{^=a ziiOiNGB7p=9L^GC5m8oxxw52DbRyiMxIq1Kk?mNS7`a!|>1j>b5YcfTUb;Xvh$40$ zJ&aJ~2$6oa*FO@q=$7CIPX+QwFR8`oTd(>(`Gq2{Nj6=^!)A(L@F1&>wa?@=@x12H zT<_iVRwkUG)gqFgVP-OBh%bxfG30b4kK(a}xnc|;E6^lq;OGeD0p=q4K>KYz?G2LP zNS^g`B2GKonL)rg&b+zt$(NkFPaARrI{+ORHg;}KmB$PE^LAxCVvJbdhfiQsw1gRY}e0k66n z?nO~u*1Hoo#%H`f8(OdJIDH(sF(JNRBmG{(;CMneo&r-6TLiR=XumCEl;Df4q8T>Y zM(*+m{pxxJa!BWW1@k5`DYxSyYz;Lo6#wW?oVleb8Q9W3by?TTbMsc&m9^-U5T5X| z%m9|XFFZ7neD|WgKfsNbmpMK?4dbLR_;d zP<(cC7MaD7+tZ>k@I{QX{ACNI^9;clI3y#WoQibBafVWEL%Iu=AMGMWYpwDFfilE66qS{UE+Y@DZKc)^-#-2x7WWP#Zsv6JSx95wVU z+Ez=v5WbgHnXrv6{8=r9Lt@wdR`h+^r3kq+9r-YjT&XHPP_bufH>D27uhRWC-zqTn* z*!HXx$;b+7JP<7=>jg6Dk-x?!UdGxm43YA@&w70`q>c9cQ^7HpL$iK2Y7{kbM?@o( zP_W_TjPH}H+?>14uvqAxhd9q z{Sp=_R*NU$ixo|`N^Uc?gp)>P5<_x0i0?ScnUvHu=_l*4DnfENG-TMRRf;+j-RUE% zyGvy?u!eFtCD5x)Zh>Q`S0i*u4eChsmb)(jj@?o8iQ_mX3|^**u|B?+QN4)qz8-7w zPN83&4A6ftHg5RLO-((+6&3w=y2)upA*{r}XkiVYlW-)^*de!6-yc7JjdM`K`w%16E!pm zv*$b*)sYP^qPavEiW3K}uh92p#qOdv*Q?Vb=DF5*vE99R*=BYL@qEO+rpiWI)nu+D zmSU3o3Z5ZAv{34&W-3DIYW!DLaA*0oQ)uk#6X_2 zV2^M($W(d7a<3+K1K)63=qNteDb}C7_lM?7m8?&q| zdf!dWq?N}Tyy3yaT??@QL+Rjdbs|!X^Tc=VF?&A*Vu*li&|UZZd=?e~qOw61p2nX{ z!YWWRvvSNDChiE|bSv6whiqWRa#~GYt15wd(v^oxQZuWL2bdeJ%zAngG`pQgMGfGc zm%VF!3l~&K&ALak$4N#MrmAmC5v8fjjru=t(aVfCSrtt^W~_U*jD^)W)csil6D(~b zd*OPCzFpQdLGktKKzlp*k<3QV>}H3#0>XKD8RHiku^+VbPOqK$ppGHJMW01p z@XXNC&8D49{*IG*ePq&R?|hEU{LUwq4f-w}n_6DQ$mh``$krQO>&sJXyYnQb)sVZI z*U~9XM>sVv`FSLZQ$+%_cc@1=6A;I1i5~ER!@34`w_T8Ci@6jRoobj0hI-FkEed{; zP34Yj1=@5IT=v_$TT`r93n+0e9kF2?G_Ecz7;>VXNjGTrOq?;1#I@u~ZWHbybFk*R zt(M54=F)3o`(z)psm0=@Ql`IZUh=r^&Mq^3lHQfK z8kO|YY1!UlJ_jdeG6m>?E+j@z%q7+u^Ay;$^O;!2m z13NJpHx8nSbQle=;y~PV?6J|By(bnK@c_?+0IV0j)aUyBHnGG8MWcDTg?(B+Nq3^k zmqmLs)LtM77#0TLhv{&Q_Dd3loju#_X^$GW-tSAnHGJ97%L+8`3}Ci%OZ$lt=LC>{ zYC3vDq?rU0gq3QvsUsYaTy|-5&@1uk{N4)ZJaJ>&!_DGamcBrT%WgQgkwi)euOBhY zbK2?M@L>0dTAZh$arvBAdx4W0Eqjd{wB0y!ACGl(QoiQBr7P4SM zG_B;hKsgB}FLy?-$_h(eb%Ih8KuYRLCVtUWZ za?V_@O(03Iq64MlYG_?{P4p$KI}axTH!gTo$qX8gV{?M8G1KlZUb-WoUNk+`PnR~8 zed#GK<^2{cYWXpBW!$1{yg-`s>JQ`MdL#!z>P5t?cdHU~^R$uZFimya?s)4zNlb$H=Z#cu<$QKiR#X6?v*+m}SK z94^bsldGAhKUEU=LJqi=*uOzWexYH~x11PAv|)eO#u{>(dI|~oS}c2@l{wWsNeq_lJlcJ0s&E5548b5FPf!*h4!Ed5GgThn}C{{gMa@Se_6d97O{=gW4 zEl9a+{SI1(-)BO+B<(>OtbPap!qc0M80 zlX?q9hCzfcNvWM+A8-ANOwl?K{mK_3a%VJeuC#@aXXrN06c7RN4Puq6M6h@+bhV`I zix2r_kQYvQb3UMH`Dz41>y6SPJ_=Am5nm$-F~o-)-#Lv6r@TmFmujhm_BiqQV*R7H zitdk(yRGHi_4O7SKJ;C>SWiOwQ3)&&v~`%hAAj8LLAt2iH37a&rFh~(ZjpLM4Apo0 zq@k&nl*g#xTa{d0>IYhKJ_B6CMjrY^J&G=NtyW`b366p5;b$% z2IdjCB~g#Q0Y)2v^9h1dFE4Nhv}@s%Ct{(mEvj;DSw*R>dK!yBtORSfiuW%aYsaM9 zHxx79Q7YC+u>Yivkwww zhPF}mucYjo>N?Br3bPeXpy_Ka6-spxP?cxmy7*sGC~c;;H_o^^(VSN{+&f)ra|uhUbAE=>J2j|{$EO252j{tcRN z;55P(B@4%yN1EB{#0H*f7?06=|(A&K#z&q0`(7AR4&zFD_`zA^Sq?n$-!pp|bk4rqrM34Ir z&mg5k)vg2q86P>0%pIHURl!5E7z@M%V_X^|D_T1}zr@?!PWqDkb=p3unQJmz_X??)M3+q8Q zB_NJF?C!@0HxAh#UL1|YLuYR!$&<)k9yFjG6^xE=?(w><#aXi>6+B^{8I{9ssp0mZ z|30Fe7oD=2Nb*H12I51C!i;9S;qFHKT2Ad=H7nUZrrSVaj>!mhMocS9e*hmn=_~fY zRQ6y=Zfxm4Ij57kWwbP;LsWFhl|F49`zni3U=1x*s(!3c#H>Dbsx zOI`Cqau{{IsX8lE5KZ~gg=U$g$GQb;X<9s|&fj{(@nfHX_0E?})FN)6_j8DX82t2T zR2{CPQRv&+zo%FIuNC%hkdt3XNBt(35bu%y^fLHgkJtvWBu@C+m+ifpbk&V0kd)-x zd;&rNtiWgbw0zo3f>sYGC-<3E(iLXIqh6Df5!`yUNlgp!At#Y`UgR09Ms}@8rqS3u||eYhKrt8fdTCT z07`?7C25~Q7JO+0MyxO-D-@PQhR_OyNV;?VbA0d4M-FpJn}f#X(p13?wJm~H(HOZz zl^bPzuZ;v%1xMc@MLuY#DQ|o%bt~S&=bcPV$YL~?!0X^Gt;MLJD5arTNra@ALz)oh zE~^g$TBM{yT@~06=PrI(!9Es6*EsY#;cN zKS?LaP^Ji;aAtJDQq%3K?B-^?N$YBf{$QSxuefP(r0N4Wxbkhaa@<;qeHT~t&=m5^ zHJ0c!Ob(5tY-}BgfE)CFwjK;Ve!WHzAFpdRtjq*J&RrF8zzem~LU~uGHBT(ayd3RVTTOE(yl^SUQ>IErtREmR*oY#q_J$Q>Xfb!+bX0YH`2Y#Du`oD5 z+r*CR@IoSA?IrtCUk#Vb9f9LXE30{yr8}g{X0NP8lue$y?T8>(3^fE*KAu{M#aOcg z1g} zcTz^aY%r>PL_NGAGC=s#4F-IPr0}eaf5YNGspCCmECIWR`k}SjX;h#LQsFxMwOTDM zeYwyJJNp7A14ckL!HI?6dN*0CLt(;ml?UoNMJ9b(cF5U5o;T%=0#<67V&r)+&Gvc{1 z@HR+hIzN*p4?>>2%av#@GX@1FH1)My<76aSH4-oTJ>^Rm)`rfAeUc3$!1C}Px2jc+ zA!K>tZDU3$tZ{1wiMM-&qF?5KJDBbkQUF>+3q#%FBw}d+p=HD>&At@&$N6As{5BBe z@-<+6g?fE&Lc7fKujSrwWx>PbyKz# zEzQmSk>Ct}<-|)Z4Avc;Z|1fkwX5?h=Su5%xXt*zEgg?EdI;Z@p)%KcZ(#bK}5Qh!> z4PEoR@B@52L$-}*xobUc$aybXP^A`@hN;TJR6Jdum4Q?~;CBY!Ia@TV9;gu}S?Q11wbVC7|7fLLiDD-23UTbmjwznAuPt?T^e($wq+pockTZ-=5(Dk>u4n zCiNYLw(h-Eb|!v&GkE2#DVTy-0MZ|l)cuw8e8pyQB|B%zW^yHmIH`Eh%zSGE=v_b4 z>NZd6ph<#7nxC&EQQXV9X=5XLI(r$x1C)0j@}^m0sEQxliY?qEDIYQEcD0Vtg9Rp( zL^0mXI-s+J#|)>ZTtZW2GU*FQ(vF@02w69~qey2n1YIL4E4jp18s6#K9aif1l1ct- z_Tp3}hCrev`jyMQt~Mfzj0y(blYZ}`m)AxDDIEH!jy426&s_|VxSvynNqURHwqMW( zcL&@ZHuPGO0Jg_uP@YdKwhlG``*&KW_OimwMS(f&11C3s1ymJl{GD6?=F`M-!2L&88;!G$H`#_ zqpdDLGQ5^gGQ3bhJ;z8V8D7pqol{W|Wf1#m)B#`jG&okv|4ThUL?S{aLOA(BXy&i? zv2OvSWCYFJLvy$^u|S9}WPYzQwourF2~soy6DPEgPWvao>|qx7li`T9D8F+PItiN0N;0mUnwsx&2eprZ zcNxK+m5eCEL(Fdjg0@bBRhSl)Q`7R3wP#6MQj!n>|usoA;>4>f-P5_D;` zFwAV8GyYX-e(qCniVYO(W=_=nH#mU{3v^{D>?@nu;#bM|ah|}pfM8$Q!B)S)2>gJc z>)>EFlP;iB(*he&eZMD!cm2R_CQHHaF!LucL6`Qx&YASPaFX+FGx;ax%#r=?GXn=8 z=*kAzE3q|)Q`7P-qWYdO10N-@K?8{kJe2$v80a)@*b4*41i?ejFT+7agX9JwNJDFPRF z_p5Ok1N*c0*zefuVZC#%HBpoS1w#e;@e$c&Q;KpL$ zV&r6D=3?Mt=49(^U}9-zV$I;{0Sg2S_6-;a=;wo|slo$6mhLTB^#DG9d{_MW=ukjV z|DQ*v20Xffft-+tf{G>sy}`eDqF+7FyZr?#6GJo;3qxbW3prW!i#O__ivA$6n4lDh zIKYlXh=KPJSfL=%L_|W0QGv19c)^YaKd}66qwZM^?w0Mpy;*BKfyetf&xui5rmYotkTzW}-D{!#B_5n4B zR}Ttiyn{yI9Ffen9A^mCpsxfXRx^`n=0LcD5Mr_!29gLQu5r(dKRfq?2Lv>RAX_SL z{`{KJ0PB(B;X2T%eXv|o&|n0)RCpt$?U73jmx)yXnYpZW=!d~kHrNvk zZ#xBykEc|%hY@$THkYH>w9y#DU?~J0$K}uFe#Bk(p%EyL8`&#cw-{9~pHv?Ehq1-T zEu?C?yZs6Zp*F#TT#VD0>A6MbumsxL=T{t>@>b`>&-whG3|(H0fRCTh^m=*P*Vgij z8DK_S2M3Ad%-|4QP6r)&t_DyMrWBj9O%jewYGmGsDdS#Xitf4Ha-73`Up!Q2bQgQX zA2P&LaOn(NjwVgH{^+UQxI^vOOOsXkxh$zNp!%B&Q3xreSAU_2CXw10@(cRTE8;q% zD^$o1oJ!Pt123A@uSzoZ7Tu`tf?4-2FZ9!*!YqlC^yNY1B*{2fs5N1_{5#DADZaY8 zAv%&fLa~~dJ3-T|^=1Ui&+H?oGo#4Gikr?;wIk@4czaTcW|L|tX8KL`?q1h*TFXC+ zKi{w&m#Jyl2{59N zPNoHs#V~JlOY^Yw_FCIl-?HJeJPn>UW`zfvWWF5!DRQeiIa(>}NFl0VpegSvVTO}M zzDpThbxO>gWkRgGWs=gQNoC?X%bPO$yLOESLmOv3)ZEK!>I;QFgCCGu^FApr0|5e( zh5Fx+`aczx&A)?<{{jsFM*h$m`+p2Hc4ihvE>>=4bc{@N_6}xFfM4wGjBI`bXe!nD z?A91jH(g=+w01|NxKZ_CK%v_fz~k9PlrULoIzPctDw9#=TYV-vnyHmILSt?aiDhjK z@X6;_u9F*1W?>C58a?;!CU{WVBueOS3PP&)0Xdy|r?a1P`5|6bR4Id$dOQits-1M1 z8rbA$&)>;vRZQ5S^GFd|c4e*l`r&{)L*w!s;Z!xdSBgIYAC)6(R4&*41Y3`A!l zjVab`)LTyw_4Fh*0p!L^^@aM}LSRf_f8&IwSHbhcw4a5*=m`vg9b#Ly9+4t{;_^Nn zm0$k1+zz_)@eB=qIfhzrWj0&{hRFEY=FnL6GUg$(avAOFm@WK|x0?-aS*>5#80Qo8 zgHv}<^zzQ9zCUjse}Hi!apcNNlkR|$y9Lu@GB0B zbRi4*y@upRj%qV6u;iUOGYIE*H|h=fyTtCNUn^XL3(08FG{2?`nJRYdM+LTlk|)&8 znb%TV3M;pE7Q~xvXJFILaa!5e12l{zc3iv0eidAZD)=%h z^(pgjtTZLU_~j*Ibw#A^@BwE_X#0~o-y7@@{J;(`JuFfS06WhAKVawgRoq_zJBEK;e`9WCXG&*o zWn<<{$H+|QY-#WQqviQc)cKG0X5+LjF$(r*LzKg64wFz&SUAZdzJ9R3HqZ|SR89DT zumc3cA2Hw(W(CJFv%q$aEX#0@SZV5G_w|F1Jo|_X1@C9(-V7iVgl3V1vSp*Z9YQFn ziaK4XST|9pN@K%y=OA_maFQ^xpBg4Mqbf~^Ir;hdS)?J(L4+Z~#xPR?k+32O*1dT@-88`%*yejr zdzEnEw?QrUNFD_vY zx2of)OJkx^mmx4e*ikP^Zb`}Q}9gVX$qnbCW>gfu<@ibi!kRzHKQGE^4^xqs)8cWWEusV(8xfz zKGj(c*<=#?j^t@rx0~yQu&>#YPos6FA|3~|>AT66o zXxxpSmHda;rvf7fpfw@Q;+ipb+>I*OYjo`5WhxSdtr{|g%@PW(=G8^%NA0d^^-mb9 z+Q*03QEXg!b1|ZS>uhiLuWnX_Y8&D6f|#A>DnYvT9F5h>w~uK@zJIg#qOgx=PCe8@dGl*_=ayLPv|IcHpA&wQDfmx z_QeZ3QC)w+7zztAPmqF1iol!PYQHqdiZG#cIVD!3OA=E&HA*$Tp#GXIs*id;l^VRr zjSi)zHncSKtsgkd?ztUf3sb0!Z`O>%a*Lp7qNB=oM1%&0#&t@PWtuQ3VfCS_b^M*_ zhwj#{j!c8jO2GuWT^Z!C9Lr289)EB-VLc_;5%eTn(=*sELtuxkitJ2*G`aNY{I+-? z$Z_FDntc-xCtJ6PE{iuS1Qgxl=UFEf?>;_{ygSs1d>-pQ*vdSyzm2uObk6V_J+#y=h3-edJzUMx94ex}A3@?@6EJ#K=Q2jm2UdlaM|ErAv~cST<^ zg@TZLD$LxzCfONF{CY1`{=je0JgQ?(z5p`-F1Xh!y;!%ZLR>rL=*7c22P=`c-DB>T zhwQ6QKjGnK3#JzYfCu_7;bHNoz~kR8oWBA%jQ==r{5SCYE%>NZ`&;L-r6Ss?e^}=T zyiU|4l~D9PC^mM+H0|Dn>Hf_t>X0gQZ{P(?J5Uf}q=w`c6pv%Qshl?AwOB&t$LT{K z{*T_ZNoFL#(UJJ37@zrk_6I=BSuw@yJ1-NZu-|chx-@mSf&JzttH!@7Un^}%Ce(&m z88z0c&AT=z+h#Z*?g?p*Ws}6gwGD;dKg$9;MBMioZ}kHf!f`dBI}-s?vQob}AxoZX zvcHl`Cb;fi4|fFXd`}vfO|NH^g}V~%2JzQ4P~H_W5%Apa@3}B?u}$!@Pfs&ZdQ+0# z8qifgrVifms#$+RnW>Gw)^Ou1cF|)V4-p|gH8F%{C?F1ewL=)g= zu@2m)+;eYV9GMaj;Nuanj@IguPuD0m7}GDw8ApdjRIg=Gf227aTnjXG% zN_lTsY3CXtU^Xvzc3c`x?MCk(UX?v5=_hZEoohXiy`$w%5*V-EuO1w(c2M?4F6yPOehYC9%-3#!JZW!(Y;oa+~8pL+#FmV^{keu zD;AZ>{(hY><}@RahqfPHI1*E^BA#W(XDAuis`wT3<1e=zJDuOV@2WlB)YKxcKXazG)Gi>23DF@swc(HgG z1l^c*)o{c_;s*pH-TW}gIIGyBLQ!%NLKF1<5qN#-Sn3=mAE;X*3QYF^XgNc{G#sg9 zPfJd_W&Ytp>KqanS>antfTJD z=B#0H#?navmU~^XSm;f)pZUiHr!seR9F=ri_dOq4d1(|Pwg&HZG#o#pW9(Z!6t>V# z&o~6na0OVt1jdZ-P<(%`$xhi{_GaI}Z;Bk6y1cv$LtcN_YpKEr3t~Qt(zSmbeHO8w z|3ux_7{%-H?Phkfe;BQxuDRg-8v}gY6FxsZp(4g13Q{B_%o$b8-c?ES<4B2;TyjzYif!d=x7F|)W@jCyiPg^Vy9THz&lsOzU67V*muZu z9Ur1Bdh^qf_dlyjHsWHZ*L;&?hbQ@`5k79)cGwI-09m zdrL8ZH%Cp7A_9jZh4K-0a)^b1BedIcR2|vV)y7#+*p+iI?DO`-%hAF4`H6J&V42pY zYWCnIOn6G&uHmKU#t7Q8t(zEQ!Es|5`=y{#o#^Mp3QXByT{>m-bmo&|{d#G(0y)TJ z6gG2|HLd(fIwRgmm#+}(-<0jnVc2ev+-MkrZ$=(u>e$ck%ko1~lg}AOvav#pu z*g4>EUsbsFTkz_|XH;`kzlZO;l=;H&16fz6JQ;_vPDAvCMw)Fov zZ2hBGWTCUOxBKa7{RUiBs>=X$WyFoIs6m}kBpkw&bLL8@5R=j-8Ngy? zq-LyiaIEEaUSaEmP>4CNEF&CWVwGvBYEQ&SdJ3M+IX_D9kLlHMo=BxKjbqGw-E}AP zt__z3xK{=7ssM>cP`Q$rF@zq0G6kKeOwC*M(U>a zQz3_#w7e%AvlGqZ<21tKw?nBK7qdtD=pJTz+4`tAKWr-j&oXRB*Or;aE_Ua}D1dD> z>5>aCHFKjRGn}J*90dIWy(96)HZA*oVT)f_Z_PPxIA_~(U&Q-DfGSZ&{skE%?yWF$1(>N%dwNE>`EK>Y7}mX6z`>=70c)# z;%fQNa=Te$%flk(!n`#*T$Y?3k99Wo!^d0J+5POkwrZ(5Z{Wa1;F*sVOj?t-lOWQe zhg%p*RP=1n=iU}CFYtTH$PC*a(lJ+!@#osWp`xtr=aF{6xd$@F?xR-Vl2$; z0G5@_PxH#n%*oBl%>6eICQGf?Ze9?v^N~hva$uS0NqQlWR>=obmeWQ zwcB!tKXDR?Kre?Psc7pBPNsnIlAAG46iWCTM^<}tw}aCT$CQG=O*m3Za{+9TV&zg2i{l789|3l9B( z7dgmbSafJwCi5XdPEvapknH8t_z19@zVR*#_j3Cc-`fwSZ&vhfdAv0@;un`smcOt+ zrfuwY6SO{3)lIkK9&bp%7Ymj`3 zhdG>oFwp@2v>E4q+2asUDnx!gN`--`WzQhtsjpPLN`b!fg_&cWr+$3q6WOAi6Bb32 zn}&kAELQWn=>RBxp-sXR(L)86hd|RsA06^;+wW_rGi3qk$l42vQ|=MOP7Pvc zW~SxLU*ONwCC+LUh+6yglURA(s0aCEs$bl?mm9_S4vHxIwwq;kFz$agEb%gQ&(Q#i z6hi*0VX^#EDDv;u&|d)}rhgnn{_`c1iO${9%Ea=gHT9cB;Yzi?U9Rq^^7z~{Y{zqV z0uXHrrPYLlB_*L+$+OuZhS^`VC>QZ#JwUR9V3A)tgujbNqEKXP$hpxZNw!OwcVYRl zWKXwlO2;b!M@OGgEZ;}kV>JqLiu7By33P48fBp!>lYJ7swa+_VzC7zDS}sfjJqO;w zP7P{3>JsB{JR=!-g&+&sG?oD;i57EllLl_0LcQ(l1*H=3xthqCh`*56C7Q0y@x#WE9oI@Ekhg~^^!1$>_w)#DzZ>yVptzH5ljKU9z>$j)qx zx~v|-b?|X=lZ;l7k6GOoOc|F^rc`&Ozc6U4l7O*K|~7wlEE2W~-FkI1*e#hL0- zz0rgklF$>JwS2V{*a}0F{4wE5;sM;xZ_HqHlEUXn|An@j{Qjl+$?X~mzB}QX6_Q%_ z-Am3m?y66gvR8XUu7Ydv5-SX_W(SdbVU%Y9GdS84Xw7Tfq>?jq^!6F*;*BVe7qJH_ z9m5(Tb-gau+A$t>t;1PWXn|N}-)SquNZA%>yj8F*NqU=)L<@R(7^wq`u3~!1NT}+8NQFkuI>0SJXq$ zuhx(Fo0F8gwpG&T_>FDkrNQm1N*8)vtgG%1#(BsS~su{*o3W_ZvZ+X zt7?V^FL?D>cy8SuI7=qo`pW&{@A|%c&E~H^=Kwp&gnP3AZ1MYLhhqPyu;q7`)?WcJ zT7Mj3?ChBiXD$;|CH^eC187~}ijKKDS2pz%|b6d|jp{y)a}urF{s`ssn9 zpoeH$><1j<4?d7#A5^9oVGrPeRRIj zM|@niON!zTwOUd|^(Upv&vl z<8d~judtp(yZ!Fg-M!hMgI>3aj9%W7n8ZPTSqE&GHbM?*8_sMC%Po`%LT5rR7j>8y z1gUM}a_HH6_rP^nhjYgB4UZvajB9&Xb2L%&!E2oA-Dks=v8X2QQ0#&-!txB78zRu~ zO>(;mssd@vi7gSAwIp~I3PVaey}a5l8SCM<=7{`m$rT%#Zi%n_l;g}u@`ZC~E0)4d zEomyf$RiruC3RWm?I)pxNh2(BX=&`UYWHJ@+=Vt2@kCk12L@7>Ln1``o^>%_trj}E zwarP6DN`9y$fu zok{W6MMD{zj)^QgMw_V;ctXsjx4eDLT-k4mZubIfkz|?wbgqMHujQyz87yO8bCq{&AB1SEHYn}_`Vy~_J5VCTn-^uPP^|2`@F8@Q5{v?h-&ggbQZ87}3uMu!%O z(a9uQOQiIbNN$xz*N{4+@67EDCJH_0!jd{p{Azj8hnuqIP%*A+7?$c8ierv?SeQjx zOAr>G_LJAcyVrvZ$bkjf^m&)`hSJ^i(LUnZ4IlkR1d&|2#U`r*Xe~_`2HId@vAVp~ zL_@}_qFj}YUZ1tXC8D9AGY{ByJLy?*j2-v_Ols<@X#(8oyah*Dl+3CW+i7y9UK1GBDUI)=t8rnQ6MSNv-PYEl9y{2zdd}Q}0?HDrlL4jKz6OyKDsqlm1wWZe#EkLY+1@4FhNoKMIhiB46K@@hW@NF#I?&-ZP7pn&l# z5lez=oKH^9O9QH4sgb1yiRSwpcriJN!Va@QZF#e;#Lx0U`BAkvIUPk0r_(Sb@tzPK zw#eBH+&cxTCmpfmGto|M@#W;bybWI~Ui&!n?idnO9(Oo|0j$4Etd$RkUp(lSWr{L} zX${==wMN-~1nTd>uAWgBcQyUNlxrV2Osnn*Yet?>xi>WMDg_I_ll$XN&MfNID3D3S zXdsadG+W9oS=g?Zk+}GC1ZlMOjmpW2Av7HphEsZeDXAZH3jRnaaSu&98?UvzH~geJ z6XwG|R6Is=4Pt0_#C#1x_-+*L_)3LIo*K9$UU7U}i+DQHv3$VYS)5v=e%~sc-HB^A zsvMksY^{~q&HG(mBtp^qkA!dbnY{6M@{}}K?DYwti!G_mW`%*K?rP2AY>p6nxHtKe zEyLkbvX^USAF9)_q1QN1EO;P%a!TUsB9~P)CMpUcY%5D8@lL-+tQp(;D89e6gh+b< z{viM@_ZIfafdTx7GJwfnM6bgI@p5eD*)&t-lZH{Oje1Lbb`aYl4Vf zU#Zadu_f&0L@o<4k-e;7q%uUPj5?FZZ$lQV+S-v_BZvx8gujFNhBqiu7QP|sRI(sj zNj8=#8i16Um~Lj-nrL1nS(z2=OVrBlHT2*N?PZ?EiB%j7izhq{CDjf#gquY8IUHEN z5HLiUuZ#!MxdS3j+QOJ4*8}DQ7fqC(>JFdl8V0;eI_D8YN-LEd`rcUV>N_-p2z%1kj4cd~doL9qD!Y#1xS*>MNMnx98VTfLN2LFag+xCJ)GXb#rDc<&4c$2o$iVm#xSQLy=*%` zG)8ehc%7}QTEqJqi*0LDTojWTo_%_f^TvDWhAD|SM3vh-z%SsaRxrMU)S;+B>oSzQ;Qbm`5^cy;=r~#|$~rsG2&IxFp+V`STnMmL*oHY-_%Tqw5ILFI$3!9m)Pp@NmHcW;^cb;1-%U#gu#hf1v;Ob zqvxYzTXfuC0B+Z`4sx@3u9`ewe+dEMR-LI1;%8e(%L=z-Z_q~O;Iy?NBP)RJ0|v^dPZxaq^vZMal7G~p}EMBx=wq#|2HDLd8? zZY@U=6G0i_-a?7xrnGRzV1-%dkyyG{pjx+YNaRAqQV_H~!eCvFdqCq-5`dw}&kf3y$TKlJ_)d5{%(8#c=7wgK3_WQ5-6mC){3_q>ImML^IHVls?ikH22_ox z0}ULqW_66B0^?^U?X?1uj@4Z-E$B=mgwLz&letVHR*-hn<_v=tdy_pB==LrxWY4hg zj0g4J^n|k%RP^mv-M7K0eEPuN#6dY!Wp?4=b^ z+ka~in44|b;?ExO4=&S!I7{(Eb6{v+1|?hF2fd@c^>TU01%u#K+Ue}NSOnd)OgO)m zNMkvPW8M!^xOMXC*vWo6xls8=|7tvS)%~NPa3>K3a|IBi=$FL!bIj}iLCyRX=wb3_ zG#~%G7xmjF{c3+Y*w1JIhn!A32x2LK*%o@a_eCR$s1Uu<78${!b);kq@VsDn+_xy- zVX;<;B-5V)o+S9B8-!Pq*LwqimG1Ck++%!h)EJ<9A?bd`>?SUIUxNwy?8Cav zm>;swh?xx+1QtvXFkj%eH$t2g0Lqa}pA;%+9sdz|2p%E~ISsgx+&ZolY9x`&@c45f zM4?D}&+-M@9$2wo$jGM$A~T^12Q7R>D$o?ph90=<5Qv7^TvKG^q4$=IX`~PJGfPz> zSxlg&9@tH2sOk*yq*Utp4MYz|9zyeNbW)8FH1CzLS~SO8q~%y4qb_4m;OOb*isMEV zW3{_A3lbgIw!hXlTVU*Rd@WFe#uwa-vbL&I*n{@-^L)qObzcKv+ZZ`5Nxh@YspAHx zl1^qWS4*_4+N9=5dY?GhL&D?j@#MpL^D&_<0dpEy=0=6afLRf?-T1QHL-U#P1@*4{ z9QY;N8~0W38BTqfvqkL4+%-z@Qga>EUFZ@gKW0$xQgOZOrrn>rd09Qfa3fwVuhA-m z@=MML5l>I1Zb>5f3C_TWDVvh?_e3r4tvtJQagj)uAFR8g+FhSgyG=>X)a@tkV2;}_ z3aUO_S<)xo-oge_va!JSS$&b+F08NGi~@=&?1>_dPk%uFf*m6!dLX&lM>9PLX4ZVL z8MKUE{RU||-V`$0qEN^&(rn`bKLOV^d)1BQtTulVSQS>Dm0CAjk3*oR9p3&^!D`h0 zclt7WF3>pvoXsK45%N{n(`2wAGjr?=Pe$)$tdvbJ&7NrRwXC!769?}_i($5hkE`q> zl~pve=!a^bnjXhIB0y|Ib0WRKrmF55F}9%)yNRb)Fb%h&^_HJ--!lMW5nLm z=pyAQs|oo9KE|YetHR@{MImDQ@F~sn@rR*3xu}mihzl1*Afa&|-K`9u4IJpD5A&F5 znZ&A-{Gu@{KlXdZ3EG`!|D=vs5EBGF%Cvwb(|3}ojF_a-+Ms0+)>djTd-40*+oP=z zg(&I$hkIZLfc1o+g_dv7W=ch$a79HUh+zi8WMtzwm~x`zVbleuz!2ew&`sYZw#>Qa z(Xj{)eHc{~3iFHQJ=Bbv3z?vRgdMwXn+tdgFAtng8-!_*u97e%X!7(74v|8SGQXgi zUcEO?S}fZFp`g#lSB~}kLL{Bt>HEBM|1d6&`S`v9$l|cLc-Ve(QA&dbMWxS7ee@uF zYCC>)eE|^zhHfRQO@)eH3xe3Sd>Ar@Ty7r=pJ)7A*^L7FLf@&Tor3V^nKa-u?7oCUV4*FN_qvyM;q7KhFdR*))b&5`y)0vTSR#Ig1 zT1PSb24GS&Wykb-hFCt%#@x3sA=_z}Z*zokS!fO*P6w_t8bsc8bAr)hzoni_Q*9&T zgXpvm%i)D{h#29j696TqAuW@Kd25cdG6SlQWEzrVN05Z3oOM6HBxPy1SB`Ku0zAEA zE|#&XLq}55b$!F_Oh}>!-G>OMZRHVB%rXX(#)5FtvTy`9-ZXZSiLdF8@+Bc|FFLFDMQ}OQ=Bm~Ymtf^i{bY; zgo!Pu=ohwjtqktvtG)26HDkBhv)A^YYGJCUO)Q8ZE40X(KGl!C(PpjKG@f_+D574; z_-eHrb>_C(RJk7F`gr7~*%F9VQ~OAJx3u+C{~cvZ=jG={12Is^R3`vGV87H*{+tox z-&uEm1^WDf9{4|>0uz8frVjR2b}qk(KaFZKb|^xK8;7VQ)u)jOHKCuxg20i1MNy%H z^5j`m!f@pLj$(qtI)F&gR~$g6fRH7Th(E)e;wbS6#GGPfh^0V^tHndFeNC|(O+xht9-yH^VGN0M zhZbg(Y;Zw$0cW2(1{>iTC+yip0W62J2D)DoMMBg2fri0YP zX{!Yc@>Qe;L_!lnRH&HxFd*#7+2Ga-hO|3kb|22m)ML}UdR`4T2O_OR^Z#6pTEhNmfw&F zH|b$!vEQo%<%8z=Uj6cT^7hv3ws-6P>&WY6bKL7^`{(Kvir2N*8;<&zm$j4n?jajC zqFF6oko1*Vt$L)AaSm>4HJd>5;J12tM(Dvad(k>Qb;57uS#I&?UKQ7seSwp=xvqRh z#yHKTZK@+Pmt;yL#g#KcDlkO>Vhf^>Cs)O@Cw)sbp9&L6`0DJ=OF0}i?!mxi6Cp`O zO&zB$36oj{t+D~h8m}#bCMO*krEAR%^Wxa2Z+lQFW^|soap00+sY_S3j1qpHs_k+u zy&<^}iX`An9{LX>5K6=}XfiPHMT`3?2G;1RDq};?A5=?b-KGzK$P?>fRUA{It0Lra zbcjDB^YKjR#p_yJvN&-8E5XDIfXmsh2X?3y81MEscD)+egdf zAxFEE8rSTTLplKl!o432~svp+EigM49hY)dh`{;LC;GTl`UNiEzf@Xv$R|Ok_ ziq!L{%hZ{J?FQ_RLfVF$l+!YyUy$nH(OoAp1M@v}TL%N|WoTB*7g}_)7iwjTNX$+m zxmk(a&d62kaK~=AQTdE+l2?SxwTY}%SvcAb%QHq*r6n+(rZZSlq7iwW5R2?*JvrXj zt0d}&LhAF@1pChkRDQ0Ev#?O2FNer+1rz3HRAp@(F{R4rK|zx4yyLFXV@H{0z=iaB zN6)ev$VJMa%YF$*pR(FM#AIvk@x^$4g}vo#pl`DL?5b2-M$saM0^aeKkcscpSqQQ?GRO}j{|0ZQ8ylG#Lt>a=aa>f^u)9X zmGr@(gUUt?x7bxySo$Y8iF0Uy!oYD}{Oy6D3t(oiU=sv(qIWsnOekQ#h~=#xwpyHF zSwuwMd51;HP48(9-4rZuoxYb$-0Oo7iWy*5QTDF^&1;D4#pK@1KN3Y*WNyx38XM6a z7M%8g0Y&EH$dMaR_Q1jG{Q;AKB?|G#1kr0IsJ=vP)yR%rTv%~HZcW?{j557Hc1>&E zF3-;ti9NuE!MT{8WZnaY+&o+@Ah*WD&!Vpmm5ACLjuiAt_7D+FM`uq8!3(*?{%rVU z{N(FNV7pVwz_aV}z_ZKp+1*LPpA#F+k+s>#K^1?{Q>o5qA-{sO^y9q?$e-~}w12Odeg&IYsZxU_@w z<8aBoYMQh9L&1aR^USGX9;A(>lAv!f5sRUeg(RCOiGwfR_EmybA6K9+hO-;G+;4$0N z3VW3}vr(%>IPYo~>!bs5PkPc-$J``f>-%ys*OGi&4QraEvP7plo&{wO9#j=`x3VHU zInZfx@FW*|)!DZzu5YP9mZ-~+X3MBwWdpxAzw%aga!0qO1v1{JqupD4Cio%I*ogrm zC;-4w`(@+uf8&nyo9pebK%GA@v*sUu^ncoC`Yn2JquO{hAd+w6jwY|7IDy&h{ihu1 z$WM%taOvQ}B;%ybl}g5tYhjf6(i7qE0=)#0;@Dw#90h&@jn^gf&3q7 z<#C4((3W2WZmTZvx`hF`5m4~&`0<=I6(^lA6)yBH97%=u3Djic3IafvLo%e10+dMw zh$5|7k*S#B>&R*1MiECc2Mv#UgF#9`u=_u3Q|*CmYzdV_`3a_BNKK6Lr5EX=aWeLR z>_Px+B%v|o&>z_m7F44I5Je7XC6R#ah=iQ#oE)E6PWc*az$Rw#FirY^Yax{yjO?qn zx#9|P5pr2S8D&FvtLW}3AwRsU`0nWiah&3iT;R04L1y-J_Oj48GOm9|CR_gKW<1@? zmz@(Ex0f~uxyDEaNn&CiP8ByW=k&q0B21M<)g}#3%KJ>Q9+6!>u6L|iEz5yL2~Zrs z5sOVpcUU7yqnbW+?@;~1KV~o-9NSh!wC_9~I6Kz2-iEJDQan8ccW(`Hys_s<_FvNR z?)Khc2a)qAuJ1~NSE$U?+4_Vys3hq$EoZ1nZz^nZim{VpEpGs|!<_*(gjBopy}&nYEO48;mvYOx$0hv`37XYH^&e z;Vs5AYMtmDzP>a)F{ge0sa}h^NBw&b^kF>Cvjp@)Tr zc@BMUTk0?P__l#vj)8imp#tLr*%^*zqFZJz6Yk#?$C%%y7MR9 zsJ#KOHl)ys3UY5{=SFft_v`GL&O?J=U;a0PA9zuDEkDWu;HB@Ec=>Y@X?|B>{T1Ny z2MRF1aNhoPQ*R$sD;p(iH3V#ENQsvL`0rc6NaPAMC;jt+bBB zqzF3zm+Y&vX*AvgN;LYJi?xgOGZ)KKJmT;_I+}0!>|{T3u?k86xmXds#{q>PWabl? zk|BFpQ;s$AA9VL}FoYgV9y*^SlHa^2y-@kZ@B2P@KU6-cz36Rr-z+HEIR9LbG)aW( zf(QxDZnSXDETPczozNeSG_DWoxHVbQQvKYgjo7}zVw=w)Z}F_vaHdNIT!|2_3m#@-A@ z^;ZP)-PSqtQ;1{-OgjwKI@Bj(HZ&x6R<}hV@-$%_%b}AeBy|~SRoO#H&!D1-A?Hj~ zNVj4W9NnzgZ$l%xp%j#7J?Oo=?%zBh16=E}{F{!>;H$qvhG-Q)WZiI;*puYJxI^|< z*00mRa5M)5+tiC$pX;qu*0_=ceNAhfa9aCRo?mBhw_d5yKlqV$*$oN-FKE%ovK8-b zpHM#bdNOVEUTfTOvhMlxZI=(h*!|~B@1d>=@4n3rdnPyYO?$f;z<|rwp?$7{B4ncr z9pcM~`=5PDsxi%54*)oLe|Zu5a|D&&T{M3Mco_VFX7%6J3;sz^`7Mn}rP|t$aXA1t zpaj<9P%vP8XFvJ8~;D_IghN>YDbd6g+I~2dN?IM5O zMkf{pyw$ac5I|=^Ud%q)lk+@@83lWOJTt&eT5v$0#AVjU!RhmIvd?Vd`mQEEVws^T zJG#o+cwMIsL^rzX!=96is}kg+Q(9`gZV{Pt*BL7Lf@6D-hsx2IZBn)*lMz+ufW(~w z!JF@shZS~YgJg#56<)25IfpL;J2IDz_vm~+^k?A$NL^bP-Qn#e_m3B)EiueF>*jh- z6(@jnisDy*oMYJpUy_L1GtD*0wh+>qjP&Pp-A+zwyt3hi}2 z*JsFb>mGHs#7$SRdy5YAP8qC1lNfGkzj9&W8~h~JaXS_1u$Ag$WG6u;>s0i`dke?9 z2leOVS1pPNzaQO)?YHE}U;soeehHDce~$nBJBsJ8z>gmRU;pl&z<)C+_@CFbSOC*< zW=>{wre@A2PFBWdroUmSpc0TU12CYw9;wvN8mmOcbH~8d3X-UkKtM=IRc)I98`X82 zZ0*)5{!T|M7sR-NJHnpe*Wwf0@-`f`I=SDsC9kh1Cz`KqJ4CJm4g1U@8Gy+#alw{Z zW)KGqi6vySV<@)y%$*Ca@-Ax7=jnZnyfh;_DBgi)! zh?l02yOaPgHNR4&~MyQFYkkj z5Ge;r=+bxa2ofiLPc5`7tHbKt~hk4S*#1CKS8g0&44^+ku zb%pxHo56pPY{pkhoym8Bt&f{@rCzRmGS+s^=5$p(Ecrk_EqN26RDFU^u*$vdD8)7* z{B-V=@=5T)j(whD7ypXq(u-^({1dhH9c{-!wYLH53$B4f{mIHUMbN;T+@DZlYA(v1 z13-!Wm#(zap8}=-Nk#q@;PeNIz5n?r{%Jk?U*C%WiJkxZe<7@#wz=S7sMybla+Llp zEjYnCzJ92`R?Y?k;tM#kLQjH2;DA7NY$wvN)hfC591NXu!uKaY=w7}1$W4v=s9695 zaMAMCd8eFbX7V`UQJkik_KzSLm#QCG!EXRTGGeS6Q^L{e;;p<8U$P)bz3d1%kWen@ zvHKG9w$KKacmOId>7hz&kX2_Wrsp6S=uegR=N>k^X7TZjJ}L_+Idim5&U0W%dA#LI zuCS@5j2&$j{+V9AtYKI>7U-xy?>HWNQ@uzw=SX$n4hz*gRD+AV;(IYW{?A(ge`trM z_uJOa+N1>P6ZtMBIJpgXmq8o;@DdYJrAckI zG9V{-6p#~qcXE!0_wDQSJH~6*6kE97A0aX^9Qf!Tul?e*)Xq>IH5EQv70pCaELt+0134XSyPZasCFb_#^gujMEbDDj*nm z)oRO0OSXkOf%XW^e0=iS_hA%~)8k70>QK}7{56x~50wcdoW`UINOMb+QUQ&d&TkDXti7S zK58kxe!mkt#r7DP?0^bfE*Kbp`FV?KCN1bJ0qwfCB0{edqGk-VLSm=zM z?5)l0=o~DajGTYls=z-oASyE3C+D1i>_VI7{uTjIQnzl}#^h?V`w>m15i*wZiXKe> zSvapl_%^Br#r}&+f?jO8OdZRvy*d9hhj(M3qH+MyD2mH|*G6@uWe=-+h^ZUnPQaH3 zOCLsVjUD8BN%XOYgbhR*X(~>K-TXpiEXyd1$5f}?NKI&K!ODQf8fs7d7?rx9{=@yUj%saa0nP>L*9X&kw!{G4Jb+WE?o$GU6pHpVMRI!J`L!p!dk#5odVyyta zu&XE!6Jpzr6B6_8lKyMXzM{rkknpR?4DX3;zvon1EaJGYxaN|gB1-@mP%TTS5QUU9uM!Q(|*P_|`* zj^10;UQv^^OOsQxG=a$n>6G+}eG{8jh^y#U)T+WO>!5I7;7-e{JUeY=bsv;`llx6c zi;lOKh7S(!>y*SSW+%=7EB!VY9vtjvjeEohI3-kJUOxA-a{qiv>;u};VrZ&4Ik**n zPK79nTKg!{4x5=yv{Vd%y#Qxp`)WC+-sEWAcoM#{5qG2$O;{1m*e-Oll`#=oM$P(k zOS&3r#uV1LlF6}!{5|8TsVbFiF;`-LOM^K5-qzVGtxXVraE=z_BB?QH+`5pj*UPF7 z0s>u`TXwlnF7#u zQ=;A8mb}14*SLjN!j-m?wOrbdaM_Q4R6J34(ul!3Z_M51si!GC>Vki{$Qzu}^k%r} zA^fx29puw3%+8pHp$jNNBtLC<{yQS{C(G~eAVL~{-9_x5r|>UM#2*{t{2Ny|?ujcb z6#_>J6<~@A+*686t`QEjFsI0rjJbA3T+zky?19+8SYlhByD^<03ys*;Cgs>UzqvU$ zzR;t1CQOOV>4L7g%H=Mk2(HV3BYe{l50{Iz(f<&innKwp(nKbjEpNTr(~*seVj^|s z)>+R_B1g=W4k*V=2=Yv>g1~$AYC7Fs6zv)rpI_SgmMb7+kw6}^D`=}79AGF5g_xr6 zZ}S=`JhF^1FdKZ#@sg2u?z?YiGDhM-8RwC1VPS)z#Ujy*F0s73SU(lRsOWp6-XAqfm-d3kO&cvL zscth7p0Rh!yjU*c^x^$-)=EqRzxaat3LZodv;s1oi7FS2(vm6;QWXXvQ1LDQ*PdW$&47HTXu zvDQm9?HwIpD7EGp>&RB-*k%N+xUUB??Tr>{yj@nGMNThJnZK%|HeBceixVLwfSY%q zNh>_7dIRde*F{5BvekyL=j!o``imtiL-v@WPRPNW{F z+EP7e=^bC|tF5ObCu^EeHizRA`H1F*1a}0$_l%}C*Yf|t%6^wfvFf`zjVs?sOx|hx~>N^Bo4`$kO*b)CAMM8@y?Mw zuxo~}#Xk)431AF7n+Qp`RxbU*8A%jckv;FsaFT&Iurb9i)J1oDHONytVIn&{n@-83 z8?v6+GqP+k1naNNSWKConoX;mGr@oW2-oZ<#3 zhW`F0MPPIst6g!B5!6>dW5S{s)zn)9ALPObNO zQCOBoZP%Fk<-#q(YT-qRQByD9IH;iP+p3!Fa;7Nzx-KglxZ)fV@nw;=Q{ulfCYkO z7D5Qb7#dmPW}Slb5({7idi!3(wt^A?{8Vn?MhI-UHxi^LBr7TByBc<`dBWV1t4c`s zY|5*hcsV|?JPhQ6cG|*U^n3#PN+;RE>PM|4;&Ov|dfeau{)3uTQB`M`xX5ZtIB6zWCjHI1nE zw0DR%h^#jl=;QB!^lk!*n=vVJg4^CIIC_?FvSQ^Oj@LxPJ z%hh}`RLG@a;+!cpOgKNFeSy_b5O^83X?c+%X47eltTx9z*8p4-;&n>oux*Acrl0j` zc1Wkl$b9@#c4z+3J&NkV^0-R3lXl;I_uf5q^-TZyx9zsuHvyx(YwMklCvgwqkD*0v z?%N)B`hYNGjtS z=20SYh%Jh_CIjsg%{rz>@+&?IHTe4FCyX z5%%C^=CNo~?AOlEOSP6Yan^$LAj9hPy-=S|8m%IX%xSmgEF&(hc0_>ZfAq#ytZyz^ z(~>Gyq%K0#Q*V1UoMgmb6W-=P4hqYm%w0LoIxz2N*Q~|GW|~)$IoBOj_+li?qSVfb zHGWed7ZZ@>U(;F$`*OSVSqz_co+#q5%TI9-!(U8$Z}FsIO)$LCgfs5E6x z`cOGwTZihOFI<(vxrsdn7B7Dpj`>bk~q%*25MaAc>q@#yMgI`B!B3`8`E z@ya7lY?)+f&lF%E;fs$m=6?pyGr=9t2uz;q`X)F4DOMBjP1^htGhm8K8YM!Ver8Mn zJpu-1$kPEb>1fOsmwt*}*UQ3kJVV;#tDah{KHY*U>+(wc>8nqeaF+1d`e*7~0hu){ zXA@qjLR(k+bXyo5z2Rq-&4AHBNA~xK24JtM(BvOTx9IFOwLNG&;&!$O2wd(WxQ&C7h#RI`^YoujTFqF*SirLZZU z1>P)tQCj<@M}zQ$;XDGJr6dL6^$v>}n_|Vv@)%Lhav@6^5}scdJigeRq6|_+A#xxA ziDGzC(y+jINb4&etILKIjS@95A~<7>UN?`(640GNdDR=?679p4g3o^b(3bVx9Y|HP zK{yezCtv&WTjaI$o!ZoKXQ+yF@S~Ma5c`To@S;^+3*8f@haP>Vl(!pR+ggOp0ceW& z>ITZt#;N!p6GRT{Jn(DWV=w&*5?QXJXimd>-#qm>MfB$N13)E8`>7KBclw+^Rf2y9 z8Tt$3=lL)YYDO;|D4g0ym)i1#vNaYM4LgYI4HMWidiSRTU3N!rOO3!i(AKbj$_7Tq7Uy zN!u*LbdAtGS^U;Go;ILLu$@8boIZl@n`bvbb&$!z(M~dZ;B^mqhnn}i7<+J>nif;! z%}1uZ)GN-q(bR7o z?X2Y@%_7ux0SRb zff4yvBe>~QsR{$47&~|c&Ip1yjKVtPUd2r5Ww0rsZyaux!{W12#fRh#%q3`J3p6gJ z$oI?V2Qe1}T%W3ALMNE`3CImET_Da>N9V^&Gi)IyGGfVmhORL+n0O9r^U zOdS^x@JnO4n0aSoH%_8u`DV|l4Ig_UPF=CmR@^QMCB~!1}?>HyR*xX|(2JVzP2S8Q(R5>B0*Pssb9(m2R+Vw5>$*JAbN!^Ve!Jafk!jqIW z7^oqEKeg=qcT(v7*Y)#v(2u7Ki2o;koj-D0dUEVMWkLb5<;h7#rW}fz$eAUI1pv`! zFfdA`xT8lnc#Ct=1KyYI|6|zkI}r{!uMs`OMhl*?E@92-znjP}am3LUj`K$PDFyYi#YE_nd+`z!&ooXwxjz^4QG}z7ijV z^%S?;nMafj$wAi{T3qjDyek+mPB?hHl69`3MU%tBDUssWIQl%_zL;vS;8i8GJZR^{ zH7n(}hUxMiWbRMvX$8k!4B;ZI`t+_iz5W}qK(=aVMcAeYG*x0yuDnzUq>L}q^QqeC z#pp%@7|g@tva$M03L+^@;ckDST={_!qEJK6*IBgQb|CzDR1#AiBcV_!i*Zq;_o+`RhG@FfRF z{o+hVZ+`H6+^_6r$#joks>9VTML2esp6 zkD}JWM=aO<$0sqG2ynn01d37aPe;i1|CJH)zdxV<|C;CiQ!)M>l<6;YBL7R7fh?c@ z31sT_&V zy`_Wa6KtK*$x{|l=&?!JJ6t>0Txs_WY*{aZ?8eyLF_-78ZmGIqk^9XFX-9hObO;$< z$Vm4zgQy{2qZ8Z+roxSQn#KW0W%wx-lZiX45s3Rkq2@`cEDc~ygkRQQY>Im+!sMQC zI3q$zV9}v%O|=~{ul17O`s@ieh3v%B zv#kc7tL(&0#z{>k3V@`~PAUUQdln~bDp**PgLMc%(jKb_$0z_u+JiTmlU>e!BJCY8 z$Z#ZmgjfAiNYN`ZO1@?{Asso-1SIW+07-kAjTnQ+Tg%@xoZmbI4tzK(z0=|;w#xcC zdp7&6_D*eOv5bI7!^9Qh;@0&@DXX%FdnX zh7+6M`t?Scq{A$SLHfqYW$@WUKzt4ytx|d+f;xYIHnG2*2dR($h(3_JCuvPZfvQS( zDa$L}qflKg=KAi?6JBjRdD?NU$NEs2>504NWKY#?T)g0ggg2kHTs3VK3chX44MH^% zQ3XnR9 z`}?o2!0RU4g6d(s_;7o817!s5r}v`&jt%+GRLe{*^or6>pj#dpF;qVfaIn~gxBm^u-g6()3y25F>>y8)^%;-4K1H1q|3ENW;aAVjWc0nC6 z!}aKp8RI1Z8Jp2Ci>qtrBE1gXwvPaD{5F@pN)qA=PKZOq0Sb|<9Q1rl_Z4x?Bk5|Umr8}S@H-h?qg?~(jZ{uNOwX=1x>=_jwX|2CIC;o_+SC>6I z4wBzTZ>n9SW&#-qqFdBEjIwk%3>MIooZ=GoW&mUIu`OV-rFyJd5Ume_??Ec+H$XZZjwR zlA0i3qO0Mod)@7>M;u-mbKk%O5T2aB$0OHkh!AacVq_1SB*XON-SrR^}L zppzaUA1z8J^Mmr#mi{skUuP29#>vZ_lH5|t*Be{TA^uJiePldL*B@azCYb3adkFD7 zpz3*`myqSv?(X=zDNUp=l6qWVzJ(5eV}!mOE{5CG`~EVYJ2S_q`=KN61J=jL`$~d3 z{s)@2fupk`!nPsHv(fqR11I;JY_S(#JVP}X3a7O4D&;NwD)XhZGhHWZy|Ck8ayQYs z9?6n>Y!PwhA4t2e-!%y(;(l9sRdS_^NmH*F3ag$amAXr&$9`JHuBtDsd5fY`v07^{ zs?##Z&)pF(VxpVkcw&2@Z(z30T#KM0UbHv>pW|x1*n)s{Tv3R|Lto@`$nkcz3sk8d z+Y`fBbRHIKa5Fo^x*pNRI&Z$9zg z=`4Tme}?X#ILjYw`~CVW_%AMt-+zL5`VTt{{PFa$=9f^i!^6ht7`UmXAX~4lYuqS4 zlQYR*Ldo<9iBi3d`2xf?tXv_lLfIWFS?3cEygvr_aDG0$xe4RV(_(yaq4#_*b!0NS zK&^~-*HBzI-2s@+OgbqEi)ip+RtkQ=$h1*ZPI6~ycV&!dZ9@#n1Rv>{1%?XUO zoUbRI^ENh3&Rf@JE&$m{+#Yv2_K&)tdv_RG9b8R|i&=Seuze2Q-9%D`@QC(@-PY}A zUFe7-vbCxDQM>x(5=cVwcqiC`n~s-k$MD~#ca-U!gl_SBbg*UYTLNdFLYmW@)oa!P zHXT$cC2NH-z>wyz_C)@qFI_(6=&KSb4WK??u0J9#(K|fzUx!x+^?Kt%wXiQIVP)Kg z?(WCDd3vIq5E^Jg9HT7_CM8P7#spA>ZS`z1 zn#hPI6(MXeN!f&`o$u=WQZSWNMK;-ExMSnIvc*jLUikikWv@_4&61ZM9d^1eo7e9M zhfLV$m94?8I%iSS5MM3ML8ODRqpR7~+}l`9gN6dhJtHzTs1&+M-Ak&QnYZWaZrUc* zYtmFN)Uk`-v500#;UA(lD3fCpF!$x4^Z6LOS|CiaHO{gxq$!IFzcPu6a59OJ8`dw0 zUSdKjw7P0ixzRDV(?ZWUJqMh~bbi0hFS;HSJw-E1{^~aWTgf&5-^j*qM1zj@&0kt$ z|F1>+zbrJra9w^)_WrTZjQmq*N|d>Q1by@s2iQ)vjXp6>bZuC0n8qo{NY>YK*vwQd zbMP+xRF~SiuzRRi&FI- z>~O?gV=MjiL!_jjToNf@5V%g6D6s+N@ z?U30VP*vCfg8nT)M%$+Kaik%b#!v!7gk!&}79aZIK|~bTg`wgD;MkaVfOl*8fU85s z`NOD(F>n6?EP*9*W2zRBEKl_877e9G*4GRmdwMWQg-4360#cp@50Ne;a=b1eLb;H! z$FN93y)67Qe%j?qwPQ-d7Z&=-C~d#^bu_Ka4s5iXa zrAv{_K7=-WEM(pwq?outdbwy-b1fKw7>;O0b_s?G5kGBagS+C!NySMos<{?+s2lus zi>#02w|muI)K?=Xco<#Ea}&Sn(`tJ}KZql_C_HDvua_Wv0p(z%R-lsLUmGLhwGC!PpuOEj%;vsr=F> z?BHi_t{i_gm&k^UMp_WI2_!PDjZ6)hY}Jy3S+ z{{J95f3D*G4zlxelh;3*w%@An540Efiw(X9INLoXuG*PcIne-Ho*y_Yp4ysUROeso z!vB-GD#&K~k8R-?X>I2> z@1?vNYF?J+@pdr@1jw+nh&0HsZCRSXj3EUSJv@Lns7q0srA4X-&uOBTZ-OK0Z zhZ2~IGe)ilwj!t>FAsEh&3)?%u!%I`ffQ3s9iwGX~=xK1O1hY9GS6Il^$f-ShNoMNM?xpwaHSbuP-* z>$t&i;KH!k>HZlwrTd#!I@$ooi8FXnSjoBSp_R}QePVVV9v&ufsADhzsK5d2I3JYf zAp}dVujVdlVc%F}xsKxF1I_G8v>V!EIj)bZCX!c3h*w_(Kf}i5F)P5lYdfa&LfiH& z0c*}Un$e@s0H5b44pz~)%G7ka8kRAAo&;Q`n0L1~=811Vu+$LN!j8mBxeh@tf%BSV_% z4TS?^luco^+Q|oUQqM&@fEtuxOMj;4tY+K`gGj3Euo$#6N0K?Hs+ac zizF4n5vh`O{q(6Mpd9WhO?u3eiQW1#Rm_@Zaky%t-jHzB!r!1Jaea8ZqDC3dF%tL+EP|%KZcPW17 zbNwBrFL|pW+X>Vklb`C(A2fIUe&PMF?fFxs_jiz=pPRdW{}g^8Kfh@3KVu7jG!p!G z=>d`of+qQ}TaFccHLcicz6vyd^bTe#T^-O4p#Bv9-a;fYft?9vCP#J#SJw?JO%DSC zg@D+Zq)m+6bb`EKY>D)KB!TJkX!71+pUu)UW`{J+Iv_y*J&+Lz0&dBPYo{tdERQXd zyW#C*q(&SB30;an7uyM)Bg#n@Vg`>&iHcB3O!ZNepwHV+XLqFrtl$++C&e)k9u(&R z@+RpkzM(Xs4e!wyyJK;=u_xIV7a$)}dr0ru6CaX-L5#qa+;pqJ7s!V!n2n22X%)p5 zjt^B#%&t0T3GD<-#seU89cj?YD*_4v-g-d7ZX8?E*E0l2xTTC)&(`w^M%yT?1_!HP zshr2fm?Q{*6PE2bm_=S0d}wQEZBBmEQoRm~N6R#^nhqC7>lI*@qc}XK)19 zssn2Mxi~eMH$f_KG^;TZ1bR@QhH6V6%+|tjsMQ#0o`9ll@Hpkb*gfsO&wWP&Xz^;> z{+xVZbs1rGYM12Ef1Jv4?yp`VC;BGXKS{B+piCk_Z!0o6mZ{L1hyKwyFP zi}YGgzH0-&Z184#LB4X`9+z8d!*-X|S1_Lt@pcw6ReN%2ulrDV7I}5=l{xex$v5RqLF0?ZAit;9EWQ)_Jzj9 z?N~0$YIkL&m)SmV(>(Fjw;VobZUsh8H~rM486K?%N>5NEjCW<>2VX$xfEV0zg^uT! ziu@ewMVNWL8r$ut7bqT>KNXKZ=<53YviYHS{I3h=?;spM z2c7)>3H(4fejuKIL_SLXX`lG4AlRb4^Rxp@R4W#h>*X5}F=mi(ZO?Fx^oZW02-D$n z0^0=QiyWdN`uQ1`O_hO^I`X+tR5B2A@}4KnwIarl1T-uJ-vDck`~6lIm=QC!a8=7` zv>1*%``oF4lR4a1M@c1~1?dWL6Eglr?2^!d4)s@y-I9$uT|i#G(R1?{HjdS2n4iX( z;ChHV*Iq1qc#gPNM(D&qfD$YB$%v3C(;?PV&ORAZbF-Z@n0c~20m8h)In>xmj(VAR zKLPyJywGdNjBj2XSQ$9_FH#Q=lhHcjV&3Y}2tp;FMwol6@oQ>(B3xqSb+Cu0qV%Uw z+$Hi9Lg+HG)<0g4Pm<}icvP;HNNmUB_K>uAb}~5D?(MAYksV&?Fx%m#x;L zosrTNf8{h7VIr<|6Ek5)mKWkZquY_fvB;QQ)VP0X zj-ZVW+uKWWTd+@Bu#LzP4s3R$+&kP4^zu=$E3*_X0% zaaP|kKUeuuGwTp{zJ)QRX^Ci`ls1zfq5`qkWKje{UgMO)aq~uwjqiMhRrhnM8`MP# ztVZ5xW5d_D^*1N;FnEgEt}C3BRInlY)!++xT>}-up)nq^A1Pf!0gKD!^FG~`GGw=ItATPe`BS<1gT#T~FSZ}b z&7Ul{zk}%fJSFw_&*2B6^Xp;oZ#)-29@P9Y5&nmdbcZtYVu4v{(61#u$d)hj4ucfA zP%~=is8JjUp7nw(QB=3t9#OaeD-7~f5nTzWh*~CHHlWI={1D3gdFVRnxkr?F{Y@!B zpzIAm0u^BVa2Y0J$Zm)ukRoP{_ZdMb5*AT2d`U3~IhyzeQCBl7Q1qi|#BPot`D;Rb z%ujs?+JFc^I>Y;CmqZlUPTnw5I(!MZVzJ;(rirwSP*CwY!2HDtfT$WQ!v-JvE;ZRr z3Sl;^VmhONaIKR!5jp=?LYrhlEFjU^sm_Qw@S~o1jJL^VYs7QR+KM%vLB5gXbqyOi z&4w-Kn}%0ZGQppLW_1;tHB786)0>=n>d`T4zcCJPlLw#h!F7sn_vNW^TeGgL%lNe+ zJtL>5r-7(TH=FgPSb@HbN1>WlkNx+rttRIHoi(Aa-hI6oU-{IFkzHAr?S=FP|7lN8 zi$9mXhk_IZ1$#^pyCdGHq7*MAqm<_p=eUS|1|}>dLDjQ&Cd74hM@O7?uO};4przD` z8>>GjjKnKgW^o{R*fsZm2IS@On`tPr6tsy1=x#+W@wg5R`AM1#@d#XaoS6YA(qY2r zjy}tSQH>QD zv=_c{b6k}JSZkB!xVRt`ne`wD=I&0EF21GcdNBbYhCWe*|k!kC*Z)|9k{kS^su{qe0(4t)?KK!qL|u!3L6wxxuJ9FyxfOzZ{a9JpS@R8$a=~r zS1Gs_U5qW+t4Sk|naFssr(Gq^k}U-ti^gJvwy2ghOr!g1*nS^s>6>l-`A8fEu~!U< zYh71pl3oQ3l=9od^4vh0GEnEz2GJyoIQ|6n3#bBR9v|C7%~|bv_49Ol8cxE`oVK!^ zhbtF@^{JnE#c$Lt*hF21nW4^0Vw`%jRMxlIoEBuxJ*Heb@adIol&=vwPbI#54-on+ z&*FFllq|9#GWR?GoV$;ejpalFo-p_zu`pYS`j1(e7(w!RD43h$(In*`_m!< zk#IzXN=E!yadHV^p3)7TpfICAz%3&v!6y<`SxqOzj}CCJd&G(vLP@Emj*0z8=s*32 zQW>15+XWv#W&lk7An>&SzF!IYiI!tpP;22Gy(t&e34Eedf;wk0J@dAVOEyTS^S%Q- zCOi&%l(aS^6w{tB-t~Slb8l%Ry&3)j_iz`Q#(U%B{i()@@1iHXZqzMX*MR9eI@>ZD zo(CHEauq{Q%LP8+Y;*VJ+Wxw-YG*Zb2}e@K->=)?*woO?jTHw$<})VwEJhqtVm@~A zcn#L4Xv0oSM8uaGqvc{36>~XkLgLcS@Qk)px3{B+w_kU}%IytrX~Wu|uyDYbc;K@Y zuX7=ejYIudO)INiO(^i$YS=ylL2T?oPNFwme$N-?0cKqU$s!@uE2rKgu%rC=RSG@No}MI%=W%E5_na<&SAp-?zYn0s(0_RS?VWNHw&eB z4J3HT*9eSzGWrd%t1(cCFunD3`3hR*m=kaFW~aF3AWbyiP7B*67}eG)g%^x6ZrY~6 z+wu0zkWXppwV;^~LaJ~cWL9i15XW0&nqrNxo>s&5ac`&#A^B~tDKj{m1*Z?hlw=kv zl&h((=qJ@Te^T~hdBqwu#66hK(`2LRniEn_8AN{#*5iS3g7nlK)nA@%K0RQW{j@v! zgZ7NyFRvd;&7UZ+zk|g5Jf-aS&)^3V^Dl$SzggM;v%;h(bv&VPTW+b8`)dj&pI z>2)b{Un_pMF60;RBrj6Xy>OT?)C@*FeC(uF_F$>AhmpY$7oCHx#!f|6^KO?P43Orv zF1cJ)mm{ZV4`#ox-X<(>v=KDizAT49TQOj4U;vVDUkPw#1YyUe5bZUydpNjrxXg3d zZfE8uCTNGic99;N`n9&=gp0&k!S%(AY=sB|AfOxZ1>!3O=Q=x{4?LhAK)6xYM!xon zRKWL!*ED#%zDa-MA>Euq#dW+6PrcE}ym-ADZ*BYl_gtywh#u<=l{*{J?Mq70`C%Bn zxq@7oG9;3m2^6$DCf`Rat0zGbbuys8)Up(6f}^&LPR%J1Ri3Y{+}_@2WQ*zmipd(1 z)ErM896$}?#%4B2P+GC+fbf$lkqxtvW2;|G_Xj|_o&CH3iIES-nfC>|7E4D>EvpJ8 z8WDcRJ7a_ocyD44UtsrUZ4Xr=+^u|cI&HW1F5o9W@2AAVR)=@=9S@L<^l0g?ZevWz62+>V3*;J*9_y-?@>GvAsZ5H1a(Z>qC z6H(QtWJjEWiEXQeFboZf7{4GKDT^Fc$PhJr(vD$%AddekrqOGd>NlRIzDMXCgO{9v%a4`iCjr-)TQkw~=2z z)ZICrqad_JoijrNG~FN42k{o(r^vfBRcFXJZ?hfYJchzzLGe7?B%0;j_Is5Bs3D7o{nfv&IcGkBz_p9M)`<9nNX zC8!sOcI%Rcq`mM|9lLyxX82JdNjZ+NGil|q$Ru-%>C=XVp?Zs_5!wOxydxc8q{K!R zx2z#|muIgKCCq&41rWb);k6Yuz;k_kmb3Csi%oY1kLu8Ci_gh*etvxwR_vSf7;Jma zrKK+Q5$P1`U~v@`?Lt+brx8h!Lt_b*hR48iW&&J0zm(ESOo2A`Cr~$~FczGmJ0H&A zakFaHF7v=eqh(-6WLidd$6Ob=DPRhLaz3c4*c^3yAClzWP{=uCnI`H2IVS4n z7Luy5dci?JD0V>e6bD4d0*-U4Pb$RG;6c^xQES7SF0GM~rJIAOCVQ+SXqz|7F-`Es z1j`M#foXOZ+Q?UnTDr%{f>46;Vv7)oQ zSg34<>vsKRe&bL?1`yXDzB|!U*Vfc@zwWSgMq*6|M`>!-CL1`5&arfPVzZ5e`W7U*j z)aa!!w#XIQHC!fJIJCol!;#}w-y4%4``BQlj$5k01$^b^1-^2>W~o#W3Ejr2WqqHM z`}XKjPGvT#Y(nLExx9W!fON`@84mOD!)^Mh-uzbX+s;)k)m7fW?{j0ANY%JjpzfId zRCk`fj{jjt@Ndl}Kh&N7UA_Gs#OBEv{U5C4bie)U+c{WR=-N8}0oP1Q%%U_7KVHwV zbC8(JA`M0eRttk*1(Do7k< zbku$VLY0{d(K_^Jxfu$}9q$)&W{7%xkKVyGS&EMfW33}(V*>zZqXgvJ-FtpXSl48f zf-xZAK6&-jx4;qNG zEO+N;y#-8fK1NET=WzFCAMQshW9KxbO37w6nw&NS(Yeg zO?EDSpn!GG7m9(enT(CiOaLinDwhO+g>kR>oD2`6vBFLPOfFXCc$hxO-zw(CCZcKK zw&?grUlSt0<=Qzyy2d?gPejgNBU-P>I~~53Hs@}5(KN`oF@W+clQRhF4VuF608y9)fSl)Ms&bh4eqJ%H!8@VUm z@Yu9wxeS>|xC#ncSDlH}jIqU1A&I>wo3Bb^XTOxB5Mu34PS8u|FZos7wti`ZBG)j~ zYQ&=TsthO8*p+%6a1B(rej;`*RA&9wNX@p2y46ZM@GUZg5th5PW@=O4R;{qTfR~3dI z&3BR8IahdMO@iR#QfJG@Z^{yJU>4aAjJcrRr{_mjhRiCe3>D`H~ef2_X$4(g@;C)Dc)x3OP_TK}}>{O4XN zM``#eBCU0w5_1bj#B$>GX%053iz%#F(rZfHmKgF&|LM}kCRB%DqU<<^(1n;pe2Sz>zFwDbknIix#wrGos{84{ z4lDMFrh2ZT=7T1YGrQvW4tc^z4$zFP>5eIh$#Ul-Gt6X$=FE?GBzJ>JNX9b&8MnA8 z-aChfAFI$WmIm8)u5JkAmoS}3AJvw&c+Wm}BP_UMya~1OtkkXr*D#*IXMX0F0N7<3QKi!jW-7LC$8)d-P~+kIC(rY z8Z^-~rA>>8t)*wBAXKO^YGJMY8z<3SJF$bMVoGKEsqnqvwYE=I=f}%$T-Rwd=MAxX z*>z|on}DNYG^g#y@ygQ07yA)77Up@m;mJX%hX?6Mt}_=5F~t6goJQUr-n$i|v3r!N zL7xH;GMlMNOg;gx3QuNIpo$-J~t z>fh_sPfig=Z9z>pK+ruOlVtB1^uGJ5q)((aY9-Xd#N|1|QiV?%C-xRM%f;9Ct#3Ch zZukPo@x%lzHx0|Q&DIoXld74oqxpU5@bS`vKNzRtSeY*m%Tz*2kO^zG7KWi<8smVc zwnH^>Eg(C&bru-7IM@^8HXxU8mnr1NqGtzYJX-w^C>VZq<*p7r?p=X1Ii*%YA1JSm19W5}A zj*@GEEN02v$EjvRqR%HG(2*lDTbmF>?zrhW)oyk zOay54`$!1(Qr8pRghcj|-S$E$8-CoAd@?^=RC9X$ZdB+kFQCLlfJ%w(kf@D1INq2WqaM8_Rqp45^Wcuv6FpzU{c)~Ut z7k6G%#{%S>)Cy3_hyyt%5V3QzT6s^L6Fi1+4vk0%)q_Hc9T}sj%k%sM(uyMBG(8l^ zIa#WIL)~iChUwuATx?ak1GqyhHm&bmO4z))TUp^YWAe*w6>5=*)>Q-OezUL0Pf^PJ zP+9E|GKj8l_B`^jU`Dl+kA%um{m469BU=mk+ev1@Cu(iG0`+fm=`TWe5%k!<2D2>a zj!**0CW6*f@TjU~;j%LHYYgg(*(A*i8xU$R$-0PZ3#`K#3{PZ}Q6su;scfD>cr1l`D?BdR?((5Lw)r6*s)m+Z7X4ZFh4kpNlugz0Jd^Gb)n})1P>0OSQ z2{sdQ0ajnDc_+rJKl7yadHNNqK^?_;U|7>N&4QCHY=K`QG*gm3^VM($4)p@5_`b|MRN_i zjkwUO92@-pJ@YDkmj4z#b}GCtgdc(TWVXjJqvW|0!-(c(>N6>{9DRlP720 zta6gha->pbjj8|3FX??mT>CwdXpdzm`7YT}`g&fb`{hBi6e#kU!d z94T83UBT`(on)7OI5VM*zPyCl!8Pz=9FOZ8k7PxXZ)uVnm-7;{{1@p@r1_E zSl8av(U6Aze^+UL2f_IZ{lvd^3;hdr{m1m?AMqYnDylqe4pSFkSc-CpqUgvx8)+mIBm{#_kw!`yL}`$gZV+kd z?v{{{?h;-T{04RK<-cZq&T^JB%f;RIx#v7*pS_>G_r>`8vVsmSUtWZN z$|B^+#U#G=d@#cH%W)d}U7s3O0|AQfm0R+=e%1E@wn2ejf6CILm3C{`OsY?V?fPXW zrZ&3C1ILgGe<)2fRjLT*el2^^a3)+baV6+9I0JoIr0Kw!iHYV?xFpQTH*?c4vp`XT zYj4RXMD2UYg9JBkdXpg4drI66;9!pPl|qseXoo>ZZN$;C4=(ApjHhQ6Xnfv$SJ2bJ zpLb5dx7)pq5+1o_v#i_s5vmkq0-YAD9u}p7*e?cKRgGa>E`YCPe4o+{~^1Z{7Bc*ZS-B0;IRcFhhs3Na5S{I6* zvCh3cS{et<$?Zesy_5=uBkuWwosHxQ+inJe%Nuf(l}O8-Z`0YxFm!TFg^3Cv$*}L6 zM&>j6^KllwdW7UY5wZR#PKbb&b{1~Aelx1zhJ7_B48!F|G~E$0W#oKtl_s8XyeN;o z-*V;gLzB>wrAZ+@(!n31y)TPgJv?m0}C?p@nX* z+zJBi>1jVQz< zT3~@=0n6UK0P~is^=i!&CQuU2=3>20?1RYQ0PTsosM!)Plh5qoL4zIQHsxPZQ zDVY)O?1Oj}E<;-DDI?mnq#;4RfP1;=rB@|30d!MuMerpW?M5(L^1WWiHwtvtJc8Fg z9_b4e$Oi}|wzsZiKnsoYIu|#$ z&0(H6T-I$BbcP<4A^~nU^N)F-v4m0$n={v>5;=9LJ;*YMj8|7LM0H4w-SX0`VPQ3y z&V=Se8eSvrQsjk- z9O_ccznI#}!EGRG=%VBHNHzW;j$7xnpK?u}&?70UTZ zWtPpLyZ?Z6gx82sfs>w`$}(q*rLSf1(=jhG(=7*EnR3aJTK89Q zcS&KHZPfPO!rddG#g;%qP41hKeqewjBi+)7_*^En%c^4*f+9E{S=uzrFUwmBUzy~2 zC?8LoYM_elT71_v`6(UMOOIn#TJmW(E1CQWrCKo!MnmU#2<5ZXrpg#}B!FlUQ`3GB z@`zWqwIVuNgpm@Gcdgnw%ecI_HxEKl3L0FOUrw zwR(T%*mDbr^py8yMN7e*G@6IES)h8(8D^-cjQ_5FK2d)J@c8Yh{um!~nN92=M7 zkQGXm=!o!$XAqOk0{ZF0-NX-ZF0`nSD7Daw2P&lC5;8U@V4pO?qKIw`JLe)|t`Xza zg=>t%CNhvw_yo1BF(3ESPY;J_;=;L2prDKS?ix_;t@K!}XFY*T8^=(C&sxB)yg5xO z@S~vH+uTcOS$Vz4Sg! zme~5vwz=sIks4Qg%g2gC-oV7@oL$v@Dubn@cG5d3DJhran&+i~Sst&WP4O;>@;=?3 z)*eMHN^2b!*?G^)Kg`3MrP5!WV7^oPVcnmIfM|KZ6B0daj!hm9#z7#o7H_jo7P9tk z!nVf+O#&!7)z^W#ywDNuZR6Wh_St(Qp2@FPF&fbcrs^0bOHlS*`HrIExm-I1sfGm# zT$APEY0~6a+>Gl@=H1I0&F)7;BOYGNL&dRdi*`w{Q7LV3Hj$tmPVX&IiS5n3olL5| zjSw{R8u31MEYnUH8uNiu>NtZ2$ zQ@(Vtng_fZZ;qQ|H-F}b%m7{8dkpDtah5Pb*O_G43g2o`N7Z0n6tCRj&QWE@>|i8- ze*#Q?8g}6#V^m>ZM_~vXE^lNu(y{rd(KEzevgqOD1BMAx)t_4n-3L#%JwI7#B@AUt954;@V)5EGHQHjsn(C;g^4tu!f-KMKc> z&Xww};OTn%?AUqwNOnvsHf|*jykB+_4W6!p6MRw6B7NU62RgpMrxurcJYoJOW*8zg89K8`ra`ujHcgtfOes&|#F7r^V2oV3e4w zG%d9*EiSo~n}yXMSPs-5SPZP}ECqd;vM)^^y0!Ccdq_3jS`Y<5fG6X9VzEOux?RN84|K(hXnYV*gP+5F|Ty)Fzo zK+hVRN0B!w*0J_tkD9y9&|ka>%X-&W*Q=B@YgicMc0Ey`M;X>n*sT{&Vvk4ExUxX| zGXY&gPb*63Gg*Z$wMMsw)gG2`PaCqr*P=Hu^J${80PyQhU`rC0e?d7f>vPP-Ac9y2nCkBu(bNEUCd@U}QmlB&KL-HNIqyAEuxn z+3MC}w47lg9iZK;--lwCZD9~HD`Lw)Hf;JT1kzwPUDz@;!ARbKwm&V{Y=@`!z6}qS zw2oC;GNB}N2L)^hF!rSD(U9dM8mNAnw2NJ7G)K2xJ{KSHW>#|hl}5NQ?M7nn>VCL# z9HKE61{zNQgd_Vy$L0Uxj`Yj>?Z3b}VC+=$Js*9dis?u9qrd8yfMJJzz$_qO*kOD| zN)U^-(_oyq&mfa1N+hfh>2U|ydm8W~o>U3qZCK z-z=FMO?ft&9x%6usP~b7J8O-wS_tSCfq-g%ozPt2?mIKwJ8Pdz^aa~Y_=OlhKx zthY>}mPNXKq@;6q2qPII?F~6qL3QcPso|^FQ7uKLme)uE?lwxgbVxmjj_rsY5NyRD zaIA>Fme4#NNPqZoa>>x@unbPJ(1%f!goKAv+6u-zvY{*)SGrH8NZyueH(I#n#uOiy zJzGr4fJ<@^0tcjbUs1>o-rJC7g{SoPSPot^o935pdyTxK+~0Sr ze&4`x!Gt5!v0vG)+HR5^O424JzbXRtPG+?7`$6=Ed!l9?lIjW!T0)xJ7vqo6RisNH zBp;JwmUq$ckjzge>hX#vHqQ=^cv|xnEgT?~7^cPXsvy0NE)*j5i&((^!1kJL0){Pq zMa1#e>l$Ga>b_RKf=8D+u<~wp6RC+akZ_tLEUT8t+2lLf;4~3(t_0yEX=FsXU(lP@ zvu@fpSa-ZEi4rINIR0^+)qA-^A|j)!>r{ALNqZwVq;7m%LC}4Oq6K9cQx;ld6S>f@ zF`iNu6=y(6-rpIJ|6pD=23mtrnUIs}$h3mqEPIr0n6~uta$roulcWKgmDUcGu*{ET zT6#{9)Jhfdejz)KWMjEo0N1)F=~Kf`4^3`~_Npv)ttjsmIMgM4dT>lH(nsm@aR9y4 z{g7VHrw`4UHr9WET)-HB`9bFGbf@Mof(eoBG6o3dS%L~P|gC)Gl(`1bWNn29^mnKD}#{Z`L zpa}`Zgt-MAY(o{kN2bB?xUpGS(YidtLXByN;D=wkVNKzE?S^G5;yw4xqxqD;PJY}C zD=`)5hUHzm;G6_SuG5AKj2nw-H_efHt}-2WNpMeduX6uZ=!L_3htv*%Gtc(y_A>Wn z4^_vjw|egxntv^e)C@+cf^&8C6vqqu;P0B<{yzGFpW1WEER_ZQ;Dv@%q1%T6#+}9T zQ|t2^&tSQRRND2@FdoPCysQbHsgr||Pt|QTMVeM1cyl8+P#TynrmDNT)etwZ&xgDc zZOGq%r_ks&L^Ks-UR$~8e-S@vML4UN_-QfTm!(vcp=Edt&ZOif{WlD+Em~lXpqke! zLl^KAyl_(BzFgm>>5rQ3yp+9&Mln^|t+Nal`WV;vl1v`fKFKxgi`HybeS#DbLil=( zOZyk)B*bNI&xzW)Cbu=3M`OWTrD)=-#Q1+|e5>L?NwrdgQ#)n-$p+rpGB3ulXnqAX zdlBAUF%d3ii!0THG#<$szBV&|lopAj*xAi6U)W$(btp5(lGJrEqO{FyWH3D;@4?P! zru>_RmvjSG2xx?^eGm0Y2_Mx7CR`p3r7NB;4Oj?OS?$=adU~a0_d~Q@V^xM--FSrw zvz5-ciE$?&a9M1e;hIgxc(|ravhKb6)h`LxpnYTm5C`uMFGA-NP&xCa`7e;ikLURO za}w>eWc44@s6hfMzv7r=%8ne% z$JD6~+zv&Fo+QvOFj6`6D(cg>UK)Cqqek~GIwFRPRri@4hHwl4-7>GI@jBrjQCrlQ zp*Tu1)=jmej4;vm8DGs{>oQ0xb8=XO#aH63Fh0cj=5?;Zq+Q*Lof0_#Qj`J|J}%Fj zvVnqYX|yYo#BB)f)xg-)-S9lBK0`Q?cyVE3(MKmDn6CH?(v9aX&T{j8RyBY(BCM={j%jkuDA>UW^p*hp*Qlzjq*TfyX!}Ud8UFfXm zCQF=U2;tJM2 z^QsjrieA%lR~za17Nd|@QRau#9`(0&?p(R>`Q2QGF?j>I`e??JQq#D(!}>{y^}<~o zzNZW;Ui=rU-e0QrDo@@0vi7><1xwthj_Q8K63~+(

Dp=oLX&PKw;&S>P5>5FR3G zM0cdqGb{Ma{K}s@CHk4`R;oUIpL7lkd{~$__R{?8I-XjlEYeg_me-Olx7kQA+uA+j zYzI45TIOJjN1#b$F>J}ah7DWs#U-?bSYV9yXo03+itA+~7L0xJcN93=t#?g>4g4Jy zdQq<^ykD6WFKnH5y!#X_P6SEA|ASc}ul2>SjY{c0GMrZ0_^PLLsk76UZ>%%C)EY3t z4OQVPXMa28ktJ2EN8p~a%9$zb@T%h3#G)6*~Ac<5GW`zG8v;HppH6k{93s|n4{VJUjqtZH$~dGr3^W8m0x|H5dCxBa>b1e z7xg-AA4W(DTmqN@)=u<#b&_|C#M>2)H)+JaR#W%UKxyh#-T7Kgt&PJbf)}!YkP3Y{ za4iPXNC@yiIGv+4#<6eqle_x_DQpsuJ=8A~LW$Az`dhDty&fhFxZ8RxKtImyH(643 zGZ(N)YSjvI+4u*e@^7kpANOh?woPYUtB4`o;D+Yg@iJ+6F-b{n?9JbhUCjY(Uu#o| z#$2z*P=xPtG_+VzU$qF%5oGNI+U#e*a0f_|d_wyQ3NYnlb#?)h_<+0A<8lB!l_5p}#v$$U+exBSxg9QJz;$~Vw*ncH#v zo+v79^on7Ync7HRNzkqj6sNqs#)!_36R-UQDRh#W9Ioqnuv`HL>jF)_xR7;uA-@i@y0v7ABpO~ z+iS;8rf@`Ui(zb=W?%;T2JwBDTPh3{JOU)apTm=k)AI1DtH|gRuMsakd#n>ST6T4D zd6MOwp{4_o;3jsrhAOm#G1d^xp&g@RA9?39MLFhYz1Qlv$%gVJ%isAMbsH`Z%Xx;* zN=1Z@qrH}E;}giTE}IWC3i4X+UZ&a?*fVDDp`0Sx;8}k{KISz@W3WS4F`I4ofbEdr z!Q=d;p$SUY`U|hVk`i-q@~duul-Pfml{PyU>F)3B$o~R4fic*75(Vwj_ir?RgR08YYdm`g5%#~*Z1=PQC_k+X@6J!N)KGy1{mnCQQoiB z*Qg393tMVmizoe*;|^R>(*yMmUkPa`NEp+_5Ur@@-&XgG1d1med0PqDi}G*8a=y)W znPjE5$9k}~ld>ypeEq|FAU`xoTl?w#P0KJNl-lFgF)uiX za9(aY1Sra`V17|36jACN^5`IVCFOY6*Jy6bxIqK!^@b1PAyHs?Qy$$*$D|UN~9#oHy^L3H!jI<4K!HOx#5w2kQ>>zO?SCcXdKHR`X<4;j(r@4C$( zj6I6F|7iS>nm4Ld#%yUg^%7g65Z<42g8`c#LnyvNXxldj)8wN?kg9*AL>}wZ@qA_u zyF!<{_nnEGF)e1Q#mBJ!RsSpTyV|#cA0K8bhZQr{;V-m5_vi zr{}BtCERSvM*-15Ak(=phX(qoAl~lURtQ{@blq|92i7IOYPYuCP3l)v@)mFe7pd<- zNL6Znd@Kz;JTG$}(Z{UjvQLQ3Hq)o1MH%Hs5HEImUO9Kqy5Z5PUK7XX4Vqy4E%Bf zeI_OcUeSBWpJi1U`J3nkkO@BZN(|uCU2b7#nuQ`jMtZM&faZ@Ziy^`#+>RJ8v(JJ=n*M#VD)?8-DAu@Nk=7DIcuiZ1FQJ6I> ztS8X8f75zJl_=4KbpSG0!hqY{j2}79P5EZC%66UTqAK#5w z@3r*XqAn=fPVeQ{jR}7CD3cH$OZf}DEWVV1zTe`K_GXfraRxC`hUzb3Q=WI_a}E=w*)Y5DW9w)xNtX?r$VuU$}upt%_Q zAbkI#^}bikaIXJHI>YyND~oM>?K81+z8XvxTW`zjb)O<14^d_F=}ut2bepj$=nZpa z$z6ZHZ3%ymq=_0|7cp|E&d9{)uBI*`@i#RDWYy_0upuIH5eP>42jU9uknT>r6cA_H zCxmHi_!4aUN`w0G3-N^z&u4StnriPI*@we!3)OR?qf!KrRj!uD7G`7WINnA(sB+(* z6p5#5G!AAb(I)pvCUS5jS110y~2$o*{2-x zjvDXvbQYXX6127(pJ(!?QaTJY0+I6|qhnsi0^?Mrxm2@#I>hMeqS*&55LhE`COdOV zbKN&fUlmxxLw15^cw)A;R-0%$mOh8DzNMJR;Zku&fL>Mji_t;fVFCZrm5!|bmrH%0 zy;X+{zO?4QU-nh?9eBAMa^PD{yQOBgon2XLt{I!{^!y!HT>Cg~MonO@ZM?IR@k#JuXt(t|((^rY6WWe2f}RkePXI}n zJ5mg?&POy^3qh%;nSG{C-GfFSl`5mVI}Lpv?~eLS=Yh+?XbMoPF3h*7vdSGhOWc48 z>-$fkoO9@uufj2y`Z+p58d>{2D=ym35Ht`e9i zr=@Gq(hZ~B7Tyn(Skr0;3^u~qJ`|MX({}qn?T@RVp}}&*auodDe_#2K??`YXYX8om zxqZlkxoXud+S)bAL)z+C2L>jq8=8ufG11W~dejv!h=^T8lYP8vJy04uVk-y?%M^yR zu@me}Vy^&`S3;wVB=cKz!<`pnzM9W?-9xR?4-98b!a#*IuEuO!W#1 z*E4?EX}w<5t#`L?AdZ^#q0eM|WBZs<80V6_QHV`OE^o+e&5A{3U@^Fy z;=n(fS)Tr^WKnCFg>bF~|j z)3PIw&s?%p4N@%LOvBuT-x-@Ue~ujWdCY8*rc>!w5e>KMLTtpqzSYYn->_cktX7?C zRqtRADff_%y&jEE-EhZYp0Xb@(K%(l&$1Q&3v>j=N=r~x^!EXmKVs#-)O>)l#u$_N zSXm>Y$Pv?-Bd|o%0_6!6p9UioqOD_$pRf+iPa=fv>Fm0TR0T;)<0k(Fx&4YM-&BND z_w79Dq59If-RpkOqVqG!7EE&rtoga#Tsv$@g{(6}*=l?Ph)H`m{LIrR4{CF=3)*VJ z$F0aDvVfLZ(0m$N6%ye&xMWJ)$Ym7x3l?zGuGr}F3jvTu_myhOEv_`e6jwX7xgSt# zi)9Vr-V_QE*O+93ND1dCRL>B@mcGjbS?_4+<+Gan$~x$B6Pnfa}uZxTU8Qix%;)XI9?&oMtDDN74c`Ar*d#fX{KnV~BV z@(q>(wL$#Wkz8gKuo+APE)|w>l&|8CK4$M59yWAfI9xlLV4Qn-(6Im1K6YY56YukE z^_K@89sD0A>yFmK4qqJkrdQj~IuzY+UhGO<|?%LvIsg9{!{@|qn>sPGlgn`$iGlAMZ zs8*FUhBi7;>kpk8;EXF%Qjz&VRWd_{E*(unsham)l#XEGi)u>>NF**fzPv8>mLWIu z3RNBs{gll3!3M81!gfESEOYB?A0xv|^Yf4^q?AMSQVMAbM%2iw#8N`vi67FWhtymy z53xy^nOwP6WZ>PYT^X1^Zcnc50(*&*kR9daLjOkEXNDt{;^aSi?j=LrHb3sU7xP1Q zIiJePv+k__0>OaM-vNc;TV>_1_&X=kS_^VUjML6EEs&lY@-$9&3ssl&^Ft~Pwkb*C zR0JkvOGs`er8!@B`6AMm6*DNcEax$+PWxwCD^DbOBteE;M@uEvoDbh<#YaHtq3%64 z63-T7^7Sv_SW4vTC{f1D#PpHja_z?rWum1VV*o$GmFRM(`v%JOZoY69V8~qk=bJ6C zVuj((WEE669=$wL7yXr(`a6ZN{1Fk`94%p^RytkrnR+=NIvE*vy^_-Vq@ft93AEp1 z9~%!}=Y4~NY>bkqxuL}45np(1quVJ~cxGpjaR$4#>BUA~1x<&i73WhlEhyf6%=?FA zGmI80Y7X=cVRJKAt~@!&te|2ff{Pxj=Z+O_YHHFIX`VL+N)OVak?~%LRqX6{30ABa z$)*(g^4V`rF02IUhP0OKWSCwdSXo`IdZJvqe^V$nPbFz0#=Zbcs-)Erdjj>-AR2r< zt~Vx}eEhVhs3664bMvWME4CdY_pF^7vw#TWkt@99RV@y=-E1q1PbT^a_}WHWBpamo zx#r&lTq|!Xx_F-^X7lz_=dD;L`hgU6yjU4y^exq#_)5V{Qa)Aer<$oB>pv{sLw&2w za&MSUOhlSog~Ar?Rbv-MjX{0~8VfzvMk|srC2duiW(DCO%#C5y=j3-#GTVDP%Rb!e z(|zV-IIXYJ#1Y3;+zit!>{ppq9)1nQ;KhiP8kIw-NVoP7Dx>jj%B#C`*9vIy ziIc|CuD!fK;8u@9BsM5>=R$58y5|*AnHNz}?}WO1s(7!PY?sC;XDUJwBkL+RJ#z@m zgq&-=udpYQskS`+`n{Vwym3iG?S=dSugm^-*FL>Xt-PbJCd%OIiRXdig^pIv+phOk423Kto`hH1|!c1h_bsW{*vP;PNj}kgTA|aRzHn zUSY^mwZ+S|7dfrK6Ipmz9p06qgDg9pvWdM26ITyo1T7l3wssr@&r0jMQbMvh(>ox^PW$wHe z7+&b7VXVbb2G_W1*YzP@@AQA?k2A|TEi0HChzSV&4q6WTg9NJ&?69KuifD0oCU7rV z1vK(7dcWU%84^*vV!hpiG&HG(jx2{6ZU7yts7yYVYxe z^lH4~kj0u>p3XrcVy6xFNog63P{S1}8;!Z&d_UET?X}15x)Kh2gr1wwy?3KqX#EAj zso_%0GiZ@4m+k~`(@anrUaW}88|rGl?O{h1+a)CA_VU_Rzm2JR7pbc8g9YnqBHZCH zC7C=kar2;yAui2a6+40Qgl?Nr4NkFFx^CND*~Z2(4td-dArVvBugGVp5=o+)zfm$$ z`B~LG-`L7{E@jGHAETdUpk(^OA~v+V@YlPC0c>2|$VcWGbYAn58LY$oWnlfStD$sS24 zTr9za&Ya`|d346zt6|c7_cqF(?3lV2|HM_H9o03>kMWn%9 zIQf1{lF8b1Un>WyMo4v0V2^b+qgwQXqIxY3t*OUW_O?Rp?Tk_*>JJ#gkOOJtSmqXW zm{KAh`+9TqscK&kzY`p74#%?ImG3e&rMP3;T~zm&pd=?s?Yg$Q+;z?M%3Z~MB(L&G zll3p}izjcbr<5RPMToCKN#@pZK<6mFuri#>YzfIzaTZn9jPCno%Vu0;EJr*fLgx!^2*E?)xF-k5 z_;tu%{3uvZ=<(l8dhSsc2hDthQg+@$`E><5(kHCjn>av zi|kOoHZVtN!Ct>afRJ=ur|hHI*t|-59GXQ~a{Kfy=>-6)o`$z<7`sO1F9R;IF^ zG3bG1n(!oK2HChYR3$+VH4=Ao2QnA;c1@t!-tEV%JZ0Mh>w9(szEH;N zv)x@+>*z07H40`)575tdlruds;5ZsFGMb^8H@NgsZ`6eMj!w3Y@gmv zy1l%EK|fPmLWBsz@O@Bn)p>2MT&^AYhKI1P|GBx*9DVpF%PBES?ER9j^m4YEY;UNGP0A3 zgwrOVjsd%ps6=c_2aBLNP%jP_cTH>u5fjekW^=t`TCEZV4FrqkMTHWFctQP_B5Pgz zuE7%<)(T@;JJjYv4foN}d^J;OmPYCc7C!?G_w3s=Ji;O3Ysr|!R`-e^mlt9511q07 zc=$i462&sr0vhfuSXhhM%CP#r?pL>DqH&^WjF|0(LGHwLF!!nrc~^o3`>HF`g5@&09^D4Q59);y~VeeQTmQUnG2*z7&?=C2()5c&bWCFHbS++M474E)eaZNYL9} zbo?|WadsQ{`)vvcBsu9jR;zdLXNiffdvDQy+CfZB8YBG@s;bQ)Wgp?t&bYC;WWCMz zB}A2LNY*~qp*d?48D&)cBSsMJp-cAS66K^l*4xGX#W(B@dfR%}dTD!cUW@0t7u3;h zXTMe5aw>F_i56MHbhR#Y`I-k8+?WiNHMMJ1dUHz)iAHxC31jK74u*oe^)P~S_(o)>~PFQDZVmxa^d1FJ_s zFV=aHB%HQ|j~F$Ip05BkJ5)dHxp973r6gAeaqW%5#@s52>eIznwii%I&b8n_c((wJO}4AX_#?0tS^dPzU}_Tvy`(r@|1We)h`VTC&|x%x^KU%o-zRKm3-JEnm_*yea| zP`5DuP`1junv5sC`qw6J+)`(aH330Aq2yX5}e_S?XSDND@aG;+sKa{qNCmv2lr{OL}=T$PcP1NQq4=JT0 zuLqK#j+2$nef~V!WXkYFu=9?<)Zx@bUDZf70<8d9k-I%NQM;2dySUfgu!fdbuXY-1T)!SJDyd5LNdx-sAP{D=O5lT}n#Lo!yT^7nLnC~z>WT@4pWRz;B=tz$v zcY||Olls^lUaaR^&CSmj6J41l&=i`(C2pgF)!yaz&>gie#G7?5u?=n0BOlMxN!WO2 ze!k15SLMRT+ZsGju4$GutEg|2c$mM$9yDjW>>F4G9ki`DFR>p59^_pq7CfY{Zdut# zzgpd9ywNfAV#(TmFHwx}qoc3Na9XcwO5S}Vx4cwIwRpRpA}8E1#N=tr`Xln_Ml-a_ zLx*GyyEf&*k@%m-c{6t&;?S4K_#!DKNXE{SYjCdTb1G;`seHMpo;y)wA*x|#ORKqQnAe%oU6#2X4b(%*mf$*K>xvE` zUFw<6E_F<~Dh+j|#VR9>=T(&vn}-f2evGNVcfsoC&3t;F@%h;UExG54*U)lPR=AQ> zO=A_Ge{7lNUP*PxoOicQr$VxL$ut^iTt7(Z4>gZ2=2VQ-u)2aS5%e@l9qFZU7ZwA& zYyO8G5~5r|4mlamoRIAp!VJbMh%pYQX>bCVpag@RJAr?0LWs`=7UBI{7?7I>6SSJOp&` z3=`Lx-je&|Q=KA#r+$0OpFN)80m$SVCa#~o^N6E!4SmEF4%to)8Fkqwf6D%E#_rFzE}c4X#PLIet-iT zu-_X*fVKz*2e6_@=K<{RTYUSA^4&TBSUmt(b&#c?fDATZPlmBr=*{&^tm%Oz@lScF zUs$jPAXdIbI}coc+h8jr7*$sQRvZ9U6%d05E`SZz?_dAV$u9=ddiG;)15Y+=Qaggjh5dA%CPY&(X0$7sK35ca^)aQXKSd8BJBu?=bVA*uw08<1p`W6k?;Qf19*V)!8=+`fzKMzdLZt2N6 zh$nA&iB44v{~pL63_Sb=w@Db}Lk6+@7E=G-l#?^xlt4^*%KGo2IOVeWou^Nqj`#~u zX@l68$NpPTf#1}V!>~Y|pmGkdLHUiKe{oXWFTe`w1Wj|F2drQ+`{e8&O_0^F#{)Kq zzpqx%8~j<%7h@1Z75L8sUvSuba;q=Eb0~Qk45(gZBGzaN-_+RvG|} zl`6@e2e7|w@X6M$pbV=IWURmxf%<_LbG9`L%CJF-=K(EPj6T`)@&SlHldJ?bc>jsB z&bnwHffzZcdLGFBuDvIl_JKyvXMubwnAYsc$ix4tf6umT%|O64(l`%r!DaW!Ze^fH znTzJRfD96oIvc*AN7<0hdE%*Zard2J`Rh^lStG z>T*4>I7dX!Zt%%=0ieMcV@t5X3hHrx*QuO!|APi&Ds9dKS#a2VvH}`(&34$H6S&`k zG2mFUx1OCpvS%>(WKk%nq(aUfY_NXwxWB7z&ju-|Q|Rq<9+3W)u_w#gKoh>9&R~P{ z$DZI>iNFHnRK;~a4{X6_`N_f`(EAtDbFcyZZ7G~cRi71J(EHZ|uk(QSckMk{r2ra} zGx7!-sGx_z-&8ASMb{i;@xs424|Kt1_(>5rsB(qKA8asxTMOSg_pIQ864{-g^8ojZ z<{k^9U;I$+trGkrNC856X!wsp=;IpKlXCClr<^YLE(4zOO$hxXx%bxx{*&bJK%Jsk4~sDG1tvoinet&ip2$0(mJ_wEh- z_iuelS{rmTe|Mw**)KWyasD#%`XroP{CmG>2mK6 z8DN7J^vL>~<9s%H1ywq^2hy@GOz)9lCD7VRA=Q_(44z}<$2%=7NZdZ z6~d~39FYG1$h{M)zy|N1xvFn@m9wo?P{jp8-FaYoc1ur}d!xVk_dxzwWBs!e9#rl< z)A(CR{d-eRmwUH2{d*`*xom#t=^x6ye+Ct(+#9C#x1a*Qsi(`mQQN=<+e~6y4-vI1K0os-B%|*{n=bjP%4m|IS*99VDjm5Z?##lLHqqUIB}0Z zD-D3gN;4MD1K8g-_;k5<`A4w9`U5ZKY-<*jVP}@l16r^ceY)IxcLi+l{u5`Nbd#Uu2s-r3=HadAPWwgPnUb+pq&%A--0pVShIc?&mY+{7<{_i zI|c)6uzvHnze^9#1}Uhdq8s}>ApI?4PnUa-;eZX!AA5plB?3^n_k+vlfi3tfKV9x^ zjSn`Uzb%Cmsp_-B3wr-bCOQvzf7jmA<=zEXzy>PlVemKA%309`m3vE(o(H;MGyHV9 vw>BBrVE(oizH{zb!39;Wgi@Xdxc}N*Sh! None: + self._run_name = run_name + self._stamp = started_at.strftime("%Y%m%d_%H%M%S") + + def run_dir_for(self, source_file: Path) -> Path: + path = source_file.parent / "test_runs" / self._run_name / self._stamp + path.mkdir(parents=True, exist_ok=True) + return path + + +class ArtifactWriter: + def __init__(self, layout: ArtifactLayout) -> None: + self._layout = layout + + def write_case(self, result: V4CaseResult) -> Path: + run_dir = self._layout.run_dir_for(result.case.source_file) + stem = f"{result.case.source_file.stem}_{result.case.case_id}" + json_path = run_dir / f"{stem}.json" + md_path = run_dir / f"{stem}.md" + json_path.write_text(json.dumps(self._json_payload(result), ensure_ascii=False, indent=2), encoding="utf-8") + md_path.write_text(self._markdown_payload(result), encoding="utf-8") + return md_path + + def write_summaries(self, results: list[V4CaseResult]) -> list[Path]: + grouped: dict[Path, list[V4CaseResult]] = defaultdict(list) + for result in results: + grouped[self._layout.run_dir_for(result.case.source_file)].append(result) + paths: list[Path] = [] + for run_dir, items in sorted(grouped.items(), key=lambda item: item[0].as_posix()): + path = run_dir / "summary.md" + path.write_text(SummaryComposer().compose(items), encoding="utf-8") + paths.append(path) + return paths + + def _json_payload(self, result: V4CaseResult) -> dict: + return { + "meta": { + "case_id": result.case.case_id, + "component": result.case.component, + "source_file": result.case.source_file.as_posix(), + "passed": result.passed, + "mismatches": result.mismatches, + }, + "actual": result.actual, + "details": result.details, + } + + def _markdown_payload(self, result: V4CaseResult) -> str: + lines = [ + f"# {result.case.case_id}", + "", + f"- component: {result.case.component}", + f"- source_file: {result.case.source_file.as_posix()}", + f"- passed: {result.passed}", + "", + "## Query", + result.case.query, + "", + "## Actual", + "```json", + json.dumps(result.actual, ensure_ascii=False, indent=2), + "```", + "", + "## Details", + "```json", + json.dumps(result.details, ensure_ascii=False, indent=2), + "```", + "", + "## Mismatches", + *([f"- {item}" for item in result.mismatches] or ["- none"]), + ] + return "\n".join(lines) + + +class SummaryComposer: + def compose(self, results: list[V4CaseResult]) -> str: + passed = sum(1 for item in results if item.passed) + lines = [ + "# pipeline_setup_v4 summary", + "", + f"Passed: {passed}/{len(results)}", + "", + "| Case | Component | Query | Intent | Sub-intent | Pass |", + "|------|-----------|-------|--------|------------|------|", + ] + for item in results: + lines.append( + f"| {item.case.case_id} | {item.case.component} | {self._cell(item.case.query)} | " + f"{item.actual.get('intent') or '—'} | {item.actual.get('sub_intent') or '—'} | " + f"{'✓' if item.passed else '✗'} |" + ) + failures = [item for item in results if not item.passed] + if failures: + lines.extend(["", "## Failures"]) + for item in failures: + lines.append(f"- **{item.case.case_id}**: {'; '.join(item.mismatches)}") + return "\n".join(lines) + + def _cell(self, text: str, limit: int = 140) -> str: + compact = " ".join(text.split()).replace("|", "\\|") + if len(compact) <= limit: + return compact + return compact[: limit - 1].rstrip() + "…" diff --git a/tests/pipeline_setup_v4/core/case_loader.py b/tests/pipeline_setup_v4/core/case_loader.py new file mode 100644 index 0000000..ba7a2ae --- /dev/null +++ b/tests/pipeline_setup_v4/core/case_loader.py @@ -0,0 +1,59 @@ +from __future__ import annotations + +from pathlib import Path + +import yaml + +from tests.pipeline_setup_v4.core.models import CaseExpectations, RouterExpectation, V4Case + + +class CaseDirectoryLoader: + def load(self, cases_dir: Path) -> list[V4Case]: + if cases_dir.is_file(): + return self._load_file(cases_dir) + files = sorted(path for path in cases_dir.rglob("*.yaml") if path.is_file()) + if not files: + raise ValueError(f"No YAML case files found in: {cases_dir}") + cases: list[V4Case] = [] + for path in files: + cases.extend(self._load_file(path)) + return cases + + def _load_file(self, path: Path) -> list[V4Case]: + payload = yaml.safe_load(path.read_text(encoding="utf-8")) or {} + if not isinstance(payload, dict): + raise ValueError(f"Invalid case file {path}: expected mapping") + defaults = dict(payload.get("defaults") or {}) + items = payload.get("cases") or [] + if not isinstance(items, list): + raise ValueError(f"Invalid case file {path}: `cases` must be a list") + return [self._to_case(path, raw, defaults) for raw in items] + + def _to_case(self, path: Path, raw: object, defaults: dict) -> V4Case: + if not isinstance(raw, dict): + raise ValueError(f"Invalid case in {path}: expected object") + case_id = str(raw.get("id") or "").strip() + component = str(raw.get("component") or defaults.get("component") or "").strip() + query = str(raw.get("query") or "").strip() + if not case_id or not component or not query: + raise ValueError(f"Invalid case in {path}: `id`, `component`, `query` are required") + expected = dict(raw.get("expected") or {}) + return V4Case( + case_id=case_id, + component=component, # type: ignore[arg-type] + query=query, + source_file=path, + expectations=self._to_expectations(expected), + notes=str(raw.get("notes") or ""), + tags=tuple(str(item).strip() for item in raw.get("tags") or [] if str(item).strip()), + ) + + def _to_expectations(self, raw: dict) -> CaseExpectations: + router = dict(raw.get("router") or {}) + return CaseExpectations( + router=RouterExpectation( + domain=str(router.get("domain") or "").strip() or None, + intent=str(router.get("intent") or "").strip() or None, + sub_intent=str(router.get("sub_intent") or "").strip() or None, + ) + ) diff --git a/tests/pipeline_setup_v4/core/models.py b/tests/pipeline_setup_v4/core/models.py new file mode 100644 index 0000000..2a8c27c --- /dev/null +++ b/tests/pipeline_setup_v4/core/models.py @@ -0,0 +1,46 @@ +from __future__ import annotations + +from dataclasses import dataclass, field +from pathlib import Path +from typing import Literal + + +ComponentKind = Literal["process_v2_intent_router"] + + +@dataclass(slots=True, frozen=True) +class RouterExpectation: + domain: str | None = None + intent: str | None = None + sub_intent: str | None = None + + +@dataclass(slots=True, frozen=True) +class CaseExpectations: + router: RouterExpectation = RouterExpectation() + + +@dataclass(slots=True, frozen=True) +class V4Case: + case_id: str + component: ComponentKind + query: str + source_file: Path + expectations: CaseExpectations = CaseExpectations() + notes: str = "" + tags: tuple[str, ...] = () + + +@dataclass(slots=True, frozen=True) +class ExecutionPayload: + actual: dict + details: dict + + +@dataclass(slots=True) +class V4CaseResult: + case: V4Case + actual: dict + details: dict + passed: bool + mismatches: list[str] = field(default_factory=list) diff --git a/tests/pipeline_setup_v4/core/runner.py b/tests/pipeline_setup_v4/core/runner.py new file mode 100644 index 0000000..b87b9a5 --- /dev/null +++ b/tests/pipeline_setup_v4/core/runner.py @@ -0,0 +1,34 @@ +from __future__ import annotations + +from datetime import datetime +from pathlib import Path + +from tests.pipeline_setup_v4.core.artifacts import ArtifactLayout, ArtifactWriter +from tests.pipeline_setup_v4.core.case_loader import CaseDirectoryLoader +from tests.pipeline_setup_v4.core.models import V4CaseResult +from tests.pipeline_setup_v4.core.validators import CaseValidator +from tests.pipeline_setup_v4.executors.registry import ExecutorRegistry + + +class V4Runner: + def __init__(self, cases_dir: Path, *, run_name: str) -> None: + self._cases_dir = cases_dir + self._validator = CaseValidator() + self._executors = ExecutorRegistry() + self._writer = ArtifactWriter(ArtifactLayout(run_name=run_name, started_at=datetime.now())) + + def run(self) -> tuple[list[V4CaseResult], list[Path]]: + results: list[V4CaseResult] = [] + for case in CaseDirectoryLoader().load(self._cases_dir): + payload = self._executors.execute(case.component, case) + mismatches = self._validator.validate(case, payload.actual) + result = V4CaseResult( + case=case, + actual=payload.actual, + details=payload.details, + passed=not mismatches, + mismatches=mismatches, + ) + self._writer.write_case(result) + results.append(result) + return results, self._writer.write_summaries(results) diff --git a/tests/pipeline_setup_v4/core/validators.py b/tests/pipeline_setup_v4/core/validators.py new file mode 100644 index 0000000..e17f269 --- /dev/null +++ b/tests/pipeline_setup_v4/core/validators.py @@ -0,0 +1,17 @@ +from __future__ import annotations + +from tests.pipeline_setup_v4.core.models import V4Case + + +class CaseValidator: + def validate(self, case: V4Case, actual: dict) -> list[str]: + mismatches: list[str] = [] + expected = case.expectations.router + self._check(expected.domain, actual.get("domain"), "domain", mismatches) + self._check(expected.intent, actual.get("intent"), "intent", mismatches) + self._check(expected.sub_intent, actual.get("sub_intent"), "sub_intent", mismatches) + return mismatches + + def _check(self, expected: str | None, actual: object, label: str, mismatches: list[str]) -> None: + if expected is not None and expected != actual: + mismatches.append(f"{label}: expected {expected}, got {actual}") diff --git a/tests/pipeline_setup_v4/executors/__init__.py b/tests/pipeline_setup_v4/executors/__init__.py new file mode 100644 index 0000000..9486c89 --- /dev/null +++ b/tests/pipeline_setup_v4/executors/__init__.py @@ -0,0 +1 @@ +"""Component executors for pipeline_setup_v4.""" diff --git a/tests/pipeline_setup_v4/executors/process_v2_router_executor.py b/tests/pipeline_setup_v4/executors/process_v2_router_executor.py new file mode 100644 index 0000000..74e7d2d --- /dev/null +++ b/tests/pipeline_setup_v4/executors/process_v2_router_executor.py @@ -0,0 +1,121 @@ +from __future__ import annotations + +import json +from dataclasses import asdict + +from app.core.agent.processes.v2 import V2IntentRouter +from tests.pipeline_setup_v4.core.models import ExecutionPayload, V4Case + + +class _KeywordLlm: + _FILE_MARKERS = ( + "в каком файле", + "в каком документе", + "в каких файлах", + "какие файлы относятся", + "покажи файл", + "покажи документ", + "где описано", + "где описан", + "где описана", + "где описаны", + "где находится", + "найди файл", + "найди файлы", + ) + _DOC_MARKERS = ( + "документац", + "endpoint", + "эндпоинт", + "архитект", + "процесс", + "сущност", + "worker", + "цикл отправки уведомлений", + "ручная отправка сообщения", + "runtime health", + "здоров", + "runtime", + "health", + "telegram", + "api", + "docs/", + "/health", + "/send", + "/actions/{action}", + ) + _GENERAL_MARKERS = ( + "что это за сервис", + "для чего нужен", + "какую задачу решает", + "общий обзор", + "что входит в документацию", + "какие документы стоит читать сначала", + "дай короткое summary", + "что тут есть кроме api", + "как в целом устроено приложение", + "какие основные части есть", + "как сервис взаимодействует с telegram в целом", + "что это", + "для чего", + ) + + def generate(self, _prompt_name: str, user_input: str, **_kwargs) -> str: + payload = json.loads(user_input) + query = str(payload.get("normalized_query") or "").lower() + route = self._select(query) + return json.dumps(route, ensure_ascii=False) + + def _select(self, query: str) -> dict[str, object]: + if any(marker in query for marker in self._FILE_MARKERS) or ("дока" in query and "покажи" in query): + return self._route("DOCS", "DOC_EXPLAIN", "FIND_FILES", "file lookup") + if any(marker in query for marker in self._GENERAL_MARKERS): + return self._route("GENERAL", "GENERAL_QA", "SUMMARY", "general overview") + if any(marker in query for marker in self._DOC_MARKERS): + return self._route("DOCS", "DOC_EXPLAIN", "SUMMARY", "docs topic") + return self._route("GENERAL", "GENERAL_QA", "SUMMARY", "default general") + + def _route(self, domain: str, intent: str, subintent: str, reason: str) -> dict[str, object]: + return { + "routing_domain": domain, + "intent": intent, + "subintent": subintent, + "confidence": 0.93, + "reason_short": reason, + } + + +class ProcessV2IntentRouterExecutor: + def __init__(self) -> None: + self._router = V2IntentRouter(llm=_KeywordLlm(), enable_llm_disambiguation=True) + + def execute(self, case: V4Case) -> ExecutionPayload: + route = self._router.route(case.query) + route_dump = asdict(route) + actual = { + "domain": route.routing_domain, + "intent": route.intent, + "sub_intent": route.subintent, + "routing_mode": route.routing_mode, + "llm_router_used": route.llm_router_used, + "confidence": route.confidence, + } + details = { + "query": case.query, + "route": route_dump, + "pipeline_steps": [ + { + "step": "intent_router", + "input": {"query": case.query}, + "output": { + "domain": route.routing_domain, + "intent": route.intent, + "sub_intent": route.subintent, + "reason_short": route.reason_short, + "target_terms": list(route.target_terms), + "anchors": route_dump.get("anchors") or {}, + }, + } + ], + } + return ExecutionPayload(actual=actual, details=details) diff --git a/tests/pipeline_setup_v4/executors/registry.py b/tests/pipeline_setup_v4/executors/registry.py new file mode 100644 index 0000000..76a298b --- /dev/null +++ b/tests/pipeline_setup_v4/executors/registry.py @@ -0,0 +1,18 @@ +from __future__ import annotations + +from tests.pipeline_setup_v4.executors.process_v2_router_executor import ProcessV2IntentRouterExecutor + + +class ExecutorRegistry: + def __init__(self) -> None: + self._router_executor: ProcessV2IntentRouterExecutor | None = None + + def execute(self, component: str, case) -> object: + if component == "process_v2_intent_router": + return self._router().execute(case) + raise ValueError(f"Unsupported component: {component}") + + def _router(self) -> ProcessV2IntentRouterExecutor: + if self._router_executor is None: + self._router_executor = ProcessV2IntentRouterExecutor() + return self._router_executor diff --git a/tests/pipeline_setup_v4/run.py b/tests/pipeline_setup_v4/run.py new file mode 100644 index 0000000..e52de5f --- /dev/null +++ b/tests/pipeline_setup_v4/run.py @@ -0,0 +1,40 @@ +from __future__ import annotations + +import argparse +import sys +from pathlib import Path + +_agent_root = Path(__file__).resolve().parents[2] +if str(_agent_root) not in sys.path: + sys.path.insert(0, str(_agent_root)) +_src = _agent_root / "src" +if _src.exists() and str(_src) not in sys.path: + sys.path.insert(0, str(_src)) + +from tests.pipeline_setup_v4.core.runner import V4Runner +from tests.pipeline_setup_v4.shared.env_loader import load_pipeline_setup_env + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(description="Run isolated component cases for pipeline_setup_v4") + parser.add_argument("--cases-dir", required=True, help="Directory or file with YAML case files") + parser.add_argument("--run-name", default="manual_run", help="Run directory name inside cases/*/test_runs") + ns = parser.parse_args(argv) + + cases_dir = Path(str(ns.cases_dir)).expanduser().resolve() + load_pipeline_setup_env(start_dir=Path(__file__).resolve().parent) + runner = V4Runner(cases_dir=cases_dir, run_name=str(ns.run_name).strip() or "manual_run") + print(f"Cases dir: {cases_dir}") + results, summary_paths = runner.run() + passed = sum(1 for item in results if item.passed) + print(f"Passed: {passed}/{len(results)}") + for path in summary_paths: + print(f"Summary: {path}") + for item in results: + if not item.passed: + print(f"FAIL {item.case.case_id}: {'; '.join(item.mismatches)}") + return 0 if passed == len(results) else 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/pipeline_setup_v4/shared/__init__.py b/tests/pipeline_setup_v4/shared/__init__.py new file mode 100644 index 0000000..67e4ac4 --- /dev/null +++ b/tests/pipeline_setup_v4/shared/__init__.py @@ -0,0 +1 @@ +"""Shared helpers for pipeline_setup_v4.""" diff --git a/tests/pipeline_setup_v4/shared/env_loader.py b/tests/pipeline_setup_v4/shared/env_loader.py new file mode 100644 index 0000000..6f9557e --- /dev/null +++ b/tests/pipeline_setup_v4/shared/env_loader.py @@ -0,0 +1,40 @@ +from __future__ import annotations + +import os +from pathlib import Path + +from app.core.shared.config import load_workspace_env + + +def load_pipeline_setup_env(start_dir: str | Path | None = None) -> list[Path]: + base = Path(start_dir or Path.cwd()).resolve() + loaded = load_workspace_env(start_dir=base) + env_path = _find_v4_root(base) / ".env" + if env_path.is_file(): + _apply_env_file(env_path) + loaded.append(env_path) + return loaded + + +def _find_v4_root(base: Path) -> Path: + for directory in (base, *base.parents): + if directory.name == "pipeline_setup_v4" and (directory / "__init__.py").is_file(): + return directory + raise RuntimeError(f"Unable to locate tests/pipeline_setup_v4 root from: {base}") + + +def _apply_env_file(path: Path) -> None: + for raw_line in path.read_text(encoding="utf-8").splitlines(): + line = raw_line.strip() + if not line or line.startswith("#") or "=" not in line: + continue + key, raw_value = line.split("=", 1) + name = key.removeprefix("export ").strip() + if name: + os.environ[name] = _normalize_value(raw_value.strip()) + + +def _normalize_value(value: str) -> str: + if len(value) >= 2 and value[0] == value[-1] and value[0] in {"'", '"'}: + return value[1:-1] + return value diff --git a/tests/unit_tests/agent/test_application_startup.py b/tests/unit_tests/agent/test_application_startup.py new file mode 100644 index 0000000..92d0244 --- /dev/null +++ b/tests/unit_tests/agent/test_application_startup.py @@ -0,0 +1,19 @@ +from __future__ import annotations + +import app.core.application as application_module + + +def test_startup_keeps_backend_alive_when_database_bootstrap_fails(monkeypatch) -> None: + def fail_bootstrap(*_args, **_kwargs) -> None: + raise RuntimeError("db down") + + monkeypatch.setattr(application_module, "bootstrap_database", fail_bootstrap) + + app = application_module.ModularApplication() + + app.startup() + + health = app.health_payload() + assert health["status"] == "degraded" + assert health["reason"] == "database_unavailable" + assert "db down" in health["details"] diff --git a/tests/unit_tests/agent/test_gigachat_client_retry.py b/tests/unit_tests/agent/test_gigachat_client_retry.py index 288dc46..ea1e737 100644 --- a/tests/unit_tests/agent/test_gigachat_client_retry.py +++ b/tests/unit_tests/agent/test_gigachat_client_retry.py @@ -1,7 +1,7 @@ import requests -from app.modules.shared.gigachat.client import GigaChatClient -from app.modules.shared.gigachat.settings import GigaChatSettings +from app.core.shared.gigachat.client import GigaChatClient +from app.core.shared.gigachat.settings import GigaChatSettings class _FakeTokenProvider: diff --git a/tests/unit_tests/agent/test_llm_service_logging.py b/tests/unit_tests/agent/test_llm_service_logging.py index 6cb3fa3..090a172 100644 --- a/tests/unit_tests/agent/test_llm_service_logging.py +++ b/tests/unit_tests/agent/test_llm_service_logging.py @@ -1,6 +1,6 @@ import logging -from app.modules.agent.llm.service import AgentLlmService +from app.core.agent.llm.service import AgentLlmService class _FakeClient: @@ -19,7 +19,7 @@ class _FakePrompts: def test_llm_service_logs_input_and_output_for_graph_context(caplog) -> None: service = AgentLlmService(_FakeClient(), _FakePrompts()) - with caplog.at_level(logging.WARNING, logger="app.modules.agent.llm.service"): + with caplog.at_level(logging.WARNING, logger="app.core.agent.llm.service"): result = service.generate("general_answer", "User input", log_context="graph.default.answer") assert result == "LLM output" diff --git a/tests/unit_tests/agent/test_logging_setup.py b/tests/unit_tests/agent/test_logging_setup.py index 0521b56..0c9d1e1 100644 --- a/tests/unit_tests/agent/test_logging_setup.py +++ b/tests/unit_tests/agent/test_logging_setup.py @@ -1,6 +1,6 @@ import logging -from app.core.logging_setup import ScrubbingFormatter +from app.infra.logging_setup import ScrubbingFormatter def test_scrubbing_formatter_redacts_identifiers_and_adds_blank_line() -> None: diff --git a/tests/unit_tests/agent/test_repo_webhook_service.py b/tests/unit_tests/agent/test_repo_webhook_service.py deleted file mode 100644 index fe64d28..0000000 --- a/tests/unit_tests/agent/test_repo_webhook_service.py +++ /dev/null @@ -1,98 +0,0 @@ -from __future__ import annotations - -from app.modules.rag.webhook_service import RepoWebhookService - - -class FakeStoryWriter: - def __init__(self) -> None: - self.calls: list[dict] = [] - - def record_story_commit(self, **kwargs) -> None: - self.calls.append(kwargs) - - -class FakeCacheWriter: - def __init__(self) -> None: - self.calls: list[dict] = [] - - def record_repo_cache(self, **kwargs) -> None: - self.calls.append(kwargs) - - -def test_gitea_webhook_binds_story() -> None: - writer = FakeStoryWriter() - cache = FakeCacheWriter() - service = RepoWebhookService(writer, cache) - - result = service.process( - provider="gitea", - payload={ - "repository": {"full_name": "acme/proj"}, - "ref": "refs/heads/feature/AAAA-1234", - "pusher": {"username": "alice"}, - "commits": [ - { - "id": "abc123", - "message": "FEAT-1 update docs", - "added": ["docs/new.md"], - "modified": ["docs/api.md"], - "removed": [], - } - ], - }, - ) - - assert result["accepted"] is True - assert result["story_bound"] is True - assert result["story_id"] == "FEAT-1" - assert result["cache_recorded"] is True - assert len(writer.calls) == 1 - assert len(cache.calls) == 1 - assert writer.calls[0]["project_id"] == "acme/proj" - - -def test_webhook_without_story_id_is_non_fatal() -> None: - writer = FakeStoryWriter() - cache = FakeCacheWriter() - service = RepoWebhookService(writer, cache) - - result = service.process( - provider="bitbucket", - payload={ - "repository": {"full_name": "acme/proj"}, - "push": { - "changes": [ - { - "new": { - "name": "feature/no-story", - "target": {"hash": "abc123", "message": "update docs"}, - } - } - ] - }, - }, - ) - - assert result["accepted"] is True - assert result["story_bound"] is False - assert result["cache_recorded"] is True - assert len(cache.calls) == 1 - assert writer.calls == [] - - -def test_provider_autodetect_by_headers() -> None: - writer = FakeStoryWriter() - service = RepoWebhookService(writer) - - result = service.process( - headers={"X-Gitea-Event": "push"}, - payload={ - "repository": {"full_name": "acme/proj"}, - "ref": "refs/heads/feature/AAAA-1234", - "commits": [{"id": "abc123", "message": "AAAA-1234 update"}], - }, - ) - - assert result["accepted"] is True - assert result["story_bound"] is True - assert result["story_id"] == "AAAA-1234" diff --git a/tests/unit_tests/agent/test_session_service.py b/tests/unit_tests/agent/test_session_service.py new file mode 100644 index 0000000..20bc4d7 --- /dev/null +++ b/tests/unit_tests/agent/test_session_service.py @@ -0,0 +1,26 @@ +from __future__ import annotations + +from app.infra.exceptions import AppError +from app.core.api.application.session_service import SessionService +from app.core.api.infrastructure.ids.session_id_factory import SessionIdFactory +from app.core.api.infrastructure.stores.in_memory_session_store import InMemorySessionStore +import pytest + + +def test_create_session_allows_binding_rag_at_creation_time() -> None: + service = SessionService(store=InMemorySessionStore(), ids=SessionIdFactory()) + + session = service.create("rag_123") + + assert session.session_id.startswith("as_") + assert session.active_rag_session_id == "rag_123" + assert session.messages == [] + assert session.conversation_state.turn_index == 0 + + +def test_get_missing_session_raises_not_found() -> None: + service = SessionService(store=InMemorySessionStore(), ids=SessionIdFactory()) + with pytest.raises(AppError) as exc: + service.get("missing-session") + + assert exc.value.code == "session_not_found" diff --git a/tests/unit_tests/agent/test_v2_evidence_ranking.py b/tests/unit_tests/agent/test_v2_evidence_ranking.py new file mode 100644 index 0000000..c1032da --- /dev/null +++ b/tests/unit_tests/agent/test_v2_evidence_ranking.py @@ -0,0 +1,80 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.evidence.assembler import DocsEvidenceAssembler +from app.core.agent.processes.v2.models import V2Domain, V2Intent, V2RouteAnchors, V2RouteResult, V2Subintent + + +def _route(*, hints: list[str], terms: list[str], subintent: str = V2Subintent.SUMMARY) -> V2RouteResult: + return V2RouteResult( + routing_domain=V2Domain.DOCS, + intent=V2Intent.DOC_EXPLAIN, + subintent=subintent, + user_query="q", + normalized_query="q", + target_terms=terms, + anchors=V2RouteAnchors(target_doc_hints=hints, endpoint_paths=["/health"] if "/health" in terms else []), + ) + + +def test_target_doc_hint_is_hard_boosted_over_readme() -> None: + rows = [ + { + "path": "docs/README.md", + "title": "README", + "content": "", + "layer": "D1_DOCUMENT_CATALOG", + "metadata": {"summary_text": "index", "document_id": "docs.readme"}, + }, + { + "path": "docs/api/health-endpoint.md", + "title": "Health endpoint", + "content": "", + "layer": "D1_DOCUMENT_CATALOG", + "metadata": {"summary_text": "health summary", "document_id": "api.health"}, + }, + ] + route = _route( + hints=["docs/api/health-endpoint.md"], + terms=["/health", "health"], + ) + + docs = DocsEvidenceAssembler().assemble_summaries(rows, route) + + assert docs[0].path == "docs/api/health-endpoint.md" + assert docs[0].score_breakdown["target_doc_boost"] >= 1000 + + +def test_find_files_prefers_exact_path_match() -> None: + rows = [ + { + "path": "docs/architecture/telegram-notify-app-overview.md", + "title": "Overview", + "content": "overview", + "layer": "D1_DOCUMENT_CATALOG", + "metadata": {"document_id": "arch"}, + }, + { + "path": "docs/domains/runtime-health-entity.md", + "title": "Runtime health", + "content": "runtime health", + "layer": "D1_DOCUMENT_CATALOG", + "metadata": {"document_id": "domain.runtime"}, + }, + ] + route = V2RouteResult( + routing_domain=V2Domain.DOCS, + intent=V2Intent.DOC_EXPLAIN, + subintent=V2Subintent.FIND_FILES, + user_query="Где находится runtime health?", + normalized_query="Где находится runtime health?", + target_terms=["runtime", "health"], + anchors=V2RouteAnchors( + target_doc_hints=["docs/domains/runtime-health-entity.md"], + matched_aliases=["runtime-health-entity"], + ), + ) + + files = DocsEvidenceAssembler().assemble_files(rows, route) + + assert files[0].path == "docs/domains/runtime-health-entity.md" + assert files[0].match_reason in {"exact_path", "alias_match"} diff --git a/tests/unit_tests/agent/test_v2_intent_router.py b/tests/unit_tests/agent/test_v2_intent_router.py new file mode 100644 index 0000000..d73f0c5 --- /dev/null +++ b/tests/unit_tests/agent/test_v2_intent_router.py @@ -0,0 +1,98 @@ +from __future__ import annotations + +import json + +from app.core.agent.processes.v2 import V2IntentRouter + + +class FakeLlm: + def __init__(self, response: str, *, fail: bool = False) -> None: + self.response = response + self.fail = fail + self.calls: list[tuple[str, str]] = [] + + def generate(self, prompt_name: str, user_input: str, **_kwargs) -> str: + self.calls.append((prompt_name, user_input)) + if self.fail: + raise RuntimeError("llm unavailable") + return self.response + + +def _llm_response(domain: str, intent: str, subintent: str, *, confidence: float = 0.9, reason: str = "ok") -> str: + return json.dumps( + { + "routing_domain": domain, + "intent": intent, + "subintent": subintent, + "confidence": confidence, + "reason_short": reason, + }, + ensure_ascii=False, + ) + + +def test_router_uses_llm_as_default_selector() -> None: + llm = FakeLlm(_llm_response("DOCS", "DOC_EXPLAIN", "FIND_FILES", reason="file request")) + + result = V2IntentRouter(llm=llm).route("В каком файле описан RuntimeHealth?") + + assert result.subintent == "FIND_FILES" + assert result.routing_mode == "llm_default" + assert result.llm_router_used is True + assert result.confidence > 0.8 + assert len(llm.calls) == 1 + + +def test_router_falls_back_when_llm_returns_invalid_enum() -> None: + llm = FakeLlm(_llm_response("DOCS", "DOC_EXPLAIN", "MADE_UP")) + + result = V2IntentRouter(llm=llm).route("В каком документе описан runtime health?") + + assert result.routing_domain == "DOCS" + assert result.subintent == "FIND_FILES" + assert result.routing_mode == "llm_fallback" + assert result.llm_router_used is True + + +def test_router_falls_back_to_general_summary_when_llm_fails() -> None: + result = V2IntentRouter(llm=FakeLlm("{}", fail=True)).route("Расскажи что важно") + + assert result.subintent == "SUMMARY" + assert result.routing_mode == "llm_fallback" + assert result.llm_router_used is True + assert result.intent == "GENERAL_QA" + + +def test_router_keeps_endpoint_anchor_and_excludes_it_from_file_names() -> None: + result = V2IntentRouter(llm=FakeLlm(_llm_response("DOCS", "DOC_EXPLAIN", "SUMMARY"))).route( + "Что делает endpoint /send?" + ) + + assert result.anchors.endpoint_paths == ["/send"] + assert "/send" not in result.anchors.file_names + + +def test_router_cleans_target_terms_with_lowercase_rules() -> None: + result = V2IntentRouter(llm=FakeLlm(_llm_response("DOCS", "DOC_EXPLAIN", "FIND_FILES"))).route( + "Покажи где описан RuntimeHealth и /health" + ) + + assert "покажи" not in result.target_terms + assert "где" not in result.target_terms + assert "runtimehealth" in result.target_terms + assert "/health" in result.target_terms + + +def test_router_detects_doc_like_file_names_only() -> None: + result = V2IntentRouter(llm=FakeLlm(_llm_response("DOCS", "DOC_EXPLAIN", "FIND_FILES"))).route( + "Покажи document docs/architecture/overview.md и runtime_health" + ) + + assert "docs/architecture/overview.md" in result.anchors.file_names + assert "runtime_health" not in result.anchors.file_names + + +def test_router_reduces_confidence_for_short_vague_query() -> None: + result = V2IntentRouter(llm=FakeLlm(_llm_response("GENERAL", "GENERAL_QA", "SUMMARY", confidence=0.8))).route("Что это?") + + assert result.confidence < 0.8 diff --git a/tests/unit_tests/agent/test_v2_intent_router_extraction.py b/tests/unit_tests/agent/test_v2_intent_router_extraction.py new file mode 100644 index 0000000..27b60e6 --- /dev/null +++ b/tests/unit_tests/agent/test_v2_intent_router_extraction.py @@ -0,0 +1,67 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.intent_router.modules.anchors import V2AnchorExtractor +from app.core.agent.processes.v2.intent_router.modules.target_terms import V2TargetTermsExtractor + + +def test_target_terms_keeps_only_endpoint_for_short_explain_query() -> None: + analysis = V2TargetTermsExtractor().extract("Кратко объясни как работает /health") + + assert analysis.target_terms == ["/health"] + + +def test_target_terms_keeps_domain_terms_without_question_words() -> None: + analysis = V2TargetTermsExtractor().extract("Что делает runtime health") + + assert analysis.target_terms == ["runtime", "health"] + + +def test_target_terms_keeps_only_endpoint_for_file_marker_query() -> None: + analysis = V2TargetTermsExtractor().extract("В каком файле описан /health?") + + assert analysis.target_terms == ["/health"] + + +def test_target_terms_drops_noisy_filler_words() -> None: + analysis = V2TargetTermsExtractor().extract("Где там дока про health, покажи плз") + + assert analysis.target_terms == ["health"] + + +def test_target_terms_keeps_api_and_explicit_endpoint() -> None: + analysis = V2TargetTermsExtractor().extract("Нужен краткий док-саммари по api /send") + + assert analysis.target_terms == ["/send", "api"] + + +def test_target_terms_keeps_identifier_like_token() -> None: + analysis = V2TargetTermsExtractor().extract("Что делает telegram_notify?") + + assert analysis.target_terms == ["telegram_notify"] + + +def test_target_terms_rejects_broken_path_like_token() -> None: + analysis = V2TargetTermsExtractor().extract("Опиши /actions/{action") + + assert analysis.target_terms == [] + + +def test_file_names_accepts_real_doc_path() -> None: + terms = V2TargetTermsExtractor().extract("docs/api/health.md") + anchors = V2AnchorExtractor().extract("docs/api/health.md", terms).anchors + + assert anchors.file_names == ["docs/api/health.md"] + + +def test_file_names_rejects_endpoint_path() -> None: + terms = V2TargetTermsExtractor().extract("/health") + anchors = V2AnchorExtractor().extract("/health", terms).anchors + + assert anchors.file_names == [] + + +def test_file_names_rejects_identifier_like_token() -> None: + terms = V2TargetTermsExtractor().extract("telegram_notify") + anchors = V2AnchorExtractor().extract("telegram_notify", terms).anchors + + assert anchors.file_names == [] diff --git a/tests/unit_tests/agent/test_v2_process.py b/tests/unit_tests/agent/test_v2_process.py new file mode 100644 index 0000000..bd97774 --- /dev/null +++ b/tests/unit_tests/agent/test_v2_process.py @@ -0,0 +1,286 @@ +from __future__ import annotations + +import asyncio +from dataclasses import dataclass + +from app.core.agent.processes.v2 import V2IntentRouter, V2Process +from app.core.agent.processes.v2.retrieval.target_doc_seeding import normalize_doc_path +from app.core.agent.processes.v2.evidence.assembler import DocsEvidenceAssembler +from app.core.agent.processes.v2.evidence.gate import DocsEvidenceGate +from app.core.agent.processes.v2.retrieval.policy_resolver import V2RetrievalPolicyResolver +from app.core.agent.runtime.execution_context import RuntimeExecutionContext +from app.core.api.domain.models.agent_request import AgentRequest +from app.core.api.domain.models.agent_session import AgentSession +from app.schemas.orchestration import RequestExecutionStatus + + +class FakePublisher: + async def publish_status(self, *_args, **_kwargs) -> None: + return None + + async def publish_user(self, *_args, **_kwargs) -> None: + return None + + +class FakeTrace: + def __init__(self) -> None: + self.events: list[tuple[str, str, dict | None]] = [] + + def module(self, _name: str) -> "FakeTrace": + return self + + def log(self, title, payload=None, **_kwargs) -> None: + self.events.append(("module", str(title), payload)) + + +class FakeLlm: + def __init__(self, answer: str) -> None: + self.answer = answer + self.calls: list[tuple[str, str]] = [] + + def generate(self, prompt_name: str, user_input: str, **_kwargs) -> str: + self.calls.append((prompt_name, user_input)) + return self.answer + + +@dataclass(slots=True) +class FakeRagAdapter: + """Имитирует сырые строки из RagSessionRetriever для summary / find_files.""" + + summary_rows: list[dict] + file_rows: list[dict] + + async def fetch_rows(self, _rag_session_id: str, _query_text: str, plan) -> list[dict]: + if "find_files" in str(plan.profile) or str(plan.profile) == "file_lookup": + return list(self.file_rows) + return list(self.summary_rows) + + async def fetch_exact_paths(self, _rag_session_id: str, *, paths: list[str], layers: list[str] | None = None) -> list[dict]: + pool = [*self.summary_rows, *self.file_rows] + want = {normalize_doc_path(p) for p in paths} + return [row for row in pool if normalize_doc_path(str(row.get("path") or "")) in want] + + async def fetch_chunks_by_path_substrings( + self, + _rag_session_id: str, + *, + path_needles: list[str], + layers: list[str] | None = None, + limit: int = 200, + ) -> list[dict]: + del layers, limit + pool = [*self.summary_rows, *self.file_rows] + return [row for row in pool if any(needle in str(row.get("path") or "") for needle in path_needles)] + + +_SUMMARY_ROWS = [ + { + "path": "docs/api/health.md", + "title": "Health endpoint", + "content": "", + "layer": "D1_DOCUMENT_CATALOG", + "metadata": { + "summary_text": "Endpoint /health возвращает агрегированный статус runtime.", + "document_id": "api.health", + "title": "Health endpoint", + }, + } +] + +_FILE_ROWS = [ + { + "path": "docs/domains/runtime-health.md", + "title": "Runtime health", + "layer": "D3_ENTITY_CATALOG", + "content": "x", + "metadata": { + "entity_name": "RuntimeHealth", + "document_id": "domain.runtime_health", + }, + } +] + + +def _v2_process(llm: FakeLlm, adapter: FakeRagAdapter, *, workflow_llm_enabled: bool = True) -> V2Process: + return V2Process( + llm=llm, + policy_resolver=V2RetrievalPolicyResolver(), + rag_adapter=adapter, + evidence_assembler=DocsEvidenceAssembler(), + evidence_gate=DocsEvidenceGate(), + router=V2IntentRouter(), + workflow_llm_enabled=workflow_llm_enabled, + ) + + +def _context(message: str, *, rag_session_id: str | None = "rag-1") -> RuntimeExecutionContext: + request = AgentRequest( + request_id="req-1", + session_id="sess-1", + message=message, + process_version="v2", + status=RequestExecutionStatus.RUNNING, + created_at=AgentRequest.create("req-x", "sess-x", "x", "v2").created_at, + ) + session = AgentSession.create("sess-1", rag_session_id) + return RuntimeExecutionContext( + request=request, + session=session, + publisher=FakePublisher(), + trace=FakeTrace(), + ) + + +def test_v2_process_runs_summary_flow() -> None: + llm = FakeLlm("Краткое объяснение по документации.") + adapter = FakeRagAdapter(summary_rows=_SUMMARY_ROWS, file_rows=[]) + process = _v2_process(llm, adapter) + + result = asyncio.run(process.run(_context("Объясни /health в документации"))) + + assert result.answer == "Краткое объяснение по документации." + assert llm.calls + assert "docs/api/health.md" in llm.calls[0][1] + + +def test_v2_process_runs_find_files_flow_without_llm() -> None: + llm = FakeLlm("should not be used") + adapter = FakeRagAdapter(summary_rows=[], file_rows=_FILE_ROWS) + process = _v2_process(llm, adapter) + + result = asyncio.run(process.run(_context("В каком файле описан RuntimeHealth?"))) + + assert "docs/domains/runtime-health.md" in result.answer + assert llm.calls == [] + + +def test_v2_process_find_files_uses_deterministic_gate_mode() -> None: + llm = FakeLlm("unused") + adapter = FakeRagAdapter(summary_rows=[], file_rows=_FILE_ROWS) + process = _v2_process(llm, adapter) + runtime = _context("В каком документе описан runtime health?") + + asyncio.run(process.run(runtime)) + + pipeline_events = [payload for _, title, payload in runtime.trace.events if title == "evidence_gate_checked"] + assert pipeline_events + assert pipeline_events[0]["answer_mode"] == "deterministic" + + +def test_v2_process_runs_grounded_general_summary_with_rag() -> None: + llm = FakeLlm("Grounded summary.") + adapter = FakeRagAdapter(summary_rows=_SUMMARY_ROWS, file_rows=[]) + process = _v2_process(llm, adapter) + + result = asyncio.run(process.run(_context("Что это за сервис?"))) + + assert result.answer == "Grounded summary." + assert llm.calls + assert "Опорные документы" in llm.calls[0][1] + + +def test_v2_process_returns_insufficiency_for_general_without_rag() -> None: + llm = FakeLlm("Общий ответ без обращения к документации.") + adapter = FakeRagAdapter(summary_rows=[], file_rows=[]) + process = _v2_process(llm, adapter) + + result = asyncio.run(process.run(_context("Что это за сервис?", rag_session_id=None))) + + assert "grounded summary" in result.answer + assert llm.calls == [] + + +def test_v2_process_requires_active_rag_session() -> None: + process = _v2_process(FakeLlm("unused"), FakeRagAdapter([], [])) + + result = asyncio.run(process.run(_context("Объясни /health в документации", rag_session_id=None))) + + assert "нужна активная RAG-сессия" in result.answer + + +def test_v2_router_detects_find_files_subintent() -> None: + result = V2IntentRouter().route("В каком файле описан RuntimeHealth?") + + assert result.subintent == "FIND_FILES" + assert "RuntimeHealth" in result.anchors.entity_names + assert "runtimehealth" in result.target_terms + + +def test_v2_process_logs_retrieved_rag_rows_in_trace() -> None: + llm = FakeLlm("Краткое объяснение по документации.") + adapter = FakeRagAdapter(summary_rows=_SUMMARY_ROWS, file_rows=[]) + process = _v2_process(llm, adapter) + runtime = _context("Объясни /health в документации") + + asyncio.run(process.run(runtime)) + + retrieval_events = [payload for _, title, payload in runtime.trace.events if title == "rag_rows_fetched"] + assert retrieval_events + payload = retrieval_events[0] or {} + rows = payload.get("rows") or [] + assert rows + assert rows[0]["path"] == "docs/api/health.md" + assert rows[0]["layer"] == "D1_DOCUMENT_CATALOG" + assert rows[0]["document_id"] == "api.health" + + +def test_v2_process_logs_pipeline_steps() -> None: + llm = FakeLlm("Краткое объяснение по документации.") + adapter = FakeRagAdapter(summary_rows=_SUMMARY_ROWS, file_rows=[]) + process = _v2_process(llm, adapter) + runtime = _context("Что делает endpoint /health?") + + asyncio.run(process.run(runtime)) + + pipeline_titles = [title for _, title, _ in runtime.trace.events] + assert "router_resolved" in pipeline_titles + assert "anchors_extracted" in pipeline_titles + assert "retrieval_profile_selected" in pipeline_titles + assert "retrieval_executed" in pipeline_titles + assert "evidence_assembled" in pipeline_titles + assert "evidence_gate_checked" in pipeline_titles + assert "answer_generated" in pipeline_titles + + +def test_v2_process_blocks_generic_docs_answer_without_target_doc() -> None: + llm = FakeLlm("галлюцинация") + adapter = FakeRagAdapter( + summary_rows=[ + { + "path": "docs/README.md", + "title": "README", + "content": "", + "layer": "D1_DOCUMENT_CATALOG", + "metadata": {"summary_text": "Общий индекс документации.", "document_id": "docs.readme"}, + } + ], + file_rows=[], + ) + process = _v2_process(llm, adapter) + + result = asyncio.run(process.run(_context("Что делает endpoint /send?"))) + + assert "не найден целевой документ" in result.answer + assert llm.calls == [] + + +def test_v2_process_can_disable_workflow_llm_for_docs_summary() -> None: + llm = FakeLlm("should not be used") + adapter = FakeRagAdapter(summary_rows=_SUMMARY_ROWS, file_rows=[]) + process = _v2_process(llm, adapter, workflow_llm_enabled=False) + + result = asyncio.run(process.run(_context("Объясни /health в документации"))) + + assert "Endpoint /health возвращает агрегированный статус runtime." in result.answer + assert llm.calls == [] + + +def test_v2_process_can_disable_workflow_llm_for_general_summary() -> None: + llm = FakeLlm("should not be used") + adapter = FakeRagAdapter(summary_rows=_SUMMARY_ROWS, file_rows=[]) + process = _v2_process(llm, adapter, workflow_llm_enabled=False) + + result = asyncio.run(process.run(_context("Что это за сервис?"))) + + assert "агрегированный статус runtime" in result.answer + assert llm.calls == [] diff --git a/tests/unit_tests/agent/test_v2_retrieval_policy.py b/tests/unit_tests/agent/test_v2_retrieval_policy.py new file mode 100644 index 0000000..ab25423 --- /dev/null +++ b/tests/unit_tests/agent/test_v2_retrieval_policy.py @@ -0,0 +1,49 @@ +from __future__ import annotations + +from app.core.agent.processes.v2.models import V2Domain, V2Intent, V2RouteAnchors, V2RouteResult, V2Subintent +from app.core.agent.processes.v2.retrieval.policy_resolver import V2RetrievalPolicyResolver + + +def _route(*, hints: list[str], endpoint_paths: list[str] | None = None, subintent: str = "SUMMARY", intent: str = "DOC_EXPLAIN") -> V2RouteResult: + return V2RouteResult( + routing_domain=V2Domain.DOCS if intent == V2Intent.DOC_EXPLAIN else V2Domain.GENERAL, + intent=intent, + subintent=subintent, + user_query="q", + normalized_query="q", + anchors=V2RouteAnchors(target_doc_hints=hints, endpoint_paths=endpoint_paths or []), + ) + + +def test_policy_prefers_api_docs_for_endpoint_queries() -> None: + plan = V2RetrievalPolicyResolver().resolve( + _route(hints=["docs/api/health-endpoint.md"], endpoint_paths=["/health"]) + ) + + assert plan.profile == "docs_summary_api_endpoint" + assert plan.filters["path_prefixes"] == ["docs/api/", "docs/architecture/", "docs/"] + assert plan.filters["prefer_path_prefixes"][0] == "docs/api/" + + +def test_policy_prefers_logic_docs_for_logic_queries() -> None: + plan = V2RetrievalPolicyResolver().resolve(_route(hints=["docs/logic/telegram-notification-loop.md"])) + + assert plan.profile == "docs_summary_logic_flow" + assert plan.filters["prefer_path_prefixes"][0] == "docs/logic/" + + +def test_policy_uses_deterministic_find_files_profile() -> None: + plan = V2RetrievalPolicyResolver().resolve( + _route(hints=["docs/api/health-endpoint.md"], endpoint_paths=["/health"], subintent=V2Subintent.FIND_FILES) + ) + + assert plan.profile == "file_lookup" + assert plan.layers == ["D1_DOCUMENT_CATALOG", "D3_ENTITY_CATALOG"] + assert "health-endpoint.md" in plan.filters["prefer_like_patterns"][0] + + +def test_policy_uses_grounded_general_profile() -> None: + plan = V2RetrievalPolicyResolver().resolve(_route(hints=[], intent=V2Intent.GENERAL_QA)) + + assert plan.profile == "general_qa_grounded_summary" + assert plan.filters["prefer_path_prefixes"][0] == "docs/architecture/" diff --git a/tests/unit_tests/api/test_route_map.py b/tests/unit_tests/api/test_route_map.py new file mode 100644 index 0000000..5e28a2e --- /dev/null +++ b/tests/unit_tests/api/test_route_map.py @@ -0,0 +1,43 @@ +from __future__ import annotations + +from fastapi import FastAPI + +from app.main import create_app + + +def _route_map(app: FastAPI) -> set[tuple[str, str]]: + routes: set[tuple[str, str]] = set() + for route in app.routes: + methods = getattr(route, "methods", set()) or set() + for method in methods: + if method in {"HEAD", "OPTIONS"}: + continue + routes.add((method, route.path)) + return routes + + +def test_route_map_exposes_current_api_and_hides_legacy_index_routes() -> None: + app = create_app() + route_map = _route_map(app) + + assert ("POST", "/api/agent/sessions") in route_map + assert ("POST", "/api/agent/requests") in route_map + assert ("GET", "/api/agent/requests/{request_id}") in route_map + assert ("GET", "/api/agent/streams/{request_id}") in route_map + + assert ("GET", "/api/rag/sessions/{rag_session_id}/jobs/{index_job_id}") in route_map + assert ("GET", "/api/rag/sessions/{rag_session_id}/jobs/{index_job_id}/events") in route_map + + assert ("POST", "/api/index/snapshot") not in route_map + assert ("POST", "/api/index/changes") not in route_map + assert ("GET", "/api/index/jobs/{index_job_id}") not in route_map + assert ("GET", "/api/index/jobs/{index_job_id}/events") not in route_map + assert ("POST", "/internal/rag/index/snapshot") not in route_map + assert ("POST", "/internal/rag/index/changes") not in route_map + assert ("GET", "/internal/rag/index/jobs/{index_job_id}") not in route_map + assert ("POST", "/internal/rag/retrieve") not in route_map + assert ("POST", "/internal/rag-repo/webhook") not in route_map + assert ("POST", "/api/agent/sessions/{session_id}/rag") not in route_map + assert ("POST", "/api/agent/sessions/{session_id}/reset") not in route_map + assert ("POST", "/api/rag/sessions") not in route_map + assert ("POST", "/api/rag/sessions/{rag_session_id}/changes") not in route_map diff --git a/tests/unit_tests/rag/asserts_intent_router.py b/tests/unit_tests/rag/asserts_intent_router.py index 97efbac..c72bce6 100644 --- a/tests/unit_tests/rag/asserts_intent_router.py +++ b/tests/unit_tests/rag/asserts_intent_router.py @@ -2,7 +2,7 @@ from __future__ import annotations import re -from app.modules.agent.intent_router_v2.models import IntentRouterResult +from app.core.agent.intent_router.models import IntentRouterResult def assert_intent(out: IntentRouterResult, expected: str) -> None: @@ -57,7 +57,7 @@ def assert_domain_layer_prefixes(out: IntentRouterResult) -> None: prefixes = {layer.layer_id[0] for layer in out.retrieval_spec.layer_queries if layer.layer_id} if out.retrieval_spec.domains == ["CODE"]: assert prefixes <= {"C"} - elif out.retrieval_spec.domains == ["DOCS"]: + elif out.retrieval_spec.domains in (["DOCS"], ["GENERAL"]): assert prefixes <= {"D"} else: assert prefixes <= {"C", "D"} diff --git a/tests/unit_tests/rag/intent_router_testkit.py b/tests/unit_tests/rag/intent_router_testkit.py index 52cbb51..26dcb8c 100644 --- a/tests/unit_tests/rag/intent_router_testkit.py +++ b/tests/unit_tests/rag/intent_router_testkit.py @@ -2,26 +2,22 @@ from __future__ import annotations import json -from app.modules.rag.contracts.enums import RagLayer -from app.modules.agent.intent_router_v2 import ConversationState, IntentRouterV2, RepoContext +from app.core.rag.contracts.enums import RagLayer +from app.core.agent.intent_router import ConversationState, IntentRouterV2, RepoContext def repo_context() -> RepoContext: return RepoContext( languages=["python"], - available_domains=["CODE", "DOCS"], + available_domains=["DOCS", "GENERAL"], available_layers=[ - RagLayer.CODE_ENTRYPOINTS, - RagLayer.CODE_SYMBOL_CATALOG, - RagLayer.CODE_DEPENDENCY_GRAPH, - RagLayer.CODE_SEMANTIC_ROLES, - RagLayer.CODE_SOURCE_CHUNKS, RagLayer.DOCS_DOC_CHUNKS, RagLayer.DOCS_DOCUMENT_CATALOG, RagLayer.DOCS_FACT_INDEX, RagLayer.DOCS_ENTITY_CATALOG, RagLayer.DOCS_WORKFLOW_INDEX, RagLayer.DOCS_RELATION_GRAPH, + RagLayer.DOCS_INTEGRATION_INDEX, ], ) diff --git a/tests/unit_tests/rag/test_code_indexing_pipeline.py b/tests/unit_tests/rag/test_code_indexing_pipeline.py index 0b39e29..74bdc74 100644 --- a/tests/unit_tests/rag/test_code_indexing_pipeline.py +++ b/tests/unit_tests/rag/test_code_indexing_pipeline.py @@ -1,5 +1,5 @@ -from app.modules.rag.contracts.enums import RagLayer -from app.modules.rag.indexing.code.pipeline import CodeIndexingPipeline +from app.core.rag.contracts.enums import RagLayer +from app.core.rag.indexing.code.pipeline import CodeIndexingPipeline def test_code_pipeline_builds_source_symbols_edges_and_entrypoints() -> None: diff --git a/tests/unit_tests/rag/test_docs_indexing_pipeline.py b/tests/unit_tests/rag/test_docs_indexing_pipeline.py index 98f3bcb..e551e23 100644 --- a/tests/unit_tests/rag/test_docs_indexing_pipeline.py +++ b/tests/unit_tests/rag/test_docs_indexing_pipeline.py @@ -1,15 +1,18 @@ -from app.modules.rag.contracts.enums import RagLayer -from app.modules.rag.indexing.docs.pipeline import DocsIndexingPipeline +from app.core.rag.contracts.enums import RagLayer +from app.core.rag.indexing.docs.pipeline import DocsIndexingPipeline -def test_docs_pipeline_builds_new_d0_to_d5_layers() -> None: +def test_docs_pipeline_builds_docs_layers_from_modern_markdown_structure() -> None: pipeline = DocsIndexingPipeline() content = """--- id: api.billing.create_invoice type: api_method +doc_type: api_method name: create_invoice title: Create Invoice API module: billing +domain: billing +sub_domain: invoices layer: application status: draft updated_at: 2026-03-23 @@ -17,21 +20,26 @@ tags: [billing, api] entities: [Invoice] parent: billing_api children: [] +related_docs: [api.billing.validate_invoice] links: - - type: related_api - target: api.billing.validate_invoice + called_by: + - ui.billing.invoice_form + uses_logic: + - logic.billing.invoice_validation --- -# Summary +# Create Invoice API + +## Summary Creates an invoice in billing. -# Details +## Details -## Описание +### Описание Создает счет на оплату. -## Сценарий +### Сценарий **Название:** Create invoice @@ -55,7 +63,12 @@ Create invoice **Постусловие:** - Invoice is created. -## Контракт +### Контракт + +#### Метаданные вызова +- Method: POST +- Auth: USER +- Idempotency: false ### Входные параметры @@ -69,7 +82,22 @@ Create invoice | --- | --- | --- | | invoice_id | string | yes | -## Ошибки +### Интеграции + +#### Billing DB +- target: db.billing.invoices +- target_type: db +- direction: outbound +- interaction: writes +- via: invoice repository +- purpose: persist created invoices +- details: + - transaction: required + - tables: + - invoices + - invoice_items + +### Ошибки | status | error | client action | | --- | --- | --- | @@ -89,10 +117,14 @@ Create invoice assert RagLayer.DOCS_ENTITY_CATALOG in layers assert RagLayer.DOCS_WORKFLOW_INDEX in layers assert RagLayer.DOCS_RELATION_GRAPH in layers + assert RagLayer.DOCS_INTEGRATION_INDEX in layers catalog_doc = next(doc for doc in docs if doc.layer == RagLayer.DOCS_DOCUMENT_CATALOG) assert catalog_doc.metadata["document_id"] == "api.billing.create_invoice" assert catalog_doc.metadata["module"] == "billing" + assert catalog_doc.metadata["domain"] == "billing" + assert catalog_doc.metadata["subdomain"] == "invoices" + assert catalog_doc.metadata["summary_text"] == "Creates an invoice in billing." fact_texts = [doc.text for doc in docs if doc.layer == RagLayer.DOCS_FACT_INDEX] assert any("has_field amount" in text for text in fact_texts) @@ -108,6 +140,16 @@ Create invoice relation_targets = [doc.metadata["target_id"] for doc in docs if doc.layer == RagLayer.DOCS_RELATION_GRAPH] assert "billing_api" in relation_targets assert "api.billing.validate_invoice" in relation_targets + assert "logic.billing.invoice_validation" in relation_targets + assert "Invoice" in relation_targets chunk_doc = next(doc for doc in docs if doc.layer == RagLayer.DOCS_DOC_CHUNKS) assert chunk_doc.metadata["section_path"] + assert chunk_doc.metadata["artifact_type"] == "DOCS" + assert chunk_doc.metadata["domain"] == "billing" + assert chunk_doc.metadata["subdomain"] == "invoices" + + integration_doc = next(doc for doc in docs if doc.layer == RagLayer.DOCS_INTEGRATION_INDEX) + assert integration_doc.metadata["target"] == "db.billing.invoices" + assert integration_doc.metadata["target_type"] == "db" + assert integration_doc.metadata["details"]["transaction"] == "required" diff --git a/tests/unit_tests/rag/test_docs_prompt_layer.py b/tests/unit_tests/rag/test_docs_prompt_layer.py index 370bd9b..3048174 100644 --- a/tests/unit_tests/rag/test_docs_prompt_layer.py +++ b/tests/unit_tests/rag/test_docs_prompt_layer.py @@ -1,11 +1,12 @@ from __future__ import annotations -from app.modules.agent.intent_router_v2 import IntentRouterV2 -from app.modules.agent.llm.prompt_loader import PromptLoader -from app.modules.agent.runtime.docs_qa_pipeline import DocsQAPipelineRunner -from app.modules.agent.runtime.docs_qa_pipeline.openapi_postprocessor import OpenAPIPostprocessor -from app.modules.agent.runtime.docs_qa_pipeline.prompt_payload_builder import DocsPromptPayloadBuilder -from app.modules.agent.runtime.steps.generation import RuntimePromptSelector +from app.core.agent.intent_router import IntentRouterV2 +from app.core.agent.llm.prompt_loader import PromptLoader +from app.core.agent.runtime.docs_qa_pipeline import DocsQAPipelineRunner +from app.core.agent.runtime.docs_qa_pipeline.openapi_postprocessor import OpenAPIPostprocessor +from app.core.agent.runtime.docs_qa_pipeline.prompt_payload_builder import DocsPromptPayloadBuilder +from app.core.agent.orchestration.processes.v2.prompt_payload_builder import V2PromptPayloadBuilder +from app.core.agent.runtime.steps.generation import RuntimePromptSelector from tests.docs_qa_eval.fixture_adapter import InMemoryDocsRetrievalAdapter from tests.unit_tests.rag.intent_router_testkit import repo_context @@ -43,7 +44,7 @@ def test_prompt_selector_uses_docs_prompts_only() -> None: def test_docs_prompt_payload_contains_required_contract() -> None: builder = DocsPromptPayloadBuilder() - from app.modules.agent.runtime.docs_qa_pipeline.models import DocsEvidenceBundle, OpenAPIResult + from app.core.agent.runtime.docs_qa_pipeline.models import DocsEvidenceBundle, OpenAPIResult payload = builder.build( question="Объясни billing", @@ -52,6 +53,8 @@ def test_docs_prompt_payload_contains_required_contract() -> None: evidence_bundle=DocsEvidenceBundle( intent="DOCUMENTATION_EXPLAIN", sub_intent="COMPONENT_EXPLAIN", + primary_documents=[{"title": "Billing"}], + secondary_documents=[{"title": "Billing relation"}], documents=[{"title": "Billing"}], facts=[{"content": "Handles payments"}], relations=[{"title": "Billing -> Orders"}], @@ -62,12 +65,36 @@ def test_docs_prompt_payload_contains_required_contract() -> None: assert '"question": "Объясни billing"' in payload assert '"intent": "DOCUMENTATION_EXPLAIN"' in payload assert '"sub_intent": "COMPONENT_EXPLAIN"' in payload + assert '"primary_documents"' in payload + assert '"secondary_documents"' in payload assert '"documents"' in payload assert '"facts"' in payload assert '"relations"' in payload assert '"api_contract"' in payload +def test_v2_prompt_payload_accepts_api_method_mode_fields() -> None: + from app.core.agent.runtime.docs_qa_pipeline.models import DocsEvidenceBundle + + payload = V2PromptPayloadBuilder().build( + question="Как работает метод health?", + intent="DOCUMENTATION_EXPLAIN", + sub_intent="API_METHOD_EXPLAIN", + evidence_bundle=DocsEvidenceBundle(intent="DOCUMENTATION_EXPLAIN", sub_intent="API_METHOD_EXPLAIN"), + api_method_answer_mode="indirect", + target_endpoint_identity={ + "anchor": "health", + "normalized_path": "/health", + "normalized_doc_id": "api.health_endpoint", + }, + direct_api_spec_found=False, + ) + + assert '"api_method_answer_mode": "indirect"' in payload + assert '"normalized_doc_id": "api.health_endpoint"' in payload + assert '"direct_api_spec_found": false' in payload + + def test_openapi_postprocessor_requires_paths_for_full_spec() -> None: validator = OpenAPIPostprocessor() diff --git a/tests/unit_tests/rag/test_docs_qa_pipeline.py b/tests/unit_tests/rag/test_docs_qa_pipeline.py index 82c96ac..10766e3 100644 --- a/tests/unit_tests/rag/test_docs_qa_pipeline.py +++ b/tests/unit_tests/rag/test_docs_qa_pipeline.py @@ -1,7 +1,7 @@ from __future__ import annotations -from app.modules.agent.intent_router_v2 import IntentRouterV2 -from app.modules.agent.runtime.docs_qa_pipeline import DocsQAPipelineRunner +from app.core.agent.intent_router import IntentRouterV2 +from app.core.agent.runtime.docs_qa_pipeline import DocsQAPipelineRunner, DocsTaskPlanner from tests.docs_qa_eval.fixture_adapter import InMemoryDocsRetrievalAdapter from tests.unit_tests.rag.intent_router_testkit import repo_context @@ -135,6 +135,52 @@ def test_openapi_partial_contract_returns_partial_mode() -> None: assert "/orders" in result.answer +def test_docs_pipeline_accepts_precomputed_task_plan_without_rerouting() -> None: + rows = [ + { + "layer": "D1_DOCUMENT_CATALOG", + "path": "docs/api/health.md", + "title": "GET /health", + "content": "/health returns runtime and component statuses.", + "metadata": {"document_id": "api.health_endpoint", "type": "api_method", "endpoint": "/health"}, + }, + { + "layer": "D2_FACT_INDEX", + "path": "docs/api/health.md", + "title": "api.health_endpoint:response", + "content": "Returns health summary and component diagnostics.", + "metadata": {"subject_id": "api.health_endpoint", "type": "api_method"}, + }, + ] + route_result = IntentRouterV2().route( + "Объясни API метод /health", + repo_context=repo_context(), + ) + task_plan = DocsTaskPlanner().plan( + "Объясни API метод /health", + "docs-session", + route_result=route_result, + ) + + class FailingRouter: + def route(self, *_args, **_kwargs): + raise AssertionError("runner should use the precomputed task plan") + + runner = DocsQAPipelineRunner(FailingRouter(), InMemoryDocsRetrievalAdapter(rows), repo_context=repo_context()) + + result = runner.run( + "Объясни API метод /health", + "docs-session", + mode="pre_llm_only", + task_plan=task_plan, + ) + + assert result.router_result.intent == "DOCUMENTATION_EXPLAIN" + assert result.router_result.query_plan.sub_intent == "API_METHOD_EXPLAIN" + assert result.diagnostics.selected_primary_documents == ["api.health_endpoint"] + assert result.diagnostics.gate_decision == "allow_exact" + + def test_pre_llm_mode_returns_diagnostic_only_without_answer_generation() -> None: rows = [ { @@ -172,7 +218,7 @@ def test_pre_llm_mode_detects_path_anchor_candidates() -> None: assert "/health" in result.diagnostics.query_anchor_candidates assert "/health" in result.diagnostics.resolved_anchor_candidates - assert result.diagnostics.planned_layers == ["D2_FACT_INDEX", "D4_WORKFLOW_INDEX", "D1_DOCUMENT_CATALOG", "D0_DOC_CHUNKS"] + assert result.diagnostics.planned_layers == ["D1_DOCUMENT_CATALOG", "D2_FACT_INDEX", "D0_DOC_CHUNKS", "D4_WORKFLOW_INDEX"] assert set(result.diagnostics.executed_layers) == {"D1_DOCUMENT_CATALOG", "D2_FACT_INDEX", "D4_WORKFLOW_INDEX", "D0_DOC_CHUNKS"} @@ -318,8 +364,311 @@ def test_openapi_request_fragment_uses_fragment_aware_gate() -> None: assert result.answer_mode in {"ready", "ready_partial"} assert result.answer assert "type: object" in result.answer - assert "message:" in result.answer - assert "chat_id:" in result.answer + + +def test_api_method_explain_prefers_api_method_primary_doc() -> None: + rows = [ + { + "layer": "D1_DOCUMENT_CATALOG", + "path": "docs/domain/runtime-health.md", + "title": "Сущность runtime health", + "content": "Runtime health describes overall service health.", + "metadata": {"document_id": "domain.runtime_health", "type": "domain_entity"}, + }, + { + "layer": "D1_DOCUMENT_CATALOG", + "path": "docs/api/health.md", + "title": "GET /health", + "content": "/health returns runtime and component statuses.", + "metadata": {"document_id": "api.health_endpoint", "type": "api_method", "endpoint": "/health"}, + }, + { + "layer": "D5_RELATION_GRAPH", + "path": "docs/domain/runtime-health.md", + "title": "Runtime health links", + "content": "runtime health used by health endpoint", + "metadata": {"document_id": "domain.runtime_health", "target_doc_id": "api.health_endpoint"}, + }, + ] + runner = DocsQAPipelineRunner(IntentRouterV2(), InMemoryDocsRetrievalAdapter(rows), repo_context=repo_context()) + + result = runner.run("Что делает метод health?", "docs-session", mode="pre_llm_only") + + assert result.router_result.query_plan.sub_intent == "API_METHOD_EXPLAIN" + assert result.diagnostics.target_anchor in {"health", "/health"} + assert result.diagnostics.api_method_match_found is True + assert result.diagnostics.selected_primary_documents == ["api.health_endpoint"] + assert "api.health_endpoint" in result.diagnostics.primary_doc_candidates + assert result.diagnostics.evidence_gate_require_target_api_spec is True + assert result.diagnostics.evidence_gate_target_api_spec_found is True + assert result.answer_mode == "exact" + assert result.diagnostics.gate_decision == "allow_exact" + + +def test_api_method_explain_promotes_api_doc_via_links() -> None: + rows = [ + { + "layer": "D1_DOCUMENT_CATALOG", + "path": "docs/domain/runtime-health.md", + "title": "Сущность runtime health", + "content": "Runtime health is the domain model for observability.", + "metadata": { + "document_id": "domain.runtime_health", + "type": "domain_entity", + "links": [{"target": "api.health_endpoint", "type": "used_by"}], + }, + }, + { + "layer": "D0_DOC_CHUNKS", + "path": "docs/api/health.md", + "title": "api.health_endpoint:Overview", + "content": "Endpoint /health returns overall runtime status and component diagnostics.", + "metadata": {"document_id": "api.health_endpoint", "type": "api_method", "endpoint": "/health"}, + }, + ] + runner = DocsQAPipelineRunner(IntentRouterV2(), InMemoryDocsRetrievalAdapter(rows), repo_context=repo_context()) + + result = runner.run("Как работает health endpoint?", "docs-session", mode="pre_llm_only") + + assert result.diagnostics.promoted_via_links == ["api.health_endpoint"] + assert result.diagnostics.selected_primary_documents == ["api.health_endpoint"] + assert result.diagnostics.api_method_match_found is True + + +def test_api_method_explain_rejects_cross_endpoint_primary_candidates() -> None: + rows = [ + { + "layer": "D1_DOCUMENT_CATALOG", + "path": "docs/documentation/api/control-actions-endpoint.md", + "title": "HTTP API /actions/{action}", + "content": "Endpoint for controlling actions.", + "metadata": { + "document_id": "api.control_actions_endpoint", + "type": "api_method", + "endpoint": "/actions/{action}", + }, + }, + { + "layer": "D1_DOCUMENT_CATALOG", + "path": "docs/documentation/api/health-endpoint.md", + "title": "HTTP API /health", + "content": "Health endpoint returns runtime health and component diagnostics.", + "metadata": { + "document_id": "api.health_endpoint", + "type": "api_method", + "endpoint": "/health", + }, + }, + { + "layer": "D0_DOC_CHUNKS", + "path": "docs/documentation/api/actions-endpoint.md", + "title": "api.control_actions_endpoint:Scenario", + "content": "The /actions/{action} endpoint triggers runtime actions.", + "metadata": { + "document_id": "api.control_actions_endpoint", + "type": "api_method", + "endpoint": "/actions/{action}", + }, + }, + ] + runner = DocsQAPipelineRunner(IntentRouterV2(), InMemoryDocsRetrievalAdapter(rows), repo_context=repo_context()) + + result = runner.run("Как работает метод health?", "docs-session", mode="pre_llm_only") + + assert result.router_result.query_plan.sub_intent == "API_METHOD_EXPLAIN" + assert result.diagnostics.target_endpoint_identity["normalized_doc_id"] == "api.health_endpoint" + assert result.diagnostics.selected_primary_documents == ["api.health_endpoint"] + assert result.diagnostics.primary_api_documents_after_filter == ["api.health_endpoint"] + assert "api.control_actions_endpoint" in result.diagnostics.rejected_endpoint_candidates + assert result.diagnostics.cross_endpoint_leakage_detected is True + assert result.diagnostics.evidence_gate_target_api_spec_found is True + assert "api.control_actions_endpoint" not in result.diagnostics.selected_doc_ids + + +def test_api_method_explain_without_exact_target_returns_insufficiency() -> None: + rows = [ + { + "layer": "D1_DOCUMENT_CATALOG", + "path": "docs/documentation/api/control-actions-endpoint.md", + "title": "HTTP API /actions/{action}", + "content": "Endpoint for controlling actions.", + "metadata": { + "document_id": "api.control_actions_endpoint", + "type": "api_method", + "endpoint": "/actions/{action}", + }, + }, + { + "layer": "D1_DOCUMENT_CATALOG", + "path": "docs/documentation/api/send-endpoint.md", + "title": "HTTP API /send", + "content": "Endpoint for sending messages.", + "metadata": { + "document_id": "api.send_message_endpoint", + "type": "api_method", + "endpoint": "/send", + }, + }, + ] + runner = DocsQAPipelineRunner(IntentRouterV2(), InMemoryDocsRetrievalAdapter(rows), repo_context=repo_context()) + + result = runner.run("Что делает метод health?", "docs-session", mode="pre_llm_only") + + assert result.router_result.query_plan.sub_intent == "API_METHOD_EXPLAIN" + assert result.diagnostics.target_endpoint_identity["normalized_doc_id"] == "api.health_endpoint" + assert result.diagnostics.selected_primary_documents == [] + assert "api.control_actions_endpoint" in result.diagnostics.rejected_endpoint_candidates + assert "api.send_message_endpoint" in result.diagnostics.rejected_endpoint_candidates + assert result.diagnostics.target_api_spec_found_exact is False + assert result.diagnostics.evidence_gate_target_api_spec_found is False + assert result.diagnostics.gate_decision == "reject" + assert result.answer_mode == "insufficient" + assert "api.control_actions_endpoint" not in result.diagnostics.selected_doc_ids + assert "api.send_message_endpoint" not in result.diagnostics.selected_doc_ids + + +def test_api_method_explain_uses_indirect_mode_from_target_linked_docs() -> None: + rows = [ + { + "layer": "D1_DOCUMENT_CATALOG", + "path": "docs/domain/runtime-health.md", + "title": "Runtime health", + "content": "Runtime health describes overall service state and component diagnostics.", + "metadata": { + "document_id": "domain.runtime_health", + "type": "domain_entity", + "links": [{"target": "api.health_endpoint", "type": "used_by"}], + }, + }, + ] + runner = DocsQAPipelineRunner(IntentRouterV2(), InMemoryDocsRetrievalAdapter(rows), repo_context=repo_context()) + + result = runner.run("Как работает метод health?", "docs-session", mode="pre_llm_only") + + assert result.answer_mode == "indirect" + assert result.diagnostics.gate_decision == "allow_indirect" + assert result.diagnostics.raw_retrieval_non_empty is True + assert result.diagnostics.target_primary_context_non_empty is False + assert result.diagnostics.indirect_target_context_non_empty is True + assert result.diagnostics.graph_promotion_attempted is True + assert result.diagnostics.graph_promotion_hits == ["api.health_endpoint"] + assert result.diagnostics.promoted_target_loaded is False + assert result.diagnostics.materialization_failure_reason == "materialized_rows_empty" + assert result.diagnostics.final_primary_document_ids == [] + assert "domain.runtime_health" in result.diagnostics.final_secondary_document_ids + + +def test_api_method_explain_skips_llm_when_no_exact_or_indirect_context() -> None: + from tests.unit_tests.rag.test_docs_prompt_layer import FakeLlm + + rows = [ + { + "layer": "D1_DOCUMENT_CATALOG", + "path": "docs/documentation/api/send-endpoint.md", + "title": "HTTP API /send", + "content": "Endpoint for sending messages.", + "metadata": { + "document_id": "api.send_message_endpoint", + "type": "api_method", + "endpoint": "/send", + }, + } + ] + llm = FakeLlm("should not be called") + runner = DocsQAPipelineRunner(IntentRouterV2(), InMemoryDocsRetrievalAdapter(rows), repo_context=repo_context(), llm=llm) + + result = runner.run("Что делает метод health?", "docs-session") + + assert llm.calls == [] + assert result.answer_mode == "insufficient" + assert result.diagnostics.llm_called is False + assert result.diagnostics.llm_call_reason == "no_exact_or_indirect_target_context" + assert result.diagnostics.gate_decision == "reject" + + +def test_api_method_explain_materializes_promoted_target_into_primary_context() -> None: + rows = [ + { + "layer": "D1_DOCUMENT_CATALOG", + "path": "docs/domain/runtime-health.md", + "title": "Runtime health", + "content": "Runtime health describes service state and component diagnostics.", + "metadata": { + "document_id": "domain.runtime_health", + "type": "domain_entity", + "links": [{"target": "api.health_endpoint", "type": "used_by"}], + }, + } + ] + materialized_rows = [ + { + "layer": "D1_DOCUMENT_CATALOG", + "path": "docs/api/health.md", + "title": "GET /health", + "content": "/health returns runtime and component statuses.", + "metadata": {"document_id": "api.health_endpoint", "type": "api_method", "endpoint": "/health"}, + }, + { + "layer": "D2_FACT_INDEX", + "path": "docs/api/health.md", + "title": "api.health_endpoint:response", + "content": "Returns health summary and component diagnostics.", + "metadata": {"subject_id": "api.health_endpoint", "type": "api_method"}, + }, + { + "layer": "D0_DOC_CHUNKS", + "path": "docs/api/health.md", + "title": "api.health_endpoint:Overview", + "content": "Endpoint /health returns overall runtime health.", + "metadata": {"document_id": "api.health_endpoint", "type": "api_method", "endpoint": "/health"}, + }, + ] + runner = DocsQAPipelineRunner( + IntentRouterV2(), + InMemoryDocsRetrievalAdapter(rows, materialized_rows=materialized_rows), + repo_context=repo_context(), + ) + + result = runner.run("Как работает метод health?", "docs-session", mode="pre_llm_only") + + assert result.answer_mode == "exact" + assert result.diagnostics.graph_promotion_hits == ["api.health_endpoint"] + assert result.diagnostics.graph_promotion_materialized == ["api.health_endpoint"] + assert result.diagnostics.promoted_target_loaded is True + assert result.diagnostics.promoted_target_chunks_loaded == 1 + assert result.diagnostics.promoted_target_facts_loaded == 1 + assert result.diagnostics.pinned_document_ids == ["api.health_endpoint"] + assert result.diagnostics.final_primary_document_ids == ["api.health_endpoint"] + assert "domain.runtime_health" in result.diagnostics.final_secondary_document_ids + assert result.diagnostics.materialized_target_primary_context_non_empty is True + assert result.diagnostics.gate_decision == "allow_exact" + + +def test_entity_question_does_not_prefer_api_method_primary_doc() -> None: + rows = [ + { + "layer": "D1_DOCUMENT_CATALOG", + "path": "docs/domain/runtime-health.md", + "title": "Сущность runtime health", + "content": "Runtime health describes service state.", + "metadata": {"document_id": "domain.runtime_health", "type": "domain_entity"}, + }, + { + "layer": "D1_DOCUMENT_CATALOG", + "path": "docs/api/health.md", + "title": "GET /health", + "content": "/health returns runtime status.", + "metadata": {"document_id": "api.health_endpoint", "type": "api_method", "endpoint": "/health"}, + }, + ] + runner = DocsQAPipelineRunner(IntentRouterV2(), InMemoryDocsRetrievalAdapter(rows), repo_context=repo_context()) + + result = runner.run("Что такое runtime health?", "docs-session", mode="pre_llm_only") + + assert result.router_result.query_plan.sub_intent == "ENTITY_EXPLAIN" + assert result.diagnostics.selected_primary_documents == [] + assert result.diagnostics.api_method_match_found is False + assert result.answer == "" def test_openapi_method_with_only_path_is_rejected() -> None: diff --git a/tests/unit_tests/rag/test_docs_retrieval_plan_mapping.py b/tests/unit_tests/rag/test_docs_retrieval_plan_mapping.py new file mode 100644 index 0000000..2462905 --- /dev/null +++ b/tests/unit_tests/rag/test_docs_retrieval_plan_mapping.py @@ -0,0 +1,32 @@ +import pytest + +from tests.unit_tests.rag.intent_router_testkit import run_sequence + +pytestmark = pytest.mark.intent_router + + +@pytest.mark.parametrize( + ("query", "plan_id", "primary_doc_types", "secondary_doc_types", "expected_filter_key", "expected_filter_value"), + [ + ("объясни /health", "docs_api_method_explain_v1", ["api_method"], ["logic_block", "domain_entity", "architecture_overview"], "endpoint_path", "/health"), + ("какие методы в notifications", "docs_list_api_methods_v1", ["api_method"], [], "domain_name", "notifications"), + ("найди документацию по telegram_delivery", "docs_find_documents_by_domain_v1", ["index_page", "architecture_overview", "api_method", "logic_block", "domain_entity"], [], "domain_name", "telegram_delivery"), + ("сгенерируй openapi по /send", "docs_generate_openapi_v1", ["api_method"], ["domain_entity", "logic_block"], "endpoint_path", "/send"), + ("как устроен сервис", "docs_general_docs_qa_v1", ["index_page", "architecture_overview"], ["logic_block", "domain_entity", "api_method"], "scope_level", "project"), + ], +) +def test_docs_retrieval_plan_contracts( + query: str, + plan_id: str, + primary_doc_types: list[str], + secondary_doc_types: list[str], + expected_filter_key: str, + expected_filter_value: str, +) -> None: + result = run_sequence([query])[0] + + assert result.retrieval_plan is not None + assert result.retrieval_plan.plan_id == plan_id + assert result.retrieval_plan.primary_doc_types == primary_doc_types + assert result.retrieval_plan.secondary_doc_types == secondary_doc_types + assert result.retrieval_plan.filters[expected_filter_key] == expected_filter_value diff --git a/tests/unit_tests/rag/test_explain_intent_builder.py b/tests/unit_tests/rag/test_explain_intent_builder.py index c76ea12..b50b86a 100644 --- a/tests/unit_tests/rag/test_explain_intent_builder.py +++ b/tests/unit_tests/rag/test_explain_intent_builder.py @@ -1,4 +1,4 @@ -from app.modules.agent.runtime.steps.explain.intent_builder import ExplainIntentBuilder +from app.core.agent.runtime.steps.explain.intent_builder import ExplainIntentBuilder def test_explain_intent_builder_extracts_route_symbol_and_file_hints() -> None: diff --git a/tests/unit_tests/rag/test_intent_router_e2e_flows.py b/tests/unit_tests/rag/test_intent_router_e2e_flows.py index 803e824..f4a3e1d 100644 --- a/tests/unit_tests/rag/test_intent_router_e2e_flows.py +++ b/tests/unit_tests/rag/test_intent_router_e2e_flows.py @@ -2,13 +2,12 @@ import os import pytest -from app.modules.agent.intent_router_v2.factory import GigaChatIntentRouterFactory -from app.modules.shared.env_loader import load_workspace_env +from app.core.agent.intent_router.factory import GigaChatIntentRouterFactory +from app.core.shared.config import load_workspace_env from tests.unit_tests.rag.asserts_intent_router import ( assert_domains, - assert_file_only_scope, assert_intent, - assert_test_policy, + assert_path_scope, ) from tests.unit_tests.rag.intent_router_testkit import run_sequence @@ -29,7 +28,7 @@ def test_e2e_path_carryover_flow() -> None: ] ) - assert_file_only_scope(first, "app/core/config.py") + assert_path_scope(first, "app/core/config.py", "app/core") assert "app/core/config.py" in second.retrieval_spec.filters.path_scope assert "app/core/config.py" in third.retrieval_spec.filters.path_scope second_file_anchors = [anchor.value for anchor in second.query_plan.anchors if anchor.type == "FILE_PATH" and anchor.source == "conversation_state"] @@ -39,7 +38,10 @@ def test_e2e_path_carryover_flow() -> None: assert any(anchor.type == "FILE_PATH" and anchor.source == "conversation_state" and anchor.span is None for anchor in third.query_plan.anchors) carried_symbols = [anchor.value for anchor in third.query_plan.anchors if anchor.type == "SYMBOL" and anchor.source == "conversation_state"] assert carried_symbols in ([], ["load_config"]) - assert third.query_plan.sub_intent == "EXPLAIN_LOCAL" + assert_intent(first, "GENERAL_QA") + assert_intent(second, "GENERAL_QA") + assert_intent(third, "GENERAL_QA") + assert third.query_plan.sub_intent == "GENERIC_QA" layer_ids = [item.layer_id for item in third.retrieval_spec.layer_queries] assert "C3_ENTRYPOINTS" not in layer_ids @@ -52,9 +54,9 @@ def test_e2e_docs_switch_from_code_topic() -> None: ] ) - assert_intent(first, "CODE_QA") + assert_intent(first, "DOCUMENTATION_EXPLAIN") assert_intent(second, "DOCUMENTATION_EXPLAIN") - assert second.conversation_mode == "SWITCH" + assert second.conversation_mode == "CONTINUE" assert_domains(second, ["DOCS"]) carried = [ anchor @@ -75,12 +77,10 @@ def test_e2e_tests_toggle_flow() -> None: ] ) - assert_intent(first, "CODE_QA") - assert_intent(second, "CODE_QA") - assert_test_policy(first, "INCLUDE") - assert_test_policy(second, "EXCLUDE") - assert first.query_plan.sub_intent == "FIND_TESTS" - assert second.query_plan.sub_intent == "EXPLAIN" + assert_intent(first, "GENERAL_QA") + assert_intent(second, "GENERAL_QA") + assert first.query_plan.sub_intent == "GENERIC_QA" + assert second.query_plan.sub_intent == "GENERIC_QA" assert "tests" in second.query_plan.negations assert not second.query_plan.expansions assert second.evidence_policy.require_flow is False @@ -94,9 +94,9 @@ def test_e2e_open_file_then_generic_next_steps_is_lightweight() -> None: ] ) - assert_file_only_scope(first, "app/core/config.py") - assert_file_only_scope(second, "app/core/config.py") - assert second.query_plan.sub_intent in {"EXPLAIN_LOCAL", "NEXT_STEPS"} + assert_path_scope(first, "app/core/config.py", "app/core") + assert_path_scope(second, "app/core/config.py", "app/core") + assert second.query_plan.sub_intent == "GENERIC_QA" layer_ids = [item.layer_id for item in second.retrieval_spec.layer_queries] assert "C3_ENTRYPOINTS" not in layer_ids assert second.evidence_policy.require_flow is False @@ -118,9 +118,9 @@ def test_intent_router_live_smoke_path_carryover() -> None: trace_label="intent-router-live", ) - assert_file_only_scope(first, "app/core/config.py") + assert_path_scope(first, "app/core/config.py", "app/core") assert "app/core/config.py" in second.retrieval_spec.filters.path_scope - assert second.query_plan.sub_intent in {"EXPLAIN_LOCAL", "NEXT_STEPS"} + assert second.query_plan.sub_intent == "GENERIC_QA" layer_ids = [item.layer_id for item in second.retrieval_spec.layer_queries] assert "C3_ENTRYPOINTS" not in layer_ids assert second.evidence_policy.require_flow is False diff --git a/tests/unit_tests/rag/test_intent_router_invariants.py b/tests/unit_tests/rag/test_intent_router_invariants.py index d4ff287..21db7e1 100644 --- a/tests/unit_tests/rag/test_intent_router_invariants.py +++ b/tests/unit_tests/rag/test_intent_router_invariants.py @@ -1,204 +1,121 @@ import pytest -from tests.unit_tests.rag.asserts_intent_router import ( - assert_domain_layer_prefixes, - assert_domains, - assert_file_only_scope, - assert_has_file_path, - assert_intent, - assert_no_symbol_keyword, - assert_no_symbol_leakage_from_paths, - assert_spans_valid, - assert_sub_intent, - assert_test_policy, -) from tests.unit_tests.rag.intent_router_testkit import run_sequence pytestmark = pytest.mark.intent_router -def test_invariant_code_file_path_with_canonical_key_term() -> None: - result = run_sequence(["Уточни по файлу app/core/config.py"])[0] - - assert_intent(result, "CODE_QA") - assert_has_file_path(result, "app/core/config.py") - assert_file_only_scope(result, "app/core/config.py") - key_terms = [anchor.value for anchor in result.query_plan.anchors if anchor.type == "KEY_TERM"] - assert "файл" in key_terms - assert "файлу" not in key_terms - assert_spans_valid(result) - assert_domain_layer_prefixes(result) +def _docs_result(query: str): + result = run_sequence([query])[0] + assert result.docs_routing is not None + assert result.retrieval_plan is not None + return result -def test_invariant_open_file_for_specified_file_phrase_uses_narrow_layers() -> None: - result = run_sequence(["Уточни по файлу app/core/config.py"])[0] +@pytest.mark.parametrize( + ("query", "endpoint"), + [ + ("как работает метод health", "/health"), + ("объясни /health", "/health"), + ("что делает endpoint /send", "/send"), + ], +) +def test_docs_mvp_api_method_explain_cases(query: str, endpoint: str) -> None: + result = _docs_result(query) - assert_intent(result, "CODE_QA") - assert_sub_intent(result, "OPEN_FILE") - assert_file_only_scope(result, "app/core/config.py") - layer_ids = [item.layer_id for item in result.retrieval_spec.layer_queries] - assert layer_ids == ["C0_SOURCE_CHUNKS"] - assert result.evidence_policy.require_flow is False + assert result.docs_routing.sub_intent == "API_METHOD_EXPLAIN" + assert result.docs_routing.intent == "DOCS_QA" + assert result.docs_routing.scope.level == "method" + assert result.docs_routing.anchors.endpoint_path == endpoint + assert result.retrieval_plan.plan_id == "docs_api_method_explain_v1" + assert result.retrieval_plan.filters["endpoint_path"] == endpoint -def test_invariant_inline_code_span_routes_to_code_and_extracts_symbol() -> None: - result = run_sequence(["Уточни по коду `def build(x): return x`"])[0] +@pytest.mark.parametrize( + ("query", "scope_level", "domain_name"), + [ + ("какие есть методы в проекте", "project", None), + ("покажи все api", "project", None), + ("какие методы в notifications", "domain", "notifications"), + ], +) +def test_docs_mvp_list_api_methods_cases(query: str, scope_level: str, domain_name: str | None) -> None: + result = _docs_result(query) - assert_intent(result, "CODE_QA") - assert_spans_valid(result) - assert_no_symbol_keyword(result) - symbols = [anchor.value for anchor in result.query_plan.anchors if anchor.type == "SYMBOL"] - key_terms = [anchor.value for anchor in result.query_plan.anchors if anchor.type == "KEY_TERM"] - assert "build" in symbols - assert "def" in key_terms + assert result.docs_routing.sub_intent == "LIST_API_METHODS" + assert result.docs_routing.intent == "DOCS_DISCOVERY" + assert result.docs_routing.scope.level == scope_level + assert result.retrieval_plan.plan_id == "docs_list_api_methods_v1" + assert result.retrieval_plan.primary_doc_types == ["api_method"] + if domain_name: + assert result.retrieval_plan.filters["domain_name"] == domain_name -def test_invariant_docs_cyrillic_path_with_quotes() -> None: - result = run_sequence(["Что сказано в «docs/архитектура.md»?"])[0] +@pytest.mark.parametrize( + ("query", "domain_name", "subdomain_name", "entity_name"), + [ + ("какие документы есть по notifications", "notifications", None, None), + ("найди документацию по telegram_delivery", "telegram_delivery", None, None), + ("какие документы связаны с health", None, None, "health"), + ], +) +def test_docs_mvp_find_documents_cases( + query: str, + domain_name: str | None, + subdomain_name: str | None, + entity_name: str | None, +) -> None: + result = _docs_result(query) - assert_intent(result, "DOCUMENTATION_EXPLAIN") - assert_sub_intent(result, "COMPONENT_EXPLAIN") - assert_domains(result, ["DOCS"]) - assert "docs/архитектура.md" in result.query_plan.normalized - assert_has_file_path(result, "docs/архитектура.md") - assert any(anchor.type == "DOC_REF" for anchor in result.query_plan.anchors) - assert result.retrieval_spec.filters.doc_kinds == [] - assert_spans_valid(result) - assert_domain_layer_prefixes(result) + assert result.docs_routing.sub_intent == "FIND_DOCUMENTS_BY_DOMAIN" + assert result.docs_routing.intent == "DOCS_DISCOVERY" + assert result.retrieval_plan.plan_id == "docs_find_documents_by_domain_v1" + if domain_name: + assert result.retrieval_plan.filters["domain_name"] == domain_name + if subdomain_name: + assert result.retrieval_plan.filters["subdomain_name"] == subdomain_name + if entity_name: + assert result.retrieval_plan.filters["entity_name"] == entity_name -def test_invariant_file_check_phrase_not_project_misc() -> None: - result = run_sequence(["Проверь app/modules/rag/explain/intent_builder.py и объясни"])[0] +@pytest.mark.parametrize( + ("query", "scope_level", "endpoint"), + [ + ("сгенерируй openapi по /health", "method", "/health"), + ("собери swagger по notifications", "domain", None), + ("сделай спецификацию api по всему проекту", "project", None), + ], +) +def test_docs_mvp_generate_openapi_cases(query: str, scope_level: str, endpoint: str | None) -> None: + result = _docs_result(query) - assert_intent(result, "CODE_QA") - assert_domains(result, ["CODE"]) - assert_no_symbol_leakage_from_paths(result) - assert_domain_layer_prefixes(result) + assert result.docs_routing.sub_intent == "GENERATE_OPENAPI" + assert result.docs_routing.intent == "DOCS_GENERATION" + assert result.docs_routing.scope.level == scope_level + assert result.retrieval_plan.plan_id == "docs_generate_openapi_v1" + if endpoint: + assert result.retrieval_plan.filters["endpoint_path"] == endpoint -def test_invariant_tests_include_routing() -> None: - result = run_sequence(["Где тесты на ConfigManager?"])[0] +@pytest.mark.parametrize( + "query", + [ + "что делает это приложение", + "как устроен сервис", + "как связаны worker и api", + ], +) +def test_docs_mvp_general_docs_qa_cases(query: str) -> None: + result = _docs_result(query) - assert_intent(result, "CODE_QA") - assert_test_policy(result, "INCLUDE") - symbols = [anchor.value for anchor in result.query_plan.anchors if anchor.type == "SYMBOL"] - key_terms = [anchor.value for anchor in result.query_plan.anchors if anchor.type == "KEY_TERM"] - assert "ConfigManager" in symbols - assert "тест" in key_terms + assert result.docs_routing.sub_intent == "GENERAL_DOCS_QA" + assert result.docs_routing.intent == "DOCS_FALLBACK" + assert result.retrieval_plan.plan_id == "docs_general_docs_qa_v1" -def test_invariant_keyword_hints_and_expansions_for_function_identifier() -> None: - result = run_sequence(["Теперь объясни функцию load_config"])[0] +def test_docs_mvp_retrieval_filters_are_merged_into_legacy_spec() -> None: + result = _docs_result("какие методы в notifications") - assert_intent(result, "CODE_QA") - assert "load_config" in result.query_plan.keyword_hints - assert "функция" not in result.query_plan.keyword_hints - assert "def" not in result.query_plan.expansions - - -def test_invariant_open_file_sub_intent_uses_narrow_retrieval_profile() -> None: - result = run_sequence(["Открой файл app/core/config.py"])[0] - - assert_intent(result, "CODE_QA") - assert_sub_intent(result, "OPEN_FILE") - assert_file_only_scope(result, "app/core/config.py") - layer_ids = [item.layer_id for item in result.retrieval_spec.layer_queries] - assert "C0_SOURCE_CHUNKS" in layer_ids - assert "C1_SYMBOL_CATALOG" not in layer_ids - assert "C2_DEPENDENCY_GRAPH" not in layer_ids - assert "C3_ENTRYPOINTS" not in layer_ids - assert result.evidence_policy.require_flow is False - - -def test_invariant_docs_question_routes_to_docs() -> None: - result = run_sequence(["Что сказано в документации?"])[0] - - assert_intent(result, "DOCUMENTATION_EXPLAIN") - assert_domains(result, ["DOCS"]) - assert_domain_layer_prefixes(result) - assert result.query_plan.keyword_hints - assert any(item in result.query_plan.expansions for item in result.query_plan.keyword_hints) - - -def test_invariant_docs_flow_sub_intent_uses_workflow_layers() -> None: - result = run_sequence(["Как работает процесс создания заказа по документации?"])[0] - - assert_intent(result, "DOCUMENTATION_EXPLAIN") - assert_sub_intent(result, "SYSTEM_FLOW_EXPLAIN") - layer_ids = [item.layer_id for item in result.retrieval_spec.layer_queries] - assert layer_ids == ["D4_WORKFLOW_INDEX", "D5_RELATION_GRAPH", "D1_DOCUMENT_CATALOG", "D0_DOC_CHUNKS"] - - -def test_invariant_docs_entity_sub_intent_uses_entity_layers() -> None: - result = run_sequence(["Что такое сущность Order в документации?"])[0] - - assert_intent(result, "DOCUMENTATION_EXPLAIN") - assert_sub_intent(result, "ENTITY_EXPLAIN") - layer_ids = [item.layer_id for item in result.retrieval_spec.layer_queries] - assert layer_ids == ["D3_ENTITY_CATALOG", "D5_RELATION_GRAPH", "D1_DOCUMENT_CATALOG", "D0_DOC_CHUNKS"] - - -def test_invariant_entity_like_camel_case_prefers_entity_explain() -> None: - result = run_sequence(["Что такое WorkerHealth?"])[0] - - assert_intent(result, "DOCUMENTATION_EXPLAIN") - assert_sub_intent(result, "ENTITY_EXPLAIN") - - -def test_invariant_related_docs_routes_to_docs_explain() -> None: - result = run_sequence(["Найди документацию по billing"])[0] - - assert_intent(result, "DOCUMENTATION_EXPLAIN") - assert_sub_intent(result, "RELATED_DOCS_EXPLAIN") - layer_ids = [item.layer_id for item in result.retrieval_spec.layer_queries] - assert layer_ids == ["D5_RELATION_GRAPH", "D1_DOCUMENT_CATALOG", "D0_DOC_CHUNKS"] - - -def test_invariant_docs_navigation_uses_related_docs_explain() -> None: - result = run_sequence(["Что связано с checkout документацией?"])[0] - - assert_intent(result, "DOCUMENTATION_EXPLAIN") - assert_sub_intent(result, "RELATED_DOCS_EXPLAIN") - layer_ids = [item.layer_id for item in result.retrieval_spec.layer_queries] - assert layer_ids == ["D5_RELATION_GRAPH", "D1_DOCUMENT_CATALOG", "D0_DOC_CHUNKS"] - - -def test_invariant_openapi_routes_to_docs_layers_with_api_filter() -> None: - result = run_sequence(["Сгенерируй openapi yaml для создания заказа"])[0] - - assert_intent(result, "OPENAPI_GENERATION") - assert_sub_intent(result, "OPENAPI_METHOD_GENERATE") - layer_ids = [item.layer_id for item in result.retrieval_spec.layer_queries] - assert layer_ids == ["D1_DOCUMENT_CATALOG", "D2_FACT_INDEX", "D0_DOC_CHUNKS"] - assert result.retrieval_spec.filters.doc_type == "api_method" - - -def test_invariant_general_qa_routes_to_generic_docs_layers() -> None: - result = run_sequence(["Помоги разобраться"])[0] - - assert_intent(result, "GENERAL_QA") - assert_sub_intent(result, "GENERIC_QA") - assert_domains(result, ["DOCS"]) - layer_ids = [item.layer_id for item in result.retrieval_spec.layer_queries] - assert layer_ids == ["D1_DOCUMENT_CATALOG", "D0_DOC_CHUNKS"] - - -def test_invariant_component_like_manager_routes_to_component_explain() -> None: - result = run_sequence(["Какую роль в системе играет RuntimeManager?"])[0] - - assert_intent(result, "DOCUMENTATION_EXPLAIN") - assert_sub_intent(result, "COMPONENT_EXPLAIN") - - -def test_invariant_cycle_query_routes_to_system_flow_explain() -> None: - result = run_sequence(["Объясни как работает цикл отправки уведомлений"])[0] - - assert_intent(result, "DOCUMENTATION_EXPLAIN") - assert_sub_intent(result, "SYSTEM_FLOW_EXPLAIN") - - -def test_invariant_overview_question_routes_to_general_qa() -> None: - result = run_sequence(["Что вообще описано в документации по этому сервису?"])[0] - - assert_intent(result, "GENERAL_QA") - assert_sub_intent(result, "GENERIC_QA") + assert getattr(result.retrieval_spec.filters, "doc_type", None) == "api_method" + assert getattr(result.retrieval_spec.filters, "domain_name", None) == "notifications" + assert getattr(result.retrieval_spec.filters, "scope_level", None) == "domain" diff --git a/tests/unit_tests/rag/test_intent_router_llm_disambiguation.py b/tests/unit_tests/rag/test_intent_router_llm_disambiguation.py index d3b9dfa..040c483 100644 --- a/tests/unit_tests/rag/test_intent_router_llm_disambiguation.py +++ b/tests/unit_tests/rag/test_intent_router_llm_disambiguation.py @@ -2,9 +2,9 @@ from __future__ import annotations import json -from app.modules.agent.intent_router_v2 import ConversationState, IntentRouterV2 -from app.modules.agent.intent_router_v2.intent.classifier import IntentClassifierV2 -from app.modules.agent.intent_router_v2.intent.llm_disambiguator import DocsLlmDisambiguator +from app.core.agent.intent_router import ConversationState, IntentRouterV2 +from app.core.agent.intent_router.docs_mvp.llm_classifier import DocsMvpLlmClassifier +from app.core.agent.intent_router.intent.classifier import IntentClassifierV2 from tests.unit_tests.rag.intent_router_testkit import repo_context @@ -21,75 +21,62 @@ class FakeLlm: return self.response -def test_technical_query_keeps_deterministic_routing_without_llm_call() -> None: - llm = FakeLlm('{"sub_intent":"GENERIC_QA","reason":"unused","confidence":"low"}') - router = IntentRouterV2( +def _router(llm: FakeLlm) -> IntentRouterV2: + return IntentRouterV2( classifier=IntentClassifierV2(), - llm_disambiguator=DocsLlmDisambiguator(llm), + docs_llm_classifier=DocsMvpLlmClassifier(llm), enable_llm_disambiguation=True, ) - result = router.route("Объясни endpoint /health", ConversationState(), repo_context()) - assert result.query_plan.sub_intent == "API_METHOD_EXPLAIN" - assert result.is_ambiguous is False - assert result.routing_mode == "deterministic" +def test_docs_technical_query_keeps_deterministic_routing_without_llm_call() -> None: + llm = FakeLlm("{}") + result = _router(llm).route("Объясни endpoint /health", ConversationState(), repo_context()) + + assert result.docs_routing is not None + assert result.docs_routing.sub_intent == "API_METHOD_EXPLAIN" + assert result.docs_routing.routing_mode == "deterministic" assert result.llm_router_used is False assert llm.calls == [] def test_ambiguous_query_can_be_resolved_by_llm() -> None: - llm = FakeLlm('{"sub_intent":"ENTITY_EXPLAIN","reason":"runtime health is a concept/entity here","confidence":"medium"}') - router = IntentRouterV2( - classifier=IntentClassifierV2(), - llm_disambiguator=DocsLlmDisambiguator(llm), - enable_llm_disambiguation=True, + llm = FakeLlm( + json.dumps( + { + "intent": "DOCS_DISCOVERY", + "sub_intent": "FIND_DOCUMENTS_BY_DOMAIN", + "confidence": 0.83, + "anchors": {"entity_name": "health", "doc_query": "документация по health"}, + "scope": {"level": "domain"}, + "reason_short": "health here is a docs topic", + }, + ensure_ascii=False, + ) ) + result = _router(llm).route("документация по health", ConversationState(), repo_context()) - result = router.route("Объясни runtime health", ConversationState(), repo_context()) - - assert result.is_ambiguous is True - assert result.routing_mode == "llm_disambiguation" + assert result.docs_routing is not None + assert result.docs_routing.routing_mode == "llm_assisted" + assert result.docs_routing.sub_intent == "FIND_DOCUMENTS_BY_DOMAIN" + assert result.retrieval_plan is not None + assert result.retrieval_plan.plan_id == "docs_find_documents_by_domain_v1" assert result.llm_router_used is True - assert result.deterministic_selected_sub_intent - assert result.llm_router_selected_sub_intent == "ENTITY_EXPLAIN" - assert result.query_plan.sub_intent == "ENTITY_EXPLAIN" -def test_ambiguous_query_falls_back_to_deterministic_when_llm_fails() -> None: +def test_ambiguous_query_falls_back_to_general_docs_when_llm_fails() -> None: llm = FakeLlm("{}", fail=True) - router = IntentRouterV2( - classifier=IntentClassifierV2(), - llm_disambiguator=DocsLlmDisambiguator(llm), - enable_llm_disambiguation=True, - ) + result = _router(llm).route("health документация", ConversationState(), repo_context()) - result = router.route("Как работает health check runtime?", ConversationState(), repo_context()) - - assert result.is_ambiguous is True - assert result.routing_mode == "deterministic_fallback" - assert result.llm_router_used is False - assert result.llm_router_error == "llm unavailable" - assert result.query_plan.sub_intent == result.deterministic_selected_sub_intent + assert result.docs_routing is not None + assert result.docs_routing.routing_mode == "llm_fallback" + assert result.docs_routing.sub_intent == "GENERAL_DOCS_QA" + assert result.retrieval_plan is not None + assert result.retrieval_plan.plan_id == "docs_general_docs_qa_v1" -def test_overview_query_stays_in_generic_qa() -> None: - llm = FakeLlm('{"sub_intent":"GENERIC_QA","reason":"overview query","confidence":"high"}') - router = IntentRouterV2( - classifier=IntentClassifierV2(), - llm_disambiguator=DocsLlmDisambiguator(llm), - enable_llm_disambiguation=True, - ) +def test_llm_classifier_rejects_unknown_labels() -> None: + llm = FakeLlm(json.dumps({"intent": "DOCS_QA", "sub_intent": "MADE_UP"})) + classifier = DocsMvpLlmClassifier(llm) - result = router.route("Какая структура документации?", ConversationState(), repo_context()) - - assert result.is_ambiguous is False or result.query_plan.sub_intent == "GENERIC_QA" - assert result.intent == "GENERAL_QA" - assert result.query_plan.sub_intent == "GENERIC_QA" - - -def test_llm_disambiguator_rejects_unknown_labels() -> None: - llm = FakeLlm(json.dumps({"sub_intent": "MADE_UP", "reason": "bad", "confidence": "high"})) - disambiguator = DocsLlmDisambiguator(llm) - - assert disambiguator.choose({"query": "test"}) is None + assert classifier.classify({"query": "test"}) is None diff --git a/tests/unit_tests/rag/test_layered_gateway.py b/tests/unit_tests/rag/test_layered_gateway.py index 244d39b..43982ee 100644 --- a/tests/unit_tests/rag/test_layered_gateway.py +++ b/tests/unit_tests/rag/test_layered_gateway.py @@ -1,4 +1,4 @@ -from app.modules.agent.runtime.steps.explain.layered_gateway import LayeredRetrievalGateway +from app.core.agent.runtime.steps.explain.layered_gateway import LayeredRetrievalGateway class _Embedder: diff --git a/tests/unit_tests/rag/test_path_filter.py b/tests/unit_tests/rag/test_path_filter.py index 7472496..e97f1dc 100644 --- a/tests/unit_tests/rag/test_path_filter.py +++ b/tests/unit_tests/rag/test_path_filter.py @@ -1,6 +1,6 @@ from __future__ import annotations -from app.modules.rag.indexing.common.path_filter import ( +from app.core.rag.indexing.common.path_filter import ( count_indexable_change_upserts, filter_changes_for_indexing, filter_snapshot_files, diff --git a/tests/unit_tests/rag/test_query_normalization.py b/tests/unit_tests/rag/test_query_normalization.py index 251509a..9bf52ce 100644 --- a/tests/unit_tests/rag/test_query_normalization.py +++ b/tests/unit_tests/rag/test_query_normalization.py @@ -1,6 +1,6 @@ import pytest -from app.modules.agent.intent_router_v2.analysis.normalization import QueryNormalizer +from app.core.agent.intent_router.analysis.normalization import QueryNormalizer pytestmark = pytest.mark.intent_router diff --git a/tests/unit_tests/rag/test_query_terms.py b/tests/unit_tests/rag/test_query_terms.py index 654ec3c..19494ff 100644 --- a/tests/unit_tests/rag/test_query_terms.py +++ b/tests/unit_tests/rag/test_query_terms.py @@ -1,4 +1,4 @@ -from app.modules.rag.retrieval.query_terms import extract_query_terms +from app.core.rag.retrieval.query_terms import extract_query_terms def test_extract_query_terms_from_code_question() -> None: diff --git a/tests/unit_tests/rag/test_rag_service_filtering.py b/tests/unit_tests/rag/test_rag_service_filtering.py index 3897e98..8dd28ad 100644 --- a/tests/unit_tests/rag/test_rag_service_filtering.py +++ b/tests/unit_tests/rag/test_rag_service_filtering.py @@ -2,7 +2,8 @@ from __future__ import annotations import asyncio -from app.modules.rag.services.rag_service import RagService +from app.core.rag.contracts.enums import RagLayer +from app.core.rag.indexing.service import RagService class _FakeEmbedder: @@ -50,3 +51,40 @@ def test_rag_service_progress_uses_only_indexable_files() -> None: assert cache_hits == 0 assert cache_misses == 1 assert progress == [(1, 1, "src/main.py")] + + +def test_rag_service_keeps_docs_artifact_type_metadata() -> None: + repository = _FakeRepository() + service = RagService(embedder=_FakeEmbedder(), repository=repository) + files = [ + { + "path": "docs/api/health.md", + "content_hash": "docs-h1", + "content": """--- +id: api.health +type: api_method +doc_type: api_method +title: Health API +domain: runtime +sub_domain: health +related_docs: [] +status: active +--- +# Health API + +## Summary +- Purpose: check service health. + +## Details +### Описание +Returns health payload. +""", + } + ] + + asyncio.run(service.index_snapshot("project-1", files)) + + doc_chunk = next(doc for doc in repository.replaced_docs if doc.layer == RagLayer.DOCS_DOC_CHUNKS) + assert doc_chunk.metadata["artifact_type"] == "DOCS" + assert doc_chunk.metadata["domain"] == "runtime" + assert doc_chunk.metadata["subdomain"] == "health" diff --git a/tests/unit_tests/rag/test_rag_session_retriever.py b/tests/unit_tests/rag/test_rag_session_retriever.py new file mode 100644 index 0000000..5902aac --- /dev/null +++ b/tests/unit_tests/rag/test_rag_session_retriever.py @@ -0,0 +1,26 @@ +"""Smoke-тест стандартного retrieval API: один embed и вызов repository.""" + +from __future__ import annotations + +import asyncio +from unittest.mock import MagicMock + +from app.core.rag.embedding.gigachat_embedder import GigaChatEmbedder +from app.core.rag.retrieval.session_retriever import RagSessionRetriever, RetrievalPlan + + +def test_rag_session_retriever_calls_repository() -> None: + embedder = MagicMock(spec=GigaChatEmbedder) + embedder.embed = MagicMock(return_value=[[0.1, 0.2]]) + repo = MagicMock() + repo.retrieve = MagicMock(return_value=[{"path": "a.md", "layer": "D0_DOC_CHUNKS"}]) + retriever = RagSessionRetriever(repository=repo, embedder=embedder) + plan = RetrievalPlan(profile="test", layers=["D0_DOC_CHUNKS", "D1_DOCUMENT_CATALOG"], limit=5) + rows = asyncio.run(retriever.retrieve("sid-1", "hello", plan)) + assert len(rows) == 1 + assert embedder.embed.called + assert repo.retrieve.called + call_kw = repo.retrieve.call_args + assert call_kw[0][0] == "sid-1" + assert call_kw[1]["layers"] == plan.layers + assert call_kw[1]["limit"] == 5 diff --git a/tests/unit_tests/rag/test_retrieval_statement_builder.py b/tests/unit_tests/rag/test_retrieval_statement_builder.py index b0c8dce..7bbb6c6 100644 --- a/tests/unit_tests/rag/test_retrieval_statement_builder.py +++ b/tests/unit_tests/rag/test_retrieval_statement_builder.py @@ -1,5 +1,5 @@ -from app.modules.rag.persistence.retrieval_statement_builder import RetrievalStatementBuilder -from app.modules.rag.retrieval.test_filter import build_test_filters, is_test_path +from app.core.rag.persistence.retrieval_statement_builder import RetrievalStatementBuilder +from app.core.rag.retrieval.test_filter import build_test_filters, is_test_path def test_retrieve_builder_adds_test_exclusion_filters() -> None: diff --git a/tests/unit_tests/rag/test_retriever_v2_no_fallback.py b/tests/unit_tests/rag/test_retriever_v2_no_fallback.py index 14ffa2e..1d91f81 100644 --- a/tests/unit_tests/rag/test_retriever_v2_no_fallback.py +++ b/tests/unit_tests/rag/test_retriever_v2_no_fallback.py @@ -1,4 +1,4 @@ -from app.modules.agent.runtime.steps.explain import CodeExplainRetrieverV2, LayeredRetrievalGateway +from app.core.agent.runtime.steps.explain import CodeExplainRetrieverV2, LayeredRetrievalGateway class _ExplodingEmbedder: diff --git a/tests/unit_tests/rag/test_retriever_v2_pack.py b/tests/unit_tests/rag/test_retriever_v2_pack.py index 2b7ee28..c93aacf 100644 --- a/tests/unit_tests/rag/test_retriever_v2_pack.py +++ b/tests/unit_tests/rag/test_retriever_v2_pack.py @@ -1,5 +1,5 @@ -from app.modules.agent.runtime.steps.explain.models import CodeLocation, LayeredRetrievalItem -from app.modules.agent.runtime.steps.explain.retriever_v2 import CodeExplainRetrieverV2 +from app.core.agent.runtime.steps.explain.models import CodeLocation, LayeredRetrievalItem +from app.core.agent.runtime.steps.explain.retriever_v2 import CodeExplainRetrieverV2 class _FakeGateway: diff --git a/tests/unit_tests/rag/test_retriever_v2_production_first.py b/tests/unit_tests/rag/test_retriever_v2_production_first.py index 151abab..8ba37a3 100644 --- a/tests/unit_tests/rag/test_retriever_v2_production_first.py +++ b/tests/unit_tests/rag/test_retriever_v2_production_first.py @@ -1,7 +1,7 @@ from types import SimpleNamespace -from app.modules.agent.runtime.steps.explain.models import CodeLocation, LayeredRetrievalItem -from app.modules.agent.runtime.steps.explain.retriever_v2 import CodeExplainRetrieverV2 +from app.core.agent.runtime.steps.explain.models import CodeLocation, LayeredRetrievalItem +from app.core.agent.runtime.steps.explain.retriever_v2 import CodeExplainRetrieverV2 class _ProductionFirstGateway: diff --git a/tests/unit_tests/rag/test_trace_builder.py b/tests/unit_tests/rag/test_trace_builder.py index 2527311..47581c9 100644 --- a/tests/unit_tests/rag/test_trace_builder.py +++ b/tests/unit_tests/rag/test_trace_builder.py @@ -1,5 +1,5 @@ -from app.modules.agent.runtime.steps.explain.models import CodeLocation, LayeredRetrievalItem -from app.modules.agent.runtime.steps.explain.trace_builder import TraceBuilder +from app.core.agent.runtime.steps.explain.models import CodeLocation, LayeredRetrievalItem +from app.core.agent.runtime.steps.explain.trace_builder import TraceBuilder class _FakeGraphRepository: