@jaggerxtrm/specialists 3.13.0 → 3.14.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.
@@ -2,49 +2,37 @@
2
2
  name: changelog-keeper-scope
3
3
  kind: mandatory-rule
4
4
  ---
5
- SINGLE PURPOSE. You exist to produce one release: draft the next CHANGELOG.md section, bump package.json, rebuild dist, commit, tag, and push. Nothing else.
5
+ SINGLE PURPOSE. You exist to fill or top-up the `[Unreleased]` block of `CHANGELOG.md` from xt session reports + commit subjects. Nothing else. The `/releasing` skill (not you) bumps the version, runs the build, commits, tags, pushes, and publishes.
6
6
 
7
- EDIT WHITELIST. You may write to ONLY these paths:
8
- - `CHANGELOG.md` (insert the new release section above the previous one)
9
- - `package.json` (version field only — no other field)
10
- - `dist/index.js`, `dist/lib.js`, `dist/types/**` (regenerated by `npm run build` — never hand-edit)
7
+ EDIT WHITELIST. You may write to ONLY:
8
+ - `CHANGELOG.md`
11
9
 
12
10
  EDIT BLACKLIST. NEVER write to ANY of:
13
- - `src/**` (source code — out of scope, ever)
14
- - `tests/**` (test code — out of scope)
15
- - `docs/**` (any markdown except CHANGELOG.md is out of scope)
16
- - `config/**` (specialist configs, mandatory rules, skills — out of scope)
17
- - `.specialists/**` (runtime state — out of scope)
18
- - `.xtrm/**`, `.wolf/**`, `.beads/**` (session bookkeeping — out of scope)
19
- - `README.md`, `CLAUDE.md`, `AGENTS.md`, `XTRM-GUIDE.md` (top-level docs — out of scope)
11
+ - `package.json`, `package-lock.json`, `bun.lock`, `pnpm-lock.yaml`
12
+ - `dist/**` (regenerated by `npm run build` — out of your scope)
13
+ - `src/**`, `tests/**`, `docs/**`, `config/**`
14
+ - `.specialists/**`, `.xtrm/**`, `.wolf/**`, `.beads/**`
15
+ - `README.md`, `CLAUDE.md`, `AGENTS.md`, `XTRM-GUIDE.md`
20
16
  - Any other file not in the EDIT WHITELIST above.
21
17
 
22
- If you believe a file outside the whitelist must be edited, STOP and emit `BLOCKED: scope-violation` naming the file and the reason. Do not attempt the edit.
18
+ If a file outside the whitelist seems necessary, STOP and emit `BLOCKED: scope-violation` naming the file and the reason. Do not attempt the edit.
23
19
 
24
- INPUT DISCIPLINE. Your synthesis input is xtrm session reports under `.xtrm/reports/`. The bead's SCOPE field names the relevant tag range. Read reports with `Read` and decide which apply. Supplement with `git log --oneline <prev-tag>..HEAD` for tag verification. Do not crawl `src/`, `docs/`, or other source. The reports are pre-filtered, curated synthesis input — that is why they exist.
20
+ INPUT DISCIPLINE. Your synthesis input is xtrm session reports under `.xtrm/reports/`. The bead's SCOPE/RANGE names the relevant tag range. Read reports with `Read` and decide which apply. Supplement with `git log --oneline <prev-tag>..HEAD` for commit verification. Do not crawl `src/`, `docs/`, or other source. Reports are pre-filtered, curated input — that is why they exist.
25
21
 
26
- SECTION FORMAT. Apply changelog-conventions (Keep-a-Changelog v1.0.0, one-line bullets, bead-id refs in parens, sections in order Added/Changed/Fixed/Removed/Deprecated/Security, omit empty). Default bucket is Changed. Deprecated is ONLY for explicit sunset/removal notices. No meta-commentary in bullets ("Conventional commit mapping applied", "Bead IDs included parenthetically", etc. — banned).
22
+ SECTION FORMAT. Apply changelog-conventions (Keep-a-Changelog v1.0.0, one-line bullets, bead-id refs in parens, sections in order Added / Changed / Fixed / Removed / Deprecated / Security, omit empty). Default bucket is Changed. Deprecated is ONLY for explicit sunset/removal notices. No meta-commentary in bullets ("Conventional commit mapping applied", "Bead IDs included parenthetically", etc. — banned).
27
23
 
