@gobing-ai/spur 0.3.48 → 0.3.49

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.
Files changed (29) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/config.example.yaml +52 -4
  3. package/config/workflows/pr-review.yaml +338 -0
  4. package/package.json +8 -8
  5. package/plugins/sp/README.md +9 -6
  6. package/plugins/sp/commands/{dev-featurechange.md → dev-feature-change.md} +7 -10
  7. package/plugins/sp/commands/dev-find-issue.md +24 -19
  8. package/plugins/sp/commands/dev-find-next.md +3 -3
  9. package/plugins/sp/commands/dev-gtd.md +11 -12
  10. package/plugins/sp/commands/dev-history-load.md +63 -0
  11. package/plugins/sp/commands/dev-pr-review.md +39 -0
  12. package/plugins/sp/plugin.json +1 -1
  13. package/plugins/sp/references/roles.md +25 -12
  14. package/plugins/sp/scripts/history-load.ts +400 -0
  15. package/plugins/sp/scripts/pr-reviewing.ts +867 -0
  16. package/plugins/sp/scripts/validate-commands.ts +33 -2
  17. package/plugins/sp/skills/code-implementation/SKILL.md +9 -1
  18. package/plugins/sp/skills/code-verification/SKILL.md +27 -28
  19. package/plugins/sp/skills/issue-finding/SKILL.md +6 -5
  20. package/plugins/sp/skills/issue-finding/references/session-formats.md +4 -2
  21. package/plugins/sp/skills/next-feature/SKILL.md +6 -6
  22. package/plugins/sp/skills/next-feature/references/handoff-routing.md +5 -5
  23. package/plugins/sp/skills/next-feature/references/signal-derivation.md +7 -2
  24. package/plugins/sp/skills/pr-reviewing/SKILL.md +285 -0
  25. package/plugins/sp/skills/spur-cli/references/features/hierarchy-mece.md +5 -5
  26. package/plugins/sp/skills/spur-cli/references/features.md +1 -1
  27. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +14 -4
  28. package/schemas/spur-config.schema.json +20 -0
  29. package/spur.js +682 -222
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: "Render the session-forensics report from imported history data (8 CLI-derivable sections plus 6 model-authored), identify bottlenecks and behavioral anti-patterns, and optionally create a structured fix task behind --create-task. Triggers: post-mortem, performance analysis, session review, find issues, identify bottlenecks"
3
3
  role: reviewer
4
- argument-hint: "[<topic>] [--sessions <glob>] [--source <auto|omp|claude|codex|gemini|opencode|antigravity|openclaw|pi>] [--feature <id>] [--template <meta|issue|standard>] [--priority <P0|P1|P2|P3>] [--severity <S0|S1|S2>] [--category <list>] [--since <iso>] [--until <iso>] [--top <n>] [--min-cost <duration>] [--strict-topic] [--create-task] [--agent <inline|auto|name>] [--json]"
4
+ argument-hint: "[<topic>] [--sessions <glob>] [--source <auto|pi|claude|codex|gemini|opencode|antigravity|openclaw|omp|grok|agy|all>] [--feature <id>] [--template <meta|issue|standard>] [--priority <P0|P1|P2|P3>] [--severity <S0|S1|S2>] [--category <list>] [--since <iso>] [--until <iso>] [--top <n>] [--min-cost <duration>] [--strict-topic] [--create-task] [--agent <inline|auto|name>] [--json]"
5
5
  allowed-tools: ["Bash", "Read", "Write", "Grep", "Glob", "Skill"]
6
6
  ---
7
7
 
@@ -14,24 +14,24 @@ task file via `spur task create`.
14
14
 
15
15
  ## Argument Flags
16
16
 
