# v3-api-send-1

- source_file: /Users/alex/Dev_projects_v2/ai driven app process/v2/agent/tests/pipeline_setup_v3/cases/suite_03_docs/full_chain_docs_intents_v3-3x.yaml
- runner: agent_runtime
- mode: pre_llm
- passed: True

## Query
Что делает /send?

## Actual
{
  "intent": "DOCUMENTATION_EXPLAIN",
  "sub_intent": "API_METHOD_EXPLAIN",
  "graph_id": "DocsQAGraph",
  "conversation_mode": "START",
  "rag_count": 8,
  "llm_answer": "",
  "answer_mode": "answered",
  "path_scope": [],
  "doc_scope": [
    "api.send_message_endpoint"
  ],
  "entity_candidates": [],
  "symbol_candidates": [],
  "layers": [
    "D2_FACT_INDEX",
    "D4_WORKFLOW_INDEX",
    "D1_DOCUMENT_CATALOG",
    "D0_DOC_CHUNKS"
  ],
  "filters": {
    "doc_type": "api_method"
  },
  "pipeline_mode": "pre_llm_only",
  "gate_decision": "allow",
  "prompt_used": "docs_explain_answer",
  "llm_mode": "prose",
  "degraded_reason": null,
  "code_intents_stubbed": true
}

## Pipeline Steps
### input_query
```json
{
  "input": {
    "query": "Что делает /send?"
  },
  "output": {
    "query": "Что делает /send?"
  }
}
```

### router
```json
{
  "input": {
    "query": "Что делает /send?"
  },
  "output": {
    "intent": "DOCUMENTATION_EXPLAIN",
    "sub_intent": "API_METHOD_EXPLAIN",
    "graph_id": "DocsQAGraph",
    "conversation_mode": "START"
  }
}
```

### docs_pipeline
```json
{
  "input": {
    "query": "Что делает /send?"
  },
  "output": {
    "answer_mode": "ready",
    "prompt_name": "docs_explain_answer",
    "llm_request": {
      "prompt_name": "docs_explain_answer",
      "log_context": "graph.project_qa.docs.answer",
      "prompt_stats": {
        "system_chars": 393,
        "user_chars": 10326,
        "tokens_in_estimate": 2680
      }
    },
    "degraded_reason": ""
  }
}
```

