sequant 2.1.2 → 2.2.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.
@@ -115,6 +115,7 @@ Surface red flags. Only track signals that change the recommendation.
115
115
  | security, auth, authentication, permissions | Domain | `spec → security-review → exec → qa` |
116
116
  | ui, frontend, admin, web, browser | Domain | `spec → exec → test → qa` |
117
117
  | complex, refactor, breaking, major | Modifier | `spec → exec → qa` + `-q` |
118
+ | (ui/frontend) + (enhancement/feature), or testable-AC signals | Modifier | inserts `testgen` before `exec` (see Testgen detection below) |
118
119
  | enhancement, feature (default) | Generic | `spec → exec → qa` |
119
120
  | bug, fix, hotfix, patch | Generic | `exec → qa` |
120
121
  | docs, documentation, readme | Generic | `exec → qa` |
@@ -131,10 +132,24 @@ Surface red flags. Only track signals that change the recommendation.
131
132
 
132
133
  **Quality loop (`-q`):** Recommend for everything except simple bug fixes and docs-only.
133
134
 
134
- **Other flags:**
135
- - `--chain` Chain issues: each branches from previous (implies --sequential)
136
- - `--qa-gate` Pause chain on QA failure, preventing downstream issues from building on broken code (requires --chain)
137
- - `--base <branch>` — Issue references a feature branch
135
+ **Testgen detection:** Add `testgen` to the workflow when any apply:
136
+ - Labels include (`ui` or `frontend`) AND (`enhancement` or `feature`)
137
+ - ACs reference "unit test", "integration test", or list "Automated Test" as a verification method
138
+
139
+ Skip when: only `bug`/`fix` labels present, only `docs` label present, or a prior `testgen` phase marker exists in issue comments.
140
+
141
+ **Chain detection (suggest-only, never auto-apply):** When 2+ assessed issues have a detected dependency, emit a `Chain:` line alongside (not replacing) the default per-issue commands. False dependency inference produces silently-wrong branch topology, so the user decides.
142
+
143
+ Triggers (any one):
144
+ - Issue body or comments mention `"depends on #N"`, `"blocked by #N"`, or `"after #N"`
145
+ - One issue's described output is another issue's input (e.g., A changes a function signature that B consumes)
146
+
147
+ Format: `Chain: npx sequant run <N1> <N2> --chain --qa-gate -q <phases> # alternative — <one-line reason>`
148
+
149
+ Flag references:
150
+ - `--chain` chains issues (each branches from previous; implies `--sequential`)
151
+ - `--qa-gate` pauses chain on QA failure (requires `--chain`)
152
+ - `--base <branch>` — issue references a feature branch
138
153
 
139
154
  ### Step 5: Conflict Detection
140
155
 
@@ -155,20 +170,25 @@ For each active worktree, check `git diff --name-only main...HEAD` for file over
155
170
  **Table column rules:** The "Reason" column must not be truncated mid-word. If a row's reason text would exceed the column width, prefer abbreviating the reason to a shorter synonym rather than cutting a word in half. Column widths should adapt to content — do not force a fixed table width.
156
171
 
157
172
  ```
158
- # Action Reason Run
159
- <N> <ACTION> <short reason> <workflow or symbol>
160
- <N> <ACTION> <short reason> <workflow or symbol>
173
+ # Action [ACs] Reason Run
174
+ <N> <ACTION> [N] <short reason> <workflow or symbol>
175
+ <N> <ACTION> [N] <short reason> <workflow or symbol>
161
176
  ...
162
177
  ────────────────────────────────────────────────────────────────
163
-
164
- npx sequant run <N1> <N2> <flags>
165
- npx sequant run <N3> <flags> # resume
166
-
178
+ Commands:
179
+ npx sequant run <N1> <N2> <flags>
180
+ npx sequant run <N3> <flags> # resume
167
181
  ────────────────────────────────────────────────────────────────
168
- Order: <N> → <N> (<shared file>) · <N> → <N> (<dependency>)
182
+ Order: <N> → <N> (<dependency reason>)
169
183
 
170
184
  ⚠ #<N> <warning>
171
185
  ⚠ #<N> <warning>
186
+
187
+ Chain: npx sequant run <N1> <N2> --chain --qa-gate -q <phases> # alternative — <reason>
188
+
189
+ Flags:
190
+ <flag> <one-line reason>
191
+ <flag> <one-line reason>
172
192
  ────────────────────────────────────────────────────────────────
173
193
  Cleanup:
174
194
  <executable command> # reason
@@ -181,6 +201,8 @@ Cleanup:
181
201
  <!-- assess:quality-loop=<bool> -->
182
202
  ```
