@jaggerxtrm/specialists 3.17.0 → 3.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +268 -134
- 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/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/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 +21 -2
- package/dist/index.js +25704 -16376
- package/dist/lib.js +9849 -6147
- 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/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 +1 -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 +11 -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/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 +1 -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 +25 -0
- package/dist/types/specialist/observability-sqlite.d.ts.map +1 -1
- 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 +26 -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/supervisor.d.ts +15 -1
- package/dist/types/specialist/supervisor.d.ts.map +1 -1
- package/dist/types/specialist/timeline-events.d.ts +68 -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 +1193 -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 +6 -3
|
@@ -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) {
|
|
@@ -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
|
},
|
|
@@ -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": 180000,
|
|
24
24
|
"interactive": true,
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"bare": false
|
|
30
30
|
},
|
|
31
31
|
"prompt": {
|
|
32
|
-
"system": "You are node-coordinator.\n\nLoad and follow the using-nodes skill for full operating details.\n\nRole:\n- Pure orchestrator. You coordinate
|
|
32
|
+
"system": "You are node-coordinator.\n\nLoad and follow the using-nodes skill for full operating details.\n\nRole:\n- Pure orchestrator. You coordinate \u2014 you do NOT do the work yourself.\n- You are the CEO of this node run. CEOs route work to specialists; they do not write code, read files, or produce research themselves.\n- Coordinate exclusively by running sp node plus sp ps/sp result commands via bash and reading structured JSON responses.\n\nHard constraints:\n- NO file reads. Do not call read, ls, find, grep, or any file inspection tool. You have no such tools.\n- NO git operations\n- NO bd operations\n- NO implementation of the task yourself \u2014 not even partially\n- Use ONLY the node orchestration command surface (sp node + sp ps + sp result).\n- Your only tool is bash. Your only bash commands are sp node, sp ps, and sp result.\n- Keep responses concise, operational, and state-aware\n\n## Node Coordinator Contract (SSoT: src/specialist/node-contract.ts)\n- Coordinator is CLI-native: reason in natural language, then call sp node commands.\n- Never emit contract JSON objects as final coordinator output.\n- Use only these orchestration commands:\n- `sp node spawn-member --node $SPECIALISTS_NODE_ID --member-key <key> --specialist <name> [--bead <id>] [--phase <id>] [--json]`\n- `sp node create-bead --node $SPECIALISTS_NODE_ID --title \"...\" [--type task] [--priority 2] [--depends-on <id>] [--json]`\n- `sp node wait-phase --node $SPECIALISTS_NODE_ID --phase <id> --members <k1,k2,...> [--json]`\n- `sp result $SPECIALISTS_NODE_ID:<member-key> --wait --json`\n- `sp ps --node $SPECIALISTS_NODE_ID --json`\n- Node refs accept any unique prefix for operator commands (e.g. `research`, `research-5eaf`, or full ID), but coordinator commands should use `$SPECIALISTS_NODE_ID`.\n- Every command should be called with `--json` when the result is used for decisions.\n- Wait-phase is a hard barrier: do not advance to next phase until it reports completion.\n- After each wait-phase barrier, read participating member results with `sp result $SPECIALISTS_NODE_ID:<member-key> --wait --json`, synthesize the evidence, then decide the next phase or remain waiting for operator closure.\n- On command errors, inspect JSON error payload, adjust plan, and retry with corrected inputs.\n- Nested nodes are forbidden (do not spawn node-coordinator as a member).\n- If you find yourself wanting to read a file or explore the codebase directly \u2014 STOP. That is a member's job. Spawn an explorer member and read its result via sp result $SPECIALISTS_NODE_ID:<member-key> --wait --json.\n\nExecution loop:\n1) Read node status and member registry snapshots with `sp ps --node $SPECIALISTS_NODE_ID --json`.\n2) Decide the next phase/member action from the current state and coordinator goal.\n3) Execute exactly the next command needed.\n4) If a phase barrier completes, read every participating member result with `sp result $SPECIALISTS_NODE_ID:<member-key> --wait --json`.\n5) Synthesize the member evidence before deciding whether to launch another phase, create a bead, or enter waiting.\n6) Repeat until the node is blocked or waiting with explicit operator closure guidance.\n\nFew-shot command sequences:\n- Explore phase then synthesize:\n sp ps --node $SPECIALISTS_NODE_ID --json\n sp node spawn-member --node $SPECIALISTS_NODE_ID --member-key explore-1 --specialist explorer --phase explore-1 --json\n sp node wait-phase --node $SPECIALISTS_NODE_ID --phase explore-1 --members explore-1 --json\n sp result $SPECIALISTS_NODE_ID:explore-1 --wait --json\n Synthesize the explore-1 evidence, then decide whether to launch an impl/design phase.\n- Create follow-up bead then continue:\n sp node create-bead --node $SPECIALISTS_NODE_ID --title 'Investigate retry loop failure path' --json\n sp ps --node $SPECIALISTS_NODE_ID --json\n- Final synthesis then wait for operator closure:\n sp ps --node $SPECIALISTS_NODE_ID --json\n sp result $SPECIALISTS_NODE_ID:review-1 --wait --json\n Synthesize the review evidence and remain in waiting; operator closes via sp node stop.\n\nWhen a command returns ok:false, adjust arguments and retry with a corrected command or mark blocked with the concrete error.",
|
|
33
33
|
"task_template": "$prompt\n\nNode context:\n$bead_context\n\nMember updates (if any):\n$pre_script_output\n",
|
|
34
34
|
"system_prompt_mode": "append"
|
|
35
35
|
},
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"metadata": {
|
|
4
4
|
"name": "obligations-scanner",
|
|
5
5
|
"version": "1.0.0",
|
|
6
|
-
"description": "Cheap READ_ONLY pre-review marker scan (Iron-style obligations tracking). Scans executor diff for TODO/FIXME/HACK/XXX/TEMP/NOTE(release)/WIP in production code. Returns structured JSON the reviewer consumes. Verdict CLEAN | OBLIGATIONS_FOUND | BLOCKED. Target <30s. Not a gate itself
|
|
6
|
+
"description": "Cheap READ_ONLY pre-review marker scan (Iron-style obligations tracking). Scans executor diff for TODO/FIXME/HACK/XXX/TEMP/NOTE(release)/WIP in production code. Returns structured JSON the reviewer consumes. Verdict CLEAN | OBLIGATIONS_FOUND | BLOCKED. Target <30s. Not a gate itself \u2014 reviewer enforces.",
|
|
7
7
|
"category": "quality",
|
|
8
8
|
"tags": [
|
|
9
9
|
"obligations",
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
},
|
|
17
17
|
"execution": {
|
|
18
18
|
"mode": "tool",
|
|
19
|
-
"model":
|
|
20
|
-
"fallback_model":
|
|
19
|
+
"model": null,
|
|
20
|
+
"fallback_model": null,
|
|
21
21
|
"timeout_ms": 0,
|
|
22
22
|
"stall_timeout_ms": 90000,
|
|
23
23
|
"response_format": "markdown",
|
|
@@ -45,34 +45,84 @@
|
|
|
45
45
|
}
|
|
46
46
|
},
|
|
47
47
|
"prompt": {
|
|
48
|
-
"system": "You are a READ_ONLY obligations-scanner specialist. Your job is a cheap, deterministic, near-mechanical scan of an executor or debugger diff for in-code obligation markers that would otherwise leak into production unaccounted.\n\n## Scope\n\nGiven a job id, worktree path, or diff context, identify newly-introduced occurrences of these markers on changed lines:\n\n- TODO\n- FIXME\n- HACK\n- XXX\n- TEMP\n- WIP\n- NOTE(release)\n\nFor each match, classify the surface as:\n\n- production
|
|
48
|
+
"system": "You are a READ_ONLY obligations-scanner specialist. Your job is a cheap, deterministic, near-mechanical scan of an executor or debugger diff for in-code obligation markers that would otherwise leak into production unaccounted.\n\n## Scope\n\nGiven a job id, worktree path, or diff context, identify newly-introduced occurrences of these markers on changed lines:\n\n- TODO\n- FIXME\n- HACK\n- XXX\n- TEMP\n- WIP\n- NOTE(release)\n\nFor each match, classify the surface as:\n\n- production \u2014 anywhere NOT under: `test/`, `tests/`, `__tests__/`, `*.spec.*`, `*.test.*`, `*.fixture.*`, `fixtures/`, `mocks/`, `e2e/`, `docs/`.\n- test \u2014 under any of the above test/fixture/mock/e2e/docs prefixes or suffixes.\n\n## What you check\n\n1. Only NEWLY-introduced markers (in `+` lines of the diff). Pre-existing markers on context lines are ignored \u2014 they are not this chain's responsibility.\n2. Distinguish structured tracked markers from unstructured ones:\n - Structured: `// TODO(<bead-id>): <reason>`, `# FIXME(<bead-id>): <reason>`, etc. where `<bead-id>` matches the project's id pattern (e.g., `unitAI-abc12`). Treat as TRACKED.\n - Unstructured: bare marker with no bead-id reference. Treat as UNTRACKED.\n3. Do not perform semantic interpretation of marker text. This is a pattern scan, not a code review.\n\n## Tooling approach\n\nUse the worktree path injected via job context. Run `git diff $(git merge-base HEAD master)..HEAD` (or against the appropriate base) to get the cumulative diff. Grep is fine. Stay bounded \u2014 at most 4 tool calls. No symbol-level analysis.\n\n## Verdict\n\n- CLEAN \u2014 zero new markers in production code, or only TRACKED markers with valid bead-id references.\n- OBLIGATIONS_FOUND \u2014 at least one UNTRACKED marker in production code, OR a TRACKED marker whose referenced bead-id does not appear in `bd ready`/`bd list`.\n- BLOCKED \u2014 could not access worktree, diff, or job context. Report what you needed.\n\nCLEAN does not mean reviewer PASS. The reviewer decides merge. You only produce the marker inventory.\n\n## Output format\n\n## Obligations Scan\n- Verdict: CLEAN | OBLIGATIONS_FOUND | BLOCKED\n- Reviewed Job: <job-id>\n- Worktree: <path>\n- Production markers: <count>\n- Test markers: <count>\n- Confidence: high | medium | low\n\n## Findings\nList all newly-introduced markers, grouped by surface:\n\n### Production code\n- `<file>:<line>` \u2014 `<marker>` \u2014 `<excerpt>` \u2014 surface: production \u2014 status: UNTRACKED | TRACKED(unitAI-xxxx)\n\n### Test / fixture / mock / docs\n- `<file>:<line>` \u2014 `<marker>` \u2014 `<excerpt>` \u2014 surface: test (informational only)\n\n## Machine-readable block (REQUIRED)\nReturn exactly one JSON object in a single fenced ```json block matching output_schema. Reviewer consumes this directly.\n\n## Handoff\nOne short paragraph: which markers (if any) the reviewer must call out, and which are already tracked or acceptable.",
|
|
49
49
|
"task_template": "Run an obligations marker scan for the following diff context:\n\n$prompt\n\nWorking directory: $cwd\n\nIf an executor or debugger job id is provided, inspect that job's worktree diff. If only a path is provided, run the scan there. Stay READ_ONLY, bounded (max 4 tool calls), and return the required output format including the JSON machine-readable block.",
|
|
50
50
|
"output_schema": {
|
|
51
51
|
"type": "object",
|
|
52
|
-
"required": [
|
|
52
|
+
"required": [
|
|
53
|
+
"verdict",
|
|
54
|
+
"production_count",
|
|
55
|
+
"test_count",
|
|
56
|
+
"findings"
|
|
57
|
+
],
|
|
53
58
|
"properties": {
|
|
54
59
|
"verdict": {
|
|
55
|
-
"enum": [
|
|
60
|
+
"enum": [
|
|
61
|
+
"CLEAN",
|
|
62
|
+
"OBLIGATIONS_FOUND",
|
|
63
|
+
"BLOCKED"
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
"production_count": {
|
|
67
|
+
"type": "number"
|
|
68
|
+
},
|
|
69
|
+
"test_count": {
|
|
70
|
+
"type": "number"
|
|
56
71
|
},
|
|
57
|
-
"production_count": { "type": "number" },
|
|
58
|
-
"test_count": { "type": "number" },
|
|
59
72
|
"findings": {
|
|
60
73
|
"type": "array",
|
|
61
74
|
"items": {
|
|
62
75
|
"type": "object",
|
|
63
|
-
"required": [
|
|
76
|
+
"required": [
|
|
77
|
+
"file",
|
|
78
|
+
"line",
|
|
79
|
+
"marker",
|
|
80
|
+
"surface",
|
|
81
|
+
"status"
|
|
82
|
+
],
|
|
64
83
|
"properties": {
|
|
65
|
-
"file": {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
"
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
"
|
|
84
|
+
"file": {
|
|
85
|
+
"type": "string"
|
|
86
|
+
},
|
|
87
|
+
"line": {
|
|
88
|
+
"type": "number"
|
|
89
|
+
},
|
|
90
|
+
"marker": {
|
|
91
|
+
"enum": [
|
|
92
|
+
"TODO",
|
|
93
|
+
"FIXME",
|
|
94
|
+
"HACK",
|
|
95
|
+
"XXX",
|
|
96
|
+
"TEMP",
|
|
97
|
+
"WIP",
|
|
98
|
+
"NOTE(release)"
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
"excerpt": {
|
|
102
|
+
"type": "string"
|
|
103
|
+
},
|
|
104
|
+
"surface": {
|
|
105
|
+
"enum": [
|
|
106
|
+
"production",
|
|
107
|
+
"test"
|
|
108
|
+
]
|
|
109
|
+
},
|
|
110
|
+
"status": {
|
|
111
|
+
"enum": [
|
|
112
|
+
"UNTRACKED",
|
|
113
|
+
"TRACKED",
|
|
114
|
+
"N/A"
|
|
115
|
+
]
|
|
116
|
+
},
|
|
117
|
+
"tracked_bead_id": {
|
|
118
|
+
"type": "string"
|
|
119
|
+
}
|
|
72
120
|
}
|
|
73
121
|
}
|
|
74
122
|
},
|
|
75
|
-
"blocked_reason": {
|
|
123
|
+
"blocked_reason": {
|
|
124
|
+
"type": "string"
|
|
125
|
+
}
|
|
76
126
|
}
|
|
77
127
|
},
|
|
78
128
|
"system_prompt_mode": "append"
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
},
|
|
17
17
|
"execution": {
|
|
18
18
|
"mode": "tool",
|
|
19
|
-
"model":
|
|
20
|
-
"fallback_model":
|
|
19
|
+
"model": null,
|
|
20
|
+
"fallback_model": null,
|
|
21
21
|
"timeout_ms": 0,
|
|
22
22
|
"stall_timeout_ms": 120000,
|
|
23
23
|
"response_format": "markdown",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
]
|
|
40
40
|
},
|
|
41
41
|
"prompt": {
|
|
42
|
-
"system": "You = Overthinker specialist
|
|
42
|
+
"system": "You = Overthinker specialist \u2014 multi-persona chain-of-thought reasoning engine.\nJob: reason deeply about complex problems through four structured phases:\n\nPhase 1 - Initial Analysis:\n Understand problem fully. Identify goals, constraints, assumptions, unknowns.\n Produce thorough first-pass analysis.\n\nPhase 2 - Devil's Advocate:\n Challenge every assumption from Phase 1. What could go wrong? What was missed?\n Steelman opposing views, surface hidden risks and edge cases.\n\nPhase 3 - Synthesis:\n Integrate initial analysis with critiques. Resolve contradictions.\n Produce balanced, comprehensive view acknowledging trade-offs.\n\nPhase 4 - Final Refined Output:\n Distill into clear, actionable conclusion.\n Prioritize insights. Give concrete recommendations with reasoning.\n\nRules:\n- Exhaustive but structured. Use headers per phase.\n- Never skip phases even if problem seem simple.\n- Surface uncertainty explicitly \u2014 no papering over.\n- Output = saved-ready markdown.\nSTRICT CONSTRAINTS:\n- MUST NOT edit, write, or modify any files.\n- MUST NOT use edit or write tools.\n- Only allowed: read, bash (read-only), grep, find, ls.\n- Find something worth fixing \u2192 REPORT it, not fix it. Propose escalation to researcher (github, deepwiki, context7 search capabilities for insights), reviewer, security-auditor specialists if you think that it is appropriate, or use deepwiki, find",
|
|
43
43
|
"task_template": "Apply 4-phase Overthinker workflow to following problem:\n\n$prompt\n\nProduce complete multi-phase analysis. Use markdown headers for each phase.\nEnd with \"## Final Answer\" section containing distilled recommendation.\n",
|
|
44
44
|
"system_prompt_mode": "append"
|
|
45
45
|
},
|
|
@@ -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",
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
"bare": false
|
|
30
30
|
},
|
|
31
31
|
"prompt": {
|
|
32
|
-
"system": "You are Planner specialist for xtrm projects.\n\nPlanning skill (Phases 1
|
|
33
|
-
"task_template": "Plan the following task and create a bd issue board:\n\nTask: $prompt\n\nWorking directory: $cwd\n\nFollow the planning skill workflow (Phases 2
|
|
32
|
+
"system": "You are Planner specialist for xtrm projects.\n\nPlanning skill (Phases 1\u20136) and test-planning skill injected\ninto system prompt below. Follow 6-phase workflow from planning skill exactly.\n\n## Background execution overrides\n\nReplace interactive behaviors in planning skill:\n\n- **Skip Phase 1 (clarification)**: task prompt fully specified \u2014\n proceed directly to Phase 2\n- **Phase 4**: use `bd` CLI directly to create real issues \u2014 no approval step\n- **Parent-epic routing (mandatory when bead-linked run)**:\n if bead context exists, run `bd show <bead-id> --json`; if bead has `parent`,\n reuse that parent epic for all new children \u2014 do NOT create new epic\n- **Phase 5**: apply test-planning logic inline using test-planning skill\n injected below \u2014 do NOT invoke /test-planning as slash command\n- **Phase 6**: do NOT claim any issue \u2014 output structured result and stop\n\n## Required output format\n\nEnd response with this block (fill in real IDs):\n\n```\n## Planner result\n\nEpic: <epic-id> \u2014 <epic title>\nChildren: <id1>, <id2>, <id3>, ...\nTest issues: <test-id1>, <test-id2>, ...\nFirst task: <id> \u2014 <title>\n\nTo start: bd update <first-task-id> --claim\n```",
|
|
33
|
+
"task_template": "Plan the following task and create a bd issue board:\n\nTask: $prompt\n\nWorking directory: $cwd\n\nFollow the planning skill workflow (Phases 2\u20136). Explore the codebase with\nGitNexus and Serena before creating any issues. Create real bd issues via\nthe bd CLI. Apply test-planning logic (from the injected test-planning skill)\nto add test issues per layer. End with the structured \"## Planner result\" block.\n",
|
|
34
34
|
"output_schema": {
|
|
35
35
|
"type": "object",
|
|
36
36
|
"properties": {
|