Skip to main content
Classic uses files to preserve workflow state. Comet writes each change’s stage, execution mode, and verification result into repository files. Every call to /comet re-reads those files instead of relying on the previous conversation. If you know which files to check and which commands to run, you can quickly judge progress and resume safely after an interruption. Project-level configuration (.comet/config.yaml) is covered in Classic configuration. The rest of this page uses <classic-root> for the current Classic OpenSpec root directory: docs/openspec/ by default for new projects, and openspec/ for projects that keep the legacy layout. The actual location is decided by classic.artifact_layout; see Project file structure.
Do not hand-edit state files: state guards fail closed. In other words, when state is not trustworthy, Comet refuses to continue. Hand-editing fields usually does not “unlock” the flow. It often stalls the task or sends it down the wrong directory:
  • .comet.yaml’s phase advances only through a guard or a valid transition; a direct comet state set <name> phase <value> is hard-rejected.
  • Do not hand-edit machine-owned fields such as .comet/run-state.json, and do not mark an already-archived change complete by hand (archiving goes through /comet-archive).
  • If state is abnormal, first follow State damage and recovery; do not fabricate state by hand.
This page has three parts. The complete field reference is in the appendix:
  • How to check current progress: where state files live and which fields to check first.
  • Which settings require your confirmation: what you select at workflow checkpoints and what Comet maintains automatically.
  • How to troubleshoot abnormal states: transition history, run-state boundaries, and diagnostic command entries.

How to check current progress

To answer “where are we and what is left”, the normal path is to call /comet again (see Resuming interrupted work); to check by hand, run comet status. Both re-read the state files on disk; neither guesses from conversation history.

State lives in three files

Little Fish labels the three state drawers: .comet.yaml, run-state, and project configuration

.comet.yaml tells you where the change is, Run state lets the runtime recover, and state events explain why the state changed

Which fields quickly tell you progress

comet status and /comet resume routing mainly use the fields below. Full types and allowed values are in the appendix. branch_status: handled only means you confirmed an immediate push or push-with-PR before archive and it was written back when archiving completed; it does not mean the push or PR succeeded.

With several changes in parallel, pick the target first

.comet/current-change.json stores the workflow and change you explicitly selected, removing write ambiguity when multiple active changes run in parallel. It does not replace .comet.yaml.
  • With a single active change, attribution can be automatic.
  • With several active changes, you must explicitly select after entering the target change.
  • When the target is archived, the selection file is damaged, or the workflow does not match, the guard fails closed (it refuses to run rather than continue on bad state).
  • When isolation is current, branch, or worktree, the change is also pinned through bound_branch to the branch where the isolation was set up. On drift, switch back to the original branch; run comet state rebind <change-name> only after you explicitly confirm that the current branch should take over the change.
  • Do not hand-edit current-change.json.
For the full commands on selecting and judging, see comet state.

Which settings require your confirmation

Fields in .comet.yaml can be grouped into two types: settings you confirm at workflow checkpoints, and runtime records maintained automatically by Comet. Do not hand-edit auto-maintained fields (see the next section).

Choices you make at workflow checkpoints

Most of these fields are copied from project defaults when a change is created. If you skip a choice, the guard blocks before stage exit and routes you back to the correct decision point. You do not need to edit files manually. Recovery for missing isolation, build_mode, or tdd_mode in build is covered in Resuming interrupted work.

What is checked before moving to the next stage

These constraints exist in both guard layers, comet guard and comet state transition:
A direct comet state set <name> phase <value> is hard-blocked unless COMET_FORCE_PHASE=1 is set (repair only). Phases advance only through comet guard —apply or a valid transition.
COMET_FORCE_PHASE is a troubleshooting-only switch; normal flows never need it. For the other environment variables, see Classic configuration.

Preset escalation goes through a valid transition only

When a hotfix/tweak hits an escalation signal (cross-module, new API, schema change, and so on), the preset-escalate transition upgrades it to full:
  • It sets workflow/classic_profile to full in one go, rolls phase back to design, and clears design_doc.
  • This is the only legal channel from preset to full — a direct set phase design is hard-blocked, and classic_profile is machine-owned, so set classic_profile is hard-blocked too.

Fields maintained by the system

These fields are written by Comet to record runtime facts. You do not need to set them manually, and you should not force them with comet state set. Common examples:
  • bound_branch: records which branch this change is bound to, so execution does not continue on the wrong branch.
  • verify_failures: the consecutive verification-failure count. verify-fail increments it, and verify-pass or archive-reopen resets it to 0. After it reaches 3, the next failure pauses and asks you to choose a retry-limit strategy.
  • archive_confirmation: Comet writes pending after verify passes; it becomes confirmed only after your confirmation before archive.
  • currentStep, pending, artifacts, and trajectory in .comet/run-state.json: written automatically by the Engine runtime.
If these fields are edited manually, state can diverge from actual code and verification history. The guard will either refuse to continue or route you into recovery handling. Archiving should always go through /comet-archive.

How to troubleshoot abnormal states

First distinguish two situations: interruption (session closed, context compressed, device switched) and state anomaly. For interruption, call /comet to resume. Use comet status and comet doctor only when .comet.yaml is missing or malformed, routing is wrong, or declared evidence is missing. The complete flow is in State damage and recovery.

Check state transition history

Classic state transitions share one set of semantics. Every successful comet state transition, comet guard --apply, and archive update appends one JSON line to:
Each record contains: Look here when you want to know why phase changed or what the last transition did. For the available transition events and commands, see comet state and Auto-transition.

Distinguish workflow state and runtime details

.comet.yaml holds the user-understandable workflow state. Engine execution details live in .comet/run-state.json. The two are linked by run_id. See Skill and Engine (Advanced) for details.

Common diagnostic commands

Engine-level details (currentStep, pending, trajectory) are usually only needed during troubleshooting. Start with these two commands:
  • comet status — shows an active change’s phase, verification result, whether the declared evidence actually exists on disk (runtime_eval), and a hint about the next step.
  • comet doctor — checks the installation, environment, Skill integrity, and whether each change’s .comet.yaml is valid.
The detailed usage of both commands and common symptoms are in State damage and recovery.

Appendix: .comet.yaml field reference

Every active change includes the fields below in .comet.yaml. The body explains which fields you confirm and which are system-maintained. The tables here are for quick lookup of value ranges and meanings.

Workflow and stage

Execution mode

Verification and branch

Path references

Time and archive

Continue reading

Last modified on September 4, 2026