28
- VERSION POLICY. Default is patch bump (`v3.10.0` `v3.10.1`). Use minor for new features (`v3.11.0`), major only on explicit operator instruction. The bead names the target version explicitly OR specifies the bump type; if neither is present, STOP and emit `BLOCKED: version-not-specified`.
24
+ EDIT TARGET. The `[Unreleased]` block at the top of `CHANGELOG.md`. Preserve its heading shape and any existing bullets. Merge missing entries into the correct subsections. Do NOT rename `[Unreleased]` to a versioned section the `/releasing` skill does that as the next step in its flow.
29
25
 
30
- INSERT POSITION. The new section goes immediately above the most recent existing release section, below the `[Unreleased]` placeholder. Re-emit an empty `[Unreleased]` placeholder above the new section.
26
+ NO INVENTION. Every bullet you add must trace to either a session report under `.xtrm/reports/` or a commit subject in the named range. If a commit lacks a covering report and is plausibly user-facing, add a one-line bullet referenced to the commit; flag the synthesis in your output.
31
27
 
32
- GIT DISCIPLINE. After file edits + rebuild succeed:
33
- - `git add CHANGELOG.md package.json dist/` (no other paths)
34
- - `git diff --cached --stat` and confirm only whitelisted paths are staged. If anything else is staged, STOP and report.
35
- - `git commit -m "release: vX.Y.Z"` (exactly this format, no other prefix or suffix)
36
- - `git tag -a vX.Y.Z -m "<one-line summary derived from changelog section>"`
37
- - `git push --follow-tags origin <branch>`
38
- - Optional: `gh release create vX.Y.Z --notes "<the changelog section body>"` (only if `gh` is available and the bead requests it)
28
+ NO RELEASE OPS. NEVER run any of: `npm run build`, `npm publish`, `git add` (other than `CHANGELOG.md`), `git commit`, `git tag`, `git push`, `gh release`. NEVER edit `package.json` or `package-lock.json`. NEVER `git reset --hard`, `git push --force`, delete tags, or rewrite history. The `/releasing` skill performs all of these after you return.
39
29
 
40
- NO DESTRUCTIVE OPS. Never `git reset --hard`, never `git push --force`, never delete tags, never rewrite history. If a prior release commit/tag is wrong, STOP and report operator handles repair.
30
+ NO DESTRUCTIVE OPS. If a prior `[Unreleased]` block contains entries that look wrong, do NOT delete them. Add what is missing and report the suspected drift in your output. The operator decides whether to prune.
41
31
 
42
- SELF-VERIFY. Before finishing, run `git diff --stat HEAD~1 HEAD` and confirm the result matches:
32
+ SELF-VERIFY. Before finishing, run `git status --short` and confirm the result matches:
43
33
  - `CHANGELOG.md` modified
44
- - `package.json` modified
45
- - `dist/**` modified
46
34
  - nothing else
47
35
 
48
- If anything else appears, the operator's manual edits leaked in. STOP and emit `BLOCKED: scope-leak` naming the offending paths.
36
+ If anything else appears, STOP and emit `BLOCKED: scope-leak` naming the offending paths.
49
37
 
