192 lines
8.7 KiB
JSON
192 lines
8.7 KiB
JSON
{
|
||
"schema_version": "domain_scenario_pack_v1",
|
||
"pack_id": "active_phase104_generic_role_tail_anchor_hygiene_20260615",
|
||
"domain": "address_phase104_generic_role_tail_anchor_hygiene",
|
||
"runtime_domain": "business_overview_role_tail_anchor_hygiene",
|
||
"title": "Generic role-tail anchor hygiene",
|
||
"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",
|
||
"source_of_truth_policy": {
|
||
"purpose": "single mutable domain source for the current orchestration target",
|
||
"switching_rule": "when the project switches to another domain, replace this file instead of rewriting the stable agent canon",
|
||
"stable_layers": [
|
||
"AGENTS.md",
|
||
".codex/skills/domain-case-loop",
|
||
".codex/agents/domain_analyst.toml",
|
||
".codex/agents/orchestrator.toml"
|
||
],
|
||
"mutable_layer": [
|
||
"docs/orchestration/active_domain_contract.json"
|
||
]
|
||
},
|
||
"analysis_context": {
|
||
"as_of_date": "2026-06-15",
|
||
"source": "phase104_generic_role_tail_anchor_hygiene_after_value_flow_p06"
|
||
},
|
||
"target_score": 88,
|
||
"bindings": {
|
||
"main_organization": "ООО Альтернатива Плюс",
|
||
"control_year": "2020",
|
||
"bank_counterparty": "СБЕРБАНК",
|
||
"svk_counterparty": "Группа СВК"
|
||
},
|
||
"issue_codes_under_test": [
|
||
"bank_counterparty_misclassified_as_business_partner",
|
||
"technical_garbage_in_answer",
|
||
"business_next_step_missing"
|
||
],
|
||
"detectors_under_test": [
|
||
"bank_counterparty_boundary_required",
|
||
"runtime_tokens_in_user_answer",
|
||
"capability_ids_in_user_answer",
|
||
"limited_answer_without_next_action"
|
||
],
|
||
"agent_audit_expectations": {
|
||
"semantic_answer_review_first": true,
|
||
"direct_answer_first": true,
|
||
"business_utility_required": true,
|
||
"generic_role_tail_must_not_be_anchor": true,
|
||
"bank_role_boundary_required": true,
|
||
"technical_garbage_forbidden": true,
|
||
"do_not_accept_if": [
|
||
"generic role wording such as 'client or supplier' becomes extracted_filters.counterparty",
|
||
"the Sberbank follow-up is answered for a stale role-tail instead of Sberbank",
|
||
"Sberbank is presented as an ordinary customer/supplier without a bank/financial-role caveat",
|
||
"the real supplier prefix for Группа СВК is erased by the role-tail guard",
|
||
"final answer leaks route ids, capability ids, runtime enums, or debug payload"
|
||
]
|
||
},
|
||
"scenarios": [
|
||
{
|
||
"scenario_id": "generic_role_tail_anchor_hygiene",
|
||
"title": "Role-tail overview, bank drilldown, and real supplier canary",
|
||
"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": [
|
||
{
|
||
"step_id": "step_01_choose_company_scope",
|
||
"title": "Bare organization choice binds active company scope",
|
||
"node_role": "root",
|
||
"question": "{{bindings.main_organization}}",
|
||
"allowed_reply_types": [
|
||
"factual_with_explanation",
|
||
"partial_coverage"
|
||
],
|
||
"semantic_tags": [
|
||
"bare_org_scope",
|
||
"company_scope"
|
||
],
|
||
"required_answer_shape": "direct_answer_first",
|
||
"required_answer_patterns_all": [
|
||
"(?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"
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|