/** * 收敛控制器 — review/finding 收敛治理层(纯计算,不接 evaluator/review engine)。 * * 解决:accepted_risk/review 无限重审循环。给 finding 的 accepted_risk 裁决加重审预算 + * 稳定态判定,打破"dismissed error 无限注入重审 focus"的振荡。 * * 设计原则:旁路新增,不替换现有 review engine。 * - 不改 reviewFindingKey/K 采样/evaluator/evidence writer/HMAC/ResolutionRecord/ImpactEngine * - 不删 finding.status/accepted_risk 字段/旧 review 字段 * - 本层是独立计算层:输入(review/findings/resolutions/impact)→ 输出(收敛状态/动作) * * accepted_risk 收敛机制: * - 首次裁决(无重挑战)→ stable_dismissed 候选(不再进无限 focus) * - reviewer 重新挑战 → 消耗 challenge budget * - 预算:普通风险 1 / security·finance·compliance 2 * - 超过 budget → blocked(强制升级人工,不无限循环) */ import type { ResolutionRecord } from "./resolution_store.js"; import type { ChangeImpactResult } from "./change_impact_engine.js"; /** review 级收敛状态(与现有 status:in_progress/completed 分离)。 */ export type ReviewConvergenceState = "sampling" | "adjudicating" | "resolving" | "converged" | "blocked" | "abandoned" | "superseded"; /** finding 级裁决状态(与 finding.resolution_status/closure_status 分离)。 */ export type FindingAdjudicationState = "open" | "resolved_fixed" | "resolved_removed" | "stable_dismissed" | "re_challenged" | "blocked"; /** finding 关键级别(决定重审预算)。 */ export type FindingCriticality = "security" | "finance" | "compliance"; /** 收敛分析输入的单个 finding。 */ export interface ConvergenceFinding { findingId: string; severity: "error" | "warning" | "info"; criticality?: FindingCriticality; /** finding 现有 resolution_status(来自 ReviewFinding,只读,不改) */ resolutionStatus?: "needs_triage" | "confirmed" | "false_positive" | "accepted_risk"; /** 本次 reviewer 是否重新挑战该 finding(重审报回) */ reChallenged?: boolean; /** 历史已消耗的重挑战次数(调用方从 review 历史提供,默认 0) */ priorChallenges?: number; } /** 收敛分析输入。 */ export interface ConvergenceInput { reviewId?: string; findings: ConvergenceFinding[]; /** 已存在的 Resolution 记录(来自 ResolutionStore) */ resolutions: ResolutionRecord[]; /** 变更影响结果(来自 ImpactEngine,可选;无则 review_outdated fallback 旧逻辑) */ impactResult?: ChangeImpactResult; /** review 是否完成 K 轮采样(判 sampling 阶段) */ reviewCompleted?: boolean; } /** 单个 finding 的裁决结果。 */ export interface FindingAdjudication { findingId: string; state: FindingAdjudicationState; /** 重审预算(普通 1 / 关键级别 2) */ challengeBudget: number; /** 已消耗重挑战次数(含本次) */ challengesUsed: number; /** 是否有稳定 Resolution(fixed/removed) */ hasStableResolution: boolean; reason: string; } /** review 是否需重开的判定(review_outdated 的语义化版本)。 */ export interface ReviewOutdatedDecision { reopen: boolean; reason: string; } /** review 收敛分析结果。 */ export interface ReviewConvergenceResult { reviewId?: string; state: ReviewConvergenceState; /** 引擎动作建议 */ action: "continue_review" | "proceed_to_resolve" | "converged" | "blocked"; findings: FindingAdjudication[]; reviewOutdated: ReviewOutdatedDecision; reason: string; } /** accepted_risk 重挑战预算:普通 1,security/finance/compliance 2。 */ export declare function budgetForCriticality(criticality?: FindingCriticality): number; /** accepted_risk 振荡 guard:判 challenge 次数是否超 budget(超 → blocked,防无限振荡)。 * 旁路 guard(F-Step2):未超 → 旧 accepted_risk 逻辑;超 → blocked(拒绝 accepted_risk,输出阻断信号让 deliver Convergence 阻断)。 */ export declare function shouldBlockAcceptedRisk(challenges: number, criticality?: FindingCriticality): { blocked: boolean; budget: number; challenges: number; reason?: string; }; /** 收敛控制器 — 纯计算层,输入 review/findings/resolutions/impact,输出收敛状态与动作。 */ export declare class ConvergenceController { /** review 是否需重开(优先用 impact 语义;无 impact fallback 保守重审)。 * metadata/documentation 不影响 review 语义 → 免重审;其余 → 重审。 */ shouldReopenReview(impact?: ChangeImpactResult): ReviewOutdatedDecision; /** 评估 review 收敛状态。 */ evaluate(input: ConvergenceInput): ReviewConvergenceResult; }