{ "trace_id": "VRLcu2oMPHhfMP", "timestamp": "2026-03-23T15:31:19.740Z", "model": "gpt-4o-mini", "prompt_version": "normalizer_v1_1_1", "schema_version": "v1", "case_id": "V11-OT-004", "user_question_raw": "Где по июню выглядит подозрительно, но без точечного документа, просто дай зоны риска.", "context": { "period_hint": null, "business_context": null, "expected_route": "store_feature_risk", "case_id": "V11-OT-004", "eval_mode": "single-pass-strict" }, "request_payload_redacted": { "model": "gpt-4o-mini", "baseUrl": "https://api.openai.com/v1", "temperature": 0, "maxOutputTokens": 900, "promptVersion": "normalizer_v1_1_1", "systemPrompt": "Ты semantic-normalizer для бухгалтерского ассистента NDC.\nТвоя роль: только нормализация запроса пользователя в строгий JSON-контракт.\n\nЖесткие правила:\n1) Не давай бухгалтерский ответ по сути вопроса.\n2) Возвращай только JSON без markdown и пояснений.\n3) JSON обязан соответствовать переданной schema normalized_query_v1.\n4) Если период не указан, не выдумывай его; отмечай ambiguity.\n5) Для цепочек документов/проводок/оплат поднимай causal и cross-entity признаки.\n6) Для точечного object trace (номер/строка/ref) поднимай needs_exact_object_trace=true.\n7) Используй терминологию NDC.", "developerPrompt": "Ты выполняешь только задачу нормализации в JSON schema `normalized_query_v1`.\nНельзя давать финальный бухгалтерский ответ, только классификация и признаки маршрутизации.\n\nTaxonomy intent_class (v1.1.1, surgical patch):\n- cross_entity: обязательно, если вопрос просит связать документы/оплаты/проводки/закрывающие/договоры/регистры/цепочку доказательств.\n- drilldown_explain: только для точечного объекта или малого списка объектов (номер документа, ref, строка, конкретная проводка).\n- rule_based_account_control: контроль правил по счетам и учетным параметрам без межсущностной цепочки.\n- anomaly_probe: поиск аномалий и подозрительных паттернов без явной необходимости causal-chain между сущностями.\n- heavy_analytical: общий обзор, рейтинг, приоритизация на уровне периода/компании.\n- ambiguous_human_query: использовать только как последний fallback, когда вопрос реально не раскладывается в конкретный класс.\n- simple_factual: простая справка без сложной аналитики и без причинно-следственной цепочки.\n- period_close_risk: специальный класс рисков предзакрытия/закрытия периода.\n\nПриоритеты route и intent:\n1) Если в вопросе одновременно есть документы/оплаты/проводки/закрывающие/договоры/цепочка подтверждений, это causal multi-entity сценарий.\n Обычно это `intent_class=cross_entity` и route не ниже `hybrid_store_plus_live`.\n2) Если вопрос про множество кейсов (\"по каким\", \"где\", \"разложи по\"), это НЕ `needs_exact_object_trace`, пока нет одного точного объекта.\n3) Если присутствуют риск-слова, но также есть document/payment/posting chain, приоритет у causal cross-entity semantics, а не у чистого risk bucket.\n4) Не используй `ambiguous_human_query` как ленивый fallback, если можно уверенно выбрать конкретный intent.\n\nRoute_hint:\n- live_mcp_drilldown: только для точечного object trace (номер/строка/ref) и needs_runtime_truth=true.\n- hybrid_store_plus_live: для cross_entity + causal explain и подтверждаемой цепочки.\n- batch_refresh_then_store: для широких периодных рейтингов/обзоров и тяжелой агрегатной аналитики.\n- store_feature_risk: для risk/control/anomaly без обязательного runtime drilldown.\n- store_canonical: для простых фактов.\n\nRequires:\n- needs_cross_entity_join=true: если надо связывать разные сущности (документы, оплаты, проводки, договоры, регистры).\n- needs_causal_chain=true: если есть \"почему\", \"чем подтверждается\", \"где ошибка в цепочке\", \"разложи цепочку\".\n- needs_exact_object_trace=true: только при точном объекте.\n- needs_period_cut=true: если нужен срез периода.\n- needs_evidence=true: если пользователь просит подтверждение документами/проводками/движениями.\n\nv1.1.1 patch block A (period_close_risk):\nЕсли вопрос явно относится к предзакрытию, закрытию периода, сдаче отчетности, концу месяца или рискам последнего дня, primary intent_class должен быть `period_close_risk`, а не `heavy_analytical`, даже если требуется обзор или приоритизация.\n\nv1.1.1 patch block B (exact drilldown):\nЕсли вопрос относится к одному конкретному документу, операции, номеру, ref или объекту и просит показать связанную проводку или источник, это exact object trace. В таком случае `needs_cross_entity_join` не поднимается, если не требуется анализ множества сущностей или нескольких кейсов.\n\nv1.1.1 patch block C (anomaly without heavy batch):\nЕсли вопрос просит показать зоны риска, подозрительные случаи или аномалии без рейтинга, без full overview и без company-wide aggregation, route_hint должен быть `store_feature_risk`, а не `batch_refresh_then_store`.\n\nConfidence policy (жестко):\nНе ставь `confidence.overall=high` и `confidence.route_hint=high`, если выполнено хотя бы одно условие:\n- есть ambiguity;\n- есть тонкое различие соседних классов (например cross_entity vs anomaly_probe/rule_based_account_control);\n- вопрос длинный и многослойный;\n- период задан неявно или неуверенно;\n- causal semantics восстановлена частично.", "domainPrompt": "Контекст домена: бухгалтерия 1С/NDC.\n\nКлючевые счета:\n- 01, 02, 10, 41, 51, 60, 62, 68.02, 90, 97.\n\nТиповые сущности:\n- контрагент, договор, документ реализации, документ поступления, оплата, проводка, регистр, закрывающий документ.\n\nЛексика causal и сверки (сильные сигналы для cross_entity):\n- \"не бьется\", \"не сходится\", \"не видно\", \"не собралось\", \"повисло\", \"хвост\";\n- \"разложи по документам/оплатам/закрывающим\";\n- \"чем подтверждается\", \"где ошибка в цепочке\", \"что пошло криво\".\n\nЛексика точечного drilldown:\n- \"документ №...\", \"ref\", \"строка проводки\", \"покажи конкретную операцию\", \"точный source-of-record\".\n\nЛексика rule-based контроля:\n- \"проверь настройки\", \"ошибка срока/даты\", \"контроль 97/10/ОС\", \"нарушение правила учета\".\n\nЛексика обзорной аналитики:\n- \"рейтинг\", \"топ рисков\", \"в целом по компании\", \"перед закрытием периода\", \"приоритизация проверок\".\n\nВажное правило:\nЕсли в одном вопросе есть и риск-лексика, и цепочка document/payment/posting, не понижать задачу до чистого `store_feature_risk`.\nПриоритет у causal cross-entity семантики.", "fewShotExamples": "Q: По каким поставщикам на конец июня не сходится 60 счет: разложи по документам, оплатам и закрывающим.\nExpected:\n{\n \"intent_class\": \"cross_entity\",\n \"requires\": {\n \"needs_cross_entity_join\": true,\n \"needs_causal_chain\": true,\n \"needs_exact_object_trace\": false\n },\n \"expected_output_shape\": \"reconciliation_report\",\n \"route_hint\": \"hybrid_store_plus_live\"\n}\n\nQ: По 10 счету где подозрительные остатки и почему они повисли по цепочке документов?\nExpected:\n{\n \"intent_class\": \"cross_entity\",\n \"requires\": {\n \"needs_cross_entity_join\": true,\n \"needs_causal_chain\": true,\n \"needs_anomaly_summary\": true\n },\n \"expected_output_shape\": \"reconciliation_report\",\n \"route_hint\": \"hybrid_store_plus_live\"\n}\n\nQ: По 97 счету проверь ошибки дат начала/окончания списания, без разложения по документам.\nExpected:\n{\n \"intent_class\": \"rule_based_account_control\",\n \"requires\": {\n \"needs_cross_entity_join\": false,\n \"needs_causal_chain\": false\n },\n \"expected_output_shape\": \"prioritized_review_list\",\n \"route_hint\": \"store_feature_risk\"\n}\n\nQ: Покажи документ TRX-88 и связанную проводку по 51, нужен точный объект.\nExpected:\n{\n \"intent_class\": \"drilldown_explain\",\n \"requires\": {\n \"needs_exact_object_trace\": true,\n \"needs_runtime_truth\": true,\n \"needs_cross_entity_join\": false\n },\n \"expected_output_shape\": \"evidence_chain\",\n \"route_hint\": \"live_mcp_drilldown\"\n}\n\nQ: Где у нас по июню не собралось и что пошло криво в взаиморасчетах с покупателями?\nExpected:\n{\n \"intent_class\": \"cross_entity\",\n \"requires\": {\n \"needs_cross_entity_join\": true,\n \"needs_causal_chain\": true,\n \"needs_period_cut\": true\n },\n \"expected_output_shape\": \"reconciliation_report\",\n \"route_hint\": \"hybrid_store_plus_live\"\n}\n\nQ: Сделай топ рисков перед закрытием периода по компании в целом.\nExpected:\n{\n \"intent_class\": \"heavy_analytical\",\n \"requires\": {\n \"needs_ranking\": true,\n \"needs_period_cut\": true,\n \"needs_exact_object_trace\": false\n },\n \"expected_output_shape\": \"ranked_list\",\n \"route_hint\": \"batch_refresh_then_store\"\n}\n\nQ: Где у нас пахнет ручной ошибкой по июню, без конкретного документа.\nExpected:\n{\n \"intent_class\": \"ambiguous_human_query\",\n \"requires\": {\n \"needs_cross_entity_join\": false,\n \"needs_causal_chain\": false,\n \"needs_exact_object_trace\": false\n },\n \"expected_output_shape\": \"anomaly_summary\",\n \"route_hint\": \"batch_refresh_then_store\"\n}\n\n# v1.1.1 targeted few-shot additions (exactly 3)\n\nQ: Перед закрытием периода что у нас может взорваться в последний день?\nExpected:\n{\n \"intent_class\": \"period_close_risk\",\n \"requires\": {\n \"needs_period_cut\": true,\n \"needs_ranking\": true,\n \"needs_exact_object_trace\": false\n },\n \"expected_output_shape\": \"prioritized_review_list\",\n \"route_hint\": \"batch_refresh_then_store\"\n}\n\nQ: Покажи документ №TRX-88 и связанную проводку по 51.\nExpected:\n{\n \"intent_class\": \"drilldown_explain\",\n \"requires\": {\n \"needs_exact_object_trace\": true,\n \"needs_runtime_truth\": true,\n \"needs_cross_entity_join\": false\n },\n \"expected_output_shape\": \"evidence_chain\",\n \"route_hint\": \"live_mcp_drilldown\"\n}\n\nQ: Где по июню выглядит подозрительно, просто дай зоны риска без детального разбора.\nExpected:\n{\n \"intent_class\": \"anomaly_probe\",\n \"requires\": {\n \"needs_anomaly_summary\": true,\n \"needs_period_cut\": true,\n \"needs_ranking\": false\n },\n \"expected_output_shape\": \"anomaly_summary\",\n \"route_hint\": \"store_feature_risk\"\n}", "userQuestion": "Где по июню выглядит подозрительно, но без точечного документа, просто дай зоны риска.", "context": { "expected_route": "store_feature_risk", "eval_label": "eval-WWb7wzqwE2", "case_id": "V11-OT-004", "eval_mode": "single-pass-strict" }, "retryPolicy": "single-pass-strict", "useMock": false }, "raw_model_response": { "id": "resp_070e0b82748e02c70069c15cc1490481949e101e7f0f2f96cc", "object": "response", "created_at": 1774279873, "status": "completed", "background": false, "billing": { "payer": "developer" }, "completed_at": 1774279879, "error": null, "frequency_penalty": 0, "incomplete_details": null, "instructions": null, "max_output_tokens": 900, "max_tool_calls": null, "model": "gpt-4o-mini-2024-07-18", "output": [ { "id": "msg_070e0b82748e02c70069c15cc1b6508194be0ce50d5ed24118", "type": "message", "status": "completed", "content": [ { "type": "output_text", "annotations": [], "logprobs": [], "text": "{\n \"schema_version\": \"normalized_query_v1\",\n \"user_question_raw\": \"Где по июню выглядит подозрительно, но без точечного документа, просто дай зоны риска.\",\n \"normalized_question\": \"Где по июню есть подозрительные зоны риска?\",\n \"intent_class\": \"anomaly_probe\",\n \"business_problem_type\": \"анализ аномалий\",\n \"domain_entities\": [],\n \"accounts_mentioned\": [],\n \"documents_mentioned\": [],\n \"registers_mentioned\": [],\n \"period_scope\": {\n \"type\": \"inferred\",\n \"value\": \"июнь\",\n \"confidence\": \"medium\"\n },\n \"requires\": {\n \"needs_cross_entity_join\": false,\n \"needs_causal_chain\": false,\n \"needs_exact_object_trace\": false,\n \"needs_ranking\": false,\n \"needs_anomaly_summary\": true,\n \"needs_runtime_truth\": false,\n \"needs_period_cut\": true,\n \"needs_evidence\": false\n },\n \"expected_output_shape\": \"anomaly_summary\",\n \"route_hint\": \"store_feature_risk\",\n \"ambiguities\": [],\n \"confidence\": {\n \"overall\": \"medium\",\n \"intent_class\": \"medium\",\n \"route_hint\": \"medium\"\n }\n}" } ], "role": "assistant" } ], "parallel_tool_calls": true, "presence_penalty": 0, "previous_response_id": null, "prompt_cache_key": null, "prompt_cache_retention": null, "reasoning": { "effort": null, "summary": null }, "safety_identifier": null, "service_tier": "default", "store": true, "temperature": 0, "text": { "format": { "type": "json_schema", "description": null, "name": "normalized_query_v1", "schema": { "$id": "normalized_query_v1", "title": "Normalized Query V1", "type": "object", "additionalProperties": false, "required": [ "schema_version", "user_question_raw", "normalized_question", "intent_class", "business_problem_type", "domain_entities", "accounts_mentioned", "documents_mentioned", "registers_mentioned", "period_scope", "requires", "expected_output_shape", "route_hint", "ambiguities", "confidence" ], "properties": { "schema_version": { "type": "string", "const": "normalized_query_v1" }, "user_question_raw": { "type": "string", "minLength": 1 }, "normalized_question": { "type": "string", "minLength": 1 }, "intent_class": { "type": "string", "enum": [ "heavy_analytical", "cross_entity", "drilldown_explain", "rule_based_account_control", "anomaly_probe", "period_close_risk", "ambiguous_human_query", "simple_factual" ] }, "business_problem_type": { "type": "string", "minLength": 1 }, "domain_entities": { "type": "array", "items": { "type": "string" } }, "accounts_mentioned": { "type": "array", "items": { "type": "string" } }, "documents_mentioned": { "type": "array", "items": { "type": "string" } }, "registers_mentioned": { "type": "array", "items": { "type": "string" } }, "period_scope": { "type": "object", "additionalProperties": false, "required": [ "type", "value", "confidence" ], "properties": { "type": { "type": "string", "enum": [ "explicit", "inferred", "missing" ] }, "value": { "type": [ "string", "null" ] }, "confidence": { "type": "string", "enum": [ "high", "medium", "low" ] } } }, "requires": { "type": "object", "additionalProperties": false, "required": [ "needs_cross_entity_join", "needs_causal_chain", "needs_exact_object_trace", "needs_ranking", "needs_anomaly_summary", "needs_runtime_truth", "needs_period_cut", "needs_evidence" ], "properties": { "needs_cross_entity_join": { "type": "boolean" }, "needs_causal_chain": { "type": "boolean" }, "needs_exact_object_trace": { "type": "boolean" }, "needs_ranking": { "type": "boolean" }, "needs_anomaly_summary": { "type": "boolean" }, "needs_runtime_truth": { "type": "boolean" }, "needs_period_cut": { "type": "boolean" }, "needs_evidence": { "type": "boolean" } } }, "expected_output_shape": { "type": "string", "enum": [ "ranked_list", "evidence_chain", "anomaly_summary", "point_answer", "reconciliation_report", "prioritized_review_list" ] }, "route_hint": { "type": "string", "enum": [ "store_canonical", "store_feature_risk", "hybrid_store_plus_live", "live_mcp_drilldown", "batch_refresh_then_store" ] }, "ambiguities": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": [ "field", "reason", "severity" ], "properties": { "field": { "type": "string" }, "reason": { "type": "string" }, "severity": { "type": "string", "enum": [ "low", "medium", "high" ] } } } }, "confidence": { "type": "object", "additionalProperties": false, "required": [ "overall", "intent_class", "route_hint" ], "properties": { "overall": { "type": "string", "enum": [ "high", "medium", "low" ] }, "intent_class": { "type": "string", "enum": [ "high", "medium", "low" ] }, "route_hint": { "type": "string", "enum": [ "high", "medium", "low" ] } } } } }, "strict": true }, "verbosity": "medium" }, "tool_choice": "auto", "tools": [], "top_logprobs": 0, "top_p": 1, "truncation": "disabled", "usage": { "input_tokens": 2964, "input_tokens_details": { "cached_tokens": 2048 }, "output_tokens": 276, "output_tokens_details": { "reasoning_tokens": 0 }, "total_tokens": 3240 }, "user": null, "metadata": {} }, "parsed_normalized_json": { "schema_version": "normalized_query_v1", "user_question_raw": "Где по июню выглядит подозрительно, но без точечного документа, просто дай зоны риска.", "normalized_question": "Где по июню есть подозрительные зоны риска?", "intent_class": "anomaly_probe", "business_problem_type": "анализ аномалий", "domain_entities": [], "accounts_mentioned": [], "documents_mentioned": [], "registers_mentioned": [], "period_scope": { "type": "inferred", "value": "июнь", "confidence": "medium" }, "requires": { "needs_cross_entity_join": false, "needs_causal_chain": false, "needs_exact_object_trace": false, "needs_ranking": false, "needs_anomaly_summary": true, "needs_runtime_truth": false, "needs_period_cut": true, "needs_evidence": false }, "expected_output_shape": "anomaly_summary", "route_hint": "store_feature_risk", "ambiguities": [], "confidence": { "overall": "medium", "intent_class": "medium", "route_hint": "medium" } }, "validation_result": { "passed": true, "errors": [] }, "route_hint": "store_feature_risk", "confidence": "medium", "usage": { "input_tokens": 2964, "output_tokens": 276, "total_tokens": 3240 }, "latency_ms": 6702, "expected_route": "store_feature_risk", "eval_label": "eval-WWb7wzqwE2", "eval_mode": "single-pass-strict", "request_count_for_case": 1 }