17
- | Flag | Description | Default |
18
- | ------------------------------------------------------------------------------------ | ------------------------------------ | ---------- |
19
- | `[<topic>]` | Narrow the analysis to a topic. | omitted |
20
- | `--sessions` `<glob>` | Session log glob (fallback input). | recent |
21
- | `--source` `<auto\|omp\|claude\|codex\|gemini\|opencode\|antigravity\|openclaw\|pi>` | Agent source to scan. | auto |
22
- | `--feature` `<id>` | Attach the generated task to a feature. | omitted |
23
- | `--template` `<meta\|issue\|standard>` | Task template shape (`--create-task` only). | standard |
24
- | `--priority` `<P0\|P1\|P2\|P3>` | Filter / assign task priority. | P2 |
25
- | `--severity` `<S0\|S1\|S2>` | Filter / assign severity. | all |
26
- | `--category` `<list>` | Comma list of categories to keep. | all |
27
- | `--since` `<iso>` | Start of the scan window. | configured |
28
- | `--until` `<iso>` | End of the scan window. | now |
29
- | `--top` `<n>` | Limit to top N findings. | omitted |
30
- | `--min-cost` `<duration>` | Minimum wasted duration to report. | omitted |
31
- | `--strict-topic` | Drop findings off-topic. | off |
32
- | `--create-task` | Generate a fix task for findings. | off |
33
- | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing analysis. | omit |
34
- | `--json` | Emit structured JSON. | off |
17
+ | Flag | Description | Default |
18
+ | ---------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | ---------- |
19
+ | `[<topic>]` | Narrow the analysis to a topic. | omitted |
20
+ | `--sessions` `<glob>` | Session log glob (fallback input). | recent |
21
+ | `--source` `<auto\|pi\|claude\|codex\|gemini\|opencode\|antigravity\|openclaw\|omp\|grok\|agy\|all>` | Agent source to scan (CLI vocabulary; `all` fans out, `auto` resolves at runtime). | auto |
22
+ | `--feature` `<id>` | Attach the generated task to a feature. | omitted |
23
+ | `--template` `<meta\|issue\|standard>` | Task template shape (`--create-task` only); `issue` is the explicit single-finding override, `standard` the generic override. | meta |
24
+ | `--priority` `<P0\|P1\|P2\|P3>` | Filter / assign task priority. | P2 |
25
+ | `--severity` `<S0\|S1\|S2>` | Filter / assign severity. | all |
26
+ | `--category` `<list>` | Comma list of categories to keep. | all |
27
+ | `--since` `<iso>` | Start of the scan window. | configured |
28
+ | `--until` `<iso>` | End of the scan window. | now |
29
+ | `--top` `<n>` | Limit to top N findings. | omitted |
30
+ | `--min-cost` `<duration>` | Minimum wasted duration to report. | omitted |
31
+ | `--strict-topic` | Drop findings off-topic. | off |
32
+ | `--create-task` | Generate a fix task for findings. | off |
33
+ | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing analysis. | omit |
34
+ | `--json` | Emit structured JSON. | off |
35
35
 
36
36
  For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
37
37
 
@@ -52,6 +52,11 @@ the history data plane is now the primary source (no flag needed), and the old r
52
52
  is the new default. Raw JSONL remains a fallback under the three conditions documented in
53
53
  `sp:issue-finding`.
54
54
 
55
+ **Data-plane preflight.** Forensics read the imported history plane as-is. If findings come back
56
+ empty or stale, run `/sp:dev-history-load` (on-demand cumulative `spur history import` + analyze,
57
+ checkpoint resume — task 0567) before re-running forensics; it owns the interactive preflight, while
58
+ `spur history daily` owns the periodic cadence.
59
+
55
60
  **See also:** skill `sp:issue-finding` (SSOT), `/sp:dev-runall`, `/sp:dev-dogfood`,
56
61
  `sp:daily-summary`, `sp:reverse-engineering`.
