aboutsummaryrefslogtreecommitdiff
path: root/.ai/workflows/spec-create.org
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-06-12 19:33:12 -0500
committerCraig Jennings <c@cjennings.net>2026-06-12 19:33:12 -0500
commit22edacfd03de68eabd96d9aaa98a4dd5693535a6 (patch)
tree242b67435ea9965e23728ad5a9ba73180dac0257 /.ai/workflows/spec-create.org
parentf058b4c15a67ce3b54e306e8b4778aa3cb540c7c (diff)
downloadrulesets-22edacfd03de68eabd96d9aaa98a4dd5693535a6.tar.gz
rulesets-22edacfd03de68eabd96d9aaa98a4dd5693535a6.zip
feat(workflows): SUPERSEDED/CANCELLED decision states + old-model gate
A superseded decision now flips to SUPERSEDED (linking its replacement) and a moot one to CANCELLED. Both are done-class via a #+TODO: header the spec template auto-adds, so the [/] cookie counts them resolved and neither blocks implementation-ready. The TODO/DONE pair alone had lost the old State: field's superseded value. spec-review's gate and Ready rubric now read "no decision is still TODO", and a spec still on the retired State: field model fails the gate item until converted. The gate as first written would have vacuously passed old specs, which have no decision tasks at all.
Diffstat (limited to '.ai/workflows/spec-create.org')
-rw-r--r--.ai/workflows/spec-create.org5
1 files changed, 3 insertions, 2 deletions
diff --git a/.ai/workflows/spec-create.org b/.ai/workflows/spec-create.org
index daf56f7..f90c511 100644
--- a/.ai/workflows/spec-create.org
+++ b/.ai/workflows/spec-create.org
@@ -53,7 +53,7 @@ Capture, in this order:
- =Context:= the forces motivating the choice
- =Decision:= the call, stated actively ("We will…")
- =Consequences:= what gets easier *and* what gets harder (both halves — a decision with only upsides is under-examined)
- An *open* decision is a =TODO= task with an *owner* and a *by-when*; agreeing flips it to =DONE=. If the decision-maker doesn't agree, it stays =TODO= and the back-and-forth continues under a =*** Discussion= child header — never overwrite the decision body to win an argument. Put a =[/]= statistics cookie on the =* Decisions= heading so the resolved tally is visible at a glance. To revisit a =DONE= decision, either reopen it to =TODO= (carrying the new dispute in its =*** Discussion= thread, prior text preserved) or write a fresh decision that supersedes it; don't silently rewrite the old one. Keep decisions inline here; promote to a standalone numbered ADR only when a decision outlives or spans beyond this one spec. (The per-decision =TODO/DONE= is distinct from the spec-wide =Status= in the metadata header — see the implementation-ready gate in Phase 6.)
+ An *open* decision is a =TODO= task with an *owner* and a *by-when*; agreeing flips it to =DONE=. If the decision-maker doesn't agree, it stays =TODO= and the back-and-forth continues under a =*** Discussion= child header — never overwrite the decision body to win an argument. Put a =[/]= statistics cookie on the =* Decisions= heading so the resolved tally is visible at a glance. To revisit a =DONE= decision: reopen it to =TODO= (new dispute in its =*** Discussion= thread, prior text preserved) when the same decision is being re-argued; flip it to =SUPERSEDED= with a link to the replacing decision when a fresh decision takes its place; flip it to =CANCELLED= with a one-line reason when scope changes make it moot. All three keep the original body intact — never silently rewrite a resolved decision. =SUPERSEDED= and =CANCELLED= are done-class (the =#+TODO:= header in the template defines them), so they count as resolved in the =[/]= cookie and don't block the gate. Keep decisions inline here; promote to a standalone numbered ADR only when a decision outlives or spans beyond this one spec. (The per-decision =TODO/DONE= is distinct from the spec-wide =Status= in the metadata header — see the implementation-ready gate in Phase 6.)
** Phase 3 — Make it buildable
@@ -90,7 +90,7 @@ This is where the spec earns a "Ready" from review: an engineer must be able to
** Phase 6 — Hand-off readiness
Self-assess against =spec-review='s rubric before handing off, so the review starts from a clean spec instead of catching basics:
-- *Decisions:* every decision is =DONE= (the =[/]= cookie reads complete), or the author *consciously accepts* the risk of building with one still =TODO= (recorded). *Implementation-ready gate:* the spec Status cannot move past =draft= to an implementation-ready state while any decision is still =TODO=.
+- *Decisions:* no decision is still =TODO= (the =[/]= cookie reads complete), or the author *consciously accepts* the risk of building with one open (recorded). =SUPERSEDED= and =CANCELLED= count as resolved. *Implementation-ready gate:* the spec Status cannot move past =draft= to an implementation-ready state while any decision is still =TODO=.
- *APIs:* every external API assumption is verified or listed as a research prerequisite — otherwise the honest verdict is =Needs research=.
- *Self-rubric:* Ready / Ready with caveats / Not ready / Needs research. If it isn't at least =Ready with caveats=, keep drafting.
- *Defer:* log open decisions and vNext items to =todo.org= (v1 work =[#B]=, vNext/someday =[#D]=) — don't leave them only in the spec.
@@ -103,6 +103,7 @@ Then it's ready for =spec-review.org=. Snapshot-vs-living rule: keep the spec li
,#+TITLE: <Feature> — Spec
,#+AUTHOR: <author>
,#+DATE: <YYYY-MM-DD>
+,#+TODO: TODO | DONE SUPERSEDED CANCELLED
,* Metadata
| Status | draft |