From ee98b0470650d5b402a85521091bee362917df02 Mon Sep 17 00:00:00 2001 From: dctouch Date: Mon, 15 Jun 2026 23:46:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=82=D1=8C=20Phase108?= =?UTF-8?q?=20=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D0=B9=20=D1=80?= =?UTF-8?q?=D0=B0=D1=81=D1=87=D0=B5=D1=82=D0=BE=D0=B2=20=D0=B8=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=81=D1=80=D0=BE=D1=87=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orchestration/active_domain_contract.json | 404 ++++++++---------- 1 file changed, 189 insertions(+), 215 deletions(-) diff --git a/docs/orchestration/active_domain_contract.json b/docs/orchestration/active_domain_contract.json index 1e911a9..59063ec 100644 --- a/docs/orchestration/active_domain_contract.json +++ b/docs/orchestration/active_domain_contract.json @@ -1,10 +1,10 @@ { "schema_version": "domain_scenario_pack_v1", - "pack_id": "active_phase107_mixed_planner_brain_dogfood_20260615", - "domain": "address_phase107_mixed_planner_brain_dogfood", - "runtime_domain": "planner_autonomy_mixed_boundary", - "title": "Mixed planner-brain dogfood replay", - "description": "Active slice for dogfooding the autonomous agent loop on a compact mixed planner path: living chat guard, counterparty alias grounding, follow-up money flow, net, documents, movement evidence, broad business evaluation, and off-domain recovery.", + "pack_id": "active_phase108_settlement_pivot_debt_boundary_20260615", + "domain": "address_phase108_settlement_pivot_debt_boundary", + "runtime_domain": "settlement_document_payment_contract_pivots", + "title": "Settlement pivot and debt boundary replay", + "description": "Active slice for dogfooding the autonomous agent loop on a settlement-heavy path: counterparty document root, repeated payments/contracts/documents pivots, year switch carryover, debt due-date boundary, and off-domain recovery.", "status": "active", "source_of_truth_policy": { "purpose": "single mutable domain source for the current orchestration target", @@ -21,25 +21,27 @@ }, "analysis_context": { "as_of_date": "2026-06-15", - "source": "phase107_after_phase106_profit_cashflow_margin_next_step", + "source": "phase108_after_phase107_mixed_planner_brain_dogfood", "known_previous_anchors": [ - "phase83_planner_brain_alignment_mix_20260603_live9", - "phase104_generic_role_tail_anchor_hygiene_20260615_p04_loop", - "phase106_profit_cashflow_margin_next_step_20260615_p03_loop" + "phase75_contracts_to_payments_year_switch", + "phase79_payments_to_contracts_to_documents_year_switch", + "phase81_payments_contracts_documents_back_to_payments_year_switch", + "phase94_debt_due_date_aging_reviewed_route", + "phase107_mixed_planner_brain_dogfood_20260615_p11_loop" ], - "why_now": "Phase83 passed in the legacy truth-harness format; this pack replays the highest-value mixed planner slice through the current autonomous pack-loop." + "why_now": "Phase107 hardened counterparty money-flow memory. Phase108 moves to settlement pivots: documents, payments, contracts, repeated pronoun reuse, year-switch carryover, and honest debt due-date boundaries." }, "target_score": 88, "bindings": { "main_organization": "ООО Альтернатива Плюс", - "control_year": "2020", - "svk_counterparty": "Группа СВК" + "pivot_counterparty": "Жуковка 51", + "control_year": "2021", + "debt_boundary_year_end": "2020-12-31" }, "issue_codes_under_test": [ "technical_garbage_in_answer", "business_direct_answer_missing", "business_next_step_missing", - "counterparty_value_flow_misrouted_to_company_profit", "business_utility_gap" ], "detectors_under_test": [ @@ -48,62 +50,66 @@ "first_line_not_direct_answer", "top_level_scaffold_before_answer", "limited_answer_without_next_action", - "counterparty_value_flow_required_surface", - "counterparty_value_flow_profit_accounts_forbidden" + "business_answer_too_verbose_output" ], "agent_audit_expectations": { "semantic_answer_review_first": true, "direct_answer_first": true, "business_utility_required": true, "selected_counterparty_memory_required": true, - "date_carryover_required": true, - "documents_and_movements_are_evidence_drilldowns": true, + "pivot_action_memory_required": true, + "year_switch_keeps_last_action_required": true, + "debt_due_date_boundary_must_be_honest": true, "off_domain_living_chat_must_not_replay_business_context": true, "technical_garbage_forbidden": true, "do_not_accept_if": [ - "a follow-up over 'нему' loses the selected counterparty", - "a payout or net follow-up loses the 2020 period", - "a counterparty received/paid/net question is answered as company profit", - "document or movement follow-up answers with a fresh clarification instead of reusing the selected counterparty", - "broad business evaluation leaks route ids, capability ids, runtime enums, or debug payload", + "a pronoun follow-up over 'по нему' loses Жуковка 51", + "the year switch asks again for a counterparty instead of reusing the active settlement object", + "a payment/contracts/documents pivot answers with a different object family without saying so", + "the debt due-date answer claims proven overdue debt without payment-term evidence", + "the final answer leaks route ids, capability ids, runtime enums, or debug payload", "off-domain living chat is hijacked by stale 1C business context" ] }, "scenarios": [ { - "scenario_id": "mixed_planner_counterparty_evidence_and_living_guard", - "title": "Counterparty memory, evidence drilldowns, business overview, and off-domain guard", - "description": "Validate a compact but cross-cutting planner path: chat sanity, loose counterparty alias grounding, follow-up money flow and net, documents/movements evidence, explicit broad company evaluation, and recovery into ordinary living chat.", + "scenario_id": "settlement_pivot_year_switch_and_debt_boundary", + "title": "Documents, payments, contracts, year switch, and debt boundary", + "description": "Validate repeated settlement pivots over the same counterparty and a debt due-date boundary canary in one session.", "steps": [ { - "step_id": "step_01_human_smalltalk_sanity", - "title": "Living chat remains human and does not expose discovery internals", + "step_id": "step_01_documents_by_counterparty", + "title": "Open documents for the counterparty", "node_role": "root", - "question": "привет, ты на связи?", + "question": "Покажи документы по Жуковке 51.", "allowed_reply_types": [ + "factual", "factual_with_explanation", "partial_coverage" ], "semantic_tags": [ - "human_answer", - "mcp_discovery_gate_sanity", - "meta_smalltalk" + "documents_by_counterparty", + "counterparty_root", + "pivot_seed", + "integrity_guard" ], "required_answer_shape": "direct_answer_first", - "required_answer_patterns_any": [ - "(?i)привет|на связи|готов|помочь" + "required_answer_patterns_all": [ + "(?i)жуковк", + "(?i)документ|сч[её]т|акт|накладн|строк" ], "forbidden_answer_patterns": [ - "(?i)mcp|runtime_|query_documents|primitive|route_candidate|capability_id|snapshot_items|answer_object" + "(?i)route_candidate|primitive|planner_|catalog_|snapshot_items|answer_object|capability_id|mcp_discovery", + "(?i)уточните.*контрагент|какого контрагента" ], - "criticality": "info" + "criticality": "critical" }, { - "step_id": "step_02_resolve_counterparty_alias", - "title": "Entity resolution grounds the checked 1C counterparty from a loose alias", - "question": "найди в 1С контрагента СВК", + "step_id": "step_02_payments_by_pronoun_followup", + "title": "Pivot from documents to payments", + "question": "А по нему платежи?", "depends_on": [ - "step_01_human_smalltalk_sanity" + "step_01_documents_by_counterparty" ], "allowed_reply_types": [ "factual", @@ -111,139 +117,29 @@ "partial_coverage" ], "semantic_tags": [ - "entity_resolution", - "alias_grounding", - "followup_anchor", - "planner_catalog_alignment" + "payments_followup", + "counterparty_pronoun_resolution", + "document_to_payments_pivot", + "integrity_guard" ], "required_answer_shape": "direct_answer_first", "required_answer_patterns_all": [ - "(?i)свк", - "(?i)контрагент" - ], - "required_answer_patterns_any": [ - "(?i)группа\\s+свк", - "(?i)каталог|найден|наиболее вероятн" + "(?i)жуковк|контрагент", + "(?i)плат[её]ж|операц|банк|поступлен|списан" ], "forbidden_answer_patterns": [ - "(?i)получили|заплатили|нетто|оборот|выручк|сумм(а|ы)", + "(?i)уточните.*контрагент|какого контрагента", + "(?i)документы по всем контрагентам", "(?i)route_candidate|primitive|planner_|catalog_|snapshot_items|answer_object|capability_id|mcp_discovery" ], "criticality": "critical" }, { - "step_id": "step_03_incoming_by_resolved_entity", - "title": "Incoming value-flow follow-up reuses the resolved counterparty anchor", - "question": "сколько получили по нему за 2020 год", + "step_id": "step_03_contracts_after_payments_pivot", + "title": "Pivot from payments to contracts", + "question": "А по нему договоры?", "depends_on": [ - "step_02_resolve_counterparty_alias" - ], - "allowed_reply_types": [ - "factual_with_explanation", - "partial_coverage" - ], - "semantic_tags": [ - "entity_resolution", - "incoming_value_flow", - "followup_reuse", - "date_carryover", - "planner_catalog_alignment" - ], - "required_answer_shape": "direct_answer_first", - "required_answer_patterns_all": [ - "(?i)2020", - "(?i)получил|входящ|поступ", - "(?i)руб" - ], - "required_answer_patterns_any": [ - "(?i)группа\\s+свк", - "(?i)свк" - ], - "forbidden_answer_patterns": [ - "(?i)не найден контрагент|уточните, какого контрагента|по какому контрагенту", - "(?i)чист.*прибыл|90/91/99|финрезульт", - "(?i)route_candidate|primitive|planner_|catalog_|snapshot_items|answer_object|capability_id|mcp_discovery" - ], - "criticality": "critical" - }, - { - "step_id": "step_04_payout_switch_by_resolved_entity", - "title": "Outgoing payment follow-up keeps the same grounded counterparty and checked year", - "question": "а теперь сколько заплатили?", - "depends_on": [ - "step_03_incoming_by_resolved_entity" - ], - "allowed_reply_types": [ - "factual_with_explanation", - "partial_coverage" - ], - "semantic_tags": [ - "entity_resolution", - "payout_switch", - "followup_reuse", - "date_carryover", - "planner_catalog_alignment" - ], - "required_answer_shape": "direct_answer_first", - "required_answer_patterns_all": [ - "(?i)2020", - "(?i)заплатил|исходящ|списан|платеж|платёж", - "(?i)руб" - ], - "required_answer_patterns_any": [ - "(?i)группа\\s+свк", - "(?i)свк" - ], - "forbidden_answer_patterns": [ - "(?i)не найден контрагент|уточните, какого контрагента|по какому контрагенту|за какой год", - "(?i)чист.*прибыл|90/91/99|финрезульт", - "(?i)route_candidate|primitive|planner_|catalog_|snapshot_items|answer_object|capability_id|mcp_discovery" - ], - "criticality": "critical" - }, - { - "step_id": "step_05_net_after_payout", - "title": "Net-flow follow-up reuses the same grounded counterparty and checked year after payout", - "question": "а какое нетто?", - "depends_on": [ - "step_04_payout_switch_by_resolved_entity" - ], - "allowed_reply_types": [ - "factual_with_explanation", - "partial_coverage" - ], - "semantic_tags": [ - "entity_resolution", - "net_value_flow", - "followup_reuse", - "date_carryover", - "planner_catalog_alignment" - ], - "required_answer_shape": "direct_answer_first", - "required_answer_patterns_all": [ - "(?i)2020", - "(?i)нетто|сальдо|разниц", - "(?i)получ", - "(?i)заплат", - "(?i)руб" - ], - "required_answer_patterns_any": [ - "12[ .\\u00a0]?093[ .\\u00a0]?465|12093465", - "(?i)группа\\s+свк|свк" - ], - "forbidden_answer_patterns": [ - "(?i)не найден контрагент|уточните, какого контрагента|по какому контрагенту|за какой год", - "(?i)чист.*прибыл|90/91/99|финрезульт", - "(?i)route_candidate|primitive|planner_|catalog_|snapshot_items|answer_object|capability_id|mcp_discovery" - ], - "criticality": "critical" - }, - { - "step_id": "step_06_documents_after_net", - "title": "Document evidence follow-up keeps the grounded counterparty after the net answer", - "question": "а по документам?", - "depends_on": [ - "step_05_net_after_payout" + "step_02_payments_by_pronoun_followup" ], "allowed_reply_types": [ "factual", @@ -251,34 +147,28 @@ "partial_coverage" ], "semantic_tags": [ - "entity_resolution", - "document_evidence", - "value_flow_pivot", - "followup_reuse", - "planner_catalog_alignment" + "contracts_followup", + "second_pivot", + "counterparty_pronoun_resolution", + "integrity_guard" ], "required_answer_shape": "direct_answer_first", "required_answer_patterns_all": [ - "(?i)документ|счет|счёт|накладн|акт" - ], - "required_answer_patterns_any": [ - "(?i)группа\\s+свк", - "(?i)свк", - "(?i)2020" + "(?i)жуковк|контрагент", + "(?i)договор|контракт|соглаш" ], "forbidden_answer_patterns": [ - "(?i)не найден контрагент|уточните, какого контрагента|по какому контрагенту", - "(?i)сколько получили|сколько заплатили|нетто", + "(?i)уточните.*контрагент|какого контрагента", "(?i)route_candidate|primitive|planner_|catalog_|snapshot_items|answer_object|capability_id|mcp_discovery" ], "criticality": "critical" }, { - "step_id": "step_07_movements_after_documents", - "title": "Movement evidence follow-up keeps the grounded counterparty after the document answer", - "question": "а по движениям?", + "step_id": "step_04_documents_after_contracts_pivot", + "title": "Pivot back from contracts to documents", + "question": "А по нему документы?", "depends_on": [ - "step_06_documents_after_net" + "step_03_contracts_after_payments_pivot" ], "allowed_reply_types": [ "factual", @@ -286,84 +176,168 @@ "partial_coverage" ], "semantic_tags": [ - "entity_resolution", - "movement_evidence", - "document_pivot", - "followup_reuse", - "planner_catalog_alignment" + "documents_followup", + "third_pivot", + "counterparty_pronoun_resolution", + "integrity_guard" ], "required_answer_shape": "direct_answer_first", "required_answer_patterns_all": [ - "(?i)движени|операц|платеж|платёж|списан|поступ" - ], - "required_answer_patterns_any": [ - "(?i)группа\\s+свк", - "(?i)свк", - "(?i)2020" + "(?i)жуковк|контрагент", + "(?i)документ|сч[её]т|акт|накладн|строк" ], "forbidden_answer_patterns": [ - "(?i)не найден контрагент|уточните, какого контрагента|по какому контрагенту", - "(?i)сколько получили|сколько заплатили|нетто", + "(?i)уточните.*контрагент|какого контрагента", "(?i)route_candidate|primitive|planner_|catalog_|snapshot_items|answer_object|capability_id|mcp_discovery" ], "criticality": "critical" }, { - "step_id": "step_08_broad_business_evaluation_explicit_org", - "title": "Broad business evaluation stays grounded and bounded after counterparty drilldowns", - "question": "Как ты оценишь деятельность компании {{bindings.main_organization}} по данным 1С?", + "step_id": "step_05_payments_after_documents_pivot", + "title": "Pivot back again to payments", + "question": "А по нему платежи?", "depends_on": [ - "step_07_movements_after_documents" + "step_04_documents_after_contracts_pivot" ], "allowed_reply_types": [ + "factual", "factual_with_explanation", "partial_coverage" ], "semantic_tags": [ - "broad_business_evaluation", - "grounded_summary", - "context_switch_from_counterparty_to_company" + "payments_followup", + "fourth_pivot", + "counterparty_pronoun_resolution", + "integrity_guard" ], "required_answer_shape": "direct_answer_first", "required_answer_patterns_all": [ - "(?i)альтернатива", - "(?i)ограниченн|проверенн|не\\s+аудит|не\\s+аудитор", - "(?i)1с|подтвержд", - "(?i)денежн|долг|ндс|контрагент|операц" + "(?i)жуковк|контрагент", + "(?i)плат[её]ж|операц|банк|поступлен|списан" ], "forbidden_answer_patterns": [ - "(?i)^\\s*коротко:", - "(?i)чистая\\s+прибыль\\s+подтверждена|аудиторское\\s+заключение", + "(?i)уточните.*контрагент|какого контрагента", + "(?i)route_candidate|primitive|planner_|catalog_|snapshot_items|answer_object|capability_id|mcp_discovery" + ], + "criticality": "critical" + }, + { + "step_id": "step_06_year_switch_after_payments", + "title": "Year switch keeps counterparty and payment action", + "question": "А за 2021?", + "depends_on": [ + "step_05_payments_after_documents_pivot" + ], + "allowed_reply_types": [ + "factual", + "factual_with_explanation", + "partial_coverage" + ], + "semantic_tags": [ + "year_switch_after_fourth_pivot", + "payments_followup", + "period_followup_reuse", + "integrity_guard" + ], + "required_answer_shape": "direct_answer_first", + "required_answer_patterns_all": [ + "(?i)2021", + "(?i)жуковк|контрагент", + "(?i)плат[её]ж|операц|банк|поступлен|списан" + ], + "forbidden_answer_patterns": [ + "(?i)уточните.*контрагент|какого контрагента|за какой год", + "(?i)метадан|схем|объект[а-я]* 1с", + "(?i)route_candidate|primitive|planner_|catalog_|snapshot_items|answer_object|capability_id|mcp_discovery" + ], + "criticality": "critical" + }, + { + "step_id": "step_07_debt_due_date_boundary", + "title": "Debt due-date ask stays honest about overdue evidence", + "question": "По ООО Альтернатива Плюс на конец 2020 можно точно понять, какая дебиторка просрочена?", + "allowed_reply_types": [ + "factual", + "factual_with_explanation", + "partial_coverage" + ], + "semantic_tags": [ + "business_overview", + "debt_due_date_boundary", + "checked_negative", + "honest_boundary" + ], + "required_answer_shape": "direct_answer_first", + "required_answer_patterns_all": [ + "(?i)дебитор|долг|открыт.*расчет|остат", + "(?i)2020|2020-12-31|конец 2020", + "(?i)срок.*оплат|due[- ]?date|просроч", + "(?i)не установлен|не подтвержд|не доказ|нет подтвержденной просроч", + "(?i)1С|проверенн|найденн|подтвержд" + ], + "forbidden_answer_patterns": [ + "(?i)точно подтверждаю.*просроч", + "(?i)просроч.*подтвержден.*без.*срок", + "(?i)route_candidate|query_movements|primitive|planner_|catalog_|snapshot_items|answer_object|capability_id|mcp_discovery" + ], + "criticality": "critical" + }, + { + "step_id": "step_08_debt_boundary_short_followup", + "title": "Short follow-up keeps the debt due-date boundary", + "question": "То есть просрочку доказать нельзя, коротко почему?", + "depends_on": [ + "step_07_debt_due_date_boundary" + ], + "allowed_reply_types": [ + "factual", + "factual_with_explanation", + "partial_coverage" + ], + "semantic_tags": [ + "context_carryover", + "debt_due_date_boundary", + "checked_negative", + "short_followup" + ], + "required_answer_shape": "direct_answer_first", + "required_answer_patterns_all": [ + "(?i)срок.*оплат|due[- ]?date|договор", + "(?i)не установлен|не хватает|не подтвержд|не доказ", + "(?i)просроч", + "(?i)2020|2020-12-31|конец 2020" + ], + "forbidden_answer_patterns": [ + "(?i)уточните организац|какую компанию", + "(?i)точно подтверждаю.*просроч", "(?i)route_candidate|primitive|planner_|catalog_|snapshot_items|answer_object|capability_id|mcp_discovery" ], "criticality": "critical" }, { "step_id": "step_09_off_domain_living_chat_not_hijacked", - "title": "Off-domain living chat is not hijacked by stale business context", - "question": "а чем капибара отличается от утки?", - "depends_on": [ - "step_08_broad_business_evaluation_explicit_org" - ], + "title": "Off-domain chat recovers after settlement and debt context", + "question": "Ок, а пингвины умеют летать?", "allowed_reply_types": [ + "factual", "factual_with_explanation", "partial_coverage" ], "semantic_tags": [ "off_domain_living_chat", - "stale_replay_forbidden", - "context_boundary" + "context_boundary", + "human_answer" ], "required_answer_shape": "direct_answer_first", "required_answer_patterns_any": [ - "(?i)капибар.*утк|утк.*капибар", - "(?i)млекопита|птиц|грызун" + "(?i)пингвин", + "(?i)не умеют летать|не летают|большинство.*не летает" ], "forbidden_answer_patterns": [ - "(?i)альтернатива|свк|контрагент|1с|поступлен|платеж|платёж|нетто", + "(?i)1С|контрагент|дебитор|договор|плат[её]ж|документ|Жуковк|Альтернатива", "(?i)route_candidate|primitive|planner_|catalog_|snapshot_items|answer_object|capability_id|mcp_discovery" ], - "criticality": "warning" + "criticality": "info" } ] }