@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.
- package/config/mandatory-rules/changelog-keeper-scope.md +18 -30
- package/config/skills/using-script-specialists/SKILL.md +7 -5
- package/config/skills/using-specialists-v3/SKILL.md +140 -0
- package/config/specialists/changelog-keeper.specialist.json +7 -12
- package/dist/index.js +390 -146
- package/dist/lib.js +145 -43
- package/dist/types/cli/script.d.ts.map +1 -1
- package/dist/types/cli/serve.d.ts +11 -2
- package/dist/types/cli/serve.d.ts.map +1 -1
- package/dist/types/specialist/observability-sqlite.d.ts +1 -0
- package/dist/types/specialist/observability-sqlite.d.ts.map +1 -1
- package/dist/types/specialist/schema.d.ts +27 -0
- package/dist/types/specialist/schema.d.ts.map +1 -1
- package/dist/types/specialist/script-runner.d.ts +5 -1
- package/dist/types/specialist/script-runner.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -2,49 +2,37 @@
|
|
|
2
2
|
name: changelog-keeper-scope
|
|
3
3
|
kind: mandatory-rule
|
|
4
4
|
---
|
|
5
|
-
SINGLE PURPOSE. You exist to
|
|
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
|
|
8
|
-
- `CHANGELOG.md`
|
|
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
|
-
- `
|
|
14
|
-
- `
|
|
15
|
-
- `
|
|
16
|
-
-
|
|
17
|
-
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
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,
|
|
36
|
+
If anything else appears, STOP and emit `BLOCKED: scope-leak` naming the offending paths.
|
|
49
37
|
|
|
50
|
-
OUTPUT SHAPE. Final report must include: `
|
|
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
|
-
-
|
|
106
|
-
|
|
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": "
|
|
6
|
-
"description": "
|
|
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-
|
|
8
|
+
"updated": "2026-05-07",
|
|
9
9
|
"tags": [
|
|
10
10
|
"changelog",
|
|
11
11
|
"release",
|
|
12
|
-
"
|
|
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
|
|
41
|
-
"task_template": "$prompt\n\n$reused_worktree_awareness\n\nWorking directory: $cwd\n\n$bead_context\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",
|