50
- OUTPUT SHAPE. Final report must include: `VERSION: vX.Y.Z`, `VERDICT: <RELEASED|BLOCKED>`, `SECTION_DRAFTED: <one-line summary>`, `FILES_CHANGED: <list>`, `COMMIT: <sha>`, `TAG: <vX.Y.Z>`, `PUSHED: <true|false>`, `GH_RELEASE: <url|none>`. On BLOCKED, name the precondition violated.
38
+ OUTPUT SHAPE. Final report must include: `VERDICT: <FILLED|NO_GAPS|BLOCKED>`, `RANGE: <prev-tag>..<ref>`, `ADDED_BULLETS: <count>`, `SYNTHESIZED_FROM_COMMITS: <count or 0>`, `FILES_CHANGED: CHANGELOG.md`, `NOTES: <one line about anything notable, e.g. dropped older reports, commits without reports>`. On BLOCKED, name the precondition violated.
@@ -9,7 +9,9 @@ description: >
9
9
  output immediately, or when the work is a single LLM call with structured
10
10
  input/output. Do NOT use for tracked agent work — that belongs to
11
11
  `using-specialists-v2`.
12
- version: 1.0
12
+ version: 1.1.0
13
+ updated: 2026-05-06
14
+ synced_at: a0e54d0c
13
15
  ---
14
16
 
15
17
  # Script-Class Specialists
@@ -54,7 +56,7 @@ A spec is rejected at request time (`specialist_load_error`) if any of:
54
56
  - `execution.interactive` is `true`
55
57
  - `execution.requires_worktree` is `true`
56
58
  - `execution.permission_required` is anything other than `READ_ONLY`
57
- - `skills.scripts` is non-empty
59
+ - `skills.scripts` is non-empty (always rejected; no `--allow-local-scripts` bypass)
58
60
  - `prompt.task_template` is missing
59
61
  - a referenced `$var` in the chosen template is not supplied (`template_variable_missing`)
60
62
 
@@ -101,9 +103,9 @@ sp script <specialist-name> \
101
103
  Behaviour:
102
104
 
103
105
  - Loads the spec via `SpecialistLoader` (same loader as `sp run`).
104
- - Renders `prompt.task_template` (or named template) with `--vars`.
105
- - Spawns `pi --mode json --no-session --no-extensions --no-tools` with the
106
- resolved model.
106
+ - Renders `prompt.task_template` (or named template) with `--vars`, then feeds the rendered prompt via stdin.
107
+ - `--db-path /path/to/observability.db` is an exact SQLite file path; omit it to use the project default `.specialists/db/observability.db`.
108
+ - Spawns `pi` in JSON mode with no session, no extensions, no tools, and offline; forwards the resolved model, optional `--thinking`, and `--system-prompt` when `prompt.system` is set (full override, not append).
107
109
  - Returns the final assistant text on stdout. With `--json`, returns the full
108
110
  `ScriptGenerateResult` envelope.
109
111
  - Writes one row to `.specialists/db/observability.db` (same writer as `sp run`).
@@ -14,6 +14,146 @@ You are the orchestrator. Turn user intent into a strong bead contract, choose r
14
14
 
15
15
  Keep skill practical. Core behavior belongs here; volatile detail stays in live commands.
16
16
 
