Open-World: закрепить границу рисков поставщиков

This commit is contained in:
2026-05-05 12:32:40 +03:00
parent 2b2e37acce
commit e803942472
12 changed files with 220 additions and 5 deletions
@@ -2771,6 +2771,14 @@ describe("address intent resolver expansion (M2.3a)", () => {
);
});
it("defers organization-level supplier quality wording to business overview discovery", () => {
const result = resolveAddressIntent(
"\u043a\u0430\u043a\u0438\u0435 \u0443 \u043d\u0430\u0441 \u0440\u0438\u0441\u043a\u0438 \u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u043e\u0432 \u0437\u0430 2020?"
);
expect(result.intent).toBe("unknown");
expect(result.reasons).toContain("unicode_business_overview_supplier_quality_deferred_to_discovery");
});
it("routes reconciliation mismatch wording into open contracts intent", () => {
const result = resolveAddressIntent(
"Покажи контрагентов, по которым сальдо скорее всего не совпадет с их актом сверки. Может, стоит поторопиться и запросить сверку?"
@@ -2054,6 +2054,37 @@ describe("assistant MCP discovery turn input adapter", () => {
expect(result.data_need_graph?.clarification_gaps).toEqual([]);
});
it("routes organization-level supplier quality wording to business overview instead of exact supplier/payables recipes", () => {
const orgName = "\u041e\u041e\u041e \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u041f\u043b\u044e\u0441";
const result = buildAssistantMcpDiscoveryTurnInput({
userMessage:
"\u043a\u0430\u043a\u0438\u0435 \u0443 \u043d\u0430\u0441 \u0440\u0438\u0441\u043a\u0438 \u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u043e\u0432 \u0437\u0430 2020?",
followupContext: {
previous_discovery_pilot_scope: "supplier_payouts_profile",
previous_filters: {
organization: orgName,
as_of_date: "2026-04-23"
}
}
});
expect(result.adapter_status).toBe("ready");
expect(result.should_run_discovery).toBe(true);
expect(result.semantic_data_need).toBe("business overview evidence with bounded analyst interpretation");
expect(result.data_need_graph?.business_fact_family).toBe("business_overview");
expect(result.turn_meaning_ref).toMatchObject({
asked_domain_family: "business_overview",
asked_action_family: "broad_evaluation",
explicit_organization_scope: orgName,
explicit_date_scope: "2020",
unsupported_but_understood_family: "broad_business_evaluation",
stale_replay_forbidden: true
});
expect(result.reason_codes).toContain("mcp_discovery_broad_business_evaluation_route_candidate");
expect(result.reason_codes).not.toContain("mcp_discovery_date_scope_from_followup_context");
expect(result.data_need_graph?.clarification_gaps).toEqual([]);
});
it("resumes an open-scope total clarification loop from saved state when the user resolves the pending period with all-time wording", () => {
const orgName = "ООО Альтернатива Плюс";
const result = buildAssistantMcpDiscoveryTurnInput({
@@ -197,5 +197,15 @@ describe("assistantTurnMeaningPolicy", () => {
expect(inventoryReserve.asked_action_family).toBe("broad_evaluation");
expect(inventoryReserve.unsupported_but_understood_family).toBe("broad_business_evaluation");
expect(inventoryReserve.reason_codes).toContain("broad_business_evaluation_current_turn_signal");
const supplierQuality = policy.resolveAssistantTurnMeaning({
rawUserMessage:
"\u043a\u0430\u043a\u0438\u0435 \u0443 \u043d\u0430\u0441 \u0440\u0438\u0441\u043a\u0438 \u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u043e\u0432 \u0437\u0430 2020?"
});
expect(supplierQuality.explicit_intent_candidate).toBeNull();
expect(supplierQuality.asked_domain_family).toBe("business_summary");
expect(supplierQuality.asked_action_family).toBe("broad_evaluation");
expect(supplierQuality.unsupported_but_understood_family).toBe("broad_business_evaluation");
expect(supplierQuality.reason_codes).toContain("broad_business_evaluation_current_turn_signal");
});
});