spec

Mission Control v2 Architecture

2026-03-15

Mission Control v2 Architecture

Executive Summary

Mission Control v2 replaces the current task-board-as-runtime model with a proper operating ledger. First-class records for requests, tasks, runs, checkpoints, artifacts, decisions, evals, and layered memory give agents and Pete a shared, auditable state machine instead of scattered JSON files and chat history. The current app shell, local-first bias, and project/task surfaces are preserved; the state model underneath gets rebuilt.

Bottom line

Mission Control v2 should stop pretending a task board is an agent runtime. The current app is a solid local-first shell, but the source of truth is still basically tasks.json plus UI state. v2 should introduce a real operating ledger with first-class records for requests, tasks, runs, checkpoints, artifacts, decisions, evals, and layered memory.

Keep the current app shell, local-first bias, and project/task surfaces. Rebuild the state model underneath.

What exists today

Current Mission Control is a Next.js local-first app with:

That is useful. It is not yet an agent operating system.

v2 design principles

  1. Conversation is not state
  1. Runs are the runtime primitive
  1. Artifacts are first-class
  1. Checkpointing is policy-driven
  1. Memory is layered
  1. Local-first remains the default

Layer 1: Interaction surfaces

Layer 2: Application services

These can start as simple TypeScript modules behind API routes.

Layer 3: Canonical local stores

Recommended initial layout:

text
mission-control/
  data-v2/
    requests.json
    tasks.json
    runs.json
    checkpoints.json
    artifacts.json
    decisions.json
    evals.json
    memory-entries.json
    timeline-events.json
    views/
      artifact-previews/
      artifact-thumbnails/
      artifact-pdfs/

Each file can use the same lock + atomic replace pattern already used by the task store.

Layer 4: File-backed artifact storage

Recommended initial layout:

text
mission-control/artifacts/
  by-id/
    artifact_xxx/
      source.md
      preview.html
      snapshot.png
      snapshot.pdf
      meta.json

Do not rely on Discord attachments as the only artifact store. Discord is a delivery surface, not the archive.

Core object graph

text
Request
  -> Task[]
Task
  -> Run[]
Run
  -> Checkpoint[]
Run
  -> Artifact[]
Run
  -> Eval[]
Artifact
  -> Decision[]
Decision
  -> Memory write candidates

This is the main change from v1. Projects and kanban lanes become views over these objects, not the backbone.

Runtime flow

1. Intake

A user asks for something in Discord or a cron trigger fires.

Mission Control creates:

2. Dispatch

Vinny assigns a task to Wendy or David.

Mission Control creates:

3. Execution

The agent works.

Mission Control records:

4. Review

If the run needs human judgment or a policy pause, Mission Control opens a checkpoint.

Discord receives a concise summary with buttons or a short answer prompt. Mission Control retains the full evidence set.

5. Completion

On completion, Mission Control stores:

6. After-action

The system may:

Mission Control UI v2

Do not replace the whole product shell. Extend it.

Keep

Add

  1. Requests page
  1. Runs page
  1. Artifacts page
  1. Decisions page
  1. Evals page
  1. Task detail v2

Dashboard changes

The dashboard should answer:

Artifact Review UX, opinionated design

This is the new pain point, so it needs its own concrete answer.

Problem

Long markdown artifacts are miserable in Discord, especially on mobile. Raw .md attachments are not meaningfully reviewable there.

v2 artifact delivery contract

For every artifact above a small threshold, generate four outputs:

  1. source.md or source file
  2. preview.html rendered from markdown
  3. snapshot.png first-page or summary snapshot for quick scan in Discord
  4. snapshot.pdf printable full version for high-fidelity review

Also store a compact artifact-summary-card object with:

Discord delivery pattern

Never dump giant bodies by default.

Standard pattern

  1. Send a short completion summary
  2. Attach or link a visual preview
  3. Offer access paths:

Message format

Chunking rules

Best mobile option

Discord mobile does not reliably render attached markdown. So the best path is:

Rendered markdown on mobile

The practical routes are:

Option A: Local HTML preview page inside Mission Control, best long-term

This is the best answer if local network access is workable.

Option B: Static HTML export saved beside the artifact, good phase 1

Option C: PDF only, acceptable fallback

Mission Control laptop rendering

Mission Control should provide a real document reader, not a textarea pretending to be one.

Artifact detail layout

Left rail:

Main pane:

Right rail:

Required controls

Phase 0: salvage current app shell

Keep:

Do not keep as canonical runtime model:

Phase 1: ship the ledger under the current UI

Add canonical stores and APIs for:

Leave current Tasks and Projects views intact, but start linking tasks to runs and artifacts.

Phase 2: ship artifact review

Add:

Phase 3: replace task board semantics

Tasks become work units with state linked to runs and decisions. The kanban becomes a view over canonical task state, not the record itself.

Memory vs artifact boundary in the data model

Design constraint

Memory and artifacts serve different purposes and must remain separate in the data model, not just by convention.

Storage separation

These are not different views of the same data. They are different record types with different lifecycles:

PropertyMemory entryArtifact
Lifecyclecreated → active → supersededdraft → reviewed → accepted/superseded
Write permissionhigh trust requiredany executing agent
Mutabilityappend-only (new entries supersede old)versioned (new versions, not edits)
Sizesmall (distilled facts)large (full documents, analyses)
Cross-referencedoes not link to artifactsmay reference memory entries
Promotionn/acan produce memory entries on resolution

Promotion workflow

When an artifact leads to a decision or confirmed fact:

  1. The reviewing agent (usually Vinny) creates a new memory entry with the distilled fact.
  2. The memory entry records promoted_from: { artifact_id, run_id } as provenance.
  3. The artifact's status updates to accepted or superseded.
  4. The artifact itself is not modified; the memory entry is the new truth.

Memory entry schema (proposed)

json
{
  "id": "mem_xxx",
  "tier": "preference | operational | decision | curated",
  "content": "Pete prefers light mode for Mission Control",
  "source": {
    "type": "observation | artifact_promotion | direct_input",
    "artifact_id": null,
    "run_id": null,
    "timestamp": "ISO-8601"
  },
  "supersedes": null,
  "created_by": "vinny",
  "created_at": "ISO-8601",
  "confidence": "high | medium",
  "tags": []
}

Implementation note (doc only, not yet built)

This schema and the promotion workflow are spec. Implementation is deferred until the MC v2 ledger phase begins. Current agents follow the classification rule defined in AGENTS.md using existing storage (MEMORY.md, memory/*.md, artifacts/by-id/).

Where the codebase should change first

1. State model refactor start point

Start in mission-control/lib/tasks-store.ts.

Why:

Create parallel stores first, do not mutate the existing task store until the new ledger is proven.

2. Artifact renderer start point

Start from mission-control/components/tasks/TaskMarkdown.tsx, but do not keep it as the long-term renderer.

Why:

3. UI insertion point

The safest first UI addition is a new /artifacts page and simple artifact API route.

Why:

Opinionated recommendation

Do not start with a database migration or a full UI rewrite. Start with a parallel v2 ledger plus artifact rendering. That gives Pete visible value fast and sets the right foundation.

Best next implementation step

Build this exact slice first:

  1. lib/mc2/ types + stores for runs, artifacts, and timeline-events
  2. /api/artifacts and /api/runs
  3. artifact generation contract: source.md, preview.html, snapshot.png, snapshot.pdf
  4. /artifacts page with card list and detail reader
  5. Discord delivery helper that posts summary + preview, not giant markdown

That is the shortest path from current shell to a real agent-ops system.