Архитектура: стабилизировать organization authority после late company switch и закрыть phase16 multi-company replay
This commit is contained in:
@@ -142,6 +142,72 @@ const INVENTORY_SELECTED_OBJECT_TESTS = [
|
||||
"full_anchor_not_degraded_by_canonical_rewrite"
|
||||
] as const;
|
||||
|
||||
const SHARED_ROOT_EXACT_TESTS = [
|
||||
"root_context_survives_domain_pivot_without_object_leak",
|
||||
"limited_mode_remains_truthful"
|
||||
] as const;
|
||||
|
||||
function rootExactCapability(input: {
|
||||
capability_id: string;
|
||||
domainId: string;
|
||||
intent_ids: AddressIntent[];
|
||||
transitions: AssistantTransitionClassId[];
|
||||
requiredAnchors: string[];
|
||||
optionalAnchors?: string[];
|
||||
resultShape: string;
|
||||
answerObjectShape: string;
|
||||
scenarioFamilies?: string[];
|
||||
}): AssistantCapabilityContract {
|
||||
return {
|
||||
schema_version: ASSISTANT_RUNTIME_CONTRACTS_SCHEMA_VERSION,
|
||||
capability_id: input.capability_id,
|
||||
domain_id: input.domainId,
|
||||
runtime_lane: "address_exact",
|
||||
intent_ids: input.intent_ids,
|
||||
entry_modes: ["root_entry", "root_followup", "clarification_resume"],
|
||||
supported_transition_classes: input.transitions,
|
||||
frame_compatibility: {
|
||||
root_frame: "optional",
|
||||
selected_object_frame: "optional",
|
||||
meta_frame: "forbidden"
|
||||
},
|
||||
required_anchors: input.requiredAnchors,
|
||||
optional_anchors: input.optionalAnchors ?? ["organization", "date_scope", "account", "counterparty", "contract"],
|
||||
anchor_source_priority: ["explicit_user_anchor", "root_frame", "semantic_hint"],
|
||||
anchor_admissibility_rules: [
|
||||
"confirmed_root_scope_beats_semantic_hint",
|
||||
"no_low_quality_counterparty_rewrite",
|
||||
"no_conversational_noise_as_entity"
|
||||
],
|
||||
organization_scope_behavior: "reuse_or_clarify",
|
||||
date_scope_behavior: "reuse",
|
||||
temporal_ceiling_policy: "must_not_expand_without_reason_code",
|
||||
root_context_compatibility: "required",
|
||||
requires_focus_object: false,
|
||||
accepted_focus_object_kinds: [],
|
||||
focus_object_override_policy: "not_applicable",
|
||||
bundle_reuse_policy: "none",
|
||||
resolver_owner: "addressIntentResolver",
|
||||
recipe_owner: "addressRecipeCatalog",
|
||||
execution_adapter: "AddressQueryService",
|
||||
result_shape: input.resultShape,
|
||||
answer_object_shape: input.answerObjectShape,
|
||||
minimum_evidence_policy: "route_specific_threshold",
|
||||
coverage_gate_behavior: "partial_or_blocked_if_evidence_insufficient",
|
||||
truth_mode_fallbacks: ["limited", "clarification_required", "unsupported"],
|
||||
blocked_reason_codes: ["missing_anchor", "route_expectation_failure", "execution_error", "insufficient_evidence"],
|
||||
clarification_triggers: ["ambiguous_organization_scope", "ambiguous_date_scope"],
|
||||
clarification_questions: ["Уточните организацию, счёт или дату, чтобы не подставлять неподтверждённый контур."],
|
||||
resume_policy: "resume_original_route_with_resolved_anchors",
|
||||
empty_match_behavior: "truthful_empty_match",
|
||||
route_expectation_failure_behavior: "blocked_route_expectation_failure",
|
||||
execution_error_behavior: "blocked_execution_error",
|
||||
required_unit_tests: [...SHARED_ROOT_EXACT_TESTS],
|
||||
required_transition_tests: input.transitions.map((transitionId) => `transition_${transitionId}`),
|
||||
required_scenario_families: input.scenarioFamilies ?? ["canonical", "colloquial", "followup_date_carryover"]
|
||||
};
|
||||
}
|
||||
|
||||
function inventoryExactCapability(input: {
|
||||
capability_id: string;
|
||||
intent_ids: AddressIntent[];
|
||||
@@ -285,6 +351,71 @@ export const INVENTORY_CAPABILITY_CONTRACTS: readonly AssistantCapabilityContrac
|
||||
})
|
||||
] as const;
|
||||
|
||||
export const ROOT_EXACT_CAPABILITY_CONTRACTS: readonly AssistantCapabilityContract[] = [
|
||||
rootExactCapability({
|
||||
capability_id: "confirmed_payables_as_of_date",
|
||||
domainId: "counterparty_debt",
|
||||
intent_ids: ["payables_confirmed_as_of_date"],
|
||||
transitions: ["T1", "T2", "T6", "T7"],
|
||||
requiredAnchors: [],
|
||||
resultShape: "counterparty_payables_snapshot",
|
||||
answerObjectShape: "payables_snapshot"
|
||||
}),
|
||||
rootExactCapability({
|
||||
capability_id: "confirmed_receivables_as_of_date",
|
||||
domainId: "counterparty_debt",
|
||||
intent_ids: ["receivables_confirmed_as_of_date"],
|
||||
transitions: ["T1", "T2", "T6", "T7"],
|
||||
requiredAnchors: [],
|
||||
resultShape: "counterparty_receivables_snapshot",
|
||||
answerObjectShape: "receivables_snapshot"
|
||||
}),
|
||||
rootExactCapability({
|
||||
capability_id: "confirmed_open_contracts_as_of_date",
|
||||
domainId: "contracts",
|
||||
intent_ids: ["open_contracts_confirmed_as_of_date"],
|
||||
transitions: ["T1", "T2", "T6", "T7"],
|
||||
requiredAnchors: [],
|
||||
resultShape: "open_contracts_snapshot",
|
||||
answerObjectShape: "open_contracts_snapshot"
|
||||
}),
|
||||
rootExactCapability({
|
||||
capability_id: "confirmed_vat_payable_as_of_date",
|
||||
domainId: "vat",
|
||||
intent_ids: ["vat_payable_confirmed_as_of_date"],
|
||||
transitions: ["T1", "T2", "T6", "T7"],
|
||||
requiredAnchors: [],
|
||||
resultShape: "vat_payable_snapshot",
|
||||
answerObjectShape: "vat_payable_snapshot"
|
||||
}),
|
||||
rootExactCapability({
|
||||
capability_id: "confirmed_vat_liability_for_tax_period",
|
||||
domainId: "vat",
|
||||
intent_ids: ["vat_liability_confirmed_for_tax_period"],
|
||||
transitions: ["T1", "T2", "T6", "T7"],
|
||||
requiredAnchors: [],
|
||||
resultShape: "vat_tax_period_liability_snapshot",
|
||||
answerObjectShape: "vat_tax_period_liability_snapshot",
|
||||
scenarioFamilies: ["canonical", "colloquial", "followup_date_carryover", "tax_period_followup"]
|
||||
}),
|
||||
rootExactCapability({
|
||||
capability_id: "account_balance_exact",
|
||||
domainId: "accounting_balance",
|
||||
intent_ids: ["account_balance_snapshot", "documents_forming_balance"],
|
||||
transitions: ["T1", "T2", "T6", "T7"],
|
||||
requiredAnchors: ["account"],
|
||||
optionalAnchors: ["organization", "date_scope", "account"],
|
||||
resultShape: "account_balance_snapshot_or_supporting_documents",
|
||||
answerObjectShape: "account_balance_context",
|
||||
scenarioFamilies: ["canonical", "colloquial", "followup_date_carryover", "same_date_account_followup"]
|
||||
})
|
||||
] as const;
|
||||
|
||||
const ALL_CAPABILITY_CONTRACTS: readonly AssistantCapabilityContract[] = [
|
||||
...INVENTORY_CAPABILITY_CONTRACTS,
|
||||
...ROOT_EXACT_CAPABILITY_CONTRACTS
|
||||
] as const;
|
||||
|
||||
export function listAssistantTransitionContracts(): readonly AssistantTransitionContract[] {
|
||||
return ASSISTANT_TRANSITION_CONTRACTS;
|
||||
}
|
||||
@@ -298,9 +429,9 @@ export function listInventoryCapabilityContracts(): readonly AssistantCapability
|
||||
}
|
||||
|
||||
export function getAssistantCapabilityContract(capabilityId: string): AssistantCapabilityContract | null {
|
||||
return INVENTORY_CAPABILITY_CONTRACTS.find((contract) => contract.capability_id === capabilityId) ?? null;
|
||||
return ALL_CAPABILITY_CONTRACTS.find((contract) => contract.capability_id === capabilityId) ?? null;
|
||||
}
|
||||
|
||||
export function getAssistantCapabilityContractByIntent(intent: AddressIntent): AssistantCapabilityContract | null {
|
||||
return INVENTORY_CAPABILITY_CONTRACTS.find((contract) => contract.intent_ids.includes(intent)) ?? null;
|
||||
return ALL_CAPABILITY_CONTRACTS.find((contract) => contract.intent_ids.includes(intent)) ?? null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user