Зафиксировать phase104 для проверки ролевых хвостов
This commit is contained in:
parent
13c48ea96e
commit
10cc779de8
|
|
@ -1,10 +1,10 @@
|
||||||
{
|
{
|
||||||
"schema_version": "domain_scenario_pack_v1",
|
"schema_version": "domain_scenario_pack_v1",
|
||||||
"pack_id": "active_counterparty_value_flow_boundary_20260615",
|
"pack_id": "active_phase104_generic_role_tail_anchor_hygiene_20260615",
|
||||||
"domain": "agent_counterparty_value_flow_boundary",
|
"domain": "address_phase104_generic_role_tail_anchor_hygiene",
|
||||||
"runtime_domain": "business_overview_counterparty_value_flow",
|
"runtime_domain": "business_overview_role_tail_anchor_hygiene",
|
||||||
"title": "Counterparty value-flow and bank-role boundary",
|
"title": "Generic role-tail anchor hygiene",
|
||||||
"description": "Active slice for the autonomous agent loop: verify that company overview, explicit counterparty value-flow, selected counterparty follow-ups, and bank-role caveats stay separated in user-facing answers.",
|
"description": "Active slice for the autonomous agent loop: broad company overview wording may mention customer/supplier roles, but generic role tails must not become counterparty anchors or poison later bank/counterparty drilldowns.",
|
||||||
"status": "active",
|
"status": "active",
|
||||||
"source_of_truth_policy": {
|
"source_of_truth_policy": {
|
||||||
"purpose": "single mutable domain source for the current orchestration target",
|
"purpose": "single mutable domain source for the current orchestration target",
|
||||||
|
|
@ -21,23 +21,21 @@
|
||||||
},
|
},
|
||||||
"analysis_context": {
|
"analysis_context": {
|
||||||
"as_of_date": "2026-06-15",
|
"as_of_date": "2026-06-15",
|
||||||
"source": "agent_loop_next_domain_slice_after_margin_p12"
|
"source": "phase104_generic_role_tail_anchor_hygiene_after_value_flow_p06"
|
||||||
},
|
},
|
||||||
"target_score": 88,
|
"target_score": 88,
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"main_organization": "ООО Альтернатива Плюс",
|
"main_organization": "ООО Альтернатива Плюс",
|
||||||
"control_year": "2020",
|
"control_year": "2020",
|
||||||
|
"bank_counterparty": "СБЕРБАНК",
|
||||||
"svk_counterparty": "Группа СВК"
|
"svk_counterparty": "Группа СВК"
|
||||||
},
|
},
|
||||||
"issue_codes_under_test": [
|
"issue_codes_under_test": [
|
||||||
"counterparty_value_flow_misrouted_to_company_profit",
|
|
||||||
"bank_counterparty_misclassified_as_business_partner",
|
"bank_counterparty_misclassified_as_business_partner",
|
||||||
"technical_garbage_in_answer",
|
"technical_garbage_in_answer",
|
||||||
"business_next_step_missing"
|
"business_next_step_missing"
|
||||||
],
|
],
|
||||||
"detectors_under_test": [
|
"detectors_under_test": [
|
||||||
"counterparty_value_flow_required_surface",
|
|
||||||
"counterparty_value_flow_profit_accounts_forbidden",
|
|
||||||
"bank_counterparty_boundary_required",
|
"bank_counterparty_boundary_required",
|
||||||
"runtime_tokens_in_user_answer",
|
"runtime_tokens_in_user_answer",
|
||||||
"capability_ids_in_user_answer",
|
"capability_ids_in_user_answer",
|
||||||
|
|
@ -47,186 +45,145 @@
|
||||||
"semantic_answer_review_first": true,
|
"semantic_answer_review_first": true,
|
||||||
"direct_answer_first": true,
|
"direct_answer_first": true,
|
||||||
"business_utility_required": true,
|
"business_utility_required": true,
|
||||||
"counterparty_scope_required": true,
|
"generic_role_tail_must_not_be_anchor": true,
|
||||||
"company_profit_boundary_required": true,
|
|
||||||
"bank_role_boundary_required": true,
|
"bank_role_boundary_required": true,
|
||||||
"technical_garbage_forbidden": true,
|
"technical_garbage_forbidden": true,
|
||||||
"do_not_accept_if": [
|
"do_not_accept_if": [
|
||||||
"counterparty received/paid/net-flow question is answered as company profit",
|
"generic role wording such as 'client or supplier' becomes extracted_filters.counterparty",
|
||||||
"90/91/99 accounts are used as the direct answer for counterparty money flow",
|
"the Sberbank follow-up is answered for a stale role-tail instead of Sberbank",
|
||||||
"bank or financial counterparty is presented as an ordinary customer/supplier without role caveat",
|
"Sberbank is presented as an ordinary customer/supplier without a bank/financial-role caveat",
|
||||||
"selected counterparty follow-up switches back to the organization",
|
"the real supplier prefix for Группа СВК is erased by the role-tail guard",
|
||||||
"documents follow-up loses the active counterparty",
|
|
||||||
"final answer leaks route ids, capability ids, runtime enums, or debug payload"
|
"final answer leaks route ids, capability ids, runtime enums, or debug payload"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"scenarios": [
|
"scenarios": [
|
||||||
{
|
{
|
||||||
"scenario_id": "company_business_overview_scope",
|
"scenario_id": "generic_role_tail_anchor_hygiene",
|
||||||
"title": "Company overview, money flow, and scope boundary",
|
"title": "Role-tail overview, bank drilldown, and real supplier canary",
|
||||||
"description": "Establish company-level context and verify that later counterparty questions do not inherit company-profit semantics.",
|
"description": "Validate that business overview role words stay semantic-only, Sberbank remains a bank-role drilldown, and an explicit supplier prefix still preserves a real counterparty.",
|
||||||
"steps": [
|
"steps": [
|
||||||
{
|
{
|
||||||
"step_id": "s01_business_overview_2020",
|
"step_id": "step_01_choose_company_scope",
|
||||||
"title": "Direct business overview for the company and year",
|
"title": "Bare organization choice binds active company scope",
|
||||||
"node_role": "root",
|
"node_role": "root",
|
||||||
"question": "Дай взрослый бизнес-обзор {{bindings.main_organization}} за {{bindings.control_year}} год по данным 1С: обороты, входящие и исходящие деньги, нетто, НДС, долги, склад, клиенты, поставщики и что пока нельзя утверждать.",
|
|
||||||
"expected_intents": ["business_overview"],
|
|
||||||
"semantic_tags": ["business_overview", "money", "vat", "debt", "inventory", "scope_guard"],
|
|
||||||
"required_answer_shape": "direct_answer_first",
|
|
||||||
"required_answer_patterns_all": ["Альтернатива", "2020"],
|
|
||||||
"forbidden_answer_patterns": [
|
|
||||||
"(?i)capability_id",
|
|
||||||
"(?i)selected_chain_id",
|
|
||||||
"(?i)runtime_",
|
|
||||||
"(?i)business_overview_route_template_v1",
|
|
||||||
"(?i)mcp_discovery"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"step_id": "s02_money_followup",
|
|
||||||
"title": "Company money follow-up with counterparty highlights",
|
|
||||||
"question": "Раскрой деньги подробнее: сколько получили, сколько заплатили, какой чистый денежный поток, кто главный клиент и главный поставщик в {{bindings.control_year}}.",
|
|
||||||
"depends_on": ["s01_business_overview_2020"],
|
|
||||||
"semantic_tags": ["money", "counterparty", "scope_guard"],
|
|
||||||
"required_answer_shape": "direct_answer_first",
|
|
||||||
"required_answer_patterns_all": ["2020"],
|
|
||||||
"forbidden_answer_patterns": ["(?i)capability_id", "(?i)runtime_"]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"scenario_id": "svk_counterparty_documents_scope",
|
|
||||||
"title": "Explicit SVK counterparty money and document scope",
|
|
||||||
"description": "Validate that an explicit counterparty request is not confused with company overview context and that document evidence is separated from business conclusions.",
|
|
||||||
"steps": [
|
|
||||||
{
|
|
||||||
"step_id": "s01_svk_money_documents",
|
|
||||||
"title": "Explicit counterparty money flow and evidence",
|
|
||||||
"node_role": "root",
|
|
||||||
"question": "Отдельно по контрагенту {{bindings.svk_counterparty}}, без опоры на прошлый диалог: сколько денег прошло, что входящее, что исходящее и есть ли документы или движения, на которых это основано?",
|
|
||||||
"expected_intents": ["value_flow"],
|
|
||||||
"semantic_tags": ["counterparty", "money", "documents", "scope_guard"],
|
|
||||||
"required_answer_shape": "direct_answer_first",
|
|
||||||
"required_answer_patterns_all": ["СВК"],
|
|
||||||
"forbidden_answer_patterns": [
|
|
||||||
"(?i)capability_id",
|
|
||||||
"(?i)selected_chain_id",
|
|
||||||
"(?i)runtime_",
|
|
||||||
"(?i)mcp_discovery",
|
|
||||||
"(?i)Альтернатива Плюс.*контрагент",
|
|
||||||
"(?i)(90[\\./](01|02|09)|91[\\./]|99\\b)"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"step_id": "s02_svk_documents_followup",
|
|
||||||
"title": "Counterparty documents follow-up",
|
|
||||||
"question": "Покажи документы по этой цепочке и не смешивай {{bindings.svk_counterparty}} с организацией {{bindings.main_organization}}.",
|
|
||||||
"depends_on": ["s01_svk_money_documents"],
|
|
||||||
"semantic_tags": ["counterparty", "documents", "scope_guard"],
|
|
||||||
"required_answer_shape": "direct_answer_first",
|
|
||||||
"required_answer_patterns_all": ["СВК"],
|
|
||||||
"forbidden_answer_patterns": [
|
|
||||||
"(?i)capability_id",
|
|
||||||
"(?i)runtime_",
|
|
||||||
"(?i)Альтернатива Плюс.*как контрагент"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"step_id": "s03_company_vs_svk_summary",
|
|
||||||
"title": "Separate company and counterparty conclusions",
|
|
||||||
"question": "Собери короткий итог: что мы подтвердили по компании, что отдельно по {{bindings.svk_counterparty}}, какие выводы можно делать и какие нельзя.",
|
|
||||||
"depends_on": ["s01_svk_money_documents", "s02_svk_documents_followup"],
|
|
||||||
"semantic_tags": ["business_overview", "counterparty", "scope_guard"],
|
|
||||||
"required_answer_shape": "direct_answer_first",
|
|
||||||
"required_answer_patterns_all": ["СВК", "компан"],
|
|
||||||
"forbidden_answer_patterns": ["(?i)capability_id", "(?i)runtime_"]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"scenario_id": "company_business_overview_colloquial_scope",
|
|
||||||
"title": "Colloquial company overview and bank-role money follow-up",
|
|
||||||
"description": "Validate colloquial wording and the bank-role caveat when the user explicitly warns not to call a bank an ordinary customer.",
|
|
||||||
"steps": [
|
|
||||||
{
|
|
||||||
"step_id": "s01_colloquial_company_overview_2020",
|
|
||||||
"title": "Colloquial business overview for the company",
|
|
||||||
"node_role": "root",
|
|
||||||
"question": "По-человечески посмотри {{bindings.main_organization}} за {{bindings.control_year}}: что по бизнесу видно в 1С по деньгам, НДС, долгам, складу, клиентам/поставщикам и где пока нельзя делать вывод?",
|
|
||||||
"expected_intents": ["business_overview"],
|
|
||||||
"semantic_tags": ["business_overview", "colloquial", "money", "vat", "debt", "inventory", "scope_guard"],
|
|
||||||
"required_answer_shape": "direct_answer_first",
|
|
||||||
"required_answer_patterns_all": ["2020", "НДС"],
|
|
||||||
"forbidden_answer_patterns": ["(?i)capability_id", "(?i)selected_chain_id", "(?i)runtime_", "(?i)mcp_discovery"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"step_id": "s02_colloquial_money_leaders",
|
|
||||||
"title": "Colloquial money leaders with bank-role boundary",
|
|
||||||
"question": "А по деньгам в этом же году кто больше всего занес и кому больше всего ушло? Банк не называй обычным клиентом без оговорки.",
|
|
||||||
"depends_on": ["s01_colloquial_company_overview_2020"],
|
|
||||||
"semantic_tags": ["money", "counterparty", "bank_role_boundary", "colloquial", "scope_guard"],
|
|
||||||
"required_answer_shape": "direct_answer_first",
|
|
||||||
"required_answer_patterns_all": ["2020"],
|
|
||||||
"forbidden_answer_patterns": ["(?i)capability_id", "(?i)runtime_"]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"scenario_id": "svk_selected_object_followup_scope",
|
|
||||||
"title": "Selected-object style SVK counterparty follow-up",
|
|
||||||
"description": "Validate selected-object and pronoun coverage for the SVK counterparty edge: root counterparty money fact, documents by selected object, and separated summary.",
|
|
||||||
"steps": [
|
|
||||||
{
|
|
||||||
"step_id": "s01_select_svk_counterparty_money",
|
|
||||||
"title": "Select SVK as the active counterparty",
|
|
||||||
"node_role": "root",
|
|
||||||
"question": "Возьми как выбранного контрагента {{bindings.svk_counterparty}}: сколько по нему входящих денег, исходящих денег и расчетное нетто, на чем это основано?",
|
|
||||||
"expected_intents": ["value_flow"],
|
|
||||||
"semantic_tags": ["counterparty", "money", "selected_object", "scope_guard"],
|
|
||||||
"required_answer_shape": "direct_answer_first",
|
|
||||||
"required_answer_patterns_all": ["СВК"],
|
|
||||||
"forbidden_answer_patterns": [
|
|
||||||
"(?i)capability_id",
|
|
||||||
"(?i)selected_chain_id",
|
|
||||||
"(?i)runtime_",
|
|
||||||
"(?i)mcp_discovery",
|
|
||||||
"(?i)(90[\\./](01|02|09)|91[\\./]|99\\b)"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"step_id": "s02_pronoun_documents_for_selected_svk",
|
|
||||||
"title": "Documents for the selected counterparty by pronoun",
|
|
||||||
"question": "Теперь по нему покажи документы и не переключайся на организацию.",
|
|
||||||
"depends_on": ["s01_select_svk_counterparty_money"],
|
|
||||||
"semantic_tags": ["counterparty", "documents", "selected_object", "pronoun_followup", "scope_guard"],
|
|
||||||
"required_answer_shape": "direct_answer_first",
|
|
||||||
"required_answer_patterns_all": ["СВК"],
|
|
||||||
"forbidden_answer_patterns": [
|
|
||||||
"(?i)capability_id",
|
|
||||||
"(?i)runtime_",
|
|
||||||
"(?i)Альтернатива Плюс.*как контрагент"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"step_id": "s03_selected_svk_company_boundary_summary",
|
|
||||||
"title": "Boundary summary after selected-object document follow-up",
|
|
||||||
"question": "И коротко сравни: что у нас подтверждено по компании, что отдельно по выбранному контрагенту, и какие выводы нельзя делать?",
|
|
||||||
"depends_on": ["s01_select_svk_counterparty_money", "s02_pronoun_documents_for_selected_svk"],
|
|
||||||
"semantic_tags": ["business_overview", "counterparty", "selected_object", "scope_guard"],
|
|
||||||
"required_answer_shape": "direct_answer_first",
|
|
||||||
"required_answer_patterns_all": ["СВК", "компан"],
|
|
||||||
"forbidden_answer_patterns": ["(?i)capability_id", "(?i)runtime_"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"step_id": "s04_org_clarification_boundary_summary",
|
|
||||||
"title": "Organization clarification after selected counterparty branch",
|
|
||||||
"question": "{{bindings.main_organization}}",
|
"question": "{{bindings.main_organization}}",
|
||||||
"depends_on": ["s03_selected_svk_company_boundary_summary"],
|
"allowed_reply_types": [
|
||||||
"semantic_tags": ["clarification", "organization", "scope_guard"],
|
"factual_with_explanation",
|
||||||
|
"partial_coverage"
|
||||||
|
],
|
||||||
|
"semantic_tags": [
|
||||||
|
"bare_org_scope",
|
||||||
|
"company_scope"
|
||||||
|
],
|
||||||
"required_answer_shape": "direct_answer_first",
|
"required_answer_shape": "direct_answer_first",
|
||||||
"required_answer_patterns_all": ["Альтернатива"],
|
"required_answer_patterns_all": [
|
||||||
"forbidden_answer_patterns": ["(?i)capability_id", "(?i)runtime_"]
|
"(?i)фиксир|рабоч.*организац|контур",
|
||||||
|
"(?i)альтернатива"
|
||||||
|
],
|
||||||
|
"forbidden_answer_patterns": [
|
||||||
|
"(?i)не могу определить",
|
||||||
|
"(?i)route_candidate|primitive|planner_|catalog_|snapshot_items|answer_object"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"step_id": "step_02_business_overview_role_tail_not_counterparty",
|
||||||
|
"title": "Business overview role words do not become counterparty anchors",
|
||||||
|
"question": "Теперь дай взрослый обзор за {{bindings.control_year}} по компании: входящие, исходящие, нетто, топы, но банк в топах отдельно объясни как финансовый поток, если по назначению он не обычный клиент или поставщик.",
|
||||||
|
"depends_on": [
|
||||||
|
"step_01_choose_company_scope"
|
||||||
|
],
|
||||||
|
"expected_intents": [
|
||||||
|
"business_overview"
|
||||||
|
],
|
||||||
|
"semantic_tags": [
|
||||||
|
"business_overview",
|
||||||
|
"generic_role_tail_anchor_hygiene",
|
||||||
|
"financial_role_purpose"
|
||||||
|
],
|
||||||
|
"required_answer_shape": "direct_answer_first",
|
||||||
|
"forbidden_filter_keys": [
|
||||||
|
"counterparty"
|
||||||
|
],
|
||||||
|
"forbidden_filter_values": {
|
||||||
|
"counterparty": [
|
||||||
|
"или поставщик",
|
||||||
|
"поставщик",
|
||||||
|
"клиент",
|
||||||
|
"обычный клиент",
|
||||||
|
"обычный клиент или поставщик"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"required_answer_patterns_all": [
|
||||||
|
"(?i)2020|компан|организац",
|
||||||
|
"(?i)вход|поступ|исход|списан|нетто",
|
||||||
|
"(?i)банк|сбербанк|финансов",
|
||||||
|
"(?i)не.*обычн.*клиент|не.*обычн.*поставщик|не.*выручк|не.*закупк|назначен"
|
||||||
|
],
|
||||||
|
"forbidden_answer_patterns": [
|
||||||
|
"(?i)сбербанк.*обычный поставщик",
|
||||||
|
"(?i)сбербанк.*обычный клиент",
|
||||||
|
"(?i)чистая прибыль.*точно",
|
||||||
|
"(?i)route_candidate|primitive|planner_|catalog_|snapshot_items|answer_object"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"step_id": "step_03_sberbank_role_after_role_tail_overview",
|
||||||
|
"title": "Bank-role drilldown still resolves Sberbank after role-tail overview",
|
||||||
|
"question": "А отдельно по {{bindings.bank_counterparty}}У: он для нас клиент, поставщик или финансовый поток? Дай коротко по подтвержденным строкам.",
|
||||||
|
"depends_on": [
|
||||||
|
"step_02_business_overview_role_tail_not_counterparty"
|
||||||
|
],
|
||||||
|
"semantic_tags": [
|
||||||
|
"bank_like_counterparty",
|
||||||
|
"financial_role_purpose",
|
||||||
|
"post_overview_anchor_integrity"
|
||||||
|
],
|
||||||
|
"required_answer_shape": "direct_answer_first",
|
||||||
|
"required_filters": {
|
||||||
|
"counterparty": "{{bindings.bank_counterparty}}"
|
||||||
|
},
|
||||||
|
"required_answer_patterns_all": [
|
||||||
|
"(?i)сбербанк|банк",
|
||||||
|
"(?i)финансов|банковск|кредит|комисс|возврат|назначен|вид операц",
|
||||||
|
"(?i)не.*обычн.*клиент|не.*обычн.*поставщик|не.*клиентск.*выручк|нельзя.*читать"
|
||||||
|
],
|
||||||
|
"forbidden_answer_patterns": [
|
||||||
|
"(?i)или поставщик",
|
||||||
|
"(?i)сбербанк.*обычный поставщик",
|
||||||
|
"(?i)сбербанк.*обычный клиент",
|
||||||
|
"(?i)route_candidate|primitive|planner_|catalog_|snapshot_items|answer_object"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"step_id": "step_04_real_supplier_prefix_still_keeps_counterparty",
|
||||||
|
"title": "Explicit supplier prefix still preserves a real counterparty",
|
||||||
|
"question": "А теперь по поставщику {{bindings.svk_counterparty}} за {{bindings.control_year}}: сколько мы ему заплатили и какой общий денежный смысл?",
|
||||||
|
"depends_on": [
|
||||||
|
"step_03_sberbank_role_after_role_tail_overview"
|
||||||
|
],
|
||||||
|
"expected_intents": [
|
||||||
|
"value_flow"
|
||||||
|
],
|
||||||
|
"semantic_tags": [
|
||||||
|
"counterparty_net_cash_flow",
|
||||||
|
"supplier_prefix_canary",
|
||||||
|
"stale_scope_guard"
|
||||||
|
],
|
||||||
|
"required_answer_shape": "direct_answer_first",
|
||||||
|
"required_filters": {
|
||||||
|
"counterparty": "{{bindings.svk_counterparty}}"
|
||||||
|
},
|
||||||
|
"required_answer_patterns_all": [
|
||||||
|
"(?i)свк|группа",
|
||||||
|
"(?i)2020",
|
||||||
|
"(?i)заплат|исход|списан|получ|поступ|нетто|смысл"
|
||||||
|
],
|
||||||
|
"forbidden_answer_patterns": [
|
||||||
|
"(?i)или поставщик",
|
||||||
|
"(?i)сбербанк",
|
||||||
|
"(?i)уточните организац|какую компанию",
|
||||||
|
"(?i)route_candidate|primitive|planner_|catalog_|snapshot_items|answer_object"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -239,7 +239,7 @@
|
||||||
"issue_codes": ["bank_counterparty_misclassified_as_business_partner"],
|
"issue_codes": ["bank_counterparty_misclassified_as_business_partner"],
|
||||||
"inputs": ["steps/<step_id>/output.md"],
|
"inputs": ["steps/<step_id>/output.md"],
|
||||||
"check": {
|
"check": {
|
||||||
"artifact_path_include_patterns": ["(?i)s02_colloquial_money_leaders"],
|
"artifact_path_include_patterns": ["(?i)(s02_colloquial_money_leaders|step_03_sberbank_role_after_role_tail_overview)"],
|
||||||
"required_patterns_any": ["(?is)(банк|банковск|финансов|не\\s+обычн|роль|назначени[ея]|плат[её]ж)"]
|
"required_patterns_any": ["(?is)(банк|банковск|финансов|не\\s+обычн|роль|назначени[ея]|плат[её]ж)"]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue