Open-World: закрепить реестр недостающих доказательств бизнес-обзора
This commit is contained in:
@@ -748,6 +748,9 @@ function buildMustNotClaim(pilot: AssistantMcpDiscoveryPilotExecutionContract):
|
||||
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) {
|
||||
@@ -1569,6 +1572,9 @@ export function buildAssistantMcpDiscoveryAnswerDraft(
|
||||
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
|
||||
|
||||
@@ -182,6 +182,23 @@ export interface AssistantMcpDiscoveryDerivedBusinessOverviewContractUsageProfil
|
||||
inference_basis: "contract_usage_overview_confirmed_1c_rows";
|
||||
}
|
||||
|
||||
export type AssistantMcpDiscoveryBusinessOverviewMissingProofFamilyId =
|
||||
| "accounting_profit_margin"
|
||||
| "debt_due_date_aging_quality"
|
||||
| "inventory_reserve_liquidation_quality"
|
||||
| "vendor_risk_procurement_quality";
|
||||
|
||||
export interface AssistantMcpDiscoveryBusinessOverviewMissingProofFamily {
|
||||
family: AssistantMcpDiscoveryBusinessOverviewMissingProofFamilyId;
|
||||
current_status:
|
||||
| "not_checked_in_current_turn"
|
||||
| "proxy_only_currently"
|
||||
| "reviewed_route_not_wired";
|
||||
current_supported_evidence: string | null;
|
||||
next_required_evidence: string;
|
||||
must_not_claim: string;
|
||||
}
|
||||
|
||||
export interface AssistantMcpDiscoveryDerivedBidirectionalValueFlow {
|
||||
counterparty: string | null;
|
||||
period_scope: string | null;
|
||||
@@ -224,6 +241,7 @@ export interface AssistantMcpDiscoveryDerivedBusinessOverview {
|
||||
coverage_limited_by_probe_limit: boolean;
|
||||
checked_signal_count: number;
|
||||
missing_signal_families: string[];
|
||||
missing_proof_families: AssistantMcpDiscoveryBusinessOverviewMissingProofFamily[];
|
||||
inference_basis:
|
||||
| "business_overview_from_confirmed_1c_money_and_activity_rows"
|
||||
| "business_overview_from_confirmed_1c_money_activity_and_tax_rows"
|
||||
@@ -3717,6 +3735,92 @@ function inventoryStalenessRiskBandRu(
|
||||
return "низкий видимый риск";
|
||||
}
|
||||
|
||||
function buildBusinessOverviewMissingProofFamilies(input: {
|
||||
missingSignalFamilies: string[];
|
||||
tradingMarginProxy: AssistantMcpDiscoveryDerivedBusinessOverviewTradingMarginProxy | null;
|
||||
debtOpenSettlementQuality: AssistantMcpDiscoveryDerivedBusinessOverviewDebtOpenSettlementQuality | null;
|
||||
debtStalenessRiskProxy: AssistantMcpDiscoveryDerivedBusinessOverviewDebtStalenessRiskProxy | null;
|
||||
inventoryPosition: AssistantMcpDiscoveryDerivedBusinessOverviewInventoryPosition | null;
|
||||
inventoryTurnoverProxy: AssistantMcpDiscoveryDerivedBusinessOverviewInventoryTurnoverProxy | null;
|
||||
inventoryStalenessRiskProxy: AssistantMcpDiscoveryDerivedBusinessOverviewInventoryStalenessRiskProxy | null;
|
||||
hasSupplierConcentrationSignal: boolean;
|
||||
}): AssistantMcpDiscoveryBusinessOverviewMissingProofFamily[] {
|
||||
const missing = new Set(input.missingSignalFamilies);
|
||||
const items: AssistantMcpDiscoveryBusinessOverviewMissingProofFamily[] = [];
|
||||
const pushUnique = (item: AssistantMcpDiscoveryBusinessOverviewMissingProofFamily) => {
|
||||
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: {
|
||||
incomingResult: AssistantMcpDiscoveryCoverageAwareQueryResult | null;
|
||||
outgoingResult: AssistantMcpDiscoveryCoverageAwareQueryResult | null;
|
||||
@@ -3816,6 +3920,30 @@ function deriveBusinessOverview(input: {
|
||||
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): item is string => 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,
|
||||
@@ -3842,20 +3970,8 @@ function deriveBusinessOverview(input: {
|
||||
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): item is string => Boolean(item)),
|
||||
missing_signal_families: missingSignalFamilies,
|
||||
missing_proof_families: missingProofFamilies,
|
||||
inference_basis:
|
||||
hasBusinessOverviewProfileSignal || inventoryPosition
|
||||
? "business_overview_from_confirmed_1c_multi_family_rows"
|
||||
@@ -5359,6 +5475,9 @@ export async function executeAssistantMcpDiscoveryPilot(
|
||||
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,
|
||||
|
||||
Reference in New Issue
Block a user