## Diagnostics
{
  "intent": "DOCUMENTATION_EXPLAIN",
  "sub_intent": "API_METHOD_EXPLAIN",
  "layers_used": [
    "D2_FACT_INDEX",
    "D4_WORKFLOW_INDEX",
    "D1_DOCUMENT_CATALOG",
    "D0_DOC_CHUNKS"
  ],
  "documents_found": 1,
  "facts_found": 2,
  "relations_found": 0,
  "openapi_fields_extracted": 0,
  "missing_required_fields": [],
  "openapi_status": {
    "has_path": false,
    "has_method": false,
    "has_request": false,
    "has_response": false
  },
  "prompt_used": "docs_explain_answer",
  "llm_mode": "prose",
  "output_valid": true,
  "matched_intent_source": "deterministic",
  "matched_anchor_type": "endpoint",
  "matched_anchor_value": "/send",
  "exact_anchor_match": true,
  "docs_layers_requested": [
    "D2_FACT_INDEX",
    "D4_WORKFLOW_INDEX",
    "D1_DOCUMENT_CATALOG",
    "D0_DOC_CHUNKS"
  ],
  "docs_layers_with_hits": [
    "D2_FACT_INDEX",
    "D4_WORKFLOW_INDEX",
    "D1_DOCUMENT_CATALOG",
    "D0_DOC_CHUNKS"
  ],
  "planned_layers": [
    "D2_FACT_INDEX",
    "D4_WORKFLOW_INDEX",
    "D1_DOCUMENT_CATALOG",
    "D0_DOC_CHUNKS"
  ],
  "executed_layers": [
    "D2_FACT_INDEX",
    "D4_WORKFLOW_INDEX",
    "D1_DOCUMENT_CATALOG",
    "D0_DOC_CHUNKS"
  ],
  "non_empty_layers": [
    "D2_FACT_INDEX",
    "D4_WORKFLOW_INDEX",
    "D1_DOCUMENT_CATALOG",
    "D0_DOC_CHUNKS"
  ],
  "layer_diagnostics": {
    "D2_FACT_INDEX": {
      "hits": 8,
      "top_ids": [
        "6bf0a662808009874a108d0c97f7cca7fc4ff7a3a3d66e0947b31bf813cfdf4d",
        "dc979c31d511a14d3af89f5f5c493fcfc0c9f2090dc16fb20ff874f4b3566221",
        "149c4e0d3d34b3faba055b1495d54818fadc882af633da70035b82190c1bd327",
        "480d85819e9298d4078f8a3bd6cfccb9c0fe2a03695b87f65f82f9aa8e2097b0",
        "7aefee9ff6110088aad1891da66fc9085eb3f77d832605a3da565deecb96e850"
      ],
      "top_sections": [
        "api.send_message_endpoint:workflow_step",
        "api.send_message_endpoint:mentions_entity"
      ]
    },
    "D4_WORKFLOW_INDEX": {
      "hits": 3,
      "top_ids": [
        "api.send_message_endpoint",
        "api.control_actions_endpoint",
        "api.health_endpoint"
      ],
      "top_sections": [
        "Scenario"
      ]
    },
    "D1_DOCUMENT_CATALOG": {
      "hits": 4,
      "top_ids": [
        "api.send_message_endpoint",
        "architecture.telegram_notify_app",
        "api.control_actions_endpoint",
        "api.health_endpoint"
      ],
      "top_sections": [
        "HTTP API /send",
        "Архитектура Telegram Notify App",
        "HTTP API /actions/{action}",
        "HTTP API /health"
      ]
    },
    "D0_DOC_CHUNKS": {
      "hits": 4,
      "top_ids": [
        "api.send_message_endpoint"
      ],
      "top_sections": [
        "api.send_message_endpoint:Описание",
        "api.send_message_endpoint:Сценарий",
        "api.send_message_endpoint:Summary",
        "api.send_message_endpoint:Функциональные требования"
      ]
    }
  },
  "query_entity_candidates": [],
  "resolved_entity_candidates": [],
  "query_anchor_candidates": [
    "/send"
  ],
  "resolved_anchor_candidates": [
    "api.send_message_endpoint",
    "docs/documentation/api/send-message-endpoint.md"
  ],
  "anchor_candidates": [],
  "selected_anchor": null,
  "anchor_selection_reason": "",
  "anchor_match_type": "",
  "doc_ids": [
    "api.send_message_endpoint"
  ],
  "doc_paths": [
    "docs/documentation/api/send-message-endpoint.md"
  ],
  "doc_titles": [
    "Scenario",
    "HTTP API /send",
    "api.send_message_endpoint:Сценарий",
    "api.send_message_endpoint:workflow_step",
    "api.send_message_endpoint:mentions_entity",
    "api.send_message_endpoint:Описание",
    "api.send_message_endpoint:Summary",
    "api.send_message_endpoint:Функциональные требования"
  ],
  "relation_hits_count": 0,
  "relation_targets": [],
  "selected_doc_ids": [
    "api.send_message_endpoint"
  ],
  "selected_fact_ids": [
    "6bf0a662808009874a108d0c97f7cca7fc4ff7a3a3d66e0947b31bf813cfdf4d",
    "149c4e0d3d34b3faba055b1495d54818fadc882af633da70035b82190c1bd327"
  ],
  "selected_relation_ids": [],
  "selected_chunk_ids": [
    "api.send_message_endpoint"
  ],
  "selected_entity_ids": [],
  "selected_workflow_ids": [
    "1ce912e07e5105b30244d71c832f25a8292e725bf5a043dbf29ab479fcbf7a00"
  ],
  "fallback_doc_hits_count": 3,
  "fallback_used": false,
  "fact_hits": 2,
  "entity_hits": 0,
  "evidence_summary": {
    "documents": 1,
    "facts": 2,
    "entities": 0,
    "workflows": 1,
    "relations": 0,
    "chunks": 2,
    "selected_doc_ids": [
      "api.send_message_endpoint"
    ],
    "selected_fact_ids": [
      "6bf0a662808009874a108d0c97f7cca7fc4ff7a3a3d66e0947b31bf813cfdf4d",
      "149c4e0d3d34b3faba055b1495d54818fadc882af633da70035b82190c1bd327"
    ],
    "selected_relation_ids": [],
    "selected_chunk_ids": [
      "api.send_message_endpoint"
    ],
    "entity_hits": 0,
    "openapi_signals": {
      "path_found": false,
      "method_found": false,
      "operation_semantics_found": false,
      "request_payload_found": false,
      "request_schema": false,
      "request_fields_found": false,
      "response_payload_found": false,
      "response_schema": false,
      "response_fields_found": false,
      "status_codes": false,
      "content_type_found": false,
      "examples_found": false,
      "payload_description": false
    }
  },
  "gate_decision": "allow",
  "gate_decision_reason": "evidence_sufficient",
  "gate_missing_requirements": [],
  "gate_satisfied_requirements": [
    "retrieval_non_empty",
    "exact_anchor_match"
  ],
  "openapi_evidence": {
    "path_found": false,
    "method_found": false,
    "operation_semantics_found": false,
    "request_payload_found": false,
    "request_schema": false,
    "request_fields_found": false,
    "response_payload_found": false,
    "response_schema": false,
    "response_fields_found": false,
    "status_codes": false,
    "content_type_found": false,
    "examples_found": false,
    "payload_description": false
  },
  "requested_fragment_type": null,
  "fragment_evidence_found": [],
  "fragment_missing_requirements": [],
  "answer_mode": "ready",
  "degrade_reason": null,
  "degraded_reason": null,
  "code_intents_stubbed": false
}