57
62
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Prompt-first feature frontier prioritizer — answers 'which feature should we work on now?' with a ranked, evidence-carrying frontier, and emits rank-distorting tree defects as proposals /sp:dev-featurechange consumes. Triggers: find next, which feature, feature ranking, frontier priority, what should I work on."
2
+ description: "Prompt-first feature frontier prioritizer — answers 'which feature should we work on now?' with a ranked, evidence-carrying frontier, and emits rank-distorting tree defects as proposals /sp:dev-feature-change consumes. Triggers: find next, which feature, feature ranking, frontier priority, what should I work on."
3
3
  role: planner
4
4
  argument-hint: "[--task [<feature-id>]] [--agent <inline|auto|name>] [--auto] [--json]"
5
5
  allowed-tools: ["Bash", "Read", "Write", "Grep", "Glob", "Skill"]
@@ -13,7 +13,7 @@ instead of ranking them, and emits tree structure defects as proposals only.
13
13
 
14
14
  Answers *"which X"* — the question `/sp:dev-next` deliberately does not (next-router routing-table
15
15
  §0 step 1c). Advancing a chosen target remains `/sp:dev-next`'s job; applying tree changes remains
16
- `/sp:dev-featurechange`'s job.
16
+ `/sp:dev-feature-change`'s job.
17
17
 
18
18
  ## Argument Flags
19
19
 
@@ -55,7 +55,7 @@ Without `--task` the command is read-only with respect to the corpus and docs. U
55
55
  only mutation is the one the dispatched commands perform on `docs/tasks*/` after confirm (or
56
56
  auto-accept) — the command still performs no `spur feature move`, no sync apply, and no write under
57
57
  `docs/features/**`. Defect proposals conform to the `docs/plans/feature-tree-restructure-map.md`
58
- schema and are applied only through `/sp:dev-featurechange` (dry-run → confirm → apply).
58
+ schema and are applied only through `/sp:dev-feature-change` (dry-run → confirm → apply).
59
59
 
60
60
  **See also:** skill `sp:next-feature` (SSOT), `sp:next-router` (`/sp:dev-next`),
61
61
  `sp:conflict-finding` (the prompt-first template), `sp:spur-cli`.
@@ -1,15 +1,15 @@
1
1
  ---
2
- description: Get things done — quality gate → fix → act CI simulation → commit → push → gh verify in one flow
2
+ description: Get things done — quality gate → fix → commit → push → gh verify in one flow (optional act CI simulation via --act)
3
3
  role: coder
4
- argument-hint: "[<quality-gate-command>] [--dry-run] [--skip-act] [--no-push] [--no-verify] [--scope <path>] [--max-retry <n>]"
4
+ argument-hint: "[<quality-gate-command>] [--dry-run] [--act] [--no-push] [--no-verify] [--scope <path>] [--max-retry <n>]"
5
5
  allowed-tools: ["Bash", "Read", "Write", "Edit", "Grep", "Glob"]
6
6
  ---
7
7
 
8
8
  # Dev GTD
9
9
 
10
10
  Self-contained end-to-end delivery command: local quality gate (auto-fix via `/sp:dev-fixall`),
11
- local CI/CD simulation via `act`, conventional commit message generation, commit, push, and
12
- GitHub push-success verification via `gh`. Designed to stand alone (no backing skill); once mature
11
+ optional local CI/CD simulation via `act` (`--act` only), conventional commit message generation,
12
+ commit, push, and GitHub push-success verification via `gh`. Designed to stand alone (no backing skill); once mature
13
13
  it supersedes `/sp:dev-gitmsg` and is absorbed into the shared command structure.
14
14
 
15
15
  ## Argument Flags
@@ -18,7 +18,7 @@ it supersedes `/sp:dev-gitmsg` and is absorbed into the shared command structure
18
18
  | --- | --- | --- |
19
19
  | `<quality-gate-command>` | Local quality gate to run first; on failure, invoke `/sp:dev-fixall "<cmd>"` to fix all issues automatically. | `bun run check` |
20
20
  | `--dry-run` | Generate the git message and plan only — no commit, push, or gh verify. | off |
