Open-World: закрепить реестр недостающих доказательств бизнес-обзора

This commit is contained in:
2026-05-05 13:41:49 +03:00
parent 42283a6ac2
commit c0a89ccece
9 changed files with 307 additions and 32 deletions
@@ -639,6 +639,9 @@ function buildMustNotClaim(pilot) {
claims.push("Do not present an inventory snapshot or purchase-date aging signal as turnover, obsolescence, liquidation value, or full inventory health.");
claims.push("Do not present business overview inventory turnover proxy as full inventory liquidity, FIFO turnover, obsolescence analysis, or liquidation value.");
claims.push("Do not present business overview inventory staleness risk proxy as confirmed obsolete stock, reserve, write-off, or liquidation value.");
if (pilot.derived_business_overview?.missing_proof_families?.length) {
claims.push("Do not present business overview missing proof families as checked, executed, or confirmed routes.");
}
claims.push("Do not expose business_overview_route_template_v1 or MCP primitive names in the user answer.");
}
if (pilot.derived_ranked_value_flow) {
@@ -1352,6 +1355,9 @@ function buildAssistantMcpDiscoveryAnswerDraft(pilot) {
if (pilot.derived_business_overview?.inventory_staleness_risk_proxy) {
pushReason(reasonCodes, "answer_contains_business_overview_inventory_staleness_risk_proxy");
}
if (pilot.derived_business_overview?.missing_proof_families?.length) {
pushReason(reasonCodes, "answer_contains_business_overview_missing_proof_ledger");
}
const confirmedLines = businessOverviewLines.length > 0
? businessOverviewLines
: pilot.derived_ranked_value_flow && derivedValueLine
@@ -2740,6 +2740,75 @@ function inventoryStalenessRiskBandRu(riskBand) {
}
return "низкий видимый риск";
}
function buildBusinessOverviewMissingProofFamilies(input) {
const missing = new Set(input.missingSignalFamilies);
const items = [];
const pushUnique = (item) => {
if (!items.some((existing) => existing.family === item.family)) {
items.push(item);
}
};
if (missing.has("profit_margin") || missing.has("accounting_profit_margin")) {
pushUnique({
family: "accounting_profit_margin",
current_status: input.tradingMarginProxy ? "proxy_only_currently" : "reviewed_route_not_wired",
current_supported_evidence: input.tradingMarginProxy
? "trading_margin_proxy_from_sales_and_purchase_document_rows"
: null,
next_required_evidence: "reviewed_pnl_route_with_cost_of_sales_expenses_period_close_and_financial_result",
must_not_claim: "clean_profit_accounting_margin_or_full_pnl"
});
}
if (missing.has("debt_due_date_aging_quality") || missing.has("debt_open_settlement_quality")) {
pushUnique({
family: "debt_due_date_aging_quality",
current_status: input.debtStalenessRiskProxy
? "proxy_only_currently"
: input.debtOpenSettlementQuality
? "proxy_only_currently"
: "not_checked_in_current_turn",
current_supported_evidence: input.debtStalenessRiskProxy
? "debt_staleness_risk_proxy_from_contract_dates_and_open_balance_concentration"
: input.debtOpenSettlementQuality
? "open_settlement_quality_from_60_62_76_balances_without_payment_terms"
: null,
next_required_evidence: "reviewed_payment_term_or_due_date_route_with_contractual_due_dates_and_settlement_status",
must_not_claim: "confirmed_overdue_debt_credit_risk_or_due_date_aging"
});
}
if (missing.has("inventory_position") ||
missing.has("inventory_turnover_quality") ||
missing.has("inventory_liquidity_quality") ||
missing.has("inventory_reserve_liquidation_quality")) {
pushUnique({
family: "inventory_reserve_liquidation_quality",
current_status: input.inventoryStalenessRiskProxy
? "proxy_only_currently"
: input.inventoryTurnoverProxy || input.inventoryPosition
? "proxy_only_currently"
: "not_checked_in_current_turn",
current_supported_evidence: input.inventoryStalenessRiskProxy
? "inventory_staleness_risk_proxy_from_purchase_age_and_sales_to_stock"
: input.inventoryTurnoverProxy
? "inventory_turnover_proxy_from_sales_documents_and_stock_balance"
: input.inventoryPosition
? "inventory_on_hand_snapshot_without_reserve_writeoff_or_liquidation_evidence"
: null,
next_required_evidence: "reviewed_inventory_quality_route_with_reserves_writeoffs_obsolescence_and_liquidation_value",
must_not_claim: "confirmed_obsolete_stock_reserve_writeoff_or_liquidation_value"
});
}
if (input.hasSupplierConcentrationSignal) {
pushUnique({
family: "vendor_risk_procurement_quality",
current_status: "proxy_only_currently",
current_supported_evidence: "supplier_concentration_proxy_from_confirmed_outgoing_payment_rows",
next_required_evidence: "reviewed_vendor_risk_route_with_supplier_reliability_terms_quality_and_full_expense_structure",
must_not_claim: "vendor_risk_procurement_quality_supplier_reliability_or_full_expense_structure"
});
}
return items;
}
function deriveBusinessOverview(input) {
const incoming = deriveValueFlowSideSummary(input.incomingResult);
const outgoing = deriveValueFlowSideSummary(input.outgoingResult);
@@ -2809,6 +2878,30 @@ function deriveBusinessOverview(input) {
}
const netAmount = incoming.total_amount - outgoing.total_amount;
const hasBusinessOverviewProfileSignal = Boolean(documentActivityProfile || counterpartyProfile || contractUsageProfile);
const missingSignalFamilies = [
tradingMarginProxy ? "accounting_profit_margin" : "profit_margin",
debtPosition ? null : "debt_position",
debtOpenSettlementQuality ? "debt_due_date_aging_quality" : "debt_open_settlement_quality",
taxPosition ? null : "tax_position",
inventoryPosition
? inventoryStalenessRiskProxy
? "inventory_reserve_liquidation_quality"
: inventoryTurnoverProxy
? "inventory_liquidity_quality"
: "inventory_turnover_quality"
: "inventory_position",
inventoryPosition?.aging_signal ? null : "inventory_aging_quality"
].filter((item) => Boolean(item));
const missingProofFamilies = buildBusinessOverviewMissingProofFamilies({
missingSignalFamilies,
tradingMarginProxy,
debtOpenSettlementQuality,
debtStalenessRiskProxy,
inventoryPosition,
inventoryTurnoverProxy,
inventoryStalenessRiskProxy,
hasSupplierConcentrationSignal: (rankedOutgoing?.ranked_values.length ?? 0) > 0
});
return {
organization_scope: input.organizationScope,
period_scope: input.periodScope,
@@ -2834,20 +2927,8 @@ function deriveBusinessOverview(input) {
contract_usage_profile: contractUsageProfile,
coverage_limited_by_probe_limit: incoming.coverage_limited_by_probe_limit || outgoing.coverage_limited_by_probe_limit,
checked_signal_count: checkedSignalCount,
missing_signal_families: [
tradingMarginProxy ? "accounting_profit_margin" : "profit_margin",
debtPosition ? null : "debt_position",
debtOpenSettlementQuality ? "debt_due_date_aging_quality" : "debt_open_settlement_quality",
taxPosition ? null : "tax_position",
inventoryPosition
? inventoryStalenessRiskProxy
? "inventory_reserve_liquidation_quality"
: inventoryTurnoverProxy
? "inventory_liquidity_quality"
: "inventory_turnover_quality"
: "inventory_position",
inventoryPosition?.aging_signal ? null : "inventory_aging_quality"
].filter((item) => Boolean(item)),
missing_signal_families: missingSignalFamilies,
missing_proof_families: missingProofFamilies,
inference_basis: hasBusinessOverviewProfileSignal || inventoryPosition
? "business_overview_from_confirmed_1c_multi_family_rows"
: debtOpenSettlementQuality
@@ -4177,6 +4258,9 @@ async function executeAssistantMcpDiscoveryPilot(planner, deps = DEFAULT_DEPS) {
if (derivedBusinessOverview.inventory_staleness_risk_proxy) {
pushReason(reasonCodes, "pilot_derived_business_overview_inventory_staleness_risk_proxy_from_confirmed_rows");
}
if (derivedBusinessOverview.missing_proof_families.length > 0) {
pushReason(reasonCodes, "pilot_business_overview_missing_proof_families_recorded");
}
}
const sourceRowsSummary = summarizeBusinessOverviewRows({
incomingResult,