/** * adversarial_review — 对抗审查编排 handler。 * * 职责边界: * - 负责:协调 store(IO + 采样算法)+ collect/normalize/prompt/judgment,编排 K 次独立采样取交集 + resolutions 闭环 * - 不负责:不 import ALL_CONTRACTS(避免 core→domain 反向违规);不调 LLM(只组装 prompt,AI 在独立 session 执行) * * 被谁调用:server/tools/sf_review * 调用谁:adversarial_review_store、./collect、./normalize、./prompt、./judgment * * 数据流:round=1 收集 artifacts/refs → buildReviewPrompt;round≥2 normalize findings → store.appendRound → 交集聚合;resolutions 闭环 * 持久化:读写 .soloforge/reviews/(AdversarialReviewStore)+ 读 .soloforge/state/evidence/(VerificationEvidenceStore,取 verified hash; 退役) * * 分层:本模块在 core/,**不 import ALL_CONTRACTS**(避免 core→domain 反向违规)。 * contracts 由调用方传入 projectContracts(projectRoot)。 */ import { AdversarialReviewStore, type AdversarialReviewRecord, type ReviewFinding } from "../adversarial_review_store.js"; import { type DowngradedDeterministic } from "./quote_validation.js"; import type { TaskContext } from "../../types/index.js"; import type { DomainContract } from "../types.js"; import type { TaskContextManager } from "../task_context.js"; /** 修复计划(AI 可直接消费,不需人工整理)。intersection 后为每个 finding 派生。 */ export interface RepairPlan { finding_id: string; root_cause: string; affected_artifacts: string[]; suggested_action: string; verification_method: "quote_absent" | "anchor_present" | "structural" | "quote_absent+anchor_present"; } /** 从 finding 派生 RepairPlan。verification_method 据 repair_evidence/fix_action/fix_verification 推断; * affected_artifacts = finding.artifact + fix_verification/repair_evidence 的 artifact(去重)。 */ export declare function deriveRepairPlan(finding: ReviewFinding): RepairPlan; /** adversarial_review:对抗性独立审查(per-artifact 单产物 / cross-artifact 跨产物一致性)。 * SoloForge 不调 LLM——只组装 prompt 返回,AI 用独立 session/subagent 执行(避免确认偏见)。 * K 次独立采样取交集:采样数由 review_policy 声明,每轮不参考前轮结论,完成后取多数交集。 * 确定性边界原则:不追求"零 error 收敛";多数复现 error 必须进入裁决/修复/复验闭环。 * 多利益方独立对抗:用户/攻击者/维护者/性能/合规 各自独立目标函数,避免单一视角确认偏见。 */ export declare function handleAdversarialReview(projectRoot: string, task: TaskContext, args: Record, contracts: DomainContract[], /** TaskContextManager:前置自动级联刷新走 VerificationService 正式通道必传(resolveFull 无 manager * 直接失败致刷新恒 null——2026-09-01 增量审查实证的死代码路径)。可选仅为测试兼容。 */ taskContextManager?: TaskContextManager): Promise<{ result: { remaining_open: number; open_error_findings: string[]; needs_re_review: boolean; next_step: string; convergence_limit_reached?: { current_round: number; max_rounds: number; } | undefined; success: boolean; action: string; review_id: string; auto_fixed: number; error?: undefined; }; } | { result: { next_step: string; resolution_failures?: { finding_id: string; detail: string | undefined; reason: string; }[] | undefined; open_error_findings: string[]; needs_re_review: boolean; re_review_severity: "none" | "advisory" | "blocking"; fixed_quote_still_present: { artifact: string; location: string; quote_preview: string; }[]; sedimentation_hint?: string | undefined; resolution_updated_note: string; convergence_limit_reached?: { current_round: number; max_rounds: number; } | undefined; success: boolean; action: string; review_id: string; resolution_updated: number; error?: undefined; }; } | { result: { success: boolean; error: string; next_step: string; review_id?: undefined; mode?: undefined; status?: undefined; completed?: undefined; intersection_findings?: undefined; retained_findings?: undefined; progress?: undefined; missing_evidence?: undefined; invalid_evidence?: undefined; action?: undefined; round?: undefined; review_mode?: undefined; artifact_count?: undefined; artifacts?: undefined; references?: undefined; reviewer_session_tokens?: undefined; delivery_evidence_eligible?: undefined; prompt?: undefined; token_diagnostic?: undefined; quote_validation_failed?: undefined; review_status?: undefined; sample_k?: undefined; converged?: undefined; convergence_confidence?: undefined; review_depth_sufficient?: undefined; round_summary?: undefined; intersection_count?: undefined; repair_plans?: undefined; is_single_round?: undefined; retained_count?: undefined; deterministic_downgraded?: undefined; rounds_completed?: undefined; }; } | { result: { success: boolean; review_id: string; mode: "per_artifact" | "cross_artifact"; status: "completed" | "in_progress"; completed: boolean; intersection_findings: { id: string; artifact: string; location: string; issue: string; severity: "warning" | "error" | "info"; resolution_status: "needs_triage" | "confirmed" | "false_positive" | "accepted_risk" | undefined; closure_status: "fixed" | "open" | "waived" | undefined; }[]; retained_findings: { id: string; artifact: string; location: string; issue: string; severity: "warning" | "error" | "info"; resolution_status: "needs_triage" | "confirmed" | "false_positive" | "accepted_risk" | undefined; closure_status: "fixed" | "open" | "waived" | undefined; }[]; next_step: string; error?: undefined; progress?: undefined; missing_evidence?: undefined; invalid_evidence?: undefined; action?: undefined; round?: undefined; review_mode?: undefined; artifact_count?: undefined; artifacts?: undefined; references?: undefined; reviewer_session_tokens?: undefined; delivery_evidence_eligible?: undefined; prompt?: undefined; token_diagnostic?: undefined; quote_validation_failed?: undefined; review_status?: undefined; sample_k?: undefined; converged?: undefined; convergence_confidence?: undefined; review_depth_sufficient?: undefined; round_summary?: undefined; intersection_count?: undefined; repair_plans?: undefined; is_single_round?: undefined; retained_count?: undefined; deterministic_downgraded?: undefined; rounds_completed?: undefined; }; } | { result: { success: boolean; progress: import("../adversarial_review_store.js").ReviewProgress; next_step: string; error?: undefined; review_id?: undefined; mode?: undefined; status?: undefined; completed?: undefined; intersection_findings?: undefined; retained_findings?: undefined; missing_evidence?: undefined; invalid_evidence?: undefined; action?: undefined; round?: undefined; review_mode?: undefined; artifact_count?: undefined; artifacts?: undefined; references?: undefined; reviewer_session_tokens?: undefined; delivery_evidence_eligible?: undefined; prompt?: undefined; token_diagnostic?: undefined; quote_validation_failed?: undefined; review_status?: undefined; sample_k?: undefined; converged?: undefined; convergence_confidence?: undefined; review_depth_sufficient?: undefined; round_summary?: undefined; intersection_count?: undefined; repair_plans?: undefined; is_single_round?: undefined; retained_count?: undefined; deterministic_downgraded?: undefined; rounds_completed?: undefined; }; } | { result: { success: boolean; error: string; missing_evidence: string[]; invalid_evidence: string[]; next_step: string; review_id?: undefined; mode?: undefined; status?: undefined; completed?: undefined; intersection_findings?: undefined; retained_findings?: undefined; progress?: undefined; action?: undefined; round?: undefined; review_mode?: undefined; artifact_count?: undefined; artifacts?: undefined; references?: undefined; reviewer_session_tokens?: undefined; delivery_evidence_eligible?: undefined; prompt?: undefined; token_diagnostic?: undefined; quote_validation_failed?: undefined; review_status?: undefined; sample_k?: undefined; converged?: undefined; convergence_confidence?: undefined; review_depth_sufficient?: undefined; round_summary?: undefined; intersection_count?: undefined; repair_plans?: undefined; is_single_round?: undefined; retained_count?: undefined; deterministic_downgraded?: undefined; rounds_completed?: undefined; }; } | { result: { success: boolean; action: string; review_id: string; round: number; mode: "per_artifact" | "cross_artifact"; review_mode: string; artifact_count: number; artifacts: string[]; references: string[]; reviewer_session_tokens: string[]; delivery_evidence_eligible: boolean; prompt: string; next_step: string; error?: undefined; status?: undefined; completed?: undefined; intersection_findings?: undefined; retained_findings?: undefined; progress?: undefined; missing_evidence?: undefined; invalid_evidence?: undefined; token_diagnostic?: undefined; quote_validation_failed?: undefined; review_status?: undefined; sample_k?: undefined; converged?: undefined; convergence_confidence?: undefined; review_depth_sufficient?: undefined; round_summary?: undefined; intersection_count?: undefined; repair_plans?: undefined; is_single_round?: undefined; retained_count?: undefined; deterministic_downgraded?: undefined; rounds_completed?: undefined; }; } | { result: { success: boolean; error: string; next_step: string; token_diagnostic: { submitted_length: number; has_rev_session_prefix: boolean; uuid_shape_ok: boolean; pending_remaining_count: number; root_cause: string; }; review_id?: undefined; mode?: undefined; status?: undefined; completed?: undefined; intersection_findings?: undefined; retained_findings?: undefined; progress?: undefined; missing_evidence?: undefined; invalid_evidence?: undefined; action?: undefined; round?: undefined; review_mode?: undefined; artifact_count?: undefined; artifacts?: undefined; references?: undefined; reviewer_session_tokens?: undefined; delivery_evidence_eligible?: undefined; prompt?: undefined; quote_validation_failed?: undefined; review_status?: undefined; sample_k?: undefined; converged?: undefined; convergence_confidence?: undefined; review_depth_sufficient?: undefined; round_summary?: undefined; intersection_count?: undefined; repair_plans?: undefined; is_single_round?: undefined; retained_count?: undefined; deterministic_downgraded?: undefined; rounds_completed?: undefined; }; } | { result: { success: boolean; error: string; next_step: string; quote_validation_failed: { artifact: string; location: string; quote_preview: string; }; review_id?: undefined; mode?: undefined; status?: undefined; completed?: undefined; intersection_findings?: undefined; retained_findings?: undefined; progress?: undefined; missing_evidence?: undefined; invalid_evidence?: undefined; action?: undefined; round?: undefined; review_mode?: undefined; artifact_count?: undefined; artifacts?: undefined; references?: undefined; reviewer_session_tokens?: undefined; delivery_evidence_eligible?: undefined; prompt?: undefined; token_diagnostic?: undefined; review_status?: undefined; sample_k?: undefined; converged?: undefined; convergence_confidence?: undefined; review_depth_sufficient?: undefined; round_summary?: undefined; intersection_count?: undefined; repair_plans?: undefined; is_single_round?: undefined; retained_count?: undefined; deterministic_downgraded?: undefined; rounds_completed?: undefined; }; } | { result: { success: boolean; action: string; review_id: string; round: number; review_status: string; sample_k: number; converged: boolean; convergence_confidence: "low" | "high" | undefined; review_depth_sufficient: boolean; round_summary: { errors: number; warnings: number; }; intersection_count: number; intersection_findings: { resolution_status: "needs_triage" | "confirmed" | "false_positive" | "accepted_risk"; closure_status: "fixed" | "open" | "waived"; id: string; severity: "error" | "warning" | "info"; artifact: string; location: string; quote: string; issue: string; suggestion: string; resolution_evidence?: string; resolved_at?: number; user_confirmed?: boolean; evidence_type?: "deterministic" | "llm_subjective"; criticality?: "security" | "finance" | "compliance"; fix_verification?: { artifact: string; expected_present?: string; expected_absent?: string; }; fix_action?: "remove"; repair_evidence?: import("../adversarial_review_store.js").RepairEvidence; }[]; repair_plans: RepairPlan[]; is_single_round: boolean; retained_count: number; completed: boolean; deterministic_downgraded: DowngradedDeterministic[]; next_step: string; error?: undefined; mode?: undefined; status?: undefined; retained_findings?: undefined; progress?: undefined; missing_evidence?: undefined; invalid_evidence?: undefined; review_mode?: undefined; artifact_count?: undefined; artifacts?: undefined; references?: undefined; reviewer_session_tokens?: undefined; delivery_evidence_eligible?: undefined; prompt?: undefined; token_diagnostic?: undefined; quote_validation_failed?: undefined; rounds_completed?: undefined; }; } | { result: { success: boolean; action: string; review_id: string; round: number; review_status: string; rounds_completed: number; sample_k: number; round_summary: { errors: number; warnings: number; }; prompt: string; deterministic_downgraded: DowngradedDeterministic[]; next_step: string; error?: undefined; mode?: undefined; status?: undefined; completed?: undefined; intersection_findings?: undefined; retained_findings?: undefined; progress?: undefined; missing_evidence?: undefined; invalid_evidence?: undefined; review_mode?: undefined; artifact_count?: undefined; artifacts?: undefined; references?: undefined; reviewer_session_tokens?: undefined; delivery_evidence_eligible?: undefined; token_diagnostic?: undefined; quote_validation_failed?: undefined; converged?: undefined; convergence_confidence?: undefined; review_depth_sufficient?: undefined; intersection_count?: undefined; repair_plans?: undefined; is_single_round?: undefined; retained_count?: undefined; }; }>; /** Hardening-3.1:re-review 收敛硬上限检查(接线 handler 设置点 → checkConvergenceLimit)。 * current_round = 同 task + mode + artifact_path + !superseded 的 review 数(首次 + re-review,精确计数,排除 superseded)。 * LIMIT_REACHED(current_round >= max_rounds) → 停止 auto re-review;非超限 → 保持现有(设 pending,GAMMA 强制重审)。 */ export declare function checkReReviewLimit(store: AdversarialReviewStore, task: TaskContext, record: AdversarialReviewRecord): Promise<{ limitReached: boolean; currentRound: number; maxRounds: number; }>;