21
- | `--skip-act` | Skip the local `act` CI/CD simulation step. | off |
21
+ | `--act` | Run local `act` CI/CD simulation before commit (heavy: launches Docker). Default off — stage 6 `gh` verify covers real CI post-push. Reach for it on workflow edits, dependency bumps, infra changes. Independent of `--dry-run`: `--dry-run --act` still runs the simulation. | off |
22
22
  | `--no-push` | Commit but do not git push or gh-verify. | off |
23
23
  | `--no-verify` | Push but skip the `gh` push-success verification. | off |
24
24
  | `--scope <path>` | Scope the commit-message diff analysis to a path. | all staged changes |
@@ -28,7 +28,7 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
28
28
 
29
29
  ## Usage
30
30
 
31
- /sp:dev-gtd [<quality-gate-command>] [--dry-run] [--skip-act] [--no-push] [--no-verify] [--scope <path>] [--max-retry <n>]
31
+ /sp:dev-gtd [<quality-gate-command>] [--dry-run] [--act] [--no-push] [--no-verify] [--scope <path>] [--max-retry <n>]
32
32
 
33
33
  ## Implementation
34
34
 
@@ -41,8 +41,9 @@ default `bun run check`. Run it. If it exits non-zero, invoke `/sp:dev-fixall "<
41
41
  re-run the gate. Loop until the gate is clean or `--max-retry` is exhausted. Report what was fixed
42
42
  per file.
43
43
 
44
- **2 — Local CI/CD simulation via `act`.** Confirm Docker is running (`docker info`). On macOS the
45
- repo uses OrbStack if the default context is not ready, use
44
+ **2 — Local CI/CD simulation via `act` (opt-in).** Skip this stage entirely unless `--act` is
45
+ given. When `--act` is given: confirm Docker is running (`docker info`). On macOS the repo uses
46
+ OrbStack — if the default context is not ready, use
46
47
  `DOCKER_HOST=unix://$HOME/.orbstack/run/docker.sock`. Run