183
203
 
204
+ **`ACs` column (conditional):** Include the `ACs` column only when every assessed issue has at least one explicit `- [ ]` checkbox AC in its body. Otherwise omit the column entirely — do not show partial values. The counter prevents eroding table trust when some issues use implicit/narrative ACs.
205
+
184
206
  #### Run Column Symbols
185
207
 
186
208
  | Symbol | Meaning | Example |
@@ -195,26 +217,51 @@ Cleanup:
195
217
  | `‖` | Blocked/deferred | Dependency or manual |
196
218
  | `—` | No action needed | Already closed/merged |
197
219
 
198
- #### Command Block Rules
220
+ #### Commands Block Rules
221
+
222
+ The commands block is headed by `Commands:` — no box-drawing, no character counting. The header label is the visual anchor.
199
223
 
200
224
  1. Only PROCEED and REWRITE issues get commands
201
225
  2. Group by identical phases + flags → same line
202
226
  3. Resume issues get `# resume` comment
203
227
  4. Rewrite issues get `# restart` comment
204
- 5. Chain mode issues use `--chain` flag
228
+ 5. Chain mode issues use `--chain` flag (see `Chain:` annotation rules below)
205
229
  6. If ALL issues share the same workflow, emit a single command
206
230
  7. **Line splitting:** When a single command would contain more than 6 issue numbers, split into multiple commands of at most 6 issues each, grouped by compatible workflow. Example: 11 issues → two commands (6 + 5)
207
231
 
208
232
  #### Annotation Rules
209
233
 
210
- - **`Order:`** Only when sequencing matters (shared files or dependencies). Format: `A → B (reason)` joined by ` · `
211
- - **`⚠` warnings** Only non-obvious signals (complexity, staleness, dual concerns). One line each. Prefix with issue number.
234
+ Emit annotations in this order between the separators that follow `Commands:`:
235
+ `Order:` `⚠` warnings `Chain:` `Flags:`. `Cleanup:` goes in its own block after. Omit any section (and its surrounding blank line) when it has no content.
236
+
237
+ - **`Order:`** — Only when sequencing matters. Include the **reason** for the ordering, not just `(<filename>)`. Prefer dependency reasoning over filename.
238
+ - Good: `Order: 185 → 186 (185 changes fetchApi error format that 186 consumes)`
239
+ - Good: `Order: 460 → 461 (460 adds batch-executor tests that 461's label matching depends on)`
240
+ - Avoid bare filenames when a reason is clearer.
241
+
242
+ - **`⚠` warnings** — Only non-obvious signals (complexity, staleness, dual concerns, partial-AC satisfaction). One line each, prefixed with issue number. Warnings can note when part of an AC is already satisfied in the codebase:
243
+ - `⚠ #185 Domain errors already exist in repository layer — scope may be smaller than expected`
244
+ - `⚠ #412 bug + auth labels — domain label (auth) takes priority over bug`
245
+
246
+ - **`Chain:`** — Only when 2+ PROCEED issues have a detected dependency (see "Chain detection" in Step 4). Suggests an alternative execution topology. Does not replace the default per-issue commands. Format:
247
+ `Chain: npx sequant run <N1> <N2> --chain --qa-gate -q <phases> # alternative — <one-line reason>`
248
+
249
+ - **`Flags:`** — Only when non-default flags appear in the commands and the reason isn't obvious. One line per **distinct** flag used across all commands. Omit entire section when `-q` is the only non-default flag AND its reason is obvious (e.g., all issues are enhancements). Format:
250
+ ```
251
+ Flags:
252
+ -q 9+ ACs or multi-file scope
253
+ --testgen testable ACs detected (UI hooks + API integration)
254
+ --phases ...,test ui label → browser verification
255
+ ```
256
+
212
257
  - **`Cleanup:`** — Only when actionable (stale branches, merged-but-open issues, label changes). Show as executable commands with `# reason` comments.
