Post-F: закрепить семантическую целостность MCP-цепочек

This commit is contained in:
2026-04-24 18:35:12 +03:00
parent 830e05fe97
commit 796a9a93f2
24 changed files with 2408 additions and 104 deletions
@@ -0,0 +1,249 @@
{
"schema_version": "domain_truth_harness_spec_v1",
"scenario_id": "address_truth_harness_phase82_human_mixed_integrity_status_dialog",
"domain": "address_phase82_human_mixed_integrity_status_dialog",
"title": "ARCH: Post-F Semantic Integrity Hardening mixed human status dialog",
"description": "Human-facing AGENT dialog that mixes the current Post-F repeated-pivot integrity contour with earlier bounded-autonomy contours: repeated counterparty pivots across documents, payments, and contracts; organization-scoped money analytics without a preselected counterparty; and a grounded named-counterparty money chain through incoming, payout, net, documents, and movements. The scenario uses explicit human resets between topics so the assistant must prove both continuity and clean topic switching rather than guessing vague 'continue' turns.",
"bindings": {},
"steps": [
{
"step_id": "step_01_documents_by_counterparty",
"title": "Open documents for the counterparty",
"question": "Покажи документы по Жуковке 51.",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": [
"(?i)жуковк",
"(?i)документ|сч[её]т|акт|накладн|строк"
],
"criticality": "critical",
"semantic_tags": ["post_f_integrity_hardening", "documents_by_counterparty", "pivot_seed", "human_dialog"]
},
{
"step_id": "step_02_payments_by_pronoun_followup",
"title": "Pivot to payments",
"question": "Хорошо, а теперь платежи по нему тоже покажи.",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": [
"(?i)жуковк|контрагент",
"(?i)платеж|операц|банк|поступлен|списан"
],
"criticality": "critical",
"semantic_tags": ["post_f_integrity_hardening", "payments_followup", "counterparty_pronoun_resolution", "human_dialog"]
},
{
"step_id": "step_03_contracts_after_payments_pivot",
"title": "Pivot to contracts",
"question": "А по нему договоры?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": [
"(?i)жуковк|контрагент",
"(?i)договор|контракт|соглаш"
],
"criticality": "critical",
"semantic_tags": ["post_f_integrity_hardening", "contracts_followup", "second_pivot", "human_dialog"]
},
{
"step_id": "step_04_documents_after_contracts_pivot",
"title": "Pivot back to documents",
"question": "А по нему документы?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": [
"(?i)жуковк|контрагент",
"(?i)документ|сч[её]т|акт|накладн|строк"
],
"criticality": "critical",
"semantic_tags": ["post_f_integrity_hardening", "documents_followup", "third_pivot", "human_dialog"]
},
{
"step_id": "step_05_payments_after_third_pivot",
"title": "Pivot back again to payments",
"question": "А по нему платежи?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": [
"(?i)жуковк|контрагент",
"(?i)платеж|операц|банк|поступлен|списан"
],
"criticality": "critical",
"semantic_tags": ["post_f_integrity_hardening", "payments_followup", "fourth_pivot", "human_dialog"]
},
{
"step_id": "step_06_year_switch_after_fourth_pivot",
"title": "Switch the year after the fourth pivot",
"question": "А за 2021?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": [
"(?i)2021",
"(?i)жуковк|контрагент",
"(?i)платеж|операц|банк|поступлен|списан"
],
"forbidden_answer_patterns": [
"(?i)метадан",
"(?i)схем",
"(?i)объект[а-я]* 1с"
],
"criticality": "critical",
"semantic_tags": ["post_f_integrity_hardening", "year_switch_after_fourth_pivot", "payments_followup", "human_dialog"]
},
{
"step_id": "step_07_open_scope_incoming_total",
"title": "Reset to organization-scoped money analytics without a preselected counterparty",
"question": "С Жуковкой закончили. Теперь нужна другая задача: быстрый денежный срез по одной организации. Если для ответа нужна организация, просто уточни ее. Сколько вообще входящих денег было за 2020 год?",
"allowed_reply_types": ["clarification_required", "partial_coverage"],
"required_answer_patterns_all": [
"(?i)уточн|нужно",
"(?i)организац"
],
"criticality": "critical",
"semantic_tags": ["organization_scope", "open_scope_total", "topic_reset", "human_dialog"]
},
{
"step_id": "step_08_open_scope_org_clarification",
"title": "Provide the organization and get the 2020 incoming total",
"question": "По ООО Альтернатива Плюс.",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": [
"(?i)2020",
"(?i)входящ|поступлен|получ"
],
"forbidden_answer_patterns": [
"(?i)уточните .*контрагент",
"(?i)не найден контрагент",
"(?i)уточните .*организац"
],
"criticality": "critical",
"semantic_tags": ["organization_scope", "open_scope_total", "organization_clarification", "human_dialog"]
},
{
"step_id": "step_09_open_scope_all_time_followup",
"title": "Broaden the same organization slice to all available time",
"question": "Понял, тогда за все время.",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": [
"(?i)все доступное время|все время|весь период",
"(?i)входящ|поступлен|получ"
],
"forbidden_answer_patterns": [
"(?i)за 2020",
"(?i)уточните .*контрагент",
"(?i)уточните .*период",
"(?i)уточните .*организац"
],
"criticality": "critical",
"semantic_tags": ["organization_scope", "all_time_followup", "human_dialog"]
},
{
"step_id": "step_10_bidirectional_comparison",
"title": "Ask which money direction is larger for the organization",
"question": "Хорошо. А что по ООО Альтернатива Плюс больше в 2020 году: входящие или исходящие деньги?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": [
"(?i)2020",
"(?i)входящ|исходящ|получ|заплат|больше"
],
"criticality": "critical",
"semantic_tags": ["organization_scope", "value_flow_comparison", "human_dialog"]
},
{
"step_id": "step_11_comparison_year_switch",
"title": "Ask the same comparison for another year",
"question": "А что по ООО Альтернатива Плюс больше уже за 2021 год: входящие или исходящие деньги?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": [
"(?i)2021",
"(?i)входящ|исходящ|получ|заплат|больше"
],
"criticality": "critical",
"semantic_tags": ["organization_scope", "value_flow_comparison", "year_switch", "human_dialog"]
},
{
"step_id": "step_12_ranking_top_counterparty",
"title": "Ask who brought the most money for the organization",
"question": "И кто больше всего принес денег этой организации в 2020 году?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": [
"(?i)2020",
"(?i)кто|контрагент|клиент|принес|доход"
],
"criticality": "critical",
"semantic_tags": ["organization_scope", "value_flow_ranking", "human_dialog"]
},
{
"step_id": "step_13_ranking_year_switch",
"title": "Ask the same ranking for another year",
"question": "А в 2021 году?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": [
"(?i)2021"
],
"criticality": "critical",
"semantic_tags": ["organization_scope", "value_flow_ranking", "year_switch", "human_dialog"]
},
{
"step_id": "step_14_ground_named_counterparty",
"title": "Reset to a named grounded counterparty",
"question": "Теперь отдельная тема по конкретному контрагенту. Найди в 1С Группу СВК.",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": [
"(?i)свк|группа свк|контрагент"
],
"criticality": "critical",
"semantic_tags": ["grounded_counterparty", "topic_reset", "human_dialog"]
},
{
"step_id": "step_15_counterparty_incoming_2020",
"title": "Ask how much money was received from the grounded counterparty",
"question": "Сколько получили по нему за 2020 год?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": [
"(?i)2020",
"(?i)получ|входящ|поступлен"
],
"criticality": "critical",
"semantic_tags": ["grounded_counterparty", "incoming_value_flow", "human_dialog"]
},
{
"step_id": "step_16_counterparty_payout_followup",
"title": "Ask how much was paid to the same grounded counterparty",
"question": "А теперь сколько заплатили?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": [
"(?i)заплат|исходящ|списан|платеж"
],
"criticality": "critical",
"semantic_tags": ["grounded_counterparty", "payout_value_flow", "human_dialog"]
},
{
"step_id": "step_17_counterparty_net_followup",
"title": "Ask for net after incoming and payout",
"question": "А какое нетто?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": [
"(?i)нетто|сальдо|получ|заплат"
],
"criticality": "critical",
"semantic_tags": ["grounded_counterparty", "net_value_flow", "human_dialog"]
},
{
"step_id": "step_18_counterparty_documents_pivot",
"title": "Pivot from money to documents for the same counterparty",
"question": "А по документам?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": [
"(?i)документ|счет|сч[её]т[- ]?фактур|накладн|акт|строк"
],
"criticality": "critical",
"semantic_tags": ["grounded_counterparty", "documents_pivot", "human_dialog"]
},
{
"step_id": "step_19_counterparty_movements_pivot",
"title": "Pivot from documents to movements for the same counterparty",
"question": "А по движениям?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": [
"(?i)движени|операц|платеж|поступлен|списан|строк"
],
"criticality": "critical",
"semantic_tags": ["grounded_counterparty", "movements_pivot", "human_dialog"]
}
]
}
@@ -0,0 +1,238 @@
{
"schema_version": "domain_truth_harness_spec_v1",
"scenario_id": "address_truth_harness_post_f_cross_stage_canary_agent_20260424",
"domain": "address_post_f_cross_stage_canary_agent",
"title": "AGENT | Post-F cross-stage semantic integrity canary",
"description": "Long human-facing AGENT dialog for the end of Post-F Semantic Integrity Hardening. It deliberately crosses older validated contours and the current fix surface in one session: VAT/metadata orientation, movement-to-document pivots, numeric counterparty suffix scope, repeated documents/payments/contracts pivots, organization open-scope clarification, bidirectional value-flow, ranking, grounded SVK counterparty chains, and final document/movement pivots. The goal is to catch stale scope, account injection, wrong post-pivot arbitration, materialization gaps, and regressions in older bounded MCP stages before saving the run into autoruns.",
"bindings": {},
"steps": [
{
"step_id": "step_01_vat_metadata_orientation",
"title": "Orient inside VAT objects",
"question": "Мне нужно понять, где в 1С по НДС вообще лежат данные. Какие объекты стоит смотреть по НДС?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)ндс", "(?i)метадан|metadata|документ|регистр|объект"],
"criticality": "critical",
"semantic_tags": ["legacy_phase64", "metadata_surface", "vat_orientation", "cross_stage_canary"]
},
{
"step_id": "step_02_vat_movements_org_needs_period",
"title": "Choose movement lane and organization",
"question": "Хорошо, тогда покажи движения по ООО Альтернатива Плюс.",
"allowed_reply_types": ["clarification_required", "partial_coverage", "factual_with_explanation"],
"required_answer_patterns_all": ["(?i)движени|регистр|операц|период|уточн"],
"criticality": "critical",
"semantic_tags": ["legacy_phase64", "movement_lane_after_metadata", "organization_scope"]
},
{
"step_id": "step_03_vat_movements_2020",
"title": "Provide the period",
"question": "За 2020 год.",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)2020", "(?i)ндс|движени|регистр|операц|строк|поступлен|списан"],
"criticality": "critical",
"semantic_tags": ["legacy_phase64", "movement_execution", "period_clarification_resume"]
},
{
"step_id": "step_04_vat_documents_pivot",
"title": "Pivot from movements to documents",
"question": "А теперь по документам?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)документ|счет|сч[её]т|накладн|акт|строк"],
"forbidden_answer_patterns": ["(?i)уточните .*организац", "(?i)уточните .*период"],
"criticality": "critical",
"semantic_tags": ["legacy_phase64", "document_pivot_after_movement", "scope_reuse"]
},
{
"step_id": "step_05_vat_documents_year_switch",
"title": "Switch document slice to another year",
"question": "А теперь за 2021 год?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)2021", "(?i)документ|счет|сч[её]т|накладн|акт|строк"],
"forbidden_answer_patterns": ["(?i)уточните .*организац", "(?i)уточните .*период"],
"criticality": "critical",
"semantic_tags": ["legacy_phase64", "year_switch_after_document_pivot"]
},
{
"step_id": "step_06_vat_documents_all_time",
"title": "Broaden document slice to all available time",
"question": "А теперь за все время?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)все доступное время|все время|весь период|истори", "(?i)документ|счет|сч[её]т|накладн|акт|строк"],
"forbidden_answer_patterns": ["(?i)уточните .*период"],
"criticality": "critical",
"semantic_tags": ["legacy_phase64", "all_time_followup", "document_lane_continuity"]
},
{
"step_id": "step_07_reset_to_numeric_counterparty_documents",
"title": "Reset to numeric counterparty suffix documents",
"question": "С НДС закончили. Новая тема: покажи документы по Жуковке 51.",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)жуковк", "(?i)документ|счет|сч[её]т|накладн|акт|строк"],
"forbidden_answer_patterns": ["(?i)счет 51", "(?i)account 51"],
"criticality": "critical",
"semantic_tags": ["post_f", "numeric_counterparty_suffix", "account_injection_guard", "topic_reset"]
},
{
"step_id": "step_08_numeric_counterparty_payments",
"title": "Pivot numeric counterparty to payments",
"question": "Хорошо, а теперь платежи по нему тоже покажи.",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)жуковк|контрагент", "(?i)платеж|операц|банк|поступлен|списан"],
"criticality": "critical",
"semantic_tags": ["post_f", "counterparty_pronoun_resolution", "payments_followup"]
},
{
"step_id": "step_09_numeric_counterparty_contracts",
"title": "Pivot numeric counterparty to contracts",
"question": "А по нему договоры?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)жуковк|контрагент", "(?i)договор|контракт|соглаш"],
"criticality": "critical",
"semantic_tags": ["post_f", "contracts_followup", "repeated_pivot"]
},
{
"step_id": "step_10_numeric_counterparty_documents_again",
"title": "Pivot back to documents again",
"question": "А по нему документы?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)жуковк|контрагент", "(?i)документ|счет|сч[её]т|накладн|акт|строк"],
"criticality": "critical",
"semantic_tags": ["post_f", "documents_followup", "repeated_pivot"]
},
{
"step_id": "step_11_numeric_counterparty_year_switch",
"title": "Switch numeric counterparty active lane to 2021",
"question": "А за 2021?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)2021", "(?i)жуковк|контрагент"],
"criticality": "critical",
"semantic_tags": ["post_f", "year_switch_after_repeated_pivot"]
},
{
"step_id": "step_12_open_org_money_requires_clarification",
"title": "Reset to open organization-scoped value flow",
"question": "С Жуковкой закончили. Теперь другая задача: быстрый денежный срез по одной организации. Если для ответа нужна организация, просто уточни ее. Сколько вообще входящих денег было за 2020 год?",
"allowed_reply_types": ["clarification_required", "partial_coverage"],
"required_answer_patterns_all": ["(?i)уточн|нужно", "(?i)организац"],
"criticality": "critical",
"semantic_tags": ["post_f", "open_scope_total", "organization_clarification", "topic_reset"]
},
{
"step_id": "step_13_open_org_clarification_answer",
"title": "Provide organization for open money slice",
"question": "По ООО Альтернатива Плюс.",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)2020|проверенн|строк", "(?i)входящ|поступлен|получ"],
"forbidden_answer_patterns": ["(?i)уточните .*контрагент", "(?i)уточните .*организац"],
"criticality": "critical",
"semantic_tags": ["post_f", "organization_scope", "clarification_resume"]
},
{
"step_id": "step_14_open_org_all_time",
"title": "Broaden same organization money slice",
"question": "Понял, тогда за все время.",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)все доступное время|все время|весь период|истори", "(?i)входящ|поступлен|получ"],
"forbidden_answer_patterns": ["(?i)уточните .*контрагент", "(?i)уточните .*организац"],
"criticality": "critical",
"semantic_tags": ["post_f", "organization_scope", "all_time_followup"]
},
{
"step_id": "step_15_open_org_bidirectional_2020",
"title": "Bidirectional comparison for organization",
"question": "Хорошо. А что по ООО Альтернатива Плюс больше в 2020 году: входящие или исходящие деньги?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)2020", "(?i)входящ|исходящ|получ|заплат|больше"],
"criticality": "critical",
"semantic_tags": ["post_f", "bidirectional_value_flow", "organization_scope"]
},
{
"step_id": "step_16_open_org_ranking_2020",
"title": "Ranking after organization comparison",
"question": "И кто больше всего принес денег этой организации в 2020 году?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)2020", "(?i)кто|контрагент|клиент|принес|доход|поступлен"],
"criticality": "critical",
"semantic_tags": ["legacy_phase39", "value_flow_ranking", "organization_scope"]
},
{
"step_id": "step_17_open_org_ranking_year_switch",
"title": "Ranking year switch",
"question": "А в 2021 году?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)2021"],
"criticality": "critical",
"semantic_tags": ["legacy_phase39", "year_switch", "organization_scope"]
},
{
"step_id": "step_18_ground_svk_counterparty",
"title": "Reset to grounded SVK counterparty",
"question": "Теперь отдельная тема по конкретному контрагенту. Найди в 1С Группу СВК.",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)свк", "(?i)контрагент|каталог|1с|заземл"],
"criticality": "critical",
"semantic_tags": ["legacy_phase67", "grounded_counterparty", "topic_reset"]
},
{
"step_id": "step_19_svk_incoming_2020",
"title": "SVK incoming value flow",
"question": "Сколько получили по нему за 2020 год?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)2020", "(?i)свк|контрагент|входящ|поступлен|получ"],
"forbidden_answer_patterns": ["(?i)жуковк"],
"criticality": "critical",
"semantic_tags": ["legacy_phase67", "grounded_counterparty", "incoming_value_flow"]
},
{
"step_id": "step_20_svk_payout",
"title": "SVK outgoing value flow",
"question": "А теперь сколько заплатили?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)свк|контрагент|заплат|исходящ|списан|платеж"],
"forbidden_answer_patterns": ["(?i)жуковк"],
"criticality": "critical",
"semantic_tags": ["legacy_phase67", "grounded_counterparty", "payout_value_flow"]
},
{
"step_id": "step_21_svk_net",
"title": "SVK net value flow",
"question": "А какое нетто?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)свк|контрагент|нетто|сальдо|получ|заплат"],
"forbidden_answer_patterns": ["(?i)жуковк"],
"criticality": "critical",
"semantic_tags": ["legacy_phase67", "grounded_counterparty", "net_value_flow"]
},
{
"step_id": "step_22_svk_documents_pivot",
"title": "SVK documents pivot",
"question": "А по документам?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)свк|контрагент|документ|счет|сч[её]т|накладн|акт|строк"],
"forbidden_answer_patterns": ["(?i)жуковк"],
"criticality": "critical",
"semantic_tags": ["legacy_phase67", "grounded_counterparty", "documents_pivot"]
},
{
"step_id": "step_23_svk_movements_pivot",
"title": "SVK movements pivot",
"question": "А по движениям?",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)свк|контрагент|движени|операц|платеж|поступлен|списан|строк"],
"forbidden_answer_patterns": ["(?i)жуковк"],
"criticality": "critical",
"semantic_tags": ["legacy_phase67", "grounded_counterparty", "movements_pivot"]
},
{
"step_id": "step_24_svk_year_switch",
"title": "SVK year switch",
"question": "А теперь тот же смысл за 2021 год.",
"allowed_reply_types": ["factual", "factual_with_explanation", "partial_coverage"],
"required_answer_patterns_all": ["(?i)2021", "(?i)свк|контрагент"],
"forbidden_answer_patterns": ["(?i)жуковк"],
"criticality": "critical",
"semantic_tags": ["legacy_phase67", "grounded_counterparty", "year_switch"]
}
]
}