ARCH: разрешить net-flow discovery переопределять stale lifecycle carryover

This commit is contained in:
2026-04-21 19:10:29 +03:00
parent 429bd3d8ec
commit d323dcd509
4 changed files with 304 additions and 41 deletions
@@ -176,8 +176,8 @@ describe("assistant MCP discovery response policy", () => {
adapter_status: "ready",
should_run_discovery: true,
turn_meaning_ref: {
asked_domain_family: "counterparty_lifecycle",
asked_action_family: "activity_duration"
asked_domain_family: "counterparty_value",
asked_action_family: "turnover"
}
}
})
@@ -209,8 +209,8 @@ describe("assistant MCP discovery response policy", () => {
adapter_status: "ready",
should_run_discovery: true,
turn_meaning_ref: {
asked_domain_family: "counterparty_value",
asked_action_family: "turnover"
asked_domain_family: "receivables",
asked_action_family: "confirmed_snapshot"
}
}
})
@@ -223,6 +223,64 @@ describe("assistant MCP discovery response policy", () => {
expect(result.reason_codes).toContain("mcp_discovery_response_policy_keep_full_confirmed_factual_address_reply");
});
it("overrides a stale full-confirmed lifecycle reply when discovery proves a different net-flow question", () => {
const result = applyAssistantMcpDiscoveryResponsePolicy({
currentReply: "Коротко: активных заказчиков в 2020 году — 1.",
currentReplySource: "address_query_runtime_v1",
currentReplyType: "factual",
addressRuntimeMeta: {
detected_intent: "counterparty_activity_lifecycle",
truth_gate_contract_status: "full_confirmed",
assistant_truth_answer_policy_v1: {
truth_gate: {
coverage_status: "full",
grounding_status: "grounded",
source_truth_gate_status: "full_confirmed"
}
},
dialog_continuation_contract_v2: {
target_intent: "counterparty_activity_lifecycle"
},
assistant_mcp_discovery_entry_point_v1: entryPoint({
turn_input: {
adapter_status: "ready",
should_run_discovery: true,
turn_meaning_ref: {
asked_domain_family: "counterparty_value",
asked_action_family: "net_value_flow",
explicit_entity_candidates: ["Группа СВК"],
explicit_organization_scope: "ООО Альтернатива Плюс",
explicit_date_scope: "2020",
unsupported_but_understood_family: "counterparty_bidirectional_value_flow_or_netting"
}
},
bridge: {
bridge_status: "answer_draft_ready",
user_facing_response_allowed: true,
business_fact_answer_allowed: true,
requires_user_clarification: false,
answer_draft: {
answer_mode: "confirmed_with_bounded_inference",
headline: "По данным 1С найдены строки входящих и исходящих денежных движений.",
confirmed_lines: ["Получили 47 628 853,03 руб.; заплатили 43 763 351,53 руб.; нетто 3 865 501,50 руб."],
inference_lines: [],
unknown_lines: ["Полное сальдо вне проверенного окна не подтверждено."],
limitation_lines: [],
next_step_line: null
}
}
})
}
});
expect(result.applied).toBe(true);
expect(result.decision).toBe("apply_candidate");
expect(result.reply_source).toBe("mcp_discovery_response_candidate_guarded");
expect(result.reply_text).toContain("47 628 853,03");
expect(result.reason_codes).toContain("mcp_discovery_response_policy_semantic_conflict_allows_candidate_override");
expect(result.reason_codes).not.toContain("mcp_discovery_response_policy_keep_full_confirmed_factual_address_reply");
});
it("keeps address lane answers when discovery was not requested for the current turn", () => {
const result = applyAssistantMcpDiscoveryResponsePolicy({
currentReply: "supported exact route answer",