213
- - **Omit entire section** (including its separator) when no annotations of that type exist.
258
+
214
259
  - **"All clear" is silence** — no annotation means no issues.
215
260
 
216
261
  #### Batch Example (mixed states, with label priority)
217
262
 
263
+ Not all issues have explicit `- [ ]` checkboxes, so the `ACs` column is omitted.
264
+
218
265
  ```
219
266
  # Action Reason Run
220
267
  462 PARK Manual measurement task ‖
@@ -227,19 +274,22 @@ Cleanup:
227
274
  411 PROCEED Config path normalization ◂ exec → qa
228
275
  405 REWRITE PR #380 200+ commits behind ⟳ spec → exec → qa
229
276
  ────────────────────────────────────────────────────────────────
230
-
231
- npx sequant run 461 460 -q --phases exec,qa
232
- npx sequant run 458 443 -q
233
- npx sequant run 412 -q --phases spec,security-review,exec,qa
234
- npx sequant run 411 -q --phases exec,qa # resume
235
- npx sequant run 405 -q # restart
236
-
277
+ Commands:
278
+ npx sequant run 461 460 -q --phases exec,qa
279
+ npx sequant run 458 443 -q
280
+ npx sequant run 412 -q --phases spec,security-review,exec,qa
281
+ npx sequant run 411 -q --phases exec,qa # resume
282
+ npx sequant run 405 -q # restart
237
283
  ────────────────────────────────────────────────────────────────
238
- Order: 460 → 461 (batch-executor.ts)
284
+ Order: 460 → 461 (460 adds batch-executor tests that 461's label matching depends on)
239
285
 
240
286
  ⚠ #458 Dual concern (UX + race) across 4 files
241
287
  ⚠ #405 Stale 30+ days, ACs still valid
242
288
  ⚠ #412 bug + auth labels — domain label (auth) takes priority over bug
289
+
290
+ Flags:
291
+ -q multi-file scope across most PROCEED issues
292
+ --phases spec,... spec phase added for 458/443/412/405 (standard features)
243
293
  ────────────────────────────────────────────────────────────────
244
294
  Cleanup:
245
295
  git worktree remove .../447-... # merged, stale worktree
@@ -258,9 +308,39 @@ Cleanup:
258
308
  <!-- #405 assess:action=REWRITE assess:phases=spec,exec,qa assess:quality-loop=true -->
259
309
  ```
260
310
 
311
+ #### Batch Example (dependent issues with testgen, chain suggestion)
312
+
313
+ All issues have explicit checkbox ACs, so the `ACs` column is shown. A dependency is detected (185 → 186), so a `Chain:` suggestion appears alongside the default commands.
314
+
315
+ ```
316
+ # Action ACs Reason Run
317
+ 185 PROCEED 6 Domain error standardization spec → exec → qa
318
+ 186 PROCEED 9 React Query hooks migration spec → testgen → exec → test → qa
319
+ ────────────────────────────────────────────────────────────────
320
+ Commands:
321
+ npx sequant run 185 -q
322
+ npx sequant run 186 -q --phases spec,testgen,exec,test,qa
323
+ ────────────────────────────────────────────────────────────────
324
+ Order: 185 → 186 (185 changes fetchApi error format that 186 consumes)
325
+
326
+ ⚠ #185 Domain errors already exist in repository layer — scope may be smaller than expected
327
+ ⚠ #186 @tanstack/react-query not installed; large scope (9 hooks + optimistic updates)
328
+
329
+ Chain: npx sequant run 185 186 --chain --qa-gate -q --phases spec,testgen,exec,test,qa
330
+ # alternative — use if 186 should branch from 185's work
331
+
332
+ Flags:
333
+ --testgen #186 has testable ACs (UI hooks + API integration)
334
+ --phases ...,test #186 ui label → browser verification
335
+ ────────────────────────────────────────────────────────────────
336
+
337
+ <!-- #185 assess:action=PROCEED assess:phases=spec,exec,qa assess:quality-loop=true -->
338
+ <!-- #186 assess:action=PROCEED assess:phases=spec,testgen,exec,test,qa assess:quality-loop=true -->
339
+ ```
340
+
261
341
  #### Batch Example (all clean)
