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

This commit is contained in:
2026-05-04 10:43:10 +03:00
parent bf3ae110ef
commit 3a28709ce4
9 changed files with 292 additions and 16 deletions
@@ -488,16 +488,22 @@ describe("assistant MCP discovery answer adapter", () => {
expect(draft.headline).toContain("складской срез");
expect(draft.headline).toContain("оборотный proxy склада");
expect(draft.headline).toContain("staleness risk proxy склада");
expect(draft.confirmed_lines.join("\n")).toContain("Складской срез на 2020-12-31");
expect(draft.confirmed_lines.join("\n")).toContain("Товар А");
expect(draft.confirmed_lines.join("\n")).toContain("Оборотный proxy склада за 2020");
expect(draft.confirmed_lines.join("\n")).toContain("sales-to-stock ratio 2x");
expect(draft.confirmed_lines.join("\n")).toContain("Staleness risk proxy склада");
expect(draft.confirmed_lines.join("\n")).toContain("зона наблюдения");
expect(draft.inference_lines.join("\n")).toContain("оборотный proxy склада");
expect(draft.unknown_lines.join("\n")).toContain("Полная складская ликвидность");
expect(draft.inference_lines.join("\n")).toContain("staleness risk proxy склада");
expect(draft.unknown_lines.join("\n")).toContain("Резервы");
expect(draft.reason_codes).toContain("answer_contains_business_overview_inventory_position");
expect(draft.reason_codes).toContain("answer_contains_business_overview_inventory_turnover_proxy");
expect(draft.reason_codes).toContain("answer_contains_business_overview_inventory_staleness_risk_proxy");
expect(draft.must_not_claim).toContain("Do not present an inventory snapshot or purchase-date aging signal as turnover, obsolescence, liquidation value, or full inventory health.");
expect(draft.must_not_claim).toContain("Do not present business overview inventory turnover proxy as full inventory liquidity, FIFO turnover, obsolescence analysis, or liquidation value.");
expect(draft.must_not_claim).toContain("Do not present business overview inventory staleness risk proxy as confirmed obsolete stock, reserve, write-off, or liquidation value.");
});
it("renders metadata-scoped movement all-time follow-up as an all-time bounded answer", async () => {
@@ -592,16 +592,28 @@ describe("assistant MCP discovery pilot executor", () => {
sales_to_stock_amount_ratio: 2,
stock_to_sales_revenue_pct: 50
});
expect(result.derived_business_overview?.inventory_staleness_risk_proxy).toMatchObject({
period_scope: "2020",
as_of_date: "2020-12-31",
oldest_purchase_date: "2020-01-10",
max_purchase_age_days: 356,
sales_to_stock_amount_ratio: 2,
risk_band: "watch"
});
expect(result.derived_business_overview?.missing_signal_families).not.toContain("inventory_position");
expect(result.derived_business_overview?.missing_signal_families).not.toContain("inventory_turnover_quality");
expect(result.derived_business_overview?.missing_signal_families).toContain("inventory_liquidity_quality");
expect(result.derived_business_overview?.missing_signal_families).not.toContain("inventory_liquidity_quality");
expect(result.derived_business_overview?.missing_signal_families).toContain("inventory_reserve_liquidation_quality");
expect(result.evidence.confirmed_facts.join("\n")).toContain("Складской срез на 2020-12-31");
expect(result.evidence.confirmed_facts.join("\n")).toContain("Оборотный proxy склада за 2020");
expect(result.evidence.confirmed_facts.join("\n")).toContain("sales-to-stock ratio 2x");
expect(result.evidence.unknown_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.unknown_facts.join("\n")).toContain("Резервы");
expect(result.reason_codes).toContain("pilot_business_overview_inventory_query_mcp_executed");
expect(result.reason_codes).toContain("pilot_derived_business_overview_inventory_position_from_confirmed_rows");
expect(result.reason_codes).toContain("pilot_derived_business_overview_inventory_turnover_proxy_from_confirmed_rows");
expect(result.reason_codes).toContain("pilot_derived_business_overview_inventory_staleness_risk_proxy_from_confirmed_rows");
expect(deps.executeAddressMcpQuery).toHaveBeenCalledTimes(10);
const inventoryCall = deps.executeAddressMcpQuery.mock.calls[6]?.[0];
expect(inventoryCall?.account_scope).toContain("41.01");