Propose a new change - create the change and generate all artifacts in one step.
After explicit review of the proposal/spec/design/tasks package, continue with /corgi-apply.
-
If no clear input provided, ask what they want to build
Use the AskUserQuestion tool (open-ended, no preset options) to ask:
"What change do you want to work on? Describe what you want to build or fix."
From their description, derive a kebab-case name (e.g., "add user authentication" → add-user-auth).
IMPORTANT: Do NOT proceed without understanding what the user wants to build.
-
Check isolation mode and set up worktree (if configured)
Read openspec/config.yaml and check for isolation settings:
isolation:
mode: worktree
root: .worktrees
branch_prefix: feat/
If isolation.mode is worktree:
If isolation.mode is none or isolation section is missing:
- Continue as today — work in the current directory
- Skip the worktree-only closeout step below (Step 9)
-
Check for an existing change directory and issue tracking
Before running openspec new change, check whether openspec/changes/<name>/ already exists.
- If the change exists and has
.github.yaml, announce that GitHub tracking is already configured and skip GitHub issue creation later.
- If the change exists without
.github.yaml, reuse the change directory and allow Step 6 to create issues later.
- If the change does not exist, continue to Step 4.
-
Create or reuse the change directory
openspec new change "<name>"
If the change does not already exist, this creates a scaffolded change at openspec/changes/<name>/ with .openspec.yaml.
If it already exists, reuse the existing change directory instead of creating a new one.
-
Develop: Get the artifact build order and build the artifact package
openspec status --change "<name>" --json
Parse the JSON to get:
applyRequires: array of artifact IDs needed before implementation (e.g., ["tasks"])
artifacts: list of all artifacts with their status and dependencies
-
Create artifacts in sequence until all implementation-required artifacts are complete
Use the TodoWrite tool to track progress through the artifacts.
Loop through artifacts in dependency order (artifacts with no pending dependencies first):
a. For each artifact that is ready (dependencies satisfied):
b. Continue until all applyRequires artifacts are complete
- After creating each artifact, re-run openspec status --change "<name>" --json
- Check if every artifact ID in applyRequires has status: "done" in the artifacts array
- Stop when all applyRequires artifacts are done
c. If an artifact requires user input (unclear context):
- Use AskUserQuestion tool to clarify
- Then continue with creation
The primary output of propose is the completed planning artifact package: proposal -> {spec, design} -> tasks.
-
Closeout: Show final status and prepare handoff state
openspec status --change "<name>"
After the artifacts are complete, prepare the local handoff state that later phases consume. The planning artifact package remains the primary output; tracker setup and worktree metadata are closeout work layered on top of it.
-
Closeout: Create GitHub issues (if gh available and tracking not already configured)
a. Check gh:
gh auth status 2>&1
b. If the change already has .github.yaml, skip issue creation.
c. If gh is available and tracking is not yet configured:
- Read
proposal.md and tasks.md
- Parse each
## N. Group Name heading in tasks.md and its child checkbox items
- Build one parent issue body with:
- Create the parent issue:
gh issue create --title "feat(<scope>): <change-name>" --body "$PARENT_BODY" --label "backlog"
- For each Task Group, build a child issue body using the doc-conv#32 style sections:
**Objectives**
**Todo**
**Estimated Completion Date:** Set when the issue is created
**Conclusion**
**References** with the parent issue and change path
- Create one child issue per Task Group:
gh issue create --title "Group N: <group-name> [<change-name>]" --body "$CHILD_BODY" --label "todo"
- Update the parent issue description so its Task Groups table and Child Issues task list includes the created child issue numbers
gh issue edit <parent_issue_number> --body "$UPDATED_PARENT_BODY"
- Save `.github.yaml` in the change directory with the canonical nested tracking contract:
```yaml
parent:
number: <parent_issue_number>
url: <parent_issue_url>
groups:
- number: 1
name: "Setup"
issue_number: <group_1_issue_number>
url: <group_1_issue_url>
- number: 2
name: "Core"
issue_number: <group_2_issue_number>
url: <group_2_issue_url>
```
Later phases should treat `.github.yaml` as the canonical local tracking state. Read `parent.number` for the parent issue and match `groups[].number` to each Task Group to find `groups[].issue_number` and `url`.
-
Closeout: Save worktree metadata (if isolation mode is worktree)
If worktree isolation is active (from Step 2), write .worktree.yaml in the change directory (openspec/changes/<name>/.worktree.yaml):
path: .worktrees/<name>
branch: feat/<name>
created: <ISO-8601-timestamp>
Also add worktree info to the parent issue. In the parent issue body's References section, include:
- Worktree: `.worktrees/<name>` (branch: `feat/<name>`)
Update the parent issue description:
gh issue edit <parent_issue_number> --body "$UPDATED_PARENT_WITH_WORKTREE"
d. If gh is unavailable:
- Print a warning that GitHub issue creation is being skipped
- Do not block artifact creation or readiness for explicit review
Successful artifact creation means planning and closeout are complete. It does not replace explicit human review of the proposal/spec/design/tasks package before implementation begins.