Conflux Rejection / Blocked Change Guide
Operator-facing guidance for deciding what to do with a change after it entered rejecting review or produced REJECTED.md.
Core Decision
Normalize the situation into one of these outcomes:
CONFIRM: close the change as terminal rejection
BLOCK: keep the change valid but paused until prerequisites are unblocked
RESUME: dismiss the rejection proposal and return to apply
If the user says "rejected gated" or similar, usually treat it as ambiguity between a rejection proposal and a blocked hold.
Read references/guide.md when you need fuller classification examples.
Inspect First
Use repository evidence, not guesses.
Recommended commands:
cflx openspec show <change-id>
cflx openspec validate <change-id> --strict
git status --short
Read when present:
openspec/changes/<change-id>/proposal.md
- the change's task file named by
tasks_path: openspec/changes/<change-id>/tasks.md or versioned openspec/changes/<change-id>/tasks.json. A change entry owns exactly one of them; never create the other filename, because two task files in one entry is an ambiguity error that fails closed.
openspec/changes/<change-id>/REJECTED.md
Decision Rules
Choose CONFIRM when
REJECTED.md gives a concrete closure reason
- the task file's blocker evidence is specific and actionable
- recovery would require changing the proposal premise itself
- another change has made this one obsolete
Choose BLOCK when
- the change remains valid
- the blocker is real and concrete
- immediate retry would likely fail again
- recovery depends on information, dependency, environment, or spec follow-up
Choose RESUME when
- the rejection proposal is under-evidenced
- there is a plausible in-repo recovery path
- the change should continue now rather than wait
Recommended Next Action
CONFIRM: keep the durable rejection record and treat the change as closed
BLOCK: keep the change alive, make unblock/recovery work explicit in the change's task file, in that file's own format
RESUME: remove worktree-local REJECTED.md, append recovery work to the change's task file, in that file's own format, return to apply
Default Recovery Workflow for Rejected Changes
When the user wants to handle a rejected change, prefer repairing the existing change instead of creating a replacement change. A REJECTED.md file is a review artifact and recovery signal, not automatic proof that the change should be abandoned.
Use this sequence by default:
- Re-review the rejected change:
- Read
openspec/changes/<change-id>/REJECTED.md.
- Read
proposal.md, the change's task file (tasks.md or versioned tasks.json), design.md if present, and relevant spec deltas.
- Run
cflx openspec show <change-id> and cflx openspec validate <change-id> --strict when available.
- Analyze the rejection cause:
- Identify whether the blocker is a real terminal mismatch, missing implementation work, incomplete tests, environment failure, or agent mistake.
- Cite concrete files, commands, or task entries rather than relying on the rejection summary alone.
- Repair the existing change:
- Update implementation, tests, specs, or the change's task file in the same
openspec/changes/<change-id>/ scope as needed.
- Add or update recovery tasks in that same task file, in its own format — an unchecked
- [ ] line in tasks.md, a task object with "status": "pending" in tasks.json — so the reason for resuming is durable.
- Remove
REJECTED.md only after the repair path is understood and the change is ready to continue.
- Verify:
- Re-run strict OpenSpec validation.
- Run the targeted tests or checks relevant to the repaired cause.
- Commit the repair if the workflow or user explicitly asks for a commit; otherwise leave the repaired worktree ready for review.
Do not create a new change merely because the current change has REJECTED.md. Create a new change only when analysis shows the original proposal premise is obsolete, the required scope is materially different, or the user explicitly asks to abandon the original change.
Response Format
Structure guidance as:
Observed state
Interpretation
Recommended disposition
Next action
Output Quality Bar
- Cite concrete repository evidence when available.
- Prefer
Blocked over Rejected for temporary, resumable blockers.
- Prefer
Rejected only when closure is genuinely correct.
- If evidence is insufficient, say what must be checked next.
1---2name: cflx-rejection-guide3description: Guide users through handling Conflux/OpenSpec changes that ended in `REJECTED.md`, `Rejected`, `Blocked`, `Rejecting`, or informal states like "rejected gated". Use whenever the user asks what to do with a rejected proposal, how to recover a blocked change, how to interpret rejecting review outcomes, or how to choose between closing, blocking, and resuming a change.4---56# Conflux Rejection / Blocked Change Guide78Operator-facing guidance for deciding what to do with a change after it entered rejecting review or produced `REJECTED.md`.910## Core Decision1112Normalize the situation into one of these outcomes:1314- `CONFIRM`: close the change as terminal rejection15- `BLOCK`: keep the change valid but paused until prerequisites are unblocked16- `RESUME`: dismiss the rejection proposal and return to apply1718If the user says "rejected gated" or similar, usually treat it as ambiguity between a rejection proposal and a blocked hold.1920Read `references/guide.md` when you need fuller classification examples.2122## Inspect First2324Use repository evidence, not guesses.2526Recommended commands:2728```bash29cflx openspec show <change-id>30cflx openspec validate <change-id> --strict31git status --short32```3334Read when present:3536- `openspec/changes/<change-id>/proposal.md`37- the change's task file named by `tasks_path`: `openspec/changes/<change-id>/tasks.md` or versioned `openspec/changes/<change-id>/tasks.json`. A change entry owns exactly one of them; never create the other filename, because two task files in one entry is an ambiguity error that fails closed.38- `openspec/changes/<change-id>/REJECTED.md`3940## Decision Rules4142### Choose `CONFIRM` when4344- `REJECTED.md` gives a concrete closure reason45- the task file's blocker evidence is specific and actionable46- recovery would require changing the proposal premise itself47- another change has made this one obsolete4849### Choose `BLOCK` when5051- the change remains valid52- the blocker is real and concrete53- immediate retry would likely fail again54- recovery depends on information, dependency, environment, or spec follow-up5556### Choose `RESUME` when5758- the rejection proposal is under-evidenced59- there is a plausible in-repo recovery path60- the change should continue now rather than wait6162## Recommended Next Action6364- `CONFIRM`: keep the durable rejection record and treat the change as closed65- `BLOCK`: keep the change alive, make unblock/recovery work explicit in the change's task file, in that file's own format66- `RESUME`: remove worktree-local `REJECTED.md`, append recovery work to the change's task file, in that file's own format, return to apply6768## Default Recovery Workflow for Rejected Changes6970When the user wants to handle a rejected change, prefer repairing the existing change instead of creating a replacement change. A `REJECTED.md` file is a review artifact and recovery signal, not automatic proof that the change should be abandoned.7172Use this sequence by default:73741. Re-review the rejected change:75 - Read `openspec/changes/<change-id>/REJECTED.md`.76 - Read `proposal.md`, the change's task file (`tasks.md` or versioned `tasks.json`), `design.md` if present, and relevant spec deltas.77 - Run `cflx openspec show <change-id>` and `cflx openspec validate <change-id> --strict` when available.782. Analyze the rejection cause:79 - Identify whether the blocker is a real terminal mismatch, missing implementation work, incomplete tests, environment failure, or agent mistake.80 - Cite concrete files, commands, or task entries rather than relying on the rejection summary alone.813. Repair the existing change:82 - Update implementation, tests, specs, or the change's task file in the same `openspec/changes/<change-id>/` scope as needed.83 - Add or update recovery tasks in that same task file, in its own format — an unchecked `- [ ]` line in `tasks.md`, a task object with `"status": "pending"` in `tasks.json` — so the reason for resuming is durable.844. Remove `REJECTED.md` only after the repair path is understood and the change is ready to continue.855. Verify:86 - Re-run strict OpenSpec validation.87 - Run the targeted tests or checks relevant to the repaired cause.886. Commit the repair if the workflow or user explicitly asks for a commit; otherwise leave the repaired worktree ready for review.8990Do not create a new change merely because the current change has `REJECTED.md`. Create a new change only when analysis shows the original proposal premise is obsolete, the required scope is materially different, or the user explicitly asks to abandon the original change.9192## Response Format9394Structure guidance as:95961. `Observed state`972. `Interpretation`983. `Recommended disposition`994. `Next action`100101## Output Quality Bar102103- Cite concrete repository evidence when available.104- Prefer `Blocked` over `Rejected` for temporary, resumable blockers.105- Prefer `Rejected` only when closure is genuinely correct.106- If evidence is insufficient, say what must be checked next.