@skitterbyte/skitterspec 21.0.0 → 22.0.0

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.
@@ -102,6 +102,67 @@ resolve it by reading the code, do that instead of asking.
102
102
 
103
103
 
104
104
 
105
+ ## 4b. Hand the refresh back on a page, then wait
106
+
107
+ **Only when the project has per-spec isolation** (`specs/.core/env.config.json`
108
+ present) **and this review actually changed something.** Either missing → skip
109
+ the whole step in silence.
110
+
111
+ A refreshed spec is a rewrite of a document someone is about to work from, so it
112
+ gets read before it is committed — the same ending `/spec` now has:
113
+
114
+ ```
115
+ skitterspec spec-env review <spec> --docs --buttons refresh
116
+ ```
117
+
118
+ `--docs` reads the spec's own documents from the tree you are standing in, so it
119
+ wants no worktree and works for a spec in any bucket. These documents are
120
+ **tracked**, so the diff against `HEAD` is a patch rather than a set of new
121
+ files — which is exactly what the reader wants here: what drifted, and what you
122
+ rewrote.
123
+
124
+ **Render nothing when nothing changed.** `/spec-review` frequently concludes a
125
+ spec is still accurate, and that is a success rather than a gap. A page showing
126
+ an empty diff under a commit button asks for a verdict on nothing, and the
127
+ engine refuses it for the same reason — `nothing to review`. Take that refusal
128
+ as the answer and report the `⏸`/`✅` you already had.
129
+
130
+ **Arm nothing.** No `review arm` here: the gate asserts that a phase which ended
131
+ owes an answer, and a re-validated spec has ended no phase. Walking away leaves
132
+ an uncommitted spec, which is the state this skill has always finished in.
133
+
134
+ ### The three endings
135
+
136
+ `--buttons refresh` offers `Commit`, `Request changes` and `Discuss`.
137
+
138
+ **No start verdict, deliberately.** The spec this skill refreshed may already be
139
+ in progress — that is half of what it is used for — so `Commit & Start` would
140
+ offer to provision a worktree for a spec that already has one.
141
+
142
+ - **`commit`** — hand off to `review.commitWith` (`/commit` by default) with the
143
+ pathspec the render reported on `docs.paths`, then finish. The spec keeps
144
+ whatever status step 4 left it in.
145
+ - **`changes`** — work the notes into the spec, record a resolution for each so
146
+ the next render strikes it through with what changed, re-render, and wait
147
+ again.
148
+ - **`discuss`** — report and talk. Claim nothing, change nothing.
149
+
150
+ ### Then wait for it
151
+
152
+ **The wait is a command. Do not write one.** Note the moment you start waiting
153
+ as an ISO timestamp, run the engine's wait in the background, and end your turn:
154
+
155
+ ```
156
+ skitterspec spec-env review wait <spec> --since <the timestamp>
157
+ ```
158
+
159
+ Pass no timeout. On waking, let the engine pick the pass —
160
+ `skitterspec spec-env review <spec> --docs --claim-since <the timestamp> --json`
161
+ — and route on the verdict above.
162
+
163
+ **Where the page is `file://`** the pass is copied and pasted, so the wait is the
164
+ turn ending and the banner says so. Do not start a watch that cannot fire.
165
+
105
166
  ## 5. Report
106
167
 
107
168
  Do **not** `git commit` unless the user asks.
@@ -122,6 +183,32 @@ the shape; this section carries only what is specific here.
122
183
  API that moved, a task the code already does. `Spec` carries the status the
123
184
  review leaves it in, which is the answer to "can I start this?".
124
185
 
186
+ **Where step 4b rendered a page the run is waiting**, so the block omits the
187
+ `Review` row and ends on the banner from `.claude/rules/spec-reports.md` — the
188
+ tier stack copied from the engine's own lines, never one link chosen for the
189
+ reader:
190
+
191
+ ---
192
+
193
+ ## ⏸ Review ready — &lt;N&gt; files, +&lt;a&gt; −&lt;d&gt;
194
+
195
+ - **local** — &lt;the `local:` URL&gt;
196
+ - **network** — &lt;the `network:` URL, or off with the command that turns it on&gt;
197
+ - **remote** — &lt;the `remote:` URL, or off with the command that turns it on&gt;
198
+
199
+ I'm holding here until you send a verdict — the wait covers local and network.
200
+
201
+ `Commit` commits the refresh · `Request changes` works them now
202
+
203
+ ---
204
+
205
+ `Next` then names the page rather than a command, because the button is what
206
+ carries the work on.
207
+
208
+ Where nothing was rendered — no isolation, or no drift to show — `Next` is
209
+ `/commit, then /spec-start <name>`, since this skill does not commit and
210
+ `/spec-start` refuses a tree holding anything that is not the spec's.
211
+
125
212
  **Drift found and not fixed is a `Follow-up`, not a silence.** A spec this skill
126
213
  declared reviewed is one nobody will re-read; something it noticed and left
127
214
  undone has to leave the session in writing or it did not happen.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: spec-reviewed