47
48
  `act -W .github/workflows/ci.yml -j verify` (or the repo's `bun run verify-gha-ci`); prefer
48
49
  `--container-architecture` matching your host when the runner pulls a foreign platform. If a step
@@ -57,10 +58,8 @@ If the build failure includes `TS2307: Cannot find module` on a workspace packag
57
58
  resolve Bun workspace packages because Bun does not create `node_modules/@scope/` symlinks.
58
59
  The real GitHub CI runner passes. **Do not** modify the build infrastructure to work around this
59
60
  `act`-specific issue. Instead, emit a clear message:
60
- `⚠ act CI simulation failed on workspace resolution — this is a container-environment artifact. Re-run with --skip-act to skip this step.`
61
- Then stop the run (this stage failed). The operator can use `--skip-act` to proceed.
62
-
63
- Skip this stage entirely when `--skip-act` is given.
61
+ `⚠ act CI simulation failed on workspace resolution — this is a container-environment artifact. Re-run without --act to skip this step (it is opt-in).`
62
+ Then stop the run (this stage failed). The operator can proceed by re-running without `--act`.
64
63
 
65
64
  **3 — Generate a conventional commit message.** Follow the gitmsg procedure (the same one
66
65
  `/sp:dev-gitmsg` runs). Run `git diff --cached --stat` (add `-- <path>` when `--scope` is given) for
@@ -0,0 +1,63 @@
1
+ ---
2
+ description: "On-demand cumulative history load + narrowed analyze: run spur history import (checkpoint-resume, additive) then spur history analyze, optionally narrowed to a session/task/window, with optional forensics render. Triggers: load history, import agent conversations, analyze my history, history for this conversation"
3
+ role: scribe
4
+ argument-hint: "[--source <name>] [--session <id>] [--task <wbs>] [--since <iso>] [--until <iso>] [--report] [--dry-run] [--json]"
5
+ allowed-tools: ["Bash", "Read"]
6
+ ---
7
+
8
+ # Dev History Load
9
+
10
+ Runs the on-demand history load+analyze sequence: `spur history import` (all sources, checkpoint
11
+ resume — additive and self-healing) then `spur history analyze`, with narrowing flags routed to the
12
+ verb that accepts them. Wraps the shipped CLI sequence in one discoverable surface; owns no import
13
+ logic, no state, and no cadence.
14
+
15
+ ## Argument Flags
16
+
17
+ | Flag | Description | Default |
18
+ | -------------------- | -------------------------------------------------------------- | -------- |
19
+ | `--source` `<name>` | Agent source to import and analyze (both verbs). | all |
20
+ | `--session` `<id>` | Narrow the analyze to a single session id. | omitted |
21
+ | `--task` `<wbs>` | Narrow the analyze to a single task WBS. | omitted |
22
+ | `--since` `<iso>` | Inclusive lower bound on the analyze window. | omitted |
23
+ | `--until` `<iso>` | Inclusive upper bound on the analyze window. | omitted |
24
+ | `--report` | Render `spur history report --mode forensics` after analyze. | off |
25
+ | `--dry-run` | Preview the sequence; import scans without persisting. | off |
26
+ | `--json` | Emit one JSON result object; no banner text interleaved. | off |
27
+
28
+ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
29
+
30
+ ## Usage
31
+
32
+ ```
33
+ /sp:dev-history-load
34
+ /sp:dev-history-load --source omp --session <session-id>
35
+ /sp:dev-history-load --task <wbs> --since 2026-08-01 --until 2026-08-15
36
+ /sp:dev-history-load --report
37
+ /sp:dev-history-load --dry-run
38
+ /sp:dev-history-load --json
39
+ ```
40
+
41
+ **Cumulative by checkpoint, not by this command.** Re-running imports only newly appended
42
+ conversation data — the shipped import checkpoint resume (task 0470 R6) makes repeat runs additive
43
+ and never double-counts. This command never prunes reports and never re-implements the daily
44
+ pipeline; for the periodic cadence (import-all → analyze → artifact → 90-day prune, self-healing),
45
+ run `spur history daily` instead.
46
+
47
+ **Degraded sources proceed with a warning; fully-failed imports abort (0569).** `spur history
48
+ import` distinguishes fatal from degraded fan-outs by exit code: **exit 1** (every source
49
+ failed) aborts the sequence before analyze and propagates the exit code; **exit 2** (mixed —
50
+ at least one source imported, some skipped malformed rows) proceeds to analyze with a loud
51
+ per-source warning: stderr names each degraded source with its parse/validation error counts
52
+ (human mode), and the `--json` payload carries a `warnings` array with the source, counts, and
53
+ the import step's warning detail. A steady-state degraded source therefore no longer blocks a
54
+ bare run; to scope around one deliberately, use `--source <name>` per source.
55
+
56
+ ## Implementation
57
+
58
+ Run the load-then-analyze sequence per `plugins/sp/scripts/history-load.ts` — import first, analyze
59
+ only after import exits 0, narrowing forwarded to `analyze` only:
60
+
61
+ ```
62
+ bun plugins/sp/scripts/history-load.ts $ARGUMENTS
63
+ ```
@@ -0,0 +1,39 @@
1
+ ---
2
+ description: "Review GitHub PRs with Codex; collect and fix findings."
3
+ role: reviewer
4
+ argument-hint: "[full|submit|collect|fix|rerun|status|rules] [--base <branch>] [--no-wait] [--agent <inline|auto|name>] [<focus>]"
5
+ allowed-tools: ["Bash", "Read", "Skill"]
6
+ ---
7
+
8
+ # Dev PR Review
9
+
10
+ Wraps the **sp:pr-reviewing** skill. The review itself runs on the GitHub PR through Codex
11
+ (`@codex review`) — never through a local Codex review mechanism; the invoking agent orchestrates
12
+ and (in `fix` mode) implements.
13
+
14
+ ## Argument Flags
15
+
16
+ | Flag | Description | Default |
17
+ | --- | --- | --- |
18
+ | `<mode>` | `full\|submit\|collect\|fix\|rerun\|status\|rules` — full: request (deduped) + wait + report; submit: request and stop at pending; collect: report the latest review; fix: validate findings, fix legitimate ones, re-review; rerun: force a fresh review of the pushed HEAD; status: read-only composite; rules: author the repo's `AGENTS.md` `## Code Review Rules`. | full |
19
+ | `--base` `<branch>` | Base branch when a new PR must be created. | existing PR base, else repo default |
20
+ | `--no-wait` | Return pending right after the review request instead of polling. | off |
21
+ | `--agent` `<inline\|auto\|name>` | Who performs model-bearing triage/fix. Omit uses the current agent, `inline` forbids dispatch, `auto` resolves the declared role, and a name pins that executor. This does not change the deterministic workflow/direct route. | omit |
22
+ | `<focus>` | Remaining free text — extra review focus appended to the Codex request (e.g. `security boundaries and transaction idempotency`). | none |
23
+
24
+ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
25
+
26
+ ## Usage
27
+
28
+ /sp:dev-pr-review [full|submit|collect|fix|rerun|status|rules] [--base <branch>] [--no-wait] [--agent <inline|auto|name>] [review focus]
29
+
30
+ ## Implementation
31
+
32
+ - Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
33
+ - Delegate everything: `Skill(skill="sp:pr-reviewing", args="$ARGUMENTS")`. The skill owns mode
34
+ routing, finding triage, fix, and rules authoring; `.spur/workflows/pr-review.yaml` is the SSOT
35
+ for the review spine's state order and guards; the staged `pr-reviewing.ts` is the
36
+ deterministic git/gh core every spine step shells out to.
37
+ - The external review goes through the GitHub PR and an `@codex review` comment only — never local
38
+ Codex review commands. Never force-push, rewrite history, merge the PR, or discard unrelated
39
+ changes; outside `fix` mode, ask before creating any commit.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sp",
3
- "version": "0.3.48",
3
+ "version": "0.3.49",
4
4
  "description": "Spur — a local-first harness engineering toolkit that wraps mainstream coding agents with constraint checking, workflow orchestration, and history analytics.",
5
5
  "extensions": {
6
6
  "pi": ["./hooks/pi/guard-extension.ts"]
@@ -9,10 +9,12 @@ see_also:
9
9
 
10
10
  # Roles — the Layer-1 role-to-tier table
11
11
 
12
- The executor-selection contract is two layers. **Layer 1 (this file)** maps *role → tier* and is
13
- owned by plugin `sp`; **Layer 2** maps *tier executor* and is owned by the operator in
14
- `.spur/config.yaml`. This file never names an executor, a model, or a vendor it declares only
15
- what tier a role's work needs, and the operator's config decides which executor serves that tier.
12
+ The executor-selection contract is two layers. **Layer 1 (this file)** projects *role → tier*;
13
+ its SSOT is `DEFAULT_AGENT_ROLES` in `packages/config/src/index.ts` (task 0572 / ADR-061) this
14
+ file is the agent/human-facing view plus the plugin-owned command→role mapping. **Layer 2** maps
15
+ *tier executor* and is owned by the operator in `.spur/config.yaml`. This file never names an
16
+ executor, a model, or a vendor — it declares only what tier a role's work needs, and the
17
+ operator's config decides which executor serves that tier.
16
18
 
17
19
  The vocabulary is four roles, one per tier:
18
20
 
@@ -36,12 +38,17 @@ collapse, named as people so they stay addressable in `--agent`.
36
38
 
37
39
  ## The table
38
40
 
41
+ <!-- PROJECTION (task 0572 / ADR-061): the tier/stages half of the block below is a generated view
42
+ of DEFAULT_AGENT_ROLES in packages/config/src/index.ts — edit that constant, not this file.
43
+ plugins/sp/tests/roles.test.ts (R9) fails the suite on any drift between the two. The
44
+ `commands:` half is plugin data (command frontmatter is its SSOT). -->
45
+
39
46
  ```yaml
40
47
  version: 1
41
48
  roles:
42
49
  - id: scribe
43
50
  tier: cheap
44
- commands: [dev-gitmsg, dev-handover, dev-daily, dev-changelog, dev-refresh, rule-add, rule-refine, workflow-add, workflow-refine, spur-init]
51
+ commands: [dev-gitmsg, dev-handover, dev-daily, dev-history-load, dev-changelog, dev-refresh, rule-add, rule-refine, workflow-add, workflow-refine, spur-init]
45
52
  stages: [changelog]
46
53
  - id: coder
47
54
  tier: standard
@@ -49,11 +56,11 @@ roles:
49
56
  stages: [implement, test, wrap]
50
57
  - id: reviewer
51
58
  tier: capable-1
52
- commands: [dev-verify, dev-verifyall, dev-review, dev-dogfood, rule-scan, dev-find-conflict, dev-find-issue]
59
+ commands: [dev-verify, dev-verifyall, dev-review, dev-pr-review, dev-dogfood, rule-scan, dev-find-conflict, dev-find-issue]
53
60
  stages: [verify, review, dogfood]
54
61
  - id: planner
55
62
  tier: capable-2
56
- commands: [dev-plan, dev-refine, dev-brainstorm, dev-idea, dev-runall, dev-parallel, dev-next, dev-arch, dev-refineall, dev-find-next, dev-featurechange]
63
+ commands: [dev-plan, dev-refine, dev-brainstorm, dev-idea, dev-runall, dev-parallel, dev-next, dev-arch, dev-refineall, dev-find-next, dev-feature-change]
57
64
  stages: [plan, refine, brainstorm]
58
65
  ```
59
66
 
@@ -81,13 +88,19 @@ must not sit below the highest `min_tier` among its folded stages.
81
88
  `refine`, `brainstorm`.
82
89
 
83
90
  **Placement notes (directory closure, task 0535).** The decided four-row table listed 31 commands;
84
- the live `plugins/sp/commands/` directory has 37. The six additional commands were placed by the
91
+ the live `plugins/sp/commands/` directory has 39. The six additional commands were placed by the
85
92
  same stage logic: `dev-refineall` folds `refine` → planner; `dev-find-next` is planning-side
86
- frontier work → planner; `dev-featurechange` is planning-half corpus surgery on the feature tree →
93
+ frontier work → planner; `dev-feature-change` is planning-half corpus surgery on the feature tree →
87
94
  planner; `dev-gtd` is the execution/delivery flow → coder; `dev-find-conflict` and `dev-find-issue`
88
- are audits/analysis → reviewer (same reasoning as `rule-scan`).
95
+ are audits/analysis → reviewer (same reasoning as `rule-scan`). Later additions: `dev-history-load`
96
+ is mechanical load+analyze orchestration → scribe; `dev-pr-review` is review orchestration —
97
+ driving the external PR review and triaging its findings folds the `review` stage → reviewer.
89
98
 
90
99
  **Consistency is a test, not a convention.** `plugins/sp/tests/roles.test.ts` parses this YAML and
91
100
  asserts the tier-distinctness, command closure, stage-floor, and boundary invariants against the
92
- real command directory, the real stage registry, and the real operator config. When the table and
93
- the registry disagree, fix the table or the registry never the test.
101
+ real command directory, the real stage registry, and the real operator config plus parity with
102
+ `DEFAULT_AGENT_ROLES` (R9, 0572): the table above must equal the code SSOT byte-for-byte on
103
+ id/tier/stages. When the table and the registry disagree, fix the table or the registry — never the
104
+ test. When the table and `DEFAULT_AGENT_ROLES` disagree, fix the constant (or regenerate this view).
105
+ A project may re-tier/re-stage a role at config time via `agent.roles` (closed vocabulary) — that
106
+ override never flows back into this file.