/** * Mission Governance contracts — C2 * * A MissionRecord governs one software mission: intent → budget → runs → * verification → decision → receipt. It never replaces LoopRecord; it * aggregates above it. * * Invariants: * - One accountable human owner per mission. * - State transitions are append-only in the ledger. * - Ledger is the authority; mission.json is a rebuildable cache. * - A mission cannot become "verified" without verified run evidence. * - A mission cannot become "shipped" without an explicit ship decision. * - Unknown schema versions fail closed. * - Budgets cannot be raised silently. */ export declare const MISSION_SCHEMA_VERSION: "martin.mission.v1"; export declare const MISSION_STATUSES: readonly ["planned", "running", "blocked", "verified", "shipped", "rolled_back", "killed"]; export type MissionStatus = (typeof MISSION_STATUSES)[number]; export declare const ALLOWED_MISSION_TRANSITIONS: Record; export type MissionDecision = "ship" | "retry" | "rollback" | "kill"; export interface MissionBudget { maxUsd: number; maxTokens: number; maxRuns: number; maxConcurrentRuns: number; } export interface MissionCost { /** Sum of actualUsd across all linked runs. */ totalActualUsd: number; /** Number of linked runs with status "completed" (verified outcome). */ verifiedOutcomeCount: number; /** Number of linked runs regardless of outcome. */ totalRunCount: number; } export type MissionRunRole = "primary" | "experiment" | "validation"; export interface MissionRunLink { loopId: string; role: MissionRunRole; attachedAt: string; /** Set to true when the linked run completed with verification passed. */ verifiedOutcome?: boolean; /** Actual cost of this run in USD. */ actualUsd?: number; } export interface MissionApproval { approvalId: string; kind: "ship" | "budget_increase" | "scope_change"; decision: "approved" | "denied"; approvedBy: string; approvedAt: string; note?: string; } export interface MissionOutcome { decision: MissionDecision; decidedAt: string; decidedBy: string; note?: string; } export type MissionEventKind = "mission.created" | "mission.status_changed" | "mission.run_attached" | "mission.run_verified" | "mission.approved" | "mission.closed" | "mission.collision_blocked"; export interface MissionEvent { eventId: string; kind: MissionEventKind; missionId: string; timestamp: string; payload: Record; } export interface MissionRecord { schemaVersion: typeof MISSION_SCHEMA_VERSION; missionId: string; /** Monotonically increasing write counter. Used for CAS enforcement. */ revision: number; title: string; objective: string; ownerId: string; workspaceId: string; projectId: string; status: MissionStatus; budget: MissionBudget; cost: MissionCost; runLinks: MissionRunLink[]; approvals: MissionApproval[]; outcome?: MissionOutcome; acceptanceCriteria: string[]; createdAt: string; updatedAt: string; } export interface MissionDraft { missionId?: string; title: string; objective: string; ownerId: string; workspaceId: string; projectId: string; budget: MissionBudget; acceptanceCriteria?: string[]; } export declare function createMissionRecord(draft: MissionDraft, options?: { now?: () => string; idFactory?: (prefix: string) => string; }): MissionRecord; export declare function isMissionTransitionAllowed(from: MissionStatus, to: MissionStatus): boolean;