3
- description: Pick up the review you approved on the page — run it bare to pick up the single waiting pass, paste the six-digit code off the page ("/spec-reviewed 608223") to name one exactly, and be asked which only when two are waiting. Use when the user says "/spec-reviewed", "I approved it", "I've reviewed it", "pick up my review", "I pressed approve", or otherwise says they have finished reviewing a rendered diff.
3
+ description: Pick up the review you approved on the page — run it bare to pick up the single waiting pass, paste the six-digit code off the page ("/spec-reviewed 608223") to name one exactly, or pass the verdict itself ("/spec-reviewed commit") when the page could not send and copied you a command instead. Use when the user says "/spec-reviewed", "I approved it", "I've reviewed it", "pick up my review", "I pressed approve", or otherwise says they have finished reviewing a rendered diff.
4
4
  disable-model-invocation: true
5
5
  ---
6
6
 
@@ -70,16 +70,42 @@ Several provisioned and none resolved is a refusal — relay its list and stop,
70
70
  never pick from it. See `.claude/rules/spec-planning.md`; do not restate the
71
71
  rule here.
72
72
 
73
- **Three argument shapes, and they cannot collide.** A **six-digit code**
74
- matches `^\d{6}$`; a **tracker id** carries a letter and a hyphen; a
75
- **spec name** is neither. So the parse needs no flag, and nothing has to be
76
- guessed at from context.
73
+ **Four argument shapes, and they cannot collide.** A **six-digit code**
74
+ matches `^\d{6}$`; a **verdict** is one of a closed list of six words;
75
+ a **tracker id** carries a letter and a hyphen;
76
+ a **spec name** is none of them and always carries a lifecycle prefix
77
+ (`feat-`, `bug-`, `hotfix-`), which no verdict does. So the parse needs no flag,
78
+ and nothing has to be guessed at from context.
77
79
 
78
80
  A **six-digit code** is a pass the operator read off their own page. It says
79
81
  **which pass**, not which spec — so resolve the spec exactly as a bare
80
82
  invocation does, above, and claim the code *there*. Then go to step 4 — a named
81
83
  pass has nothing to disambiguate.
82
84
 
85
+ A **verdict word** — `commit`, `commit-continue`, `commit-start`, `continue`,
86
+ `changes`, `discuss` — is the conclusion itself, arriving without a pass behind
87
+ it. It is
88
+ what a **`file://` page** hands over: that page has no server to POST to and no
89
+ store to write to, so it copies a command instead of sending anything, and this
90
+ is the command. Resolve the spec as a bare invocation does, then send the word
91
+ through the engine:
92
+
93
+ ```
94
+ skitterspec spec-env review <spec> --verdict <word>
95
+ ```
96
+
97
+ It joins the same merge a claimed pass goes through, so the routing in step 4
98
+ is unchanged: a commit over open notes is refused exactly as it would be, the
99
+ outcome log records it, and the gate a phase armed is cleared. Then go to step
100
+ 4 — there is nothing to disambiguate.
101
+
102
+ **A word carries a verdict and nothing else**, and that is a property of the
103
+ transport, not a shortcut. Accepts and comments do not fit on a command line,
104
+ so the page only ever offers the words while the reader has marked nothing —
105
+ the moment they tick an accept or write a note it goes back to handing over the
106
+ blob. If someone tells you they marked things up *and* gives you a word, ask
107
+ for the pass: the word would land a verdict with their notes silently dropped.
108
+
83
109
  A **name** targets that spec instead. A **tracker id** does too, but only
84
110
  through a **provider seam**: the base knows nothing about tracker ids, so
85
111
  resolve one by asking whichever provider is installed for its listing —
@@ -268,6 +268,25 @@ here beyond knowing it is no longer dead code.
268
268
  A spec ideally arrives `Ready` from `/spec`; a `Draft` works too — sanity-check
269
269
  it is well-formed first.
270
270
 
271
+ - **Report anything left waiting, and claim none of it.** Ask the engine once:
272
+
273
+ ```
274
+ skitterspec spec-env review waiting
275
+ ```
276
+
277
+ A pass listed here arrived when nothing was watching — a wait that never ran,
278
+ a session cleared, a terminal closed overnight — and no watcher can recover
279
+ those, however good. Relay what it prints: the spec, the code, the verdict and
280
+ the age, with `/spec-reviewed <code>` to pick one up and `--drop <code>` to
281
+ disown it.
282
+
283
+ **It is information, not a gate.** It never refuses, nothing here is
284
+ conditional on it, and **you never claim one** — `/spec-diff` §0 stands
285
+ unchanged, and a pass sitting there when you arrived was not sent to you.
286
+ Silent when nothing is waiting, which is the usual case: say nothing rather
287
+ than reporting that there was nothing to report.
288
+
289
+
271
290
  ## 4b. Note a missing gating decision (only if configured)
272
291
 
273
292
  **Only when `specs/.core/gating.config.json` exists.** Run
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skitterbyte/skitterspec",
3
- "version": "21.0.0",
3
+ "version": "22.0.0",
4
4
  "description": "Spec-driven development for Claude Code \u2014 a tracker-free filesystem workflow: lifecycle skills and per-spec isolation. For Linear sync, install @skitterbyte/skitterspec-linear instead.",
5
5
  "keywords": [
6
6
  "claude",