## LLM Request
- prompt_name: docs_explain_answer
- log_context: graph.project_qa.docs.answer

### Prompt Stats
```json
{
  "system_chars": 393,
  "user_chars": 10326,
  "tokens_in_estimate": 2680
}
```

### System Prompt
```text
Ты объясняешь документацию системы.

На вход приходит JSON с полями:
- question
- intent
- sub_intent
- documents
- facts
- relations

Правила:
- Используй только предоставленные факты
- Не додумывай
- Если данных недостаточно, скажи это явно
- Объясняй структурировано

Формат ответа:
1. Краткое описание
2. Основные элементы
3. Как это работает
4. Связи с другими частями системы (если есть)
```

### User Prompt
```json
{
  "question": "Что делает /send?",
  "intent": "DOCUMENTATION_EXPLAIN",
  "sub_intent": "API_METHOD_EXPLAIN",
  "documents": [
    {
      "layer": "D1_DOCUMENT_CATALOG",
      "path": "docs/documentation/api/send-message-endpoint.md",
      "title": "HTTP API /send",
      "content": "Endpoint `/send` выполняет ручную отправку сообщения в Telegram через `TelegramSendService`. Он используется для операторской проверки доставки и для отправки уведомлений вне периодического worker loop. Endpoint работает поверх тех же credentials и того же delivery path, что и фоновая отправка.",
      "metadata": {
        "name": "send_message_endpoint",
        "tags": [
          "api",
          "telegram",
          "manual-send"
        ],
        "type": "api_method",
        "layer": "application",
        "links": [
          {
            "type": "part_of",
            "target": "architecture.telegram_notify_app"
          },
          {
            "type": "depends_on",
            "target": "logic.telegram_notification_loop"
          }
        ],
        "owner": null,
        "title": "HTTP API /send",
        "doc_id": null,
        "module": "telegram_notify_app",
        "parent": "architecture.telegram_notify_app",
        "status": "draft",
        "repo_id": "test_echo_app",
        "section": null,
        "blob_sha": "5fbf2e33510b0676a3a53b957a4569bd3c2c31fb7719546602c573421ccaa32d",
        "children": [],
        "doc_kind": "misc",
        "entities": [
          "TelegramControlAppFactory",
          "TelegramSendService",
          "TelegramNotifyWorker"
        ],
        "updated_at": "2026-03-20",
        "doc_version": null,
        "document_id": "api.send_message_endpoint",
        "source_path": "docs/documentation/api/send-message-endpoint.md",
        "summary_text": "Endpoint `/send` выполняет ручную отправку сообщения в Telegram через `TelegramSendService`. Он используется для операторской проверки доставки и для отправки уведомлений вне периодического worker loop. Endpoint работает поверх тех же credentials и того же delivery path, что и фоновая отправка.",
        "artifact_type": null,
        "last_modified": null,
        "staleness_score": null,
        "system_component": null
      }
    }
  ],
  "facts": [
    {
      "layer": "D2_FACT_INDEX",
      "path": "docs/documentation/api/send-message-endpoint.md",
      "title": "api.send_message_endpoint:workflow_step",
      "content": "api.send_message_endpoint workflow_step Telegram credentials доступны в переменных окружения.",
      "metadata": {
        "tags": [],
        "owner": null,
        "anchor": "Сценарий",
        "doc_id": null,
        "object": "Telegram credentials доступны в переменных окружения.",
        "fact_id": "6bf0a662808009874a108d0c97f7cca7fc4ff7a3a3d66e0947b31bf813cfdf4d",
        "repo_id": "test_echo_app",
        "section": null,
        "blob_sha": "5fbf2e33510b0676a3a53b957a4569bd3c2c31fb7719546602c573421ccaa32d",
        "predicate": "workflow_step",
        "object_ref": null,
        "subject_id": "api.send_message_endpoint",
        "doc_version": null,
        "source_path": "docs/documentation/api/send-message-endpoint.md",
        "artifact_type": null,
        "last_modified": null,
        "staleness_score": null,
        "system_component": null
      }
    },
    {
      "layer": "D2_FACT_INDEX",
      "path": "docs/documentation/api/send-message-endpoint.md",
      "title": "api.send_message_endpoint:mentions_entity",
      "content": "api.send_message_endpoint mentions_entity TelegramNotifyWorker",
      "metadata": {
        "tags": [],
        "owner": null,
        "anchor": "frontmatter.entities",
        "doc_id": null,
        "object": "TelegramNotifyWorker",
        "fact_id": "149c4e0d3d34b3faba055b1495d54818fadc882af633da70035b82190c1bd327",
        "repo_id": "test_echo_app",
        "section": null,
        "blob_sha": "5fbf2e33510b0676a3a53b957a4569bd3c2c31fb7719546602c573421ccaa32d",
        "predicate": "mentions_entity",
        "object_ref": null,
        "subject_id": "api.send_message_endpoint",
        "doc_version": null,
        "source_path": "docs/documentation/api/send-message-endpoint.md",
        "artifact_type": null,
        "last_modified": null,
        "staleness_score": null,
        "system_component": null
      }
    }
  ],
  "entities": [],
  "workflows": [
    {
      "layer": "D4_WORKFLOW_INDEX",
      "path": "docs/documentation/api/send-message-endpoint.md",
      "title": "Scenario",
      "content": "Scenario\nHTTP control plane запущен.\nTelegram credentials доступны в переменных окружения.\nКлиент передает непустой параметр `message`.\nКлиент отправляет `GET /send?message=...`.\n1. Endpoint принимает HTTP-запрос `GET /send`.\n2. API извлекает query parameter `message`.\n3. API проверяет, что сообщение не пустое.\n4. Endpoint вызывает `TelegramSendService.send(message)`.\n5. Сервис получает Telegram credentials из окружения.\n6. Сервис вызывает Telegram Bot API для отправки сообщения.\n7. API возвращает клиенту успешный JSON-ответ.\n1. Если credentials отсутствуют, сервис завершает вызов пользовательской ошибкой.",
      "metadata": {
        "owner": null,
        "doc_id": null,
        "repo_id": "test_echo_app",
        "section": null,
        "trigger": [
          "Клиент отправляет `GET /send?message=...`."
        ],
        "blob_sha": "5fbf2e33510b0676a3a53b957a4569bd3c2c31fb7719546602c573421ccaa32d",
        "main_flow": [
          "1. Endpoint принимает HTTP-запрос `GET /send`.",
          "2. API извлекает query parameter `message`.",
          "3. API проверяет, что сообщение не пустое.",
          "4. Endpoint вызывает `TelegramSendService.send(message)`.",
          "5. Сервис получает Telegram credentials из окружения.",
          "6. Сервис вызывает Telegram Bot API для отправки сообщения.",
          "7. API возвращает клиенту успешный JSON-ответ."
        ],
        "doc_version": null,
        "document_id": "api.send_message_endpoint",
        "source_path": "docs/documentation/api/send-message-endpoint.md",
        "workflow_id": "1ce912e07e5105b30244d71c832f25a8292e725bf5a043dbf29ab479fcbf7a00",
        "artifact_type": null,
        "last_modified": null,
        "preconditions": [
          "HTTP control plane запущен.",
          "Telegram credentials доступны в переменных окружения.",
          "Клиент передает непустой параметр `message`."
        ],
        "workflow_name": "Scenario",
        "error_handling": [
          "1. Если `message` пустой или credentials не заданы, API возвращает `400`.",
          "2. Если отправка завершилась непредвиденной ошибкой, API возвращает `500`."
        ],
        "postconditions": [
          "Сообщение либо отправлено в Telegram, либо клиент получил диагностическую ошибку."
        ],
        "staleness_score": null,
        "alternative_flow": [
          "1. Если credentials отсутствуют, сервис завершает вызов пользовательской ошибкой."
        ],
        "system_component": null
      }
    }
  ],
  "relations": [],
  "chunks": [
    {
      "layer": "D0_DOC_CHUNKS",
      "path": "docs/documentation/api/send-message-endpoint.md",
      "title": "api.send_message_endpoint:Сценарий",
      "content": "**Название:** Ручная отправка сообщения в Telegram\n\n**Предусловия:**\n- HTTP control plane запущен.\n- Telegram credentials доступны в переменных окружения.\n- Клиент передает непустой параметр `message`.\n\n**Триггер:**\n- Клиент отправляет `GET /send?message=...`.\n\n**Основной сценарий:**\n1. Endpoint принимает HTTP-запрос `GET /send`.\n2. API извлекает query parameter `message`.\n3. API проверяет, что сообщение не пустое.\n4. Endpoint вызывает `TelegramSendService.send(message)`.\n5. Сервис получает Telegram credentials из окружения.\n6. Сервис вызывает Telegram Bot API для отправки сообщения.\n7. API возвращает клиенту успешный JSON-ответ.\n\n**Альтернативный сценарий:**\n1. Если credentials отсутствуют, сервис завершает вызов пользовательской ошибкой.\n\n**Обработка ошибок:**\n1. Если `message` пустой или credentials не заданы, API возвращает `400`.\n2. Если отправка завершилась непредвиденной ошибкой, API возвращает `500`.\n\n**Постусловие:**\n- Сообщение либо отправлено в Telegram, либо клиент получил диагностическую ошибку.",
      "metadata": {
        "tags": [
          "api",
          "telegram",
          "manual-send"
        ],
        "type": "api_method",
        "order": 4,
        "owner": null,
        "doc_id": null,
        "module": "telegram_notify_app",
        "repo_id": "test_echo_app",
        "section": null,
        "blob_sha": "5fbf2e33510b0676a3a53b957a4569bd3c2c31fb7719546602c573421ccaa32d",
        "doc_kind": "misc",
        "doc_version": null,
        "document_id": "api.send_message_endpoint",
        "source_path": "docs/documentation/api/send-message-endpoint.md",
        "section_path": "Details > Сценарий",
        "artifact_type": null,
        "last_modified": null,
        "section_title": "Сценарий",
        "staleness_score": null,
        "system_component": null
      }
    },
    {
      "layer": "D0_DOC_CHUNKS",
      "path": "docs/documentation/api/send-message-endpoint.md",
      "title": "api.send_message_endpoint:Описание",
      "content": "Метод принимает текст сообщения и инициирует разовую отправку в Telegram без ожидания планового интервала worker'а. Endpoint нужен для ручной диагностики канала доставки и для ad-hoc уведомлений.",
      "metadata": {
        "tags": [
          "api",
          "telegram",
          "manual-send"
        ],
        "type": "api_method",
        "order": 3,
        "owner": null,
        "doc_id": null,
        "module": "telegram_notify_app",
        "repo_id": "test_echo_app",
        "section": null,
        "blob_sha": "5fbf2e33510b0676a3a53b957a4569bd3c2c31fb7719546602c573421ccaa32d",
        "doc_kind": "misc",
        "doc_version": null,
        "document_id": "api.send_message_endpoint",
        "source_path": "docs/documentation/api/send-message-endpoint.md",
        "section_path": "Details > Описание",
        "artifact_type": null,
        "last_modified": null,
        "section_title": "Описание",
        "staleness_score": null,
        "system_component": null
      }
    }
  ]
}
```

### User Prompt Overview
- question: Что делает /send?
- intent: DOCUMENTATION_EXPLAIN
- sub_intent: API_METHOD_EXPLAIN
- documents: 1 | samples: HTTP API /send
- facts: 2 | samples: api.send_message_endpoint:workflow_step, api.send_message_endpoint:mentions_entity
- relations: 0

## Mismatches
- none