@pilotspace/add 1.6.0 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -20,6 +20,25 @@ scope drafting honors intake's classification — it never re-sizes a request:
20
20
  means one drafting pass, NOT auto-creation. Nothing is written to disk — single draft or the
21
21
  whole batch — until the human confirms. You propose; you wait.
22
22
 
23
+ ## Position the goal — ground in assets, relate to the milestone map (do this FIRST)
24
+
25
+ Before you draft the goal sentence — before Diverge below — position the request in what
26
+ already exists. You cannot write a correct goal without knowing where it sits.
27
+
28
+ 1. **Ground in current assets.** Read the goal input against `PROJECT.md` (domain · spec ·
29
+ UI/UX), the code it touches, and the existing docs — so the goal is grounded in what the
30
+ project already is, not in what you assume.
31
+ 2. **Relate to the milestone map.** Read every existing goal — `.add/milestones/*/MILESTONE.md`
32
+ and `.add/archive/*` — and name THIS request's relationship to them: *extends* theme X ·
33
+ *depends-on* Y · *overlaps* Z. Record that relationship in the `rationale` line you will write.
34
+ 3. **If the goal is already delivered** by an existing milestone, do NOT fork it — reject
35
+ `duplicate_goal` and route the request as a `task` or `change-request` (create nothing).
36
+
37
+ This COMPLEMENTS `intake.md`'s bucket test (which weighs only whether a live milestone's goal
38
+ covers the request); positioning also grounds the goal in current assets and relates it to the
39
+ prior milestone map (`.add/milestones/*` + `.add/archive/*`) — which classification does not do.
40
+ Point at intake for the bucket; do not restate it here.
41
+
23
42
  ## Brainstorm before you draft — co-specify at milestone level
24
43
 
25
44
  Don't draft a MILESTONE.md from thin input. Run the same three-move co-specify as a
@@ -39,11 +58,14 @@ Rank assumptions lowest-confidence first; the top 1–2 get the flag the human r
39
58
  `⚠ <assumption> — lowest confidence because <why>; if wrong: <cost>`. Present the draft via
40
59
  `report-template.md` — open with the ARC (goal · done · plan): the goal this milestone serves,
41
60
  what is already covered, and the plan its task list lays out.
61
+ Render the draft as a guided choice — the recommended scope + its described alternatives (per `report-template.md`).
42
62
 
43
63
  ## Drafting a good MILESTONE.md (section by section)
44
64
 
45
65
  - **goal** — ONE sentence, an outcome not an output ("a user can size any request", not "write
46
66
  intake.md"). If it needs an "and", it is probably two milestones.
67
+ - **rationale** — the confirmed intake bucket + WHY (the theme · slice · fit), AND the milestone
68
+ relationship you captured in "Position the goal" above. One or two header lines; never in state.json.
47
69
  - **Scope In/Out** — the explicit anti-creep deferral list. Naming what is OUT is as important
48
70
  as what is IN; an empty Out list usually means the scope is not yet thought through.
49
71
  - **Shared decisions & glossary deltas** — cross-cutting rules every task must honor, named from
@@ -53,6 +75,22 @@ what is already covered, and the plan its task list lays out.
53
75
  by phase; keep each task one-file-sized. Order by dependency, not by guesswork.
54
76
  - **Exit criteria** — observable, and **every exit criterion maps to a declared task slug**
55
77
  (no dangling criterion). Each line answers "which task delivers this, and how would we see it?"
78
+ - **Close — ship review** + **Release steps** — leave these as the template at draft time: they are
79
+ **drafted-blank** here and filled LATER (Close at `milestone-done`, the close flow; Release steps when
80
+ the ship path is known, owned by `release.md`) — not scope drafting. Named here so you know the full
81
+ 9-section shape and neither fill them early nor read a fresh draft as "incomplete".
82
+
83
+ ## Draft well-formedness gate (a draft passes ALL of these before you propose it)
84
+
85
+ A scope draft is well-formed — ready to show the human — only when:
86
+ - [ ] the goal is ONE outcome sentence (no "and" — that is two milestones)
87
+ - [ ] every exit criterion maps to a declared task slug (no dangling criterion)
88
+ - [ ] `rationale` records the bucket + the milestone relationship from "Position the goal"
89
+ - [ ] `Close — ship review` and `Release steps` are left as the template (drafted-blank)
90
+ - [ ] the In/Out list names what is deferred (an empty Out list is unfinished thinking)
91
+
92
+ Propose only a well-formed draft — an incomplete one is the gap that lets a milestone reach
93
+ task breakdown half-formed.
56
94
 
57
95
  ## Reject codes (emit `{ reject, rationale }`, create nothing)
58
96
 
@@ -64,6 +102,9 @@ what is already covered, and the plan its task list lays out.
64
102
  a malformed milestone. With no engine lint, you are the first check and the human is the backstop.
65
103
  - `no_milestone` — intake routed the request to `task` or `change-request`; scope drafting
66
104
  creates NO milestone. Honor the classification; do not invent milestone-sized scope.
105
+ - `duplicate_goal` — the goal is already delivered by an existing milestone (live or in
106
+ `.add/archive/`). Do NOT fork it into a parallel milestone; route the request as a `task` or
107
+ `change-request` and create nothing. (Raised by the "Position the goal" step.)
67
108
  </reject_codes>
68
109
 
69
110
  ## Worked example (from this repo's own history)