seamless docs

Capture Claude Code plans

How plan mode is captured automatically - which hook does what, a plan's life from draft to approved, and the escape hatches.

Claude Code's plan mode produces exactly the artifact that usually evaporates: a considered design, written down, immediately before the work starts and gone immediately after it. Seamless captures it without you doing anything.

Codex also has a Plan mode, but this automatic artifact capture is Claude-Code-specific. Seamless has no verified Claude-style plan-file and ExitPlanMode surface to capture from Codex; Codex SubagentStart/Stop hooks provide bounded constraints and parent heartbeats, not plan notes. A Codex agent can still compose durable plans explicitly with a plan:<slug> note plus tasks.

The result is a plan composition - narrative, supporting context, and steps - built for you as you plan.

Which hook captures what

Hook Fires when Captures
PostToolUse (Write/Edit/MultiEdit) A plan file is saved Upserts a cc-plan-<basename> note - one note per plan, updated on each iteration
PostToolUse (ExitPlanMode) The plan is approved Creates the tracking task
PermissionRequest (ExitPlanMode) You are asked to review the plan Marks the plan presented
SubagentStop A planning subagent finishes Caches its prompt and report as a cc-agent-<id> note in the same composition

The SubagentStop capture is the one people do not expect and end up valuing: when a plan was informed by four research subagents, their findings are usually lost the moment the planning turn ends. Here they stay attached to the plan, so the agent that executes it can read the research that justified it.

A plan's life

Captured-plan lifecycle
1 · plan modePlan file savedUpserts cc-plan-<name> with plan-status:draft; later saves create iterations.
2 · presentedAwaiting approvalThe briefing names the presented plan.
3a · approvedTracking beginsStatus becomes approved and an implementation task is created.
3b · abandonedClosed deliberatelyAn unapproved plan can be marked abandoned instead of lingering.
A captured plan remains one composition across edits; approval changes its state and opens the execution loop.

The statuses are stored as a plan-status:<value> tag on the note: draft, presented, approved, abandoned.

Why unapproved plans show up in the briefing

A captured-but-unapproved plan appears in briefings as:

PLAN (awaiting approval): seamless-documentation-site -- (presented, 2m)

This is deliberate. A plan that was designed, presented, and then forgotten is the most expensive kind of lost work - the thinking already happened. Surfacing it costs one briefing line and makes the decision explicit: pick it up, or abandon it on purpose.

Unapproved captures are budget-participating, unlike the pinned lines above them: a stale hint should lose to your actual memories, not crowd them out.

The escape hatches

Sometimes Claude Code skips the approval hook, and a plan you did approve stays presented.

seam plan list                  # every captured plan and its status
seam plan show <slug>           # the narrative + its steps
seam plan check <slug>          # staleness: has the repo moved since capture?
seam plan approve <slug>        # force approval + create the tracking task

seam plan check compares the git stamp recorded at capture against the repo now. A plan written against a tree that has since moved on is not automatically wrong, but it is worth re-reading before executing - that is the question this answers.

--cwd picks the repo to check against and defaults to the current directory. It goes on either side of the slug: seam plan check --cwd ~/repos/myproj my-slug and seam plan check my-slug --cwd ~/repos/myproj are the same line. See the seam CLI.

You can also browse everything at /console/plans.

Turning it off

Capture is controlled by the plan_capture block - see Configuration:

  • plan_capture.enabled - capture at all.
  • plan_capture.auto_task - create the tracking task on approval.
  • plan_capture.inject_related - surface related captures in briefings.

All default to on.