import type { GoalCompletionProposal, ValidatedGoalCompletionProposal } from "../core/proposal.js"; import type { GoalTodoCompletionDiagnostics } from "../core/completion.js"; import type { GoalTodoAutoAcceptDimension, GoalTodoClaimValidationLike } from "../core/claims.js"; export declare const ORACLE_VERSION = 1; export type OracleVerdict = "PASS" | "WARN" | "FAIL"; /** zob runtime goal status vocabulary the freshness gates operate over. */ export type OracleGoalStatus = "active" | "ready_for_oracle" | "oracle_failed" | "paused" | "blocked" | "budget_limited" | "complete"; /** * Minimal goal snapshot freshness needs: identity (goalId), lineage root * (revision), lifecycle (status), and the stored completion proposal. The * Phase 4 runtime goal satisfies this structurally. */ export interface OracleGoalSnapshot { readonly goalId: string; readonly revision: number; readonly status: OracleGoalStatus; readonly completionProposal?: GoalCompletionProposal; } /** Oracle review result injected into buildOracleDecision (reviewedAt injected, D-O7). */ export interface OracleReviewInput { readonly goalRevision: number; readonly verdict: OracleVerdict; readonly noShip: boolean; readonly evidenceSummary: string; readonly evidenceRefs: readonly string[]; readonly reviewedAt: string; } export interface OracleDecision { readonly oracleVersion: 1; readonly oracleDecisionHash: string; readonly proposalHash: string; readonly proposalGoalRevision: number; readonly todoGraphRevision: number; readonly goalRevision: number; readonly verdict: OracleVerdict; readonly noShip: boolean; readonly evidenceHash: string; readonly evidenceCount: number; readonly reviewedAt: string; readonly bodyStored: false; } /** Body-free decision shape the canonical hash runs over. */ export type OracleDecisionHashBody = Omit; /** zob parity: sha256 over JSON [evidenceSummary, ...evidenceRefs]. */ export declare function hashOracleEvidence(evidenceSummary: string, evidenceRefs: readonly string[]): string; export declare function hashOracleDecision(decision: OracleDecisionHashBody): string; export type OracleDecisionValidationCode = "not_a_record" | "missing_fields" | "unexpected_fields" | "invalid_oracle_version" | "invalid_decision_hash" | "invalid_proposal_hash" | "invalid_evidence_hash" | "invalid_revision" | "invalid_evidence_count" | "invalid_verdict" | "invalid_no_ship" | "invalid_reviewed_at" | "invalid_body_stored" | "decision_hash_mismatch"; export type OracleDecisionValidation = { readonly valid: true; readonly decision: OracleDecision; } | { readonly valid: false; readonly code: OracleDecisionValidationCode; readonly message: string; }; /** * Strict single-schema validator: exact 12-key record, oracleVersion 1, * bodyStored false, exact full sha256 hashes, safe-integer revisions * (proposalGoalRevision >= 1, todoGraphRevision >= 0, goalRevision >= 1, * evidenceCount >= 1), verdict enum, boolean noShip, parseable ISO * reviewedAt, and a decisionHash recompute as the final gate (D-O6). */ export declare function validateOracleDecision(value: unknown): OracleDecisionValidation; /** * Bind an oracle decision to an ALREADY-VALIDATED proposal. The proposal is * re-validated at runtime (exact hashes + recompute-verify) so even JS * callers cannot smuggle a tampered proposal past the type brand. Gates: * safe-integer goalRevision >= 1, verdict enum, boolean noShip, string * evidence summary + refs, injected ISO reviewedAt (D-O7). The decision * inherits proposalHash / proposalGoalRevision / todoGraphRevision from the * proposal exactly; evidenceCount = evidenceRefs.length + 1 (the summary * counts, zob parity). */ export declare function buildOracleDecision(proposal: ValidatedGoalCompletionProposal, review: OracleReviewInput): OracleDecision; export type SafeReproposeAction = "resolve_goal_todos_then_propose_goal_completion" | "propose_goal_completion" | "resume_goal_then_propose_goal_completion"; export type SafeOracleNextAction = "none" | "resolve_goal_todos_then_propose_goal_completion" | "record_goal_oracle" | "propose_goal_completion_then_record_goal_oracle" | "resume_goal_then_propose_goal_completion"; /** * Proposal freshness codes (zob inventory minus legacy/restore): * proposal_missing, malformed_snapshot, goal_identity_mismatch, * proposal_hash_mismatch, proposal_goal_revision_not_in_lineage, * todo_graph_revision_mismatch, completion_diagnostics_no_ship, * completion_diagnostics_not_ready, goal_status_not_oracle_ready, fresh. */ export type GoalCompletionProposalFreshnessCode = "fresh" | "proposal_missing" | "malformed_snapshot" | "goal_identity_mismatch" | "proposal_hash_mismatch" | "proposal_goal_revision_not_in_lineage" | "todo_graph_revision_mismatch" | "completion_diagnostics_no_ship" | "completion_diagnostics_not_ready" | "goal_status_not_oracle_ready"; export interface GoalCompletionProposalFreshness { readonly status: "fresh" | "stale"; readonly code: GoalCompletionProposalFreshnessCode; readonly currentGoalRevision?: number; readonly currentTodoGraphRevision: number; readonly proposalHash?: string; readonly proposalGoalRevision?: number; readonly proposalTodoGraphRevision?: number; readonly safeReproposeAction: SafeReproposeAction; } /** * Oracle freshness codes (zob inventory minus legacy/restore): * oracle_binding_missing, malformed_snapshot, oracle_decision_hash_mismatch, * proposal_binding_mismatch, proposal_goal_revision_mismatch, * todo_graph_revision_mismatch, root_revision_mismatch, * oracle_verdict_not_pass, oracle_no_ship, completion_diagnostics_no_ship, * completion_diagnostics_not_ready, goal_status_not_oracle_ready, fresh. */ export type GoalOracleFreshnessCode = "fresh" | "oracle_binding_missing" | "malformed_snapshot" | "oracle_decision_hash_mismatch" | "proposal_binding_mismatch" | "proposal_goal_revision_mismatch" | "todo_graph_revision_mismatch" | "root_revision_mismatch" | "oracle_verdict_not_pass" | "oracle_no_ship" | "completion_diagnostics_no_ship" | "completion_diagnostics_not_ready" | "goal_status_not_oracle_ready"; export interface GoalOracleFreshness { readonly status: "fresh" | "stale" | "missing"; readonly code: GoalOracleFreshnessCode; readonly currentGoalRevision?: number; readonly currentTodoGraphRevision: number; readonly oracleDecisionHash?: string; readonly proposalHash?: string; readonly proposalGoalRevision?: number; readonly decisionTodoGraphRevision?: number; readonly oracleGoalRevision?: number; readonly safeNextAction: SafeOracleNextAction; } /** * Is the goal's stored completion proposal still fresh? zob gate order: * presence → strict validation (structural junk → malformed_snapshot, hash * tamper → proposal_hash_mismatch) → identity → lineage → todo graph → * completion diagnostics → goal status. */ export declare function evaluateProposalFreshness(goal: OracleGoalSnapshot | undefined, todoGraphRevision: number, completionDiagnostics: GoalTodoCompletionDiagnostics): GoalCompletionProposalFreshness; /** * Is the oracle decision still fresh against the goal, its stored proposal, * the current todo graph, and the completion diagnostics? zob gate order: * presence → strict validation → decision hash recompute → proposal binding * → revision bindings → root revision (complete+1 rule, D-O4) → verdict → * noShip → diagnostics → goal status. */ export declare function evaluateOracleFreshness(goal: OracleGoalSnapshot | undefined, decision: OracleDecision | undefined, todoGraphRevision: number, completionDiagnostics: GoalTodoCompletionDiagnostics): GoalOracleFreshness; /** * Strict oracle PASS gate: the decision strictly validates (schema + hash * recompute) AND is verdict PASS with noShip false. WARN/FAIL/noShip/invalid * decisions all return false. */ export declare function isStrictPassOracleDecision(value: unknown): boolean; export interface OracleClaimAutoAcceptComposition { readonly autoAccept: boolean; readonly outcome: "accept" | "needs_review"; /** Failing 2d claim dimensions (empty when the claim rule accepts). */ readonly failures: readonly GoalTodoAutoAcceptDimension[]; /** Whether the oracle side of the composition is a strict PASS. */ readonly oracleStrictPass: boolean; } /** * Auto-accept routing for delegated claims behind an oracle decision: the * 2d isStrictPassAutoAccept claim rule AND the strict oracle PASS gate must * BOTH accept. Either side weakening routes to parent review * (needs_review); the claim failures explain the claim-side downgrade and * oracleStrictPass explains the oracle-side one. */ export declare function composeOracleClaimAutoAccept(decision: unknown, claimValidation: GoalTodoClaimValidationLike): OracleClaimAutoAcceptComposition;