262
342
 
263
- When every issue is PROCEED with no warnings, the output is minimal:
343
+ When every issue is PROCEED with no warnings, no dependencies, and no non-default flags beyond an obvious `-q`, the output is minimal. The `Flags:` section is omitted because `-q` is obvious here (all PROCEED enhancements).
264
344
 
265
345
  ```
266
346
  # Action Reason Run
@@ -268,10 +348,9 @@ When every issue is PROCEED with no warnings, the output is minimal:
268
348
  460 PROCEED batch-executor tests exec → qa
269
349
  443 PROCEED Consolidate gh calls spec → exec → qa
270
350
  ────────────────────────────────────────────────────────────────
271
-
272
- npx sequant run 461 460 -q --phases exec,qa
273
- npx sequant run 443 -q
274
-
351
+ Commands:
352
+ npx sequant run 461 460 -q --phases exec,qa
353
+ npx sequant run 443 -q
275
354
  ────────────────────────────────────────────────────────────────
276
355
 
277
356
  <!-- #461 assess:action=PROCEED assess:phases=exec,qa assess:quality-loop=true -->
@@ -279,9 +358,11 @@ When every issue is PROCEED with no warnings, the output is minimal:
279
358
  <!-- #443 assess:action=PROCEED assess:phases=spec,exec,qa assess:quality-loop=true -->
280
359
  ```
281
360
 
361
+ Silence means clean — no `Order:`, no `⚠`, no `Chain:`, no `Flags:`, no `Cleanup:`.
362
+
282
363
  #### Batch Example (large batch, 13 issues with Rule 7 split)
283
364
 
284
- When assessing 9+ issues, commands are split per Rule 7 (max 6 issue numbers per line), and the table adapts to content width:
365
+ When assessing 9+ issues, commands are split per Rule 7 (max 6 issue numbers per line), and the table adapts to content width. Mixed AC styles across issues → `ACs` column omitted.
285
366
 
286
367
  ```
287
368
  # Action Reason Run
@@ -299,18 +380,21 @@ When assessing 9+ issues, commands are split per Rule 7 (max 6 issue numbers per
299
380
  492 PROCEED Add export command spec → exec → qa
300
381
  491 PROCEED Normalize config paths exec → qa
301
382
  ────────────────────────────────────────────────────────────────
302
-
303
- npx sequant run 503 502 501 498 495 494 -q --phases exec,qa
304
- npx sequant run 491 -q --phases exec,qa
305
- npx sequant run 499 -q --phases spec,exec,test,qa
306
- npx sequant run 500 -q --phases spec,security-review,exec,qa
307
- npx sequant run 497 492 -q
308
-
383
+ Commands:
384
+ npx sequant run 503 502 501 498 495 494 -q --phases exec,qa
385
+ npx sequant run 491 -q --phases exec,qa
386
+ npx sequant run 499 -q --phases spec,exec,test,qa
387
+ npx sequant run 500 -q --phases spec,security-review,exec,qa
388
+ npx sequant run 497 492 -q
309
389
  ────────────────────────────────────────────────────────────────
310
- Order: 497 → 492 (batch-executor.ts)
390
+ Order: 497 → 492 (497 refactors batch-executor internals that 492's export command uses)
311
391
 
312
392
  ⚠ #500 bug + auth labels — domain label takes priority
313
393
  ⚠ #499 bug + ui labels — domain label triggers test phase
394
+
395
+ Flags:
396
+ --phases ...,security-review #500 auth label → security review required
397
+ --phases ...,test #499 ui label → browser verification
314
398
  ────────────────────────────────────────────────────────────────
315
399
  Cleanup:
316
400
  gh issue close 493 # duplicate of #491
@@ -346,9 +430,13 @@ More context since you're focused on one issue. Separators between every section
346
430
 
347
431
  → PROCEED — <one-line reason>
348
432
 
349
- npx sequant run <N> <flags>
433
+ Commands:
434
+ npx sequant run <N> <flags>
435
+
436
+ <phases> · <N> ACs
350
437
 
351
- <phases> · <N> ACs · <flag reasoning>
438
+ Flags:
439
+ <flag> <one-line reason>
352
440
  ────────────────────────────────────────────────────────────────
353
441
  ⚠ <warning if any>
354
442
  ⚠ Conflict: #<N> also modifies <path>
@@ -359,7 +447,9 @@ More context since you're focused on one issue. Separators between every section
359
447
  <!-- assess:quality-loop=<bool> -->
360
448
  ```