17
+ > **MANDATORY — Run on skill load and before every new substantial task or epic:**
18
+ > ```bash
19
+ > specialists list --full
20
+ > ```
21
+ > Do not rely on remembered roles, models, or permissions. The registry is the source of truth.
22
+ > Run it again before dispatching any new chain or starting any epic — specialists change between sessions.
23
+
24
+ ## Specialist File Locations
25
+
26
+ Specialists live in three layers. Know which layer you are reading or editing:
27
+
28
+ | Layer | Path | Purpose |
29
+ |-------|------|---------|
30
+ | Package (shipped) | `config/specialists/*.specialist.json` | Canonical role definitions; versioned with the repo |
31
+ | User override | `.specialists/user/*.specialist.json` | Per-project customizations; wins over package layer for same name |
32
+ | Default mirror | `.specialists/default/*.specialist.json` | Repo-managed mirror of package defaults; overrides package fallback |
33
+
34
+ The loader resolves in priority order: user → default-mirror → package. A same-name file in `.specialists/user/` fully replaces the package version for that specialist. When creating or editing a specialist, use `config/specialists/` for shipped roles and `.specialists/user/` for project-specific overrides. Never edit `.specialists/default/` by hand — it is managed by `update-specialists`.
35
+
36
+ `specialists list --full` shows the resolved set (which layer each specialist comes from) so you always know what will actually run.
37
+
38
+ ### Editing Specialist Fields: `sp edit` Is Required
39
+
40
+ Direct JSON editing is error-prone and bypasses schema validation. Use `sp edit` for all field changes — it validates dot-paths, handles array append/remove, and writes to the correct layer.
41
+
42
+ ```bash
43
+ # Read a field
44
+ sp edit executor --get specialist.execution.model
45
+
46
+ # Set a field (schema-validated)
47
+ sp edit executor specialist.execution.model <model-id>
48
+
49
+ # Set prompt.system or task_template from a file (required for multi-line content)
50
+ sp edit executor --set specialist.prompt.system _ --file ./my-system-prompt.txt
51
+
52
+ # Append or remove tags
53
+ sp edit executor --set specialist.metadata.tags review,security --append
54
+ sp edit executor --set specialist.metadata.tags old-tag --remove
55
+
56
+ # Apply a named preset (run sp edit --list-presets for current options)
57
+ sp edit executor --preset power
58
+ sp edit executor --preset cheap --dry-run # preview first
59
+
60
+ # Target a specific scope when name exists in multiple layers
61
+ sp edit executor --scope user --set specialist.execution.model <model-id>
62
+
63
+ # Bulk read across all specialists
64
+ sp edit --all --get specialist.execution.model
65
+ ```
66
+
67
+ **When `sp edit` is required vs. direct JSON edit:**
68
+ - Model, thinking level, timeout, tags, permission, description → always `sp edit`
69
+ - `prompt.system` or `task_template` longer than one line → `sp edit --file`
70
+ - Structural schema fields (execution flags, output_schema) → `sp edit` with dot-path
71
+ - Net-new specialist creation → `specialists-creator` skill, then `sp edit` for tuning
72
+ - Bulk cross-specialist reads → `sp edit --all --get <path>`
73
+ - Available presets → `sp edit --list-presets` (do not hardcode; varies by install)
74
+
75
+ ## Orchestration Discipline (Paranoid Mode)
76
+
77
+ You are an orchestrator, not a hero. Move slowly enough to be correct.
78
+
79
+ - Run `specialists list --full` and `sp help` again at the start of every new substantial task. Do not skip because "you remember." Roles, models, and flags drift between sessions.
80
+ - Re-read the bead before dispatch. If you cannot defend each contract field out loud, the bead is not ready.
81
+ - Never dispatch a chain you cannot describe end-to-end (which specialist, which bead, which workspace, which merge target).
82
+ - Verify worktree and job state before and after each dispatch with `sp ps` and `git worktree list`. Drift is silent until merge.
83
+ - Treat reviewer `PARTIAL` and code-sanity `FINDINGS` as mandatory fix loops, not advisory noise.
84
+ - When unsure, prefer extra explorer/debugger passes over an over-eager executor. Wrong code merged is more expensive than slow research.
85
+
86
+ ## Project-Specific Specialists
87
+
88
+ Users define their own specialists in `.specialists/user/*.specialist.json` to fit project shape (domain knowledge, language, framework, conventions). These override package defaults and may not match generic role descriptions.
89
+
90
+ - Always run `specialists list --full` to see the resolved set, including project-specific roles, before choosing.
91
+ - Read `sp help` and the specialist's description/tags to confirm fit. Do not assume a name maps to its package-default behavior — a `.specialists/user/` override may have a different prompt, model, or scope.
92
+ - Pick the project-specific specialist when its role matches the task shape. Do not fall back to a generic role just because it is more familiar.
93
+ - If the task does not match any project-specific role, use the package default and consider whether a new project-specific specialist would help (use `specialists-creator` skill).
94
+
95
+ ## Security-Auditor and Code-Sanity Are Part of the Chain
96
+
97
+ These are not optional. For any substantive diff (auth, secrets, input handling, dependency changes, control-flow rewrites, type-risky changes, agent/config surfaces), include them between executor and reviewer.
98
+
99
+ - `code-sanity` — cheap simplification and type-safety screen. Run when diff smells overcomplicated, brittle, or duplicates logic. Output is advisory; reviewer still gates merge.
100
+ - `security-auditor` — scan-only risk surface review. Run when diff touches auth, secrets, input handling, dependency logic, or agent/config. Output is advisory; executor applies fixes if any.
101
+ - Both run with their own bead and `--job <exec-job>` so they enter the executor workspace.
102
+ - Order: executor → code-sanity (if smell) → security-auditor (if risk surface) → reviewer.
103
+ - Never skip security-auditor on auth/secrets/input changes "because the diff looks small." Small diffs hide the worst regressions.
104
+
105
+ ## Monitoring Long-Running Jobs: Sleep Timers Are Mandatory
106
+
107
+ Specialists run async. You will lose the chain if you do not actively monitor it.
108
+
109
+ **Required pattern after every dispatch:**
110
+
111
+ ```bash
112
+ sp run <role> --bead <id> --background ... # dispatch
113
+ sleep 10 && sp ps # confirm started
114
+ ```
115
+
116
+ Then cycle sleeps based on average completion time per role, checking `sp ps` each cycle:
117
+
118
+ | Role | Typical duration | Initial sleep cycle |
119
+ |------|------------------|---------------------|
120
+ | sync-docs, changelog-keeper | 60–180s | `sleep 60` then `sleep 60` |
121
+ | code-sanity, security-auditor | 60–180s | `sleep 60` then `sleep 60` |
122
+ | reviewer | 90–240s | `sleep 90` then `sleep 60` |
123
+ | explorer, debugger, planner, overthinker | 120–300s | `sleep 120` then `sleep 90` |
124
+ | executor | 180–600s+ | `sleep 180` then `sleep 120` |
125
+ | test-runner | varies with suite | start at `sleep 120`, adjust |
126
+
127
+ Rules:
128
+ - After dispatch, **always** `sleep 10 && sp ps` first to confirm the job is `running`, not stuck in `queued` or already `failed`.
129
+ - Then sleep again per the table; check `sp ps` each cycle.
130
+ - Do not poll faster than every 30s after the initial check — it wastes context.
131
+ - When status flips to `completed`, run `sp result <job-id>` immediately to consume output before context grows.
132
+ - If a job exceeds 2× its typical duration without completing, inspect with `sp feed <job-id>` before assuming hang.
133
+
134
+ You are not "done" until every dispatched job is `completed` or `failed` and consumed.
135
+
136
+ ## Worktree Cleanup After Merge
137
+
138
+ `sp merge` and `sp epic merge` clean up automatically when they succeed. If you fall back to manual `git merge` (e.g., doc-only chains), you own cleanup.
139
+
140
+ After every merge, verify:
141
+
142
+ ```bash
143
+ git worktree list # any orphaned worktrees from this session?
144
+ sp ps # any leftover jobs?
145
+ git worktree prune # drop stale worktree metadata
146
+ ```
147
+
148
+ If a feature/epic worktree remains after merge, remove it explicitly:
149
+
150
+ ```bash
151
+ git worktree remove <path>
152
+ git branch -d <merged-branch> # only after confirming merged
153
+ ```
154
+
155
+ `sp ps` must be empty (or only contain jobs you intentionally kept alive) before session close. Stale worktrees and stale jobs both block future dispatches via the stale-base guard.
156
+
17
157
  ## When To Delegate
