ГЛОБАЛЬНЫЙ РЕФАКТОРИНГ АРХИТЕКТУРЫ - Рефакторинг этапов 2.2 - Усилена оркестрацию в deep/address гейте и follow-up binding в assistantService.ts. Починен кейс UTF-8 follow-up refinement (теперь followup_state_usage.applied=true в нужном сценарии). Убраны регрессии по assistantLivingRouter и stage3 lifecycle probe. Корректное поведение для llm canonical candidate (чтобы не уезжало в clarification_required там, где должен быть address factual).

This commit is contained in:
2026-04-11 14:56:14 +03:00
parent 19f5f19d8e
commit b5bd4fd737
46 changed files with 2471 additions and 370 deletions
@@ -1,4 +1,33 @@
import type { AnswerGroundingCheck, RequirementCoverageReport } from "../types/assistant";
import type {
AssistantDebugRouteRecord,
AssistantExecutionStateRecord,
AssistantFallbackType,
AssistantProblemAnswerMode,
AssistantReplyType,
AssistantRequirement,
UnifiedRetrievalResult,
AnswerGroundingCheck,
FaLiveRouteAuditDebug,
RbpLiveRouteAuditDebug,
RequirementCoverageReport
} from "../types/assistant";
import type { AnswerStructureV11 } from "../types/stage1Contracts";
import type { InvestigationStateWithProblemUnits } from "../types/stage2ProblemUnits";
import type { ClaimBoundAnchorAudit, TargetedEvidenceAcquisitionAudit } from "./assistantClaimBoundEvidence";
import type { AssistantContractsBundleV1 } from "./assistantContractsBundleAssembler";
import type { AssistantOutcomeClassV1 } from "./assistantOrchestrationContracts";
import type { AssistantFollowupUsage } from "./assistantFollowupUsage";
import type { CompanyAnchorSet } from "./companyAnchorResolver";
import type {
AssistantRetrievalCallRecord,
AssistantRetrievalRawResultRecord
} from "./assistantDeepTurnRetrievalRuntimeAdapter";
import type {
DomainPolarityGuardAudit,
EvidenceAdmissibilityAudit,
GroundedAnswerEligibilityAudit,
TemporalGuardAudit
} from "./assistantRuntimeGuards";
export interface DeepAnalysisMessageLogDetailsInput {
sessionId: string;
@@ -6,18 +35,18 @@ export interface DeepAnalysisMessageLogDetailsInput {
userMessage: string;
normalizerOutput: unknown;
executionPlan: Array<Record<string, unknown>>;
resolvedExecutionState: unknown;
routes: Array<Record<string, unknown>>;
retrievalCalls: Array<Record<string, unknown>>;
retrievalResultsRaw: unknown[];
retrievalResultsNormalized: unknown[];
requirementsExtracted: unknown[];
resolvedExecutionState: AssistantExecutionStateRecord[];
routes: AssistantDebugRouteRecord[];
retrievalCalls: AssistantRetrievalCallRecord[];
retrievalResultsRaw: AssistantRetrievalRawResultRecord[];
retrievalResultsNormalized: UnifiedRetrievalResult[];
requirementsExtracted: AssistantRequirement[];
coverageReport: RequirementCoverageReport;
groundingCheck: AnswerGroundingCheck;
replyType: string;
replyType: AssistantReplyType;
droppedIntentSegments: string[];
questionTypeClass: string;
companyAnchors: unknown;
companyAnchors: CompanyAnchorSet | null;
runtimeAnalysisContext: {
active: boolean;
as_of_date: string | null;
@@ -32,26 +61,26 @@ export interface DeepAnalysisMessageLogDetailsInput {
company_grounding_applied?: boolean;
scope_resolution_reason?: string[];
};
temporalGuard: Record<string, unknown>;
polarityAudit: Record<string, unknown>;
claimAnchorAudit: Record<string, unknown>;
targetedEvidenceAudit: unknown;
evidenceAdmissibilityGateAudit: unknown;
rbpLiveRouteAudit: unknown | null;
faLiveRouteAudit: unknown | null;
groundedAnswerEligibilityGuard: Record<string, unknown>;
followupStateUsage: unknown | null;
temporalGuard: TemporalGuardAudit;
polarityAudit: DomainPolarityGuardAudit;
claimAnchorAudit: ClaimBoundAnchorAudit;
targetedEvidenceAudit: TargetedEvidenceAcquisitionAudit;
evidenceAdmissibilityGateAudit: EvidenceAdmissibilityAudit;
rbpLiveRouteAudit: RbpLiveRouteAuditDebug | null;
faLiveRouteAudit: FaLiveRouteAuditDebug | null;
groundedAnswerEligibilityGuard: GroundedAnswerEligibilityAudit;
followupStateUsage: AssistantFollowupUsage | null;
compositionDebug: {
problem_centric_answer_applied?: boolean;
problem_units_used_count?: number;
problem_answer_mode?: string;
problem_answer_mode?: AssistantProblemAnswerMode;
problem_unit_ids_used?: string[];
fallback_type?: string;
fallback_type?: AssistantFallbackType;
};
outcomeClassV1: unknown;
assistantOrchestrationContractsV1: unknown;
answerStructureV11: unknown;
investigationStateSnapshot: unknown;
outcomeClassV1: AssistantOutcomeClassV1;
assistantOrchestrationContractsV1: AssistantContractsBundleV1["assistantOrchestrationContractsV1"];
answerStructureV11: AnswerStructureV11 | null;
investigationStateSnapshot: InvestigationStateWithProblemUnits | null;
assistantReply: string;
traceId: string;
}
@@ -77,7 +106,9 @@ function resolveCoverageStatus(coverageReport: RequirementCoverageReport): "full
: "partial_or_limited";
}
export function buildDeepAnalysisProcessedLogDetails(input: DeepAnalysisMessageLogDetailsInput): Record<string, unknown> {
export type DeepAnalysisLogDetails = Record<string, unknown>;
export function buildDeepAnalysisProcessedLogDetails(input: DeepAnalysisMessageLogDetailsInput): DeepAnalysisLogDetails {
const analysisContext = toAnalysisContext(input.runtimeAnalysisContext);
return {
session_id: input.sessionId,