361
449
 
362
- If no warnings exist, omit the warning section and its separator:
450
+ **`Flags:` (single mode):** Indented list of each enabled non-default flag with a one-line reason. Omit the entire `Flags:` section when `-q` is the only non-default flag AND the reason is obvious (e.g., a straightforward enhancement). Do not repeat obvious flags.
451
+
452
+ Example with `Flags:` (non-obvious `-q` + `--testgen`):
363
453
 
364
454
  ```
365
455
  #458 — Parallel run UX freeze + reconcileState race condition
@@ -368,9 +458,33 @@ Open · bug, enhancement, cli
368
458
 
369
459
  → PROCEED — Both root causes confirmed in codebase
370
460
 
371
- npx sequant run 458 -q
461
+ Commands:
462
+ npx sequant run 458 -q
463
+
464
+ spec → exec → qa · 8 ACs
465
+
466
+ Flags:
467
+ -q dual concern across 4 files
468
+ ────────────────────────────────────────────────────────────────
469
+
470
+ <!-- assess:action=PROCEED -->
471
+ <!-- assess:phases=spec,exec,qa -->
472
+ <!-- assess:quality-loop=true -->
473
+ ```
474
+
475
+ Example omitting `Flags:` (obvious `-q` for a standard enhancement):
476
+
477
+ ```
478
+ #443 — Consolidate gh CLI calls
479
+ Open · enhancement
480
+ ────────────────────────────────────────────────────────────────
372
481
 
373
- spec exec qa · 8 ACs · -q (dual concern)
482
+ PROCEED Codebase matches spec, 5 ACs
483
+
484
+ Commands:
485
+ npx sequant run 443 -q
486
+
487
+ spec → exec → qa · 5 ACs
374
488
  ────────────────────────────────────────────────────────────────
375
489
 
376
490
  <!-- assess:action=PROCEED -->
@@ -448,7 +562,8 @@ Need: <specific information required>
448
562
 
449
563
  → REWRITE — <reason>
450
564
 
451
- npx sequant run <N> <flags> # fresh start
565
+ Commands:
566
+ npx sequant run <N> <flags> # fresh start
452
567
 
453
568
  <phases> · <N> ACs
454
569
  ────────────────────────────────────────────────────────────────
@@ -466,27 +581,19 @@ Need: <specific information required>
466
581
 
467
582
  | Section | Show when |
468
583
  |---------|-----------|
469
- | Command block | At least one PROCEED or REWRITE issue |
584
+ | `ACs` column (batch) | Every assessed issue has ≥1 explicit `- [ ]` checkbox AC |
585
+ | `Commands:` block | At least one PROCEED or REWRITE issue |
470
586
  | `Order:` | File conflicts or dependencies require sequencing |
471
- | `⚠` warnings | Non-obvious signals exist |
587
+ | `⚠` warnings | Non-obvious signals exist (complexity, staleness, dual concerns, partial-AC satisfaction) |
588
+ | `Chain:` | 2+ PROCEED issues with detected dependency (suggest-only) |
589
+ | `Flags:` | Non-default flags appear AND `-q` is not the sole flag with an obvious reason |
472
590
  | `Cleanup:` | Stale branches, merged-but-open issues, or label changes |
473
591
  | Separators | Between sections that are both shown; omit if adjacent section is omitted |
474
592
 
475
- Every separator and section is conditional. If there are no warnings and no cleanup, the output is just: table → separator → command block → separator → markers.
593
+ Every separator and section is conditional. If there are no warnings, no chain, no flags, and no cleanup, the output is just: table → separator → `Commands:` block → separator → markers.
476
594
 
477
595
  ---
478
596
 
479
- ## State Tracking
480
-
481
- Initialize state for each assessed issue:
482
-
483
- ```bash
484
- TITLE=$(gh issue view <N> --json title -q '.title')
485
- npx tsx scripts/state/update.ts init <N> "$TITLE"
486
- ```
487
-
488
- Note: `/assess` only initializes issues — actual phase tracking happens during workflow execution.
489
-
490
597
  ## Persist Analysis
491
598
 
492
599
  After displaying output, prompt the user to save using `AskUserQuestion` with options "Yes (Recommended)" and "No".
@@ -516,10 +623,16 @@ If confirmed, post a structured comment to each issue via `gh issue comment`. Ea
516
623
 
517
624
  - [ ] Every issue has exactly one action in the table
518
625
  - [ ] Run column uses correct symbol for the action/state
519
- - [ ] Command block only contains PROCEED and REWRITE issues
520
- - [ ] Commands are grouped by compatible workflow
521
- - [ ] Separators appear between every shown section
522
- - [ ] Annotations omitted when not applicable (silence = healthy)
626
+ - [ ] `ACs` column included only when every issue has explicit `- [ ]` checkboxes
627
+ - [ ] Commands appear under a `Commands:` header (no bare indented block, no box-drawing)
628
+ - [ ] Commands block only contains PROCEED and REWRITE issues, grouped by compatible workflow
629
+ - [ ] `testgen` included when ui/frontend + enhancement/feature labels OR testable-AC signals
630
+ - [ ] `Chain:` suggested (not auto-applied) when 2+ PROCEED issues have a detected dependency
631
+ - [ ] `Flags:` section present when non-default flags appear (unless only obvious `-q`)
632
+ - [ ] `Order:` annotations carry dependency **reasoning**, not bare filenames
633
+ - [ ] `⚠` warnings include partial-AC satisfaction where applicable
634
+ - [ ] Separators appear between every shown section; omitted when adjacent section is omitted
635
+ - [ ] Annotations/sections omitted when not applicable (silence = healthy)
523
636
  - [ ] HTML markers present for every assessed issue
524
637
  - [ ] Batch mode: table is the primary output, no per-issue detail sections
525
638
  - [ ] Single mode: focused summary with separators between sections
@@ -806,16 +806,6 @@ After implementation is complete and all checks pass, create and verify the PR:
806
806
  - If PR exists: Record the URL from `gh pr view` output
807
807
  - If PR creation failed: Record the error and include manual creation instructions
808
808
 
809
- 6. **Record PR info in workflow state:**
810
- ```bash
811
- # Extract PR number and URL from gh pr view output, then update state
812
- PR_INFO=$(gh pr view --json number,url)
813
- PR_NUMBER=$(echo "$PR_INFO" | jq -r '.number')
814
- PR_URL=$(echo "$PR_INFO" | jq -r '.url')
815
- npx tsx scripts/state/update.ts pr <issue-number> "$PR_NUMBER" "$PR_URL"
816
- ```
817
- This enables `--cleanup` to detect merged PRs and auto-remove state entries.
818
-
819
809
  **PR Verification Failure Handling:**
820
810
 
821
811
  If `gh pr view` fails after retry:
@@ -1924,37 +1914,6 @@ You may be invoked multiple times for the same issue. Each time, re-establish co
1924
1914
 
1925
1915
  ---
1926
1916
 
1927
- ## State Tracking
1928
-
1929
- **IMPORTANT:** Update workflow state when running standalone (not orchestrated).
1930
-
1931
- ### Check Orchestration Mode
1932
-
1933
- The orchestration check happens automatically when you run the state update script - it exits silently if `SEQUANT_ORCHESTRATOR` is set.
1934
-
1935
- ### State Updates (Standalone Only)
1936
-
1937
- When NOT orchestrated (`SEQUANT_ORCHESTRATOR` is not set):
1938
-
1939
- **At skill start:**
1940
- ```bash
1941
- npx tsx scripts/state/update.ts start <issue-number> exec
1942
- ```
1943
-
1944
- **On successful completion:**
1945
- ```bash
1946
- npx tsx scripts/state/update.ts complete <issue-number> exec
1947
- ```
1948
-
1949
- **On failure:**
1950
- ```bash
1951
- npx tsx scripts/state/update.ts fail <issue-number> exec "Error description"
1952
- ```
1953
-
1954
- **Why this matters:** State tracking enables dashboard visibility, resume capability, and workflow orchestration. Skills update state when standalone; orchestrators handle state when running workflows.
1955
-
1956
- ---
1957
-
1958
1917
  ## Output Verification
1959
1918
 
1960
1919
  **Before responding, verify your output includes ALL of these:**
@@ -854,33 +854,7 @@ As an orchestrator, `/fullsolve` must:
854
854
  export SEQUANT_WORKTREE=<worktree-path>
855
855
  ```