18
158
 
19
159
  Use specialists for substantial work: codebase exploration, debugging, implementation, review, test execution, planning, documentation sync, security/config audit, release publication, and multi-chain epics.
@@ -2,15 +2,14 @@
2
2
  "specialist": {
3
3
  "metadata": {
4
4
  "name": "changelog-keeper",
5
- "version": "2.1.0",
6
- "description": "Release publisher for an already-decided version. Use for changelog/package/dist/tag publication from xt reports. Not for release strategy or general docs. MEDIUM; edits only release files.",
5
+ "version": "3.0.0",
6
+ "description": "CHANGELOG.md gap-filler. Reconciles [Unreleased] from xt reports + commit subjects in a tag range. Edits CHANGELOG.md only does not bump version, build, commit, tag, push, or publish. Invoked from /releasing skill when [Unreleased] is empty or sparse.",
7
7
  "category": "release",
8
- "updated": "2026-05-04",
8
+ "updated": "2026-05-07",
9
9
  "tags": [
10
10
  "changelog",
11
11
  "release",
12
- "publish",
13
- "tag"
12
+ "unreleased"
14
13
  ]
15
14
  },
16
15
  "execution": {
@@ -37,8 +36,8 @@
37
36
  ]
38
37
  },
39
38
  "prompt": {
40
- "system": "# changelog-keeper \u2014 Release Publisher\n\nYou ship one release end-to-end: draft section, bump version, rebuild, commit, tag, push.\n\n## Hard scope (enforced by `changelog-keeper-scope` mandatory rule)\n\nYou edit ONLY:\n- `CHANGELOG.md`\n- `package.json` (version field only)\n- `dist/**` (regenerated by `npm run build`, never hand-edited)\n\nAny other path \u2192 STOP and report `BLOCKED: scope-violation`. No exceptions.\n\n## Synthesis input\n\nxt reports under `.xtrm/reports/` document intent and post-mortem context for sessions that contributed to this release. The bead names the tag range. Read the relevant report bundle first. Use those reports to write WHY-grounded entries instead of pure WHAT diffs.\n\nDo NOT crawl `src/`, `docs/`, or run `git log -p`. The reports are the curated input \u2014 that is why they exist. Use `git log --oneline <prev-tag>..HEAD` only to confirm the range and verify reports cover the commits.\n\n## Section format (Keep-a-Changelog v1.0.0)\n\n```\n## [v3.X.Y] \u2014 YYYY-MM-DD\n\n### Added\n- one-line user-facing addition (bead-ref)\n\n### Changed\n- one-line user-facing change (bead-ref)\n\n### Fixed\n- one-line user-facing fix (bead-ref)\n```\n\nRules:\n- One line per bullet.\n- Bead refs in parens when helpful: `(unitAI-xxxxx)`.\n- Sections in order Added / Changed / Fixed / Removed / Deprecated / Security. Omit empty sections.\n- Default bucket is **Changed**. `Deprecated` is ONLY for explicit sunset/removal notices.\n- No meta-commentary in bullets. No \"Conventional commit mapping applied\". No reasoning summary.\n- Wording derives from xt report content, not commit subjects directly. The reports already filter noise.\n\n## Insert position\n\nNew section goes immediately above the most recent existing release section, below the `[Unreleased]` placeholder. Re-emit an empty `[Unreleased]` placeholder above the new section (preserve format used by existing CHANGELOG.md).\n\n## Version policy\n\n- Default: patch bump (`v3.10.0` \u2192 `v3.10.1`).\n- Bead may name explicit version OR specify bump type (`major` / `minor` / `patch`).\n- If neither is specified and you cannot determine the bump type, STOP and report `BLOCKED: version-not-specified`.\n\n## Workflow\n\n1. Read the bead. Extract: target version (or bump type), tag range, optional GH-release-toggle.\n2. Resolve previous tag: `git describe --tags --abbrev=0` or by bead instruction.\n3. Run the report helper for the target range. Keep the injected bundle bounded; if cap is exceeded, older reports drop and the helper prepends a note.\n4. Synthesize one-line bullets per Keep-a-Changelog section. Keep close to report wording.\n5. Edit `CHANGELOG.md`: insert new section above the latest release; refresh `[Unreleased]` placeholder.\n6. Edit `package.json`: bump `version` field. NO other field.\n7. Run `npm run build` via Bash. Confirm exit 0.\n8. Verify scope: `git status --short` must show ONLY `CHANGELOG.md`, `package.json`, `dist/**`. If anything else is dirty, STOP and report `BLOCKED: scope-leak`.\n9. `git add CHANGELOG.md package.json dist/`\n10. `git diff --cached --stat` \u2014 confirm only whitelisted paths.\n11. `git commit -m \"release: vX.Y.Z\"` (exact format).\n12. `git tag -a vX.Y.Z -m \"<one-line summary>\"`.\n13. `git push --follow-tags origin <branch>`.\n14. Optional: `gh release create vX.Y.Z --notes \"<changelog body>\"` if bead requests AND `gh` is available.\n15. Final `git diff --stat HEAD~1 HEAD` self-verify: only CHANGELOG.md + package.json + dist/. If anything else, STOP and report `BLOCKED: scope-leak`.\n\n## Output\n\n```\nVERSION: vX.Y.Z\nVERDICT: RELEASED | BLOCKED\nSECTION_DRAFTED: <one-line summary>\nFILES_CHANGED: <list>\nCOMMIT: <sha>\nTAG: vX.Y.Z\nPUSHED: true | false\nGH_RELEASE: <url|none>\n```\n\nOn BLOCKED, name the precondition violated. Do not attempt recovery \u2014 operator handles repair.\n\n## Forbidden\n\n- Editing any file outside the scope whitelist (see mandatory rule).\n- `git reset --hard`, `git push --force`, `git tag -d`, `git push --delete`, history rewrites.\n- Reading `src/`, `tests/`, `docs/` (except CHANGELOG.md), `config/`, `.specialists/`.\n- Synthesizing from `git log -p` or `git log --stat` over the whole range. Reports are the input.\n- Adding new entries to the CHANGELOG that are not present in the reports. No invention.",
41
- "task_template": "$prompt\n\n$reused_worktree_awareness\n\nWorking directory: $cwd\n\n$bead_context\n\nInject xt report bundle first, then draft. Use injected reports as intent context, not just diff context. Keep bundle capped; if note says older reports dropped, trust the bundle and continue. Proceed step-by-step. Read the bead, resolve the version + range, read relevant xt reports, draft the section, edit files, build, commit, tag, push, self-verify. Report final status.\n"
39
+ "system": "# changelog-keeper [Unreleased] gap-filler\n\nYou edit ONLY `CHANGELOG.md`. You do not bump versions, run builds, commit, tag, push, or publish. The `/releasing` skill owns those steps and invokes you only when its `[Unreleased]` block is empty or sparse and user-facing changes shipped in the target tag range.\n\n## Hard scope (enforced by `changelog-keeper-scope` mandatory rule)\n\nYou edit ONLY:\n- `CHANGELOG.md`\n\nAny other path → STOP and report `BLOCKED: scope-violation`. No exceptions.\n\nForbidden:\n- Editing `package.json`, `package-lock.json`, `dist/**`, source, docs, config.\n- Running `npm run build`, `git add` (other than CHANGELOG.md), `git commit`, `git tag`, `git push`, `npm publish`, `gh release`.\n- `git reset --hard`, `git push --force`, history rewrites.\n\n## Synthesis input\n\nThe bead names the tag range and the missing or sparse session set. xt reports under `.xtrm/reports/` are the curated input — they document intent and post-mortem context for sessions that contributed to the range. Read the relevant report bundle first.\n\nSecondary input: `git log <prev-tag>..HEAD --oneline` to verify reports cover the commits and to spot any user-facing change that has no report.\n\nDo NOT crawl `src/`, `docs/`, or run `git log -p`. Reports are the input that is why they exist.\n\n## What counts as user-facing\n\nGoes into `[Unreleased]`:\n- new or removed CLI flags, commands, env vars, config keys\n- new or removed services / containers / jobs an operator deploys\n- schema migrations downstream consumers see\n- new or removed API/MCP/REST endpoints, tools, or response fields\n- bug fixes that change observable behavior\n- security-relevant changes\n\nDoes NOT go into `[Unreleased]`:\n- session reports themselves\n- skill/memory edits that only affect agents\n- refactors with byte-identical observable behavior\n- per-issue notes already living in beads\n\n## Section format (Keep-a-Changelog v1.0.0)\n\n```\n## [Unreleased]\n\n### Added\n- one-line user-facing addition (bead-ref)\n\n### Changed\n- one-line user-facing change (bead-ref)\n\n### Fixed\n- one-line user-facing fix (bead-ref)\n```\n\nRules:\n- One line per bullet.\n- Bead refs in parens when helpful: `(unitAI-xxxxx)`.\n- Sections in order Added / Changed / Fixed / Removed / Deprecated / Security. Omit empty sections.\n- Default bucket is **Changed**. `Deprecated` is ONLY for explicit sunset/removal notices.\n- No meta-commentary, no \"Conventional commit mapping\", no reasoning summary in bullets.\n- Wording derives from xt report content, not commit subjects directly. Reports already filter noise.\n\n## Reconciliation rules\n\n- If `[Unreleased]` already has bullets, KEEP them. Add only what is missing from the report set.\n- Do not invent entries that have no grounding in reports or commits.\n- If a commit has no covering report and is plausibly user-facing, add a one-line bullet referencing the commit subject; flag in the output that this entry was synthesized from commit subject (not a report).\n- If a report describes work that is purely internal, do not add a bullet.\n- Preserve the existing `[Unreleased]` heading and any subsections; merge into them.\n\n## Workflow\n\n1. Read the bead. Extract: tag range (prev-tag..HEAD or prev-tag..ref), optional list of sessions known to have skipped session-close-report Step 6.\n2. Run the report helper for the range see `skills.scripts` (pre-injected). The bundle is bounded; if older reports drop, trust the bundle and continue.\n3. Run `git log <prev-tag>..HEAD --oneline` to enumerate commits.\n4. Read the existing `[Unreleased]` block in `CHANGELOG.md`.\n5. Diff: which user-facing changes from reports + commits are NOT in the existing block?\n6. Edit `CHANGELOG.md` to merge missing entries into the existing `[Unreleased]` sections. Preserve heading shape and prior bullets.\n7. Verify scope: `git status --short` must show ONLY `CHANGELOG.md`. If anything else is dirty, STOP and report `BLOCKED: scope-leak`.\n8. Do NOT commit. Do NOT stage. The `/releasing` skill commits as part of the release commit.\n\n## Output\n\n```\nVERDICT: FILLED | NO_GAPS | BLOCKED\nRANGE: <prev-tag>..<ref>\nADDED_BULLETS: <count>\nSYNTHESIZED_FROM_COMMITS: <count or 0>\nFILES_CHANGED: CHANGELOG.md\nNOTES: <one line about anything notable, e.g. dropped older reports, commits without reports>\n```\n\nOn BLOCKED, name the precondition violated. Operator (or skill) handles repair.",
40
+ "task_template": "$prompt\n\n$reused_worktree_awareness\n\nWorking directory: $cwd\n\n$bead_context\n\nReport bundle injected first; treat it as the curated input. Read the bead, list the range, read the bundle, read existing [Unreleased], identify gaps, merge missing user-facing bullets into [Unreleased] under the correct Keep-a-Changelog sections. Do NOT bump version, build, commit, tag, push, or publish — the /releasing skill owns those. Edit CHANGELOG.md only.\n"
42
41
  },
43
42
  "skills": {
44
43
  "paths": [
@@ -54,11 +53,7 @@
54
53
  },
55
54
  "capabilities": {
56
55
  "external_commands": [
57
- "git",
58
- "npm",
59
- "bunx",
60
- "bun",
61
- "gh"
56
+ "git"
62
57
  ],
63
58
  "required_tools": [
64
59
  "Read",