Panout review packOverviewFinal memoMVPLive outputsJudge roundsAppendicesDecisions

Source: docs/research/2026-09-03-defensibility/MVP-GOAL-PROMPT.md

Panout MVP goal prompt

Paste everything below the line into a fresh Claude Code or Codex session opened at /code/research/panout. It is written to be executed cold.


Goal

Build the Panout MVP: a local, metadata-only commit-boundary tool that (1) runs a small set of contracts against each commit, prints only failures, and (2) records every override (a human committing past a failing contract) and every evaluation as a hash-chained event with a stable work ID written into the commit itself, so that 30 days later the outcome (reworked or not) can be joined back to the evaluation. Ship it in the founder's own repos within 48 hours. The only clock that matters starts when the first captured commit lands; nothing else in this brief is allowed to delay it.

One-liner for orientation: Panout is the record of what your team stopped reading.

Read first

Invariants (violating any of these is a failed MVP)

  1. Panout never controls, blocks, or orchestrates agents and never sits in the live agent loop.
  2. The human never has to log in anywhere. Repo plus terminal only. No cloud, no account.
  3. Metadata only. Never store prompt text, assistant text, file contents, diff bodies, command bodies, or identity fields. Paths, counts, hashes, timestamps, contract names, results, and pseudonymous IDs are allowed. The existing salted-hash pattern applies.
  4. Zero new habits. The hook installs once, runs on commits the user already makes, and is silent when every contract passes. A commit after a printed failure is an override and is recorded as one; it is never blocked (--no-verify is never required).
  5. Python 3.10+ standard library only, as in the prototype. Linux and macOS.

Decisions already made (do not reopen)

Scope: what to build

1. panout init (extend the existing command)

2. Contracts

A contract is a named, deterministic check over the staged diff and the working tree that returns pass, fail, or skip, plus a one-line reason with no file contents. Ship these built in:

Contracts must run in under 2 seconds total on a typical commit or be skipped with a reason.

3. Event capture at commit time

Extend the ledger event schema (bump to panout.event.v1, keep v0 readable) with: evaluation events: work ID, commit SHA, timestamp, per-contract result, override flag (true when any contract failed and the commit proceeded), harness and model if present in trailers, agent flag, path-class histogram of staged files (counts only), lines added and deleted, files changed, commits in the last 60 minutes on this branch, and, if a supported session surface is readable, session-shape metadata only (tool call count, error count, duration). Reuse the record-claude allow-list approach for session data; never read transcripts beyond counts.

4. panout status (rename or extend brief)

Terminal only. Prints: contracts installed, evaluations recorded (total and last 7 days), overrides per contract, and the exposure rate (share of commits with at least one non-skip result) against the 30% target. Prints nothing else. Must run in under one second.

5. panout audit (the day-one artifact)

Prints a table of agent-attributed commits in the last N days with: SHA, date, contracts and results, override yes/no, and, for commits older than 30 days, whether any added line was changed or deleted within 30 days (reuse the reverse-blame method in docs/research/2026-09-03-defensibility/scripts/measure.py, with -w -M -C). Label the rework column as a proxy in the header. Support --json. This is the audit trail of auto-approved agent work; it is the thing a buyer receives on day one.

6. panout inject (fault injection, minimum viable)

Off the hot path, on a scratch worktree only: take the last K accepted agent commits, apply one of three injected faults (delete a test assertion, introduce an obvious secret-shaped string, remove a staged test file from a source-touching change), run the contracts, and record per contract: injected faults presented, caught, missed. Print catch rate per contract with n. Never touch the real working tree or index. This is the only mechanism that may later grant a level; the MVP only measures and prints.

7. panout verify (keep) and panout uninstall

Uninstall removes the hook shims (restoring any chained hooks) and leaves .panout/ in place unless --purge.

Out of scope for the MVP (do not build)

Autonomy levels or auto-merge, cloud sync, any dashboard or web UI, Linear or GitHub API integration, routing or model recommendation, the .agents/ standard, decisions/ drafting, billing, Codex adapters beyond reading trailers, any LLM call.

Acceptance criteria

Working rules

First hour

  1. Read the files listed above.
  2. Add hook, status, audit, inject, uninstall subcommands as stubs; extend init.
  3. Implement the Panout-Work trailer and evaluation event with the size-guard contract.
  4. Run panout init in this repo and make one real commit. That commit is the start of the 30-day clock; everything after it is iteration.