856
856
 
857
- 2. **Initialize issue state at workflow start:**
858
- ```bash
859
- npx tsx scripts/state/update.ts init <issue-number> "<issue-title>"
860
- ```
861
-
862
- 3. **Update phase status** at each transition:
863
- ```bash
864
- # Before invoking child skill
865
- npx tsx scripts/state/update.ts start <issue-number> <phase>
866
-
867
- # After child skill completes
868
- npx tsx scripts/state/update.ts complete <issue-number> <phase>
869
-
870
- # If child skill fails
871
- npx tsx scripts/state/update.ts fail <issue-number> <phase> "Error"
872
- ```
873
-
874
- 4. **Update final status** after workflow completes:
875
- ```bash
876
- # On READY_FOR_MERGE
877
- npx tsx scripts/state/update.ts status <issue-number> ready_for_merge
878
-
879
- # On failure
880
- npx tsx scripts/state/update.ts status <issue-number> blocked
881
- ```
882
-
883
- **Why child skills skip state updates:** When `SEQUANT_ORCHESTRATOR` is set, child skills defer state management to the orchestrator to avoid duplicate updates.
857
+ 2. **State tracking** is handled automatically by the orchestrator runtime when `SEQUANT_ORCHESTRATOR` is set. Child skills defer state management to the orchestrator to avoid duplicate updates.
884
858
 
