Open-World: добавить debt staleness risk proxy в бизнес-обзор

This commit is contained in:
2026-05-04 11:08:20 +03:00
parent 34e7a135ee
commit cd22164f33
9 changed files with 293 additions and 7 deletions
@@ -404,21 +404,29 @@ describe("assistant MCP discovery answer adapter", () => {
expect(draft.headline).toContain("долговой срез");
expect(draft.headline).toContain("качество открытых расчетов");
expect(draft.headline).toContain("возрастной сигнал открытых расчетов");
expect(draft.headline).toContain("staleness risk proxy открытых расчетов");
expect(draft.headline).toContain("договорные сроки оплаты/due-date просрочка");
expect(draft.confirmed_lines.join("\n")).toContain("Долговой срез на 2020-12-31");
expect(draft.confirmed_lines.join("\n")).toContain("Качество открытых расчетов на 2020-12-31");
expect(draft.confirmed_lines.join("\n")).toContain("Возрастной сигнал открытых расчетов");
expect(draft.confirmed_lines.join("\n")).toContain("не due-date анализ");
expect(draft.confirmed_lines.join("\n")).toContain("Staleness risk proxy открытых расчетов");
expect(draft.confirmed_lines.join("\n")).toContain("высокая зона внимания");
expect(draft.confirmed_lines.join("\n")).toContain("не due-date aging");
expect(draft.confirmed_lines.join("\n")).toContain("нетто");
expect(draft.inference_lines.join("\n")).toContain("Риски и контуры внимания");
expect(draft.inference_lines.join("\n")).toContain("самый старый договорный возрастной сигнал");
expect(draft.inference_lines.join("\n")).toContain("staleness risk proxy открытых расчетов");
expect(draft.inference_lines.join("\n")).toContain("Сводный LLM-аудит");
expect(draft.unknown_lines.join("\n")).toContain("due-date");
expect(draft.reason_codes).toContain("answer_contains_business_overview_debt_position");
expect(draft.reason_codes).toContain("answer_contains_business_overview_open_settlement_quality");
expect(draft.reason_codes).toContain("answer_contains_business_overview_debt_age_signal");
expect(draft.reason_codes).toContain("answer_contains_business_overview_debt_staleness_risk_proxy");
expect(draft.reason_codes).toContain("answer_contains_business_overview_analyst_synthesis");
expect(draft.must_not_claim).toContain("Do not present a debt-position snapshot as debt aging, overdue debt, or credit-quality analysis.");
expect(draft.must_not_claim).toContain("Do not present open-settlement concentration as contractual due-date aging or confirmed overdue debt.");
expect(draft.must_not_claim).toContain("Do not present business overview debt staleness risk proxy as confirmed overdue debt, contractual delinquency, credit risk, or due-date aging.");
});
it("surfaces checked inventory-position snapshot in business overview without treating it as warehouse liquidity", async () => {
@@ -468,6 +468,14 @@ describe("assistant MCP discovery pilot executor", () => {
latest_start_date: "2020-03-15",
max_age_days: 690
});
expect(result.derived_business_overview?.debt_staleness_risk_proxy).toMatchObject({
as_of_date: "2020-12-31",
oldest_contract_start_date: "2019-02-10",
max_contract_age_days: 690,
top_contract_amount: 90000,
top_contract_share_pct: 75,
risk_band: "high"
});
expect(result.derived_business_overview?.debt_open_settlement_quality?.age_signal?.top_aged_contracts[0]).toMatchObject({
contract: "Договор А от 10.02.2019",
start_date: "2019-02-10",
@@ -480,6 +488,8 @@ describe("assistant MCP discovery pilot executor", () => {
expect(result.evidence.confirmed_facts.join("\n")).toContain("Долговая позиция на 2020-12-31");
expect(result.evidence.confirmed_facts.join("\n")).toContain("Качество открытых расчетов на 2020-12-31");
expect(result.evidence.confirmed_facts.join("\n")).toContain("Возрастной сигнал открытых расчетов");
expect(result.evidence.confirmed_facts.join("\n")).toContain("Staleness risk proxy открытых расчетов");
expect(result.evidence.confirmed_facts.join("\n")).toContain("высокая зона внимания");
expect(result.evidence.confirmed_facts.join("\n")).toContain("не due-date анализ");
expect(result.evidence.unknown_facts.join("\n")).toContain("due-date");
expect(result.reason_codes).toContain("pilot_business_overview_debt_query_mcp_executed");
@@ -487,6 +497,7 @@ describe("assistant MCP discovery pilot executor", () => {
expect(result.reason_codes).toContain("pilot_business_overview_open_contracts_query_mcp_executed");
expect(result.reason_codes).toContain("pilot_derived_business_overview_open_settlement_quality_from_confirmed_rows");
expect(result.reason_codes).toContain("pilot_derived_business_overview_debt_age_signal_from_contract_dates");
expect(result.reason_codes).toContain("pilot_derived_business_overview_debt_staleness_risk_proxy_from_confirmed_rows");
expect(deps.executeAddressMcpQuery).toHaveBeenCalledTimes(10);
const receivablesCall = deps.executeAddressMcpQuery.mock.calls[3]?.[0];
const payablesCall = deps.executeAddressMcpQuery.mock.calls[4]?.[0];