Skip to main content
Planning commands add milestones or features to feature_list.json. They use compare-and-swap writes and reject duplicate IDs. Interactive commands perform their documented input checks; the full schema and structural preflight applies specifically to new-feature --input.

new-feature

Create a feature interactively or import one from a JSON file in the repository.
The input can be a feature object directly or { "feature": { ... } }. id, milestone, behavior, and a non-empty verification array are required. The milestone must already exist. A new feature can only have the not_started status and cannot include a preconfigured claim, workspace, or evidence. Before writing, this mode runs [schema], [structural], [dependency-cycles], [milestone-order], and [stage-gate] checks against the candidate feature list. See the feature_list.json reference for the full field definitions. Without --input, the command prompts for the ID, milestone, title, observable behavior, owner, verification commands, dependencies, source references, and priority. Priority must be an integer. Lower values are selected first by claim --next.

new-milestone

Create a milestone interactively.
This command has no CLI arguments. It prompts for the milestone ID, title, and objective. The ID must be unique. On success, it appends the milestone to feature_list.json.

milestone archive

Move a completed milestone, and every feature in it, out of feature_list.json into .harness/archive/<milestone-id>.json.
Every feature in the milestone must already be passing; the command refuses and lists the blocking features otherwise, without changing anything. The archive file is written before the milestone is removed from feature_list.json, so an interrupted run can leave a duplicate archive record but never loses the milestone’s data. Archived features are not deleted from the project’s history — they still satisfy dependencies for new features (claim, feature start, dependency-cycles), and traceability still counts them as covering their requirements, stories, and acceptance criteria. Archiving only relocates completed work so a new milestone starts from a lean feature_list.json; it never invalidates what already shipped. See Archiving milestones for the archive file’s shape.

milestone list-archived

List archived milestones.
This command has no arguments and does not modify the repository. It prints a JSON array with each archived milestone’s id, title, feature count, and archived_at/archived_by.