885
859
  ---
886
860
 
@@ -122,10 +122,23 @@ Include this marker in every `gh issue comment` that represents QA completion.
122
122
  Invocation:
123
123
 
124
124
  - `/qa 123`: Treat `123` as the GitHub issue/PR identifier in context.
125
+ - `/qa 123 172`: Treat both as issue numbers — process each sequentially.
125
126
  - `/qa <freeform description>`: Treat the text as context about the change to review.
126
127
  - `/qa 123 --parallel`: Force parallel agent execution (faster, higher token usage).
127
128
  - `/qa 123 --sequential`: Force sequential agent execution (slower, lower token usage).
128
129
 
130
+ ### Multi-Issue Invocation
131
+
132
+ When multiple issue numbers are provided (e.g., `/qa 167 172`):
133
+
134
+ 1. **Parse all issue numbers** from args
135
+ 2. **Process each issue sequentially** with inline code review — do NOT spawn ad-hoc background agents for the diff reading or AC verification portions
136
+ 3. The built-in `sequant-qa-checker` sub-agents (type safety, scope, security) continue to run per the size gate rules for each issue
137
+ 4. Each issue gets its own full QA cycle: context fetch → diff review → quality checks → verdict → comment
138
+ 5. Post a **separate QA comment** to each issue's GitHub thread
139
+
140
+ **Why sequential with inline review:** Ad-hoc background agents for code review are unreliable — they hallucinate about file existence, misattribute API patterns, and hit permission issues on worktree reads. The narrowly-scoped `sequant-qa-checker` agents work well because they have specific, bounded tasks. The code review portion must stay inline for accuracy.
141
+
129
142
  ### Agent Execution Mode
