@jaggerxtrm/specialists 3.17.0 → 3.18.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/README.md +268 -134
- package/config/mandatory-rules/executor-delivery.md +4 -0
- package/config/mandatory-rules/json-only-final-output.md +13 -0
- package/config/mandatory-rules/service-skills-diff-scan-mandatory.md +26 -0
- package/config/mandatory-rules/service-skills-gitnexus-triage.md +5 -0
- package/config/mandatory-rules/test-runner-execution-scope.md +4 -0
- package/config/skills/setup-specialists/SKILL.md +556 -0
- package/config/skills/specialists-creator/SKILL.md +132 -4
- package/config/skills/specialists-creator/scripts/audit-spec-uniformity.mjs +1 -1
- package/config/skills/using-specialists-v3/SKILL.md +80 -20
- package/config/specialists/bare.specialist.json +3 -3
- package/config/specialists/changelog-drafter.specialist.json +5 -4
- package/config/specialists/changelog-keeper.specialist.json +7 -6
- package/config/specialists/debugger.specialist.json +2 -2
- package/config/specialists/executor.specialist.json +2 -2
- package/config/specialists/explorer.specialist.json +4 -4
- package/config/specialists/memory-processor.specialist.json +3 -3
- package/config/specialists/node-coordinator.specialist.json +3 -3
- package/config/specialists/obligations-scanner.specialist.json +67 -17
- package/config/specialists/overthinker.specialist.json +3 -3
- package/config/specialists/planner.specialist.json +4 -4
- package/config/specialists/quant-methodologist.specialist.json +145 -0
- package/config/specialists/quant-researcher.specialist.json +144 -0
- package/config/specialists/researcher.specialist.json +5 -5
- package/config/specialists/reviewer.specialist.json +1 -1
- package/config/specialists/seconder.specialist.json +2 -2
- package/config/specialists/security-auditor.specialist.json +2 -2
- package/config/specialists/service-skills-sync.specialist.json +90 -75
- package/config/specialists/specialists-creator.specialist.json +4 -4
- package/config/specialists/sync-docs.specialist.json +4 -4
- package/config/specialists/test-engineer.specialist.json +3 -3
- package/config/specialists/test-runner.specialist.json +7 -7
- package/config/specialists/transcriber.specialist.json +3 -3
- package/config/specialists/xt-merge.specialist.json +4 -4
- package/dist/asset-contract.json +22 -3
- package/dist/index.js +28711 -18517
- package/dist/lib.js +10020 -6150
- package/dist/types/cli/console/components.d.ts +83 -0
- package/dist/types/cli/console/components.d.ts.map +1 -0
- package/dist/types/cli/console/config-source.d.ts +58 -0
- package/dist/types/cli/console/config-source.d.ts.map +1 -0
- package/dist/types/cli/console/forensic.d.ts +11 -0
- package/dist/types/cli/console/forensic.d.ts.map +1 -0
- package/dist/types/cli/console/git.d.ts +28 -0
- package/dist/types/cli/console/git.d.ts.map +1 -0
- package/dist/types/cli/console/help.d.ts +2 -0
- package/dist/types/cli/console/help.d.ts.map +1 -0
- package/dist/types/cli/console/log.d.ts +13 -0
- package/dist/types/cli/console/log.d.ts.map +1 -0
- package/dist/types/cli/console/repo-config.d.ts +26 -0
- package/dist/types/cli/console/repo-config.d.ts.map +1 -0
- package/dist/types/cli/console/repo-discovery.d.ts +12 -0
- package/dist/types/cli/console/repo-discovery.d.ts.map +1 -0
- package/dist/types/cli/console/runtime.d.ts +12 -0
- package/dist/types/cli/console/runtime.d.ts.map +1 -0
- package/dist/types/cli/console/subscribe-prototype.d.ts +18 -0
- package/dist/types/cli/console/subscribe-prototype.d.ts.map +1 -0
- package/dist/types/cli/console/theme.d.ts +91 -0
- package/dist/types/cli/console/theme.d.ts.map +1 -0
- package/dist/types/cli/console/types.d.ts +231 -0
- package/dist/types/cli/console/types.d.ts.map +1 -0
- package/dist/types/cli/console/view-model.d.ts +252 -0
- package/dist/types/cli/console/view-model.d.ts.map +1 -0
- package/dist/types/cli/console.d.ts +2 -0
- package/dist/types/cli/console.d.ts.map +1 -0
- package/dist/types/cli/db.d.ts.map +1 -1
- package/dist/types/cli/doctor.d.ts.map +1 -1
- package/dist/types/cli/edit.d.ts.map +1 -1
- package/dist/types/cli/epic.d.ts.map +1 -1
- package/dist/types/cli/feed.d.ts.map +1 -1
- package/dist/types/cli/forensic.d.ts +2 -0
- package/dist/types/cli/forensic.d.ts.map +1 -0
- package/dist/types/cli/format-helpers.d.ts +4 -2
- package/dist/types/cli/format-helpers.d.ts.map +1 -1
- package/dist/types/cli/help.d.ts.map +1 -1
- package/dist/types/cli/init.d.ts +10 -0
- package/dist/types/cli/init.d.ts.map +1 -1
- package/dist/types/cli/list.d.ts.map +1 -1
- package/dist/types/cli/log.d.ts.map +1 -1
- package/dist/types/cli/merge.d.ts.map +1 -1
- package/dist/types/cli/metrics.d.ts +2 -0
- package/dist/types/cli/metrics.d.ts.map +1 -0
- package/dist/types/cli/ps.d.ts.map +1 -1
- package/dist/types/cli/result.d.ts.map +1 -1
- package/dist/types/cli/run.d.ts +20 -0
- package/dist/types/cli/run.d.ts.map +1 -1
- package/dist/types/cli/script.d.ts +3 -0
- package/dist/types/cli/script.d.ts.map +1 -1
- package/dist/types/cli/serve.d.ts.map +1 -1
- package/dist/types/cli/setup.d.ts +19 -1
- package/dist/types/cli/setup.d.ts.map +1 -1
- package/dist/types/cli/status.d.ts.map +1 -1
- package/dist/types/cli/version-check.d.ts +1 -0
- package/dist/types/cli/version-check.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/pi/session.d.ts +12 -1
- package/dist/types/pi/session.d.ts.map +1 -1
- package/dist/types/server.d.ts +15 -0
- package/dist/types/server.d.ts.map +1 -1
- package/dist/types/specialist/benchmarks.d.ts +37 -0
- package/dist/types/specialist/benchmarks.d.ts.map +1 -0
- package/dist/types/specialist/chain-identity.d.ts +7 -1
- package/dist/types/specialist/chain-identity.d.ts.map +1 -1
- package/dist/types/specialist/control.d.ts.map +1 -1
- package/dist/types/specialist/dead-job-audit.d.ts +20 -0
- package/dist/types/specialist/dead-job-audit.d.ts.map +1 -0
- package/dist/types/specialist/forensic-events.d.ts +138 -0
- package/dist/types/specialist/forensic-events.d.ts.map +1 -0
- package/dist/types/specialist/forensic-renderer.d.ts +34 -0
- package/dist/types/specialist/forensic-renderer.d.ts.map +1 -0
- package/dist/types/specialist/git-diff-evidence.d.ts +28 -0
- package/dist/types/specialist/git-diff-evidence.d.ts.map +1 -0
- package/dist/types/specialist/global-config.d.ts +389 -0
- package/dist/types/specialist/global-config.d.ts.map +1 -0
- package/dist/types/specialist/launch.d.ts +9 -0
- package/dist/types/specialist/launch.d.ts.map +1 -1
- package/dist/types/specialist/live-aggregates.d.ts +46 -0
- package/dist/types/specialist/live-aggregates.d.ts.map +1 -0
- package/dist/types/specialist/loader.d.ts +50 -1
- package/dist/types/specialist/loader.d.ts.map +1 -1
- package/dist/types/specialist/model-chain.d.ts +7 -0
- package/dist/types/specialist/model-chain.d.ts.map +1 -0
- package/dist/types/specialist/model-probes.d.ts +28 -0
- package/dist/types/specialist/model-probes.d.ts.map +1 -0
- package/dist/types/specialist/node-contract.d.ts +18 -18
- package/dist/types/specialist/node-supervisor.d.ts.map +1 -1
- package/dist/types/specialist/observability-db.d.ts +1 -1
- package/dist/types/specialist/observability-db.d.ts.map +1 -1
- package/dist/types/specialist/observability-sqlite.d.ts +101 -0
- package/dist/types/specialist/observability-sqlite.d.ts.map +1 -1
- package/dist/types/specialist/pr-drift-refresh.d.ts +17 -0
- package/dist/types/specialist/pr-drift-refresh.d.ts.map +1 -0
- package/dist/types/specialist/preset-resolver.d.ts +56 -0
- package/dist/types/specialist/preset-resolver.d.ts.map +1 -0
- package/dist/types/specialist/prometheus-projection.d.ts +25 -0
- package/dist/types/specialist/prometheus-projection.d.ts.map +1 -0
- package/dist/types/specialist/runner.d.ts +29 -1
- package/dist/types/specialist/runner.d.ts.map +1 -1
- package/dist/types/specialist/schema.d.ts +163 -54
- 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/dist/types/specialist/snapshot-diff.d.ts +8 -0
- package/dist/types/specialist/snapshot-diff.d.ts.map +1 -0
- package/dist/types/specialist/source-queue.d.ts +13 -0
- package/dist/types/specialist/source-queue.d.ts.map +1 -0
- package/dist/types/specialist/status-load.d.ts.map +1 -1
- package/dist/types/specialist/supervisor.d.ts +25 -1
- package/dist/types/specialist/supervisor.d.ts.map +1 -1
- package/dist/types/specialist/timeline-events.d.ts +70 -1
- package/dist/types/specialist/timeline-events.d.ts.map +1 -1
- package/dist/types/tools/specialist/resume_specialist.tool.d.ts +4 -4
- package/dist/types/tools/specialist/specialist_status.tool.d.ts +1 -1
- package/dist/types/tools/specialist/steer_specialist.tool.d.ts +4 -4
- package/dist/types/tools/specialist/use_specialist.tool.d.ts +16 -16
- package/docs/ARCHITECTURE.md +1176 -0
- package/docs/TODO.md +9 -0
- package/docs/architecture.md +11 -0
- package/docs/archive/2026-03-13-bd-decision-context-template-plan.md +96 -0
- package/docs/archive/AGENT-HANDOFF.md +351 -0
- package/docs/archive/PARITY-ANALYSIS.md +296 -0
- package/docs/archive/SPECIALISTS_REFACTOR.md.md +30 -0
- package/docs/archive/cc-programmatic.md +216 -0
- package/docs/archive/claude-agent-sdk.md +594 -0
- package/docs/archive/decision-specialist-directory.md +41 -0
- package/docs/archive/discoveries.md +148 -0
- package/docs/archive/executor-benchmark-protocol.md +198 -0
- package/docs/archive/future-features.md +66 -0
- package/docs/archive/gzrx-completion-critique.md +183 -0
- package/docs/archive/gzrx-research-notes.md +401 -0
- package/docs/archive/gzrx-tool-catalog.md +760 -0
- package/docs/archive/iron-review-hardening-qa-chain-substrate.md +322 -0
- package/docs/archive/iron-review-hardening.html +1004 -0
- package/docs/archive/issuetracking.md +312 -0
- package/docs/archive/qa-v3.0.2.md +220 -0
- package/docs/archive/restructure.md +231 -0
- package/docs/archive/script-specialists.md +1254 -0
- package/docs/archive/spec-v3.md +792 -0
- package/docs/archive/specialist-stats.md +127 -0
- package/docs/archive/specialists-friction-audit.md +1347 -0
- package/docs/archive/specialists-runtime-critique.md +170 -0
- package/docs/archive/specialists-service-evaluation.md +713 -0
- package/docs/archive/specialists-substrate-alignment.md +255 -0
- package/docs/archive/substrate-review.md +1288 -0
- package/docs/archive/test-writer-specialist.md +254 -0
- package/docs/archive/using-specialists-v3-improvements-2026-05-09.md +600 -0
- package/docs/archive/xtrm-specialists-analysis.md +314 -0
- package/docs/authoring.md +701 -0
- package/docs/background-jobs.md +203 -0
- package/docs/bare-specialists.md +83 -0
- package/docs/benchmarks/executor-benchmark-runner.md +66 -0
- package/docs/bootstrap.md +161 -0
- package/docs/cli-reference.md +1645 -0
- package/docs/deploying-alongside.md +155 -0
- package/docs/design/README.md +36 -0
- package/docs/design/darth-feedor-migration.md +290 -0
- package/docs/design/roadmap/README.md +32 -0
- package/docs/design/roadmap/chain-templates/README.md +146 -0
- package/docs/design/roadmap/chain-templates/code-quick.formula.json +27 -0
- package/docs/design/roadmap/chain-templates/code-standard.formula.json +126 -0
- package/docs/design/roadmap/chain-templates/code-with-advisors.formula.json +128 -0
- package/docs/design/roadmap/chain-templates/code-with-tests.formula.json +76 -0
- package/docs/design/roadmap/chain-templates/debug.formula.json +128 -0
- package/docs/design/roadmap/chain-templates/doc-sync.formula.json +28 -0
- package/docs/design/roadmap/chain-templates/memory-hygiene.formula.json +27 -0
- package/docs/design/roadmap/chain-templates/planning.formula.json +27 -0
- package/docs/design/roadmap/chain-templates/premortem.formula.json +26 -0
- package/docs/design/roadmap/chain-templates/release-prep.formula.json +36 -0
- package/docs/design/roadmap/chain-templates/research-only.formula.json +28 -0
- package/docs/design/roadmap/chain-templates/restitch.formula.json +125 -0
- package/docs/design/roadmap/chain-templates/security-deep.formula.json +161 -0
- package/docs/design/roadmap/chain-templates/test-only.formula.json +52 -0
- package/docs/design/roadmap/chain-templates/triage.formula.json +35 -0
- package/docs/design/roadmap/history/handoff-from-substrate-design.md +87 -0
- package/docs/design/roadmap/history/substrate-reconciliation.md +105 -0
- package/docs/design/roadmap/specialists-roadmap.md +1261 -0
- package/docs/design/sp-console-subscribe-via-materializer.md +231 -0
- package/docs/design/sp-console-tui-mock-v2.html +293 -0
- package/docs/design/sp-console-tui-mock.html +120 -0
- package/docs/design/sp-console-tui.md +340 -0
- package/docs/design/specialist-agentops-suite.md +323 -0
- package/docs/design/substrate/channels.md +14 -0
- package/docs/design/substrate/devops-platform-engineering-prd.md +446 -0
- package/docs/design/substrate/html-design-example.md +339 -0
- package/docs/design/xtrm-tiers-architecture.svg +132 -0
- package/docs/devops/dependency-verdict-materialization.md +46 -0
- package/docs/epic-readiness.md +75 -0
- package/docs/examples/mercury-atomic-summarizer.specialist.json +26 -0
- package/docs/examples/smoke-echo-text-expected-keys.specialist.json +25 -0
- package/docs/examples/smoke-echo.specialist.json +25 -0
- package/docs/features.md +1577 -0
- package/docs/hooks.md +81 -0
- package/docs/installation.md +142 -0
- package/docs/manifest.md +184 -0
- package/docs/mcp-servers.md +73 -0
- package/docs/mcp-tools.md +71 -0
- package/docs/nodes.md +231 -0
- package/docs/observability-metrics.md +152 -0
- package/docs/operator/sp-console-v2-walkthrough.md +410 -0
- package/docs/overrides-guide.md +306 -0
- package/docs/pi-rpc-boundary.md +118 -0
- package/docs/pi-session.md +195 -0
- package/docs/release.md +22 -0
- package/docs/skills.md +132 -0
- package/docs/specialists/handoff-schema.md +181 -0
- package/docs/specialists-catalog.md +99 -0
- package/docs/specialists-service-install.md +226 -0
- package/docs/specialists-service.md +363 -0
- package/docs/surface-ownership.md +138 -0
- package/docs/upgrade-notes/kan-90-global-user-config.md +114 -0
- package/docs/upgrade-notes/kan-91-expanded-overrides.md +261 -0
- package/docs/workflow.md +114 -0
- package/docs/worktree.md +71 -0
- package/docs/worktrees.md +309 -0
- package/package.json +7 -4
|
@@ -5,8 +5,8 @@ description: >
|
|
|
5
5
|
agent through writing a valid `.specialist.json`, choosing supported models,
|
|
6
6
|
validating against the schema, and avoiding common specialist authoring
|
|
7
7
|
mistakes.
|
|
8
|
-
version: 1.
|
|
9
|
-
synced_at:
|
|
8
|
+
version: 1.4
|
|
9
|
+
synced_at: fc9168e2
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# Specialist Author Guide
|
|
@@ -266,7 +266,7 @@ Avoid vague descriptions like "general purpose assistant" or "helps with code".
|
|
|
266
266
|
| `mode` | enum | `auto` | `tool` \| `skill` \| `auto` |
|
|
267
267
|
| `timeout_ms` | number | `120000` | ms |
|
|
268
268
|
| `stall_timeout_ms` | number | — | kill if no event for N ms |
|
|
269
|
-
| `interactive` | boolean | `false` | enable multi-turn keep-alive by default |
|
|
269
|
+
| `interactive` | boolean | `false` | enable multi-turn keep-alive by default (also overridable globally via `~/.config/specialists/user.json`) |
|
|
270
270
|
| `response_format` | enum | `text` | `text` \| `json` \| `markdown` |
|
|
271
271
|
| `output_type` | enum | `custom` | `codegen` \| `analysis` \| `review` \| `synthesis` \| `orchestration` \| `workflow` \| `research` \| `custom` |
|
|
272
272
|
| `permission_required` | enum | `READ_ONLY` | see tier table below |
|
|
@@ -281,7 +281,8 @@ Avoid vague descriptions like "general purpose assistant" or "helps with code".
|
|
|
281
281
|
- Run-level overrides still apply:
|
|
282
282
|
- CLI: `--keep-alive` enables, `--no-keep-alive` disables.
|
|
283
283
|
- MCP `start_specialist`: `keep_alive` enables, `no_keep_alive` disables.
|
|
284
|
-
- Effective precedence: explicit disable (`--no-keep-alive` / `no_keep_alive`) → explicit enable (`--keep-alive` / `keep_alive`) → `execution.interactive` → one-shot default.
|
|
284
|
+
- Effective precedence: explicit disable (`--no-keep-alive` / `no_keep_alive`) → explicit enable (`--keep-alive` / `keep_alive`) → merged `execution.interactive` (package / global user.json / repo) → one-shot default.
|
|
285
|
+
- When the operator wants a cross-repo default, prefer `sp edit --global --set <name>.execution.interactive true|false` over forking per-repo specs.
|
|
285
286
|
|
|
286
287
|
**Permission tiers** — controls the *native* pi tools the specialist gets. The full resolved tool set also includes catalog-defined GitNexus and Serena tools per tier; see [docs/manifest.md](../../../docs/manifest.md) for the complete picture.
|
|
287
288
|
|
|
@@ -651,6 +652,131 @@ This specialist goes STALE the moment `schema.ts` or `runner.ts` is modified aft
|
|
|
651
652
|
|
|
652
653
|
---
|
|
653
654
|
|
|
655
|
+
## Global User Override Layer (KAN-90/91)
|
|
656
|
+
|
|
657
|
+
The same per-spec field schema documented above is also exposed at a **global,
|
|
658
|
+
cross-repo layer** since 2026-06-13. Operators do not need to fork a
|
|
659
|
+
`.specialists/user/<name>.specialist.json` per repo just to swap their model or
|
|
660
|
+
opt out of an extension — those changes live once in
|
|
661
|
+
`~/.config/specialists/user.json` and apply everywhere.
|
|
662
|
+
|
|
663
|
+
### 3-layer field merge
|
|
664
|
+
|
|
665
|
+
`SpecialistLoader.get()` resolves fields top-down:
|
|
666
|
+
|
|
667
|
+
1. **Package canonical** — `config/specialists/<name>.specialist.json` shipped
|
|
668
|
+
in `@jaggerxtrm/specialists`. Most fields are concrete defaults; `model` and
|
|
669
|
+
`fallback_model` ship as `null` since KAN-90 part 2.
|
|
670
|
+
2. **`~/.config/specialists/user.json`** — operator's global override. Wins
|
|
671
|
+
over package canonical for the allowlisted user-environment fields.
|
|
672
|
+
3. **`.specialists/user/<name>.specialist.json`** — per-repo override. Wins
|
|
673
|
+
over global. Can change any field, including ones blocked at the global
|
|
674
|
+
layer.
|
|
675
|
+
|
|
676
|
+
The pre-KAN-90 `.specialists/default/<name>.specialist.json` mirror is no
|
|
677
|
+
longer walked (commit `31a6421c`).
|
|
678
|
+
|
|
679
|
+
### CLI surface
|
|
680
|
+
|
|
681
|
+
| Command | Effect |
|
|
682
|
+
|---|---|
|
|
683
|
+
| `sp init --global` | Bootstraps `~/.config/specialists/user.json` with null placeholders for every spec; writes `_doc` sentinel + `overrides-guide.md`. Idempotent — preserves existing values, only adds entries for newly-discovered specialists on re-run. |
|
|
684
|
+
| `sp edit --global --set <name>.<dot.path> <value>` | Writes one field in `user.json` (schema-validated). |
|
|
685
|
+
| `sp edit --global --get <name>.<dot.path>` | Reads the current merged value. |
|
|
686
|
+
| `sp doctor --specialists` | Reports `N/M specialists have a model configured`, lists missing models, and surfaces blocked-field overrides applied with warning. |
|
|
687
|
+
| `sp config show <name> --resolved` | Shows the merged spec for one specialist with per-layer attribution. |
|
|
688
|
+
|
|
689
|
+
The bare positional form (`sp edit --global <name>.field value` without
|
|
690
|
+
`--set`) currently falls through to `$EDITOR` in some environments — prefer
|
|
691
|
+
`--set` in scripts.
|
|
692
|
+
|
|
693
|
+
### Allowlist mapping (which fields can be set globally)
|
|
694
|
+
|
|
695
|
+
The constants in `src/specialist/schema.ts` define what the global layer may
|
|
696
|
+
write:
|
|
697
|
+
|
|
698
|
+
```ts
|
|
699
|
+
OVERRIDE_ALLOWED_EXECUTION_FIELDS = [
|
|
700
|
+
'model', 'fallback_model', 'fallback_models',
|
|
701
|
+
'timeout_ms', 'stall_timeout_ms', 'interactive', 'thinking_level',
|
|
702
|
+
'max_retries', 'prompt_limit_bytes', 'stdout_limit_bytes',
|
|
703
|
+
]
|
|
704
|
+
OVERRIDE_ALLOWED_NESTED_EXECUTION_PATHS = [
|
|
705
|
+
'extensions.serena', 'extensions.gitnexus',
|
|
706
|
+
]
|
|
707
|
+
OVERRIDE_ALLOWED_STALL_DETECTION_PATHS = ['waiting_auto_close_ms']
|
|
708
|
+
OVERRIDE_ALLOWED_PROMPT_FIELDS = ['system_prompt_mode']
|
|
709
|
+
OVERRIDE_ALLOWED_TOP_FIELDS = ['beads_write_notes', 'notes_mode', 'output_file']
|
|
710
|
+
```
|
|
711
|
+
|
|
712
|
+
So `sp edit --global --set executor.notes_mode final-only` is allowed; the
|
|
713
|
+
same effect for `permission_required`, `prompt.system`, `mandatory_rules`,
|
|
714
|
+
`capabilities`, `output_schema`, `auto_commit`, `skills.scripts`, or
|
|
715
|
+
`prompt.task_template` is **blocked at the global layer** and must be done
|
|
716
|
+
per-repo in `.specialists/user/<name>.specialist.json`. A blocked field that
|
|
717
|
+
sneaks into `user.json` is applied with a `BlockedFieldWarning` and reported
|
|
718
|
+
by `sp doctor --specialists`.
|
|
719
|
+
|
|
720
|
+
### Same fields as the per-spec reference
|
|
721
|
+
|
|
722
|
+
Every field documented above in `## Schema Reference` applies at the global
|
|
723
|
+
layer with the same semantics — only the **scope** changes (one machine vs one
|
|
724
|
+
repo). Examples:
|
|
725
|
+
|
|
726
|
+
```bash
|
|
727
|
+
# Set notes_mode + output_file globally for a chained pipeline reader
|
|
728
|
+
sp edit --global --set sync-docs.notes_mode final-only
|
|
729
|
+
sp edit --global --set sync-docs.output_file ".specialists/sync-docs-result.md"
|
|
730
|
+
|
|
731
|
+
# Opt out of Serena MCP injection on a read-only specialist (RAM saver)
|
|
732
|
+
sp edit --global --set overthinker.execution.extensions.serena false
|
|
733
|
+
|
|
734
|
+
# Set the default keep-alive behavior globally for one specialist
|
|
735
|
+
sp edit --global --set reviewer.execution.interactive false
|
|
736
|
+
|
|
737
|
+
# Auto-close forgotten waiting sessions after 1h (graceful close first)
|
|
738
|
+
sp edit --global --set reviewer.stall_detection.waiting_auto_close_ms 3600000
|
|
739
|
+
|
|
740
|
+
# Set system_prompt_mode to replace globally for a bare specialist
|
|
741
|
+
sp edit --global --set my-bare-spec.prompt.system_prompt_mode replace
|
|
742
|
+
|
|
743
|
+
# Plural fallback chain (KAN-91 Phase 2; walked on transient failures only)
|
|
744
|
+
sp edit --global --set executor.execution.fallback_models \
|
|
745
|
+
'["openai-codex/gpt-5.5","anthropic/claude-sonnet-4-6"]'
|
|
746
|
+
```
|
|
747
|
+
|
|
748
|
+
### Preset references (KAN-91 Phase 3)
|
|
749
|
+
|
|
750
|
+
Both `model` and `fallback_model`/`fallback_models` entries may be a
|
|
751
|
+
`@preset/<name>` reference:
|
|
752
|
+
|
|
753
|
+
```bash
|
|
754
|
+
sp edit --global --set executor.execution.model @preset/medium
|
|
755
|
+
sp edit --global --set executor.execution.fallback_models '["@preset/cheap"]'
|
|
756
|
+
sp edit --list-presets # show available preset names in the installed package
|
|
757
|
+
```
|
|
758
|
+
|
|
759
|
+
Built-in presets typically include `cheap`, `medium`, `power`. Depth cap = 5;
|
|
760
|
+
cycles surface a structured error at dispatch.
|
|
761
|
+
|
|
762
|
+
### `_doc` sentinel and `overrides-guide.md`
|
|
763
|
+
|
|
764
|
+
`sp init --global` writes a `_doc` key at the top of `user.json` pointing at
|
|
765
|
+
`./overrides-guide.md`, and (re)generates that guide with the live field
|
|
766
|
+
reference. Any other `_`-prefixed keys are tolerated as comments. Authors of a
|
|
767
|
+
new specialist should run `sp init --global` after release so existing operators
|
|
768
|
+
get a fresh null-placeholder entry on next bootstrap.
|
|
769
|
+
|
|
770
|
+
### Pitfall — `thinking_level: "off"`
|
|
771
|
+
|
|
772
|
+
`thinking_level: null` inherits pi's `defaultThinkingLevel` (typically `high`
|
|
773
|
+
on most installs). Forcing `off` on certain thinking-class models (verified:
|
|
774
|
+
Kimi-via-nano-gpt) silently produces an empty assistant text turn after
|
|
775
|
+
multi-tool runs because the model's tool-result-summary phase needs thinking
|
|
776
|
+
budget. Leave it `null` unless you have a documented reason to force a level.
|
|
777
|
+
|
|
778
|
+
---
|
|
779
|
+
|
|
654
780
|
## Built-in Template Variables
|
|
655
781
|
|
|
656
782
|
These are **always available** in `task_template` — no configuration needed:
|
|
@@ -794,6 +920,7 @@ Quality degrades as the context grows — compressed early context causes incons
|
|
|
794
920
|
|
|
795
921
|
**Rules when authoring a specialist:**
|
|
796
922
|
- Set `stall_timeout_ms` explicitly for any specialist that may idle between turns (keep-alive/interactive). Without it, a stuck session holds resources indefinitely.
|
|
923
|
+
- If the operator wants forgotten waiting sessions to retire automatically, set `stall_detection.waiting_auto_close_ms` explicitly; keep it unset/0 when human follow-up should remain indefinitely resumable.
|
|
797
924
|
- Use `thinking_level: low` for orchestration/coordinator specialists that emit structured JSON output — thinking tokens cost context budget without improving structured output quality.
|
|
798
925
|
- For research/explorer specialists: bounded scope per session + `handoff_summary` in `output_schema` > one unbounded session.
|
|
799
926
|
- `interactive: true` specialists must define what "done" looks like in their system prompt — otherwise they drift.
|
|
@@ -827,6 +954,7 @@ Before finalising a specialist that uses `interactive: true` or is expected to r
|
|
|
827
954
|
|
|
828
955
|
```
|
|
829
956
|
[ ] stall_timeout_ms set (not relying on timeout_ms alone)
|
|
957
|
+
[ ] waiting_auto_close_ms decision made (unset/0 for indefinite waiting, explicit ms for auto-retire)
|
|
830
958
|
[ ] thinking_level set appropriately for the output type
|
|
831
959
|
[ ] output_schema includes handoff_summary or equivalent for rotation
|
|
832
960
|
[ ] system prompt has explicit termination condition ("you are done when...")
|
|
@@ -27,7 +27,7 @@ const KNOWN = {
|
|
|
27
27
|
capabilities: new Set(['required_tools','external_commands','diagnostic_scripts']),
|
|
28
28
|
communication: new Set(['next_specialists','publishes']),
|
|
29
29
|
validation: new Set(['files_to_watch','stale_threshold_days']),
|
|
30
|
-
stall_detection: new Set(['running_idle_warn_ms','running_idle_kill_ms','waiting_stale_ms','tool_duration_warn_ms']),
|
|
30
|
+
stall_detection: new Set(['running_idle_warn_ms','running_idle_kill_ms','waiting_stale_ms','waiting_auto_close_ms','tool_duration_warn_ms']),
|
|
31
31
|
};
|
|
32
32
|
|
|
33
33
|
function unknownKeys(obj, knownSet, path) {
|
|
@@ -7,7 +7,7 @@ description: >
|
|
|
7
7
|
security checks, multi-step chains, integration-phase reconciliation,
|
|
8
8
|
debugger-restitch on conflicting chains, pre-dispatch conflict-cluster
|
|
9
9
|
mapping, test-failure-map epics, and questions about specialist workflow.
|
|
10
|
-
version: 3.
|
|
10
|
+
version: 3.7
|
|
11
11
|
---
|
|
12
12
|
|
|
13
13
|
# Using Specialists v3
|
|
@@ -215,6 +215,7 @@ Do small deterministic edits directly when scope is already obvious and delegati
|
|
|
215
215
|
12. Drive routine stages autonomously once task is clear. Escalate only for human judgment, destructive actions, repeated crashes, or reviewer `FAIL`.
|
|
216
216
|
13. The orchestrator NEVER edits code directly. Conflict resolution, even mechanical, goes through a debugger or executor specialist. Manual conflict resolution always escalates to the operator. (Exception: epics that explicitly restructure the specialists themselves — bootstrapping via the specialists they restructure is circular. Such epics are operator-authorized manual-orchestrator-direct work and must say so up-front.)
|
|
217
217
|
14. Before dispatching any chain whose work depends on prior chain output, verify git state per the Git State Precondition section: `git status` clean, HEAD contains prior chain commits, no orphaned worktrees. Stale-base dispatch produces guaranteed debugger-restitch loops downstream.
|
|
218
|
+
15. Never dispatch a specialist against a bead tagged `contract:draft` (`bd state <id> contract` returns `draft` or nothing). Promote it first — see Draft Beads And The Promotion Gate. A draft is a sanctioned capture format, not a shortcut around bead quality.
|
|
218
219
|
|
|
219
220
|
## Escalation Matrix
|
|
220
221
|
|
|
@@ -238,6 +239,7 @@ Do small deterministic edits directly when scope is already obvious and delegati
|
|
|
238
239
|
| `npm publish` | Never | Always |
|
|
239
240
|
| Dependency bump | Auto for security-patch bumps | Major/minor bumps escalate |
|
|
240
241
|
| Config file schema-changing edit | Never | Always |
|
|
242
|
+
| Dispatch against `contract:draft` bead | Never (rule #15) | Always — promote first: explore + rewrite full 7-section contract + `bd set-state <id> contract=ready --reason "..."` |
|
|
241
243
|
|
|
242
244
|
## Live Registry And Help
|
|
243
245
|
|
|
@@ -300,6 +302,58 @@ Fix three bad smells fast:
|
|
|
300
302
|
|
|
301
303
|
What differs: orchestrator writes contract before dispatch, so specialist does less guessing and more useful work.
|
|
302
304
|
|
|
305
|
+
## Draft Beads And The Promotion Gate
|
|
306
|
+
|
|
307
|
+
Full 7-section contracts are expensive to write for an idea you won't touch for weeks. Demanding that rigor for every captured thought is exactly what produces the other failure mode: skipping the bead entirely, or writing a one-liner. There is a third, sanctioned option — but it is a capture format, not an escape hatch.
|
|
308
|
+
|
|
309
|
+
**Draft state.** Tag a bead `contract:draft` at creation:
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
bd create --title "..." --labels contract:draft --type task --priority 3 \
|
|
313
|
+
--description "PROBLEM: <2+ real sentences — why this matters, not a title restated>
|
|
314
|
+
SCOPE: <rough guess — 'somewhere in src/auth/, needs investigation' is fine>
|
|
315
|
+
SUCCESS: TBD — needs exploration
|
|
316
|
+
NON_GOALS: TBD — needs exploration
|
|
317
|
+
CONSTRAINTS: TBD — needs exploration
|
|
318
|
+
VALIDATION: TBD — needs exploration
|
|
319
|
+
OUTPUT: TBD — needs exploration"
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
**No one-liners, ever — draft or not.** A draft still requires a real PROBLEM (why this exists, in prose) and a rough SCOPE. Every other section must be present and say `TBD — needs exploration` explicitly. A bare title, or a description that just restates the title, is never a valid bead — draft state lowers the bar on *completeness*, not on *honesty about what's missing*.
|
|
323
|
+
|
|
324
|
+
**The promotion gate (rule #15).** No specialist may be dispatched against a `contract:draft` bead. Before dispatch, the orchestrator must:
|
|
325
|
+
|
|
326
|
+
1. Re-read the bead (`bd show <id>`).
|
|
327
|
+
2. Actually explore — the same Phase 2 evidence-gathering the `planning` skill requires before writing a real contract (`gitnexus_query`/`gitnexus_context`/`gitnexus_impact`, or Serena symbol reads).
|
|
328
|
+
3. Rewrite the bead in place to the full 7-section contract (`bd update <id> --description "..."`), replacing every `TBD` with real content grounded in what was just found.
|
|
329
|
+
4. Flip the state: `bd set-state <id> contract=ready --reason "Explored via <what>; rewrote to full contract"`.
|
|
330
|
+
|
|
331
|
+
Check before any dispatch: `bd state <id> contract` — if it returns `draft` or nothing, stop and promote. This is a hard refuse (Escalation Matrix), not a warning — a stale draft wastes a full specialist turn on a contract the executor will have to guess at, which is the exact failure this rule exists to prevent.
|
|
332
|
+
|
|
333
|
+
**Current enforcement is a bridge.** This is orchestrator-discipline-enforced today, not yet a hard `sp run` pre-dispatch check — see `specialists-roadmap.md` §5.3 for the planned real enforcement (same class as the existing C1 cwd-mismatch hard-refuse). Follow the rule anyway; do not treat the absence of a hook as license to dispatch against a draft.
|
|
334
|
+
|
|
335
|
+
What differs: orchestrator has a sanctioned way to capture backlog ideas cheaply without either over-scoping them immediately or letting them decay into unusable one-liners.
|
|
336
|
+
|
|
337
|
+
## Bead Title Convention (canonical)
|
|
338
|
+
|
|
339
|
+
Every bead dispatched to a specialist gets a title in the form:
|
|
340
|
+
|
|
341
|
+
```text
|
|
342
|
+
<specialist-role>: <concise task description>
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
Examples: `explorer: map auth refresh path`, `executor: implement token refresh retry`, `reviewer: verify token refresh retry`, `seconder: sanity check token retry diff`, `security-auditor: scan token retry diff`, `test-runner: refresh <epic> failure map`.
|
|
346
|
+
|
|
347
|
+
Why: `bd list`, `bd ready`, `bd query`, and `sp ps` all show titles inline — a role-prefixed title makes the board scannable at a glance (which role owns which open work) without opening each bead. It also disambiguates same-named chains dispatched to different roles against the same parent (e.g. a `seconder:` and a `security-auditor:` bead both `validates`-linked to the same `executor:` bead).
|
|
348
|
+
|
|
349
|
+
Rules:
|
|
350
|
+
|
|
351
|
+
- Prefix with the exact specialist name from `specialists list --full` (`explorer`, `debugger`, `executor`, `reviewer`, `seconder`, `security-auditor`, `test-runner`, `test-engineer`, `obligations-scanner`, `planner`, `overthinker`, `researcher`, `sync-docs`, `changelog-keeper`, `specialists-creator`), not a role synonym.
|
|
352
|
+
- Root task/epic beads that are not themselves dispatched to a single specialist (the umbrella bead a chain is built under) are exempt — keep those descriptive without a role prefix, e.g. `Epic: auth refresh hardening`, `Fix token refresh retry`.
|
|
353
|
+
- Combine with the nesting default above: a role-prefixed title on a `--parent`-nested bead gives both a scannable title and a scannable ID (`bd-x.2` = `seconder: ...`).
|
|
354
|
+
|
|
355
|
+
What differs: orchestrator can `bd list`/`sp ps` and immediately tell which role owns which open work, instead of opening each bead to find out.
|
|
356
|
+
|
|
303
357
|
## SCRUTINY taxonomy (Iron-style)
|
|
304
358
|
|
|
305
359
|
`SCRUTINY` is a chain-property from canon §2.2, not reviewer input and not a quality tier. Every substantive bead must declare it at creation. It modulates chain structure only; quality stays invariant. New beads without it are invalid unless read-only / none-chain work.
|
|
@@ -363,13 +417,15 @@ Core commands:
|
|
|
363
417
|
- `bd dep <blocker> --blocks <blocked>`: reverse phrasing of the same hard sequencing edge. [source: bd dep --help]
|
|
364
418
|
- `bd dep add <issue> <other> --type <type>`: store a typed relationship. Supported types: `blocks`, `tracks`, `related`, `parent-child`, `discovered-from`, `until`, `caused-by`, `validates`, `relates-to`, `supersedes`. [source: bd dep add --help]
|
|
365
419
|
- `bd dep relate <a> <b>` / `bd dep unrelate <a> <b>`: bidirectional non-blocking `relates_to` link. Use for context, not order. [source: bd dep --help]
|
|
366
|
-
- `bd create --parent <
|
|
420
|
+
- `bd create --parent <bead-id>`: hierarchical child edge; auto-names child `<parent>.1`, `<parent>.2`, … and nests recursively — a child's own child becomes `<parent>.1.1`. `<bead-id>` can be an epic, a plain task, or an already-nested child; bd does not restrict `--parent` by issue type (`bd create --help` describes it generically as "Parent issue ID for hierarchical child"). [source: bd create --help]
|
|
367
421
|
- `bd create --deps discovered-from:<id>` or `bd dep add <new> <source> --type discovered-from`: follow-up work discovered from a source bead.
|
|
368
422
|
- `bd duplicate <new> --of <canonical>`: close duplicate issue and point at canonical. Use when two beads describe the same required work.
|
|
369
423
|
- `bd duplicates` / `bd find-duplicates --status open --method ai --json`: find exact or semantic duplicates before dispatching parallel chains.
|
|
370
424
|
- `bd supersede <old> --with <new>` or `bd dep add <new> <old> --type supersedes`: mark a replacement when a better-scoped fix bead replaces an obsolete/abandoned one.
|
|
371
425
|
- `bd dep cycles`, `bd dep tree <id>`, and `bd graph <id>`: sanity-check the execution graph before merge/publication.
|
|
372
426
|
|
|
427
|
+
**Default to nesting, not loose beads.** When a chain is dispatched to service an existing bead — a top-level task, an epic, or an already-nested child like `bd-x.1` — create the new bead with `bd create --parent <that-bead>` so it inherits the next sequential child ID (`bd-x.1`, or `bd-x.1.1` if the parent is itself a child). This applies uniformly, not only under epics — the common failure mode is orchestrators treating `--parent` as epic-only and defaulting every explorer/executor/reviewer/seconder/security bead spawned mid-chain to a loose top-level bead linked solely by a typed dep. `--parent` (hierarchy/ID) and a typed `bd dep add ... --type <blocks|validates|discovered-from>` edge (semantic relationship) are independent flags — combine both when the relationship needs naming beyond parentage. Only skip `--parent` when the new bead is a genuine standalone sibling concern, not work done on behalf of the bead it services.
|
|
428
|
+
|
|
373
429
|
Relationship vocabulary for specialist chains:
|
|
374
430
|
|
|
375
431
|
| Relationship | Reach for it when | Example command |
|
|
@@ -377,7 +433,7 @@ Relationship vocabulary for specialist chains:
|
|
|
377
433
|
| `blocks` | Hard must-happen-before sequencing: planner before executor, implementation before reviewer, restitch before publish. | `bd dep add <impl> <plan> --type blocks` |
|
|
378
434
|
| `tracks` | A local bead mirrors upstream or cross-project work whose status matters but is not owned here. | `bd dep add <local> external:xtrm-tools:<capability> --type tracks` |
|
|
379
435
|
| `related` | Loose topical association when no direction or scheduling effect is intended. Prefer `bd dep relate` for bidirectional relation. | `bd dep add <a> <b> --type related` |
|
|
380
|
-
| `parent-child` |
|
|
436
|
+
| `parent-child` | Any bead spawns tracked child work — epic owning chains, a task spawning its explorer/executor/reviewer, or an already-nested child spawning its own sub-chain. Prefer `bd create --parent <bead>` (not only `<epic>`) so IDs nest and parentage stays canonical instead of drifting into loose top-level beads. | `bd create --parent <bead-id> --title "executor: Impl auth retry" ...` |
|
|
381
437
|
| `discovered-from` | Reviewer, debugger, explorer, or test-runner surfaces new follow-up work from a run. | `bd dep add <follow-up> <reviewer-bead> --type discovered-from` |
|
|
382
438
|
| `until` | Time-bounded or event-bounded precondition that blocks only until a stated condition lands. | `bd dep add <chain> <precondition> --type until` |
|
|
383
439
|
| `caused-by` | Failure bead points to the root-cause bead/cluster that explains it. Makes test-failure-map epics navigable. | `bd dep add <failing-test> <root-cause> --type caused-by` |
|
|
@@ -416,7 +472,7 @@ Use each form for a different reason:
|
|
|
416
472
|
- `discovered-from` for spawned follow-up beads.
|
|
417
473
|
- `caused-by` for failure-to-root-cause attribution.
|
|
418
474
|
- `relates-to` / `bd dep relate` for soft linkage with no schedule effect.
|
|
419
|
-
- `parent-child` / `--parent` for epic ownership
|
|
475
|
+
- `parent-child` / `--parent` for hierarchy and child naming — use for any bead spawned to do work on behalf of another bead, not only epic ownership. Nests recursively: a chain dispatched from an already-nested child (e.g. `bd-x.1`) becomes `bd-x.1.1`, not a new loose top-level bead.
|
|
420
476
|
- `supersedes` / `bd supersede` for replacement work; `duplicate` for same-work issues.
|
|
421
477
|
|
|
422
478
|
Cross-repo consistency: keep this vocabulary aligned with the xtrm-tools triaging skill and sibling triage bead `xtrm-drkk`; both should use the same relationship names when rewiring issue graphs.
|
|
@@ -698,7 +754,7 @@ Use when:
|
|
|
698
754
|
### Step-by-step
|
|
699
755
|
|
|
700
756
|
1. **Run the suite once**, save the full log. Do not interpret yet.
|
|
701
|
-
2. **File one mapping bead** (e.g., `test-runner: refresh <epic> failure map`) with contract:
|
|
757
|
+
2. **File one mapping bead** titled per the Bead Title Convention (e.g., `test-runner: refresh <epic> failure map`) with contract:
|
|
702
758
|
- `PROBLEM:` exact command + exit status + raw failure count.
|
|
703
759
|
- `SUCCESS:` cluster table grouping every failure by **likely shared root cause and file scope**, plus recommended fix-chain order.
|
|
704
760
|
- `SCOPE:` the log file path + bounded test files involved.
|
|
@@ -736,29 +792,29 @@ Use for one implementation branch.
|
|
|
736
792
|
bd create --title "Fix token refresh retry" --type task --priority 2 --description "PROBLEM: login and refresh flow have a retry bug when transient token refresh fails before backoff clears stale state. SUCCESS: token refresh retries once, login survives transient failure, and terminal failure stays clear. SCOPE: src/auth/refresh.ts, src/cli/login.ts, tests/unit/auth/refresh.test.ts. NON_GOALS: no auth provider redesign, no storage migration, no UI changes. CONSTRAINTS: preserve token format, keep error text backward-compatible, avoid broad retry changes outside auth flow. VALIDATION: add regression test for fail-then-succeed path and run targeted auth tests. OUTPUT: changed files, test proof, residual risks."
|
|
737
793
|
bd update <task> --claim
|
|
738
794
|
|
|
739
|
-
# 2. Optional discovery when path is unknown
|
|
740
|
-
bd create --title "
|
|
795
|
+
# 2. Optional discovery when path is unknown — nested under task (bd-x.1) + typed edge for relationship semantics
|
|
796
|
+
bd create --parent <task> --title "explorer: map auth refresh path" --type task --priority 2 --description "PROBLEM: token refresh retry path is undocumented and likely drifts on failure handling. SUCCESS: evidence-backed plan names exact files, symbols, and risk. SCOPE: src/auth/refresh.ts, src/cli/login.ts, tests/unit/auth/*.test.ts. NON_GOALS: no implementation, no broad audit. CONSTRAINTS: READ_ONLY, cite files/symbols/flows, stay within live repo evidence. VALIDATION: findings cite code path and recommended sequence. OUTPUT: tracked discovery plan with stop condition."
|
|
741
797
|
bd dep add <explore> <task> --type discovered-from
|
|
742
798
|
specialists run explorer --bead <explore> --context-depth 3
|
|
743
799
|
specialists result <explore-job>
|
|
744
800
|
|
|
745
|
-
# 3. Implementation
|
|
746
|
-
bd create --title "
|
|
801
|
+
# 3. Implementation — nested under task (bd-x.2)
|
|
802
|
+
bd create --parent <task> --title "executor: implement token refresh retry" --type task --priority 2 --description "PROBLEM: login fails after transient token refresh error because retry path returns before backoff and clear error state. SUCCESS: retry waits once, preserves session on success, and surfaces final failure clearly. SCOPE: src/auth/refresh.ts, src/cli/login.ts, tests/unit/auth/refresh.test.ts. NON_GOALS: no auth redesign, no storage migration, no UI refresh. CONSTRAINTS: preserve existing token format, keep backward-compatible error text, avoid broad retry changes elsewhere. VALIDATION: add regression test for transient failure then success; run targeted auth tests. OUTPUT: changed files, test evidence, residual risks."
|
|
747
803
|
bd dep add <impl> <explore-or-task> --type blocks
|
|
748
804
|
specialists run executor --bead <impl> --context-depth 3
|
|
749
805
|
specialists result <exec-job>
|
|
750
806
|
|
|
751
|
-
# 4. Advisory passes when diff smells risky
|
|
752
|
-
bd create --title "
|
|
807
|
+
# 4. Advisory passes when diff smells risky — nested under impl (bd-x.2.1, bd-x.2.2), since they service impl's diff specifically
|
|
808
|
+
bd create --parent <impl> --title "seconder: sanity check token retry diff" --type task --priority 2 --description "PROBLEM: auth retry diff has control-flow and state-handling smell that could hide bug. SUCCESS: findings identify concrete simplification or confirm clean shape. SCOPE: executor diff in auth refresh and login flow. NON_GOALS: no edits, no merge gate decision. CONSTRAINTS: READ_ONLY, keep feedback cheap, cite exact lines or symbols. VALIDATION: findings name concrete improvement or say OK. OUTPUT: FINDINGS with severity or OK with caveats."
|
|
753
809
|
bd dep add <sanity-bead> <impl> --type validates
|
|
754
810
|
specialists run seconder --bead <sanity-bead> --job <exec-job> --context-depth 3
|
|
755
811
|
|
|
756
|
-
bd create --title "
|
|
812
|
+
bd create --parent <impl> --title "security-auditor: scan token retry diff" --type task --priority 2 --description "PROBLEM: auth refresh code touches secrets and session handling, so security regression is possible. SUCCESS: findings isolate real risk surface or confirm no obvious issue. SCOPE: executor diff in auth, token storage, and login path. NON_GOALS: no edits, no package updates, no destructive scans, no live exploit tests. CONSTRAINTS: LOW permissions, scan-only, recommendations only. VALIDATION: findings cite auth/secrets/input surface and why it matters. OUTPUT: recommendations for executor to apply in separate bead."
|
|
757
813
|
bd dep add <security-bead> <impl> --type validates
|
|
758
814
|
specialists run security-auditor --bead <security-bead> --job <exec-job> --context-depth 3
|
|
759
815
|
|
|
760
|
-
# 5. Final review
|
|
761
|
-
bd create --title "
|
|
816
|
+
# 5. Final review — nested under impl (bd-x.2.3)
|
|
817
|
+
bd create --parent <impl> --title "reviewer: verify token refresh retry" --type task --priority 2 --description "PROBLEM: verify executor output against auth retry requirements. SUCCESS: PASS only if retry behavior, error handling, and tests satisfy contract. SCOPE: executor job, diff, acceptance criteria, and target auth files. NON_GOALS: do not rewrite unless explicitly asked. CONSTRAINTS: code-review mindset; findings first; verify security and sanity findings were handled. VALIDATION: inspect targeted checks and regression coverage. OUTPUT: PASS/PARTIAL/FAIL with file/line findings."
|
|
762
818
|
bd dep add <review> <impl> --type validates
|
|
763
819
|
specialists run reviewer --bead <review> --job <exec-job> --context-depth 3
|
|
764
820
|
specialists result <review-job>
|
|
@@ -789,18 +845,20 @@ Use epic when multiple implementation chains publish together.
|
|
|
789
845
|
# Epic bead
|
|
790
846
|
bd create --title "Epic: auth refresh hardening" --type epic --priority 2 --description "PROBLEM: login and refresh flow have retry drift, weak error surfacing, and unclear follow-up ownership. SUCCESS: epic closes with stable retry behavior, tests, docs, and clean publish. SCOPE: src/auth/*, src/cli/login.ts, tests/unit/auth/*, docs/auth-refresh.md. NON_GOALS: no auth provider swap, no storage migration, no unrelated session revamp. CONSTRAINTS: preserve token format, keep login compatible, sequence risky fixes before merge, use child beads for parallelizable slices. VALIDATION: targeted tests, seconder or security pass if risk appears, final reviewer PASS. OUTPUT: merged chain set with notes on remaining gaps."
|
|
791
847
|
|
|
792
|
-
# Planner bead
|
|
793
|
-
bd create --parent <epic> --title "
|
|
848
|
+
# Planner bead — bd-epic.1
|
|
849
|
+
bd create --parent <epic> --title "planner: plan auth refresh split" --type task --priority 2 --description "PROBLEM: epic needs disjoint chains before executor starts. SUCCESS: child beads, dependency edges, and file ownership split are explicit. SCOPE: auth refresh epic area. NON_GOALS: no code changes. CONSTRAINTS: keep chains disjoint, identify security-sensitive slice, name review order. VALIDATION: plan names beads and edges. OUTPUT: parallel-ready plan with risk notes."
|
|
794
850
|
specialists run planner --bead <plan> --context-depth 3
|
|
795
851
|
|
|
796
|
-
# Parallel impl beads
|
|
797
|
-
bd create --parent <epic> --title "
|
|
798
|
-
bd create --parent <epic> --title "
|
|
852
|
+
# Parallel impl beads — bd-epic.2, bd-epic.3
|
|
853
|
+
bd create --parent <epic> --title "executor: impl auth retry" --type task --priority 2 --description "PROBLEM: transient refresh failure breaks login flow. SUCCESS: retry path succeeds after one transient failure and preserves session state. SCOPE: src/auth/refresh.ts, tests/unit/auth/refresh.test.ts. NON_GOALS: no UI changes, no storage migration, no unrelated retry framework edits. CONSTRAINTS: preserve error text, keep backoff bounded, avoid side effects outside auth flow. VALIDATION: regression test for fail-then-succeed path. OUTPUT: code diff, test proof, residual risk list."
|
|
854
|
+
bd create --parent <epic> --title "executor: impl login handoff" --type task --priority 2 --description "PROBLEM: login CLI does not surface refresh outcome clearly enough for operators. SUCCESS: login shows clear success/failure handoff and no stale token state. SCOPE: src/cli/login.ts, tests/unit/cli/login.test.ts. NON_GOALS: no auth protocol redesign. CONSTRAINTS: preserve CLI flags and error codes, keep output terse. VALIDATION: CLI regression test. OUTPUT: login diff and test evidence."
|
|
799
855
|
|
|
800
856
|
specialists run executor --bead <impl-a> --context-depth 3
|
|
801
857
|
specialists run executor --bead <impl-b> --context-depth 3
|
|
802
858
|
|
|
803
|
-
# Per-chain review
|
|
859
|
+
# Per-chain review — nested under each impl (bd-epic.2.1, bd-epic.3.1)
|
|
860
|
+
bd create --parent <impl-a> --title "reviewer: verify auth retry" --type task --priority 2 --description "..."
|
|
861
|
+
bd create --parent <impl-b> --title "reviewer: verify login handoff" --type task --priority 2 --description "..."
|
|
804
862
|
bd dep add <review-a> <impl-a> --type validates
|
|
805
863
|
bd dep add <review-b> <impl-b> --type validates
|
|
806
864
|
specialists run reviewer --bead <review-a> --job <exec-a-job> --context-depth 3
|
|
@@ -1250,6 +1308,8 @@ Then choose one action:
|
|
|
1250
1308
|
## What Orchestrator Does Differently Because Of This Skill
|
|
1251
1309
|
|
|
1252
1310
|
- Writes bead contract before dispatch.
|
|
1311
|
+
- Nests specialist-dispatch beads under the bead they service via `--parent`, regardless of whether that bead is an epic, a task, or already a nested child — never defaults to loose top-level beads.
|
|
1312
|
+
- Titles every specialist-dispatch bead `<specialist-role>: <task>` so `bd list`/`sp ps` are scannable by role at a glance.
|
|
1253
1313
|
- Chooses edge type before creating chain.
|
|
1254
1314
|
- Uses specialist role by job shape, not by habit.
|
|
1255
1315
|
- Keeps fix loops alive with resume, not re-spawn.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"metadata": {
|
|
4
4
|
"name": "bare",
|
|
5
5
|
"version": "1.0.0",
|
|
6
|
-
"description": "TEMPLATE
|
|
6
|
+
"description": "TEMPLATE \u2014 do not dispatch. Copy from the installed @jaggerxtrm/specialists package to .specialists/user/<your-name>.specialist.json and customize for your own task. Fresh-canvas specialist template for non-coding transforms that need zero runtime prompt injection.",
|
|
7
7
|
"category": "template",
|
|
8
8
|
"tags": [
|
|
9
9
|
"template",
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
"execution": {
|
|
15
15
|
"bare": true,
|
|
16
16
|
"mode": "tool",
|
|
17
|
-
"model":
|
|
18
|
-
"fallback_model":
|
|
17
|
+
"model": null,
|
|
18
|
+
"fallback_model": null,
|
|
19
19
|
"timeout_ms": 120000,
|
|
20
20
|
"max_retries": 0,
|
|
21
21
|
"interactive": false,
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
]
|
|
15
15
|
},
|
|
16
16
|
"execution": {
|
|
17
|
-
"model":
|
|
18
|
-
"fallback_model":
|
|
17
|
+
"model": null,
|
|
18
|
+
"fallback_model": null,
|
|
19
19
|
"timeout_ms": 120000,
|
|
20
20
|
"stall_timeout_ms": 120000,
|
|
21
21
|
"response_format": "markdown",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
]
|
|
41
41
|
},
|
|
42
42
|
"prompt": {
|
|
43
|
-
"system": "# changelog-drafter
|
|
43
|
+
"system": "# changelog-drafter \u2014 Read-Only Release Drafting\n\nYou synthesize changelog and release-note text only. You do NOT publish releases, bump versions, edit files, create commits, create tags, push, or require a worktree.\n\n## Hard scope\n\nDraft only:\n- changelog section text\n- release metadata summary\n- version-range summary\n\nForbidden:\n- file edits\n- git commit/tag/push\n- build/release side effects\n- worktree assumptions\n\n## Synthesis input\n\nxt reports under `.xtrm/reports/` are curated intent and post-mortem context. Use them to write WHY-grounded entries instead of pure WHAT diffs.\n\nDo NOT crawl `src/`, `docs/`, or run `git log -p`. Use report bundle as primary input.\n\n## Output shape\n\nReturn release-ready markdown plus optional structured metadata in a JSON block if asked by caller. Keep bullets one line each. Default bucket is Changed.\n\n## Section format\n\n```\n## [vX.Y.Z] \u2014 YYYY-MM-DD\n\n### Added\n- ...\n\n### Changed\n- ...\n\n### Fixed\n- ...\n```\n\n## Version policy\n\n- Default: patch bump unless caller supplies explicit version or bump type.\n- If neither is specified, STOP and report `BLOCKED: version-not-specified`.\n\n## Forbidden\n\n- editing files\n- publishing steps\n- worktree setup\n- release automation beyond drafting\n- inventing bullets not supported by reports\n",
|
|
44
44
|
"task_template": "$prompt\n\n$reused_worktree_awareness\n\nWorking directory: $cwd\n\n$bead_context\n\nInject xt report bundle first, then draft. Draft only; do not publish or mutate files. Return release-ready text and any metadata needed by xt release prepare. Proceed step-by-step.\n",
|
|
45
45
|
"system_prompt_mode": "append"
|
|
46
46
|
},
|
|
@@ -63,6 +63,7 @@
|
|
|
63
63
|
"stale_threshold_days": 30
|
|
64
64
|
},
|
|
65
65
|
"beads_integration": "auto",
|
|
66
|
-
"beads_write_notes": false
|
|
66
|
+
"beads_write_notes": false,
|
|
67
|
+
"stall_detection": {}
|
|
67
68
|
}
|
|
68
69
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"metadata": {
|
|
4
4
|
"name": "changelog-keeper",
|
|
5
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
|
|
6
|
+
"description": "CHANGELOG.md gap-filler. Reconciles [Unreleased] from xt reports + commit subjects in a tag range. Edits CHANGELOG.md only \u2014 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
8
|
"updated": "2026-05-07",
|
|
9
9
|
"tags": [
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
]
|
|
14
14
|
},
|
|
15
15
|
"execution": {
|
|
16
|
-
"model":
|
|
17
|
-
"fallback_model":
|
|
16
|
+
"model": null,
|
|
17
|
+
"fallback_model": null,
|
|
18
18
|
"timeout_ms": 0,
|
|
19
19
|
"stall_timeout_ms": 120000,
|
|
20
20
|
"response_format": "markdown",
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
]
|
|
38
38
|
},
|
|
39
39
|
"prompt": {
|
|
40
|
-
"system": "# changelog-keeper
|
|
41
|
-
"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
|
|
40
|
+
"system": "# changelog-keeper \u2014 [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 \u2192 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 \u2014 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 \u2014 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 \u2014 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.",
|
|
41
|
+
"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 \u2014 the /releasing skill owns those. Edit CHANGELOG.md only.\n",
|
|
42
42
|
"system_prompt_mode": "append"
|
|
43
43
|
},
|
|
44
44
|
"skills": {
|
|
@@ -72,6 +72,7 @@
|
|
|
72
72
|
"stale_threshold_days": 30
|
|
73
73
|
},
|
|
74
74
|
"beads_integration": "auto",
|
|
75
|
-
"beads_write_notes": true
|
|
75
|
+
"beads_write_notes": true,
|
|
76
|
+
"stall_detection": {}
|
|
76
77
|
}
|
|
77
78
|
}
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
]
|
|
15
15
|
},
|
|
16
16
|
"execution": {
|
|
17
|
-
"model":
|
|
18
|
-
"fallback_model":
|
|
17
|
+
"model": null,
|
|
18
|
+
"fallback_model": null,
|
|
19
19
|
"timeout_ms": 0,
|
|
20
20
|
"stall_timeout_ms": 120000,
|
|
21
21
|
"response_format": "markdown",
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
},
|
|
16
16
|
"execution": {
|
|
17
17
|
"mode": "tool",
|
|
18
|
-
"model":
|
|
19
|
-
"fallback_model":
|
|
18
|
+
"model": null,
|
|
19
|
+
"fallback_model": null,
|
|
20
20
|
"timeout_ms": 0,
|
|
21
21
|
"stall_timeout_ms": 120000,
|
|
22
22
|
"response_format": "markdown",
|
|
@@ -48,8 +48,8 @@
|
|
|
48
48
|
}
|
|
49
49
|
},
|
|
50
50
|
"prompt": {
|
|
51
|
-
"system": "You are codebase explorer specialist with GitNexus knowledge graph access.\nJob: analyze codebases deep, give clear structured answers about\narchitecture, patterns, code organization.\n\n## Primary Approach
|
|
52
|
-
"task_template": "Explore the codebase and answer the following question:\n\n$prompt\n\nWorking directory: $cwd\n\n## Required exploration steps (MCP form shown; if MCP tools not loaded, use `npx gitnexus query|context` CLI
|
|
51
|
+
"system": "You are codebase explorer specialist with GitNexus knowledge graph access.\nJob: analyze codebases deep, give clear structured answers about\narchitecture, patterns, code organization.\n\n## Primary Approach \u2014 GitNexus (use when indexed)\n\nStart here for any codebase. GitNexus gives call chains, execution flows,\nsymbol relationships that grep/find cannot. Prefer MCP tools; if not loaded\nin the harness, fall back to the `npx gitnexus` CLI (equivalent evidence \u2014\nreviewer accepts either form):\n\n- MCP `gitnexus_query({query})` \u2194 CLI `npx gitnexus query \"<text>\"`\n- MCP `gitnexus_context({name})` \u2194 CLI `npx gitnexus context <name>`\n- MCP `gitnexus_impact({target})` \u2194 CLI `npx gitnexus impact <target>`\n- MCP resources (`gitnexus://repo/{name}/clusters`, `/process/{name}`) have no CLI equivalent \u2014 skip if MCP unavailable.\n\n1. Read `gitnexus://repo/{name}/context`\n \u2192 Stats, staleness check. If stale, fall back to bash.\n2. `gitnexus_query({query: \"<what you want to understand>\"})`\n \u2192 Find execution flows and related symbols grouped by process.\n3. `gitnexus_context({name: \"<symbol>\"})`\n \u2192 360-degree view: callers, callees, processes symbol participates in.\n4. Read `gitnexus://repo/{name}/clusters`\n \u2192 Functional areas with cohesion scores (architectural map).\n5. Read `gitnexus://repo/{name}/process/{name}`\n \u2192 Step-by-step execution trace for specific flow.\n\n## Fallback Approach \u2014 Bash/Grep\n\nUse when GitNexus unavailable or index stale:\n- `find`, `tree`, `grep -r` for structure discovery\n- Read key files: package.json, tsconfig.json, README.md, src/index.ts\n- Trace imports manually for layer dependencies\n\n## Output Format\n\nAlways provide:\n1. **Summary** (2-3 sentences)\n2. **Architecture overview** \u2014 layers, modules, key patterns\n3. **Execution flows** (GitNexus) or **Directory map** (fallback)\n4. **Key symbols** \u2014 entry points, central hubs, important interfaces\n5. **Answer** \u2014 direct response to specific question\n\nSTRICT CONSTRAINTS:\n- MUST NOT edit, write, or modify any files.\n- Read-only: bash (read-only commands), grep, find, ls, GitNexus tools only.\n- If find something worth fixing, REPORT it \u2014 do not fix.\nEFFICIENCY RULE: Stop using tools and write final answer after at most 12 tool calls.",
|
|
52
|
+
"task_template": "Explore the codebase and answer the following question:\n\n$prompt\n\nWorking directory: $cwd\n\n## Required exploration steps (MCP form shown; if MCP tools not loaded, use `npx gitnexus query|context` CLI \u2014 same evidence):\n1. `gitnexus_query({query: \"<your question>\"})` or `npx gitnexus query \"<question>\"` \u2014 find execution flows and symbols\n2. `gitnexus_context({name: \"<key symbol>\"})` or `npx gitnexus context <symbol>` \u2014 callers, callees, process participation\n3. Read `gitnexus://repo/{name}/clusters` \u2014 architectural map\n4. Read `gitnexus://repo/{name}/process/{name}` \u2014 step-by-step execution traces\n5. Read source files ONLY for details that GitNexus didn't cover\n\nDo NOT skip to grep/find \u2014 GitNexus is your primary navigation tool.\n",
|
|
53
53
|
"output_schema": {
|
|
54
54
|
"type": "object",
|
|
55
55
|
"properties": {
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
},
|
|
18
18
|
"execution": {
|
|
19
19
|
"mode": "tool",
|
|
20
|
-
"model":
|
|
21
|
-
"fallback_model":
|
|
20
|
+
"model": null,
|
|
21
|
+
"fallback_model": null,
|
|
22
22
|
"timeout_ms": 0,
|
|
23
23
|
"stall_timeout_ms": 120000,
|
|
24
24
|
"response_format": "markdown",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"bare": false
|
|
31
31
|
},
|
|
32
32
|
"prompt": {
|
|
33
|
-
"system": "You are a memory curator for a software project. You synthesize the project's accumulated bd memories and current code state into a clean, dense context document at .xtrm/memory.md
|
|
33
|
+
"system": "You are a memory curator for a software project. You synthesize the project's accumulated bd memories and current code state into a clean, dense context document at .xtrm/memory.md \u2014 written for a fresh agent who has never seen this codebase.\n\nFollow the `memory-audit-transaction` skill exactly. It defines the chunked file-backed ledger workflow that scales to any N memories without exhausting context.\n\n## Hard rules (non-negotiable)\n\n- **Per-entry decisions never go in chat.** Append every classification to `.tmp/memory-audit/decisions.jsonl` as a JSON line. Chat output per chunk is one line: `chunk N: X classified (Current=a, Stale=b, Contradicted=c, Redundant=d, Skipped=e)`.\n- **Chunk size is 20-30 memories per turn.** Never classify more than 30 entries in one model turn. Checkpoint to disk between chunks.\n- **Completeness gate before .xtrm/memory.md write.** Before Phase 8, `wc -l .tmp/memory-audit/keys.txt` must equal `wc -l .tmp/memory-audit/decisions.jsonl`. If not, STOP and report the gap. Never default missing rows to Current.\n- **Conservative pruning.** When in doubt about a memory's status, write `status=Skipped` with `evidence=[\"unverifiable: <reason>\"]`. Never default to Current without evidence; never delete without evidence.\n- **No destructive git ever.** Forbidden: `git pull`, `git push`, `git reset --hard`, `git rebase`, `git checkout HEAD --`, force-push, any history rewrite. Memory audit is local read + bd forget + single-file write only.\n- **Hash-guarded prune.** Each `bd forget` re-verifies sha256(bd recall) against the hash captured at classification time. Mismatches are skipped and logged, not silently dropped.\n\n## Workflow summary\n\nPhases 1-9 are defined in `config/skills/memory-audit-transaction/SKILL.md` (injected). Adhere to it line-by-line:\n\n1. Read `.xtrm/memory.md` (existing)\n2. Read targeted sections of latest 3 session reports\n3. Bulk-export all memories to `.tmp/memory-audit/memories.txt` via ONE shell call\n4. Single-pass project state read (git log -30, CLAUDE.md head, README.md head)\n5. Chunked classification, decisions appended to `.tmp/memory-audit/decisions.jsonl`\n6. Completeness validator (HARD GATE)\n7. Atomic prune with hash guard (single batch loop, output goes to `.tmp/memory-audit/apply-log.txt`)\n8. Write `.xtrm/memory.md` filtered from Current rows\n9. Final report: counts + artifact paths, NOT per-entry text\n\n## Output format\n\nFinal chat output is the Memory Processor Report defined in the skill Phase 9. Counts only. Per-entry data lives in artifacts:\n\n- `.tmp/memory-audit/decisions.jsonl` \u2014 every classification with evidence\n- `.tmp/memory-audit/apply-log.txt` \u2014 every applied/skipped prune\n- `.tmp/memory-audit/backup/<key>.txt` \u2014 per-key backup before delete\n",
|
|
34
34
|
"task_template": "Run the memory processor for this project.\n\nWorking directory: $cwd\n$prompt\n\n$bead_context\n\nFollow the `memory-audit-transaction` skill (injected) exactly. The skill replaces the legacy linear workflow with chunked file-backed ledger that scales past 500+ memories.\n\nHard constraints reminder:\n- Chunks of 20-30 per turn, decisions to `.tmp/memory-audit/decisions.jsonl` not chat\n- Phase 6 completeness gate is non-negotiable; do NOT default missing rows to Current\n- Phase 7 prune is one batch loop with hash-guard, not inline `bd forget` per decision\n- No destructive git commands\n\nProceed step-by-step.\n",
|
|
35
35
|
"system_prompt_mode": "append"
|
|
36
36
|
},
|