130
143
 
131
144
  Before spawning quality check agents, determine the execution mode:
@@ -838,6 +851,12 @@ issue_type="${SEQUANT_ISSUE_TYPE:-}"
838
851
  admin_modified=$(git diff main...HEAD --name-only | grep -E "^app/admin/" | head -1 || true)
839
852
  ```
840
853
 
854
+ **Add skill sync check if skill files modified:**
855
+ ```bash
856
+ skill_modified=$(git diff main...HEAD --name-only | grep -E "^\.(claude/skills|skills|templates/skills)/" | head -1 || true)
857
+ ```
858
+ If skill files are modified, the quality-checks.sh script automatically runs the three-directory sync check (section 12). If divergence is detected, this blocks `READY_FOR_MERGE` — verdict becomes `AC_MET_BUT_NOT_A_PLUS` with a note to run `npx tsx scripts/check-skill-sync.ts --fix`.
859
+
841
860
  See [quality-gates.md](references/quality-gates.md) for detailed verdict synthesis.
842
861
 
843
862
  ### Using MCP Tools (Optional)
@@ -385,7 +385,53 @@ else
385
385
  fi
386
386
 
387
387
  # =============================================================================
388
- # 11. Build Verification (cacheable - expensive operation)
388
+ # =============================================================================
389
+ # 11.5. Skill Sync Check (when skill files modified)
390
+ # =============================================================================
391
+ echo ""
392
+ skill_files_changed=$(git diff main...HEAD --name-only | grep -E '^\.(claude/skills|skills|templates/skills)/' || true)
393
+ if [[ -n "$skill_files_changed" ]]; then
394
+ echo "🔍 Checking three-directory skill sync..."
395
+ if [[ -f "scripts/check-skill-sync.ts" ]]; then
396
+ sync_output=$(npx tsx scripts/check-skill-sync.ts 2>&1 || true)
397
+ sync_exit=$?
398
+ sync_summary=$(echo "$sync_output" | grep "^Summary:" || true)
399
+ if [[ $sync_exit -ne 0 ]]; then
400
+ echo "⚠️ Skill sync: DIVERGENCE DETECTED"
401
+ echo "$sync_summary"
402
+ echo " Run: npx tsx scripts/check-skill-sync.ts --fix"
403
+ else
404
+ echo "✅ Skill sync: All files synced across 3 directories"
405
+ fi
406
+ else
407
+ echo " (scripts/check-skill-sync.ts not found — using inline diff)"
408
+ diverged=0
409
+ for f in $skill_files_changed; do
410
+ if [[ "$f" == .claude/skills/* ]]; then
411
+ rel="${f#.claude/skills/}"
412
+ for mirror in "templates/skills" "skills"; do
413
+ if [[ -f "${mirror}/${rel}" ]]; then
414
+ if ! diff -q ".claude/skills/${rel}" "${mirror}/${rel}" > /dev/null 2>&1; then
415
+ echo " ⚠️ DIVERGED: ${rel} (.claude/skills vs ${mirror})"
416
+ diverged=$((diverged + 1))
417
+ fi
418
+ fi
419
+ done
420
+ fi
421
+ done
422
+ if [[ $diverged -eq 0 ]]; then
423
+ echo "✅ Skill sync: Changed skill files are synced"
424
+ else
425
+ echo "⚠️ Skill sync: ${diverged} file(s) diverged"
426
+ echo " Fix: copy from .claude/skills/ to templates/skills/ and skills/"
427
+ fi
428
+ fi
429
+ else
430
+ echo "🔍 Skill sync: No skill files changed (skipped)"
431
+ fi
432
+
433
+ # =============================================================================
434
+ # 12. Build Verification (cacheable - expensive operation)
389
435
  # =============================================================================
390
436
 
391
437
  verify_build_against_main() {