@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
package/docs/skills.md
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Skills Catalog
|
|
3
|
+
scope: skills
|
|
4
|
+
category: overview
|
|
5
|
+
version: 2.0.1
|
|
6
|
+
updated: 2026-06-24
|
|
7
|
+
synced_at: bf6baf7a
|
|
8
|
+
description: Skills shipped in this repo and how they are distributed.
|
|
9
|
+
source_of_truth_for:
|
|
10
|
+
- "config/skills/**/*.md"
|
|
11
|
+
domain:
|
|
12
|
+
- skills
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Skills Catalog
|
|
16
|
+
|
|
17
|
+
> `sp` is a shorter alias for `specialists`.
|
|
18
|
+
|
|
19
|
+
Skills are prompt packages that add focused guidance to specialist runs and to local coding-agent sessions.
|
|
20
|
+
|
|
21
|
+
## Managed skill distribution
|
|
22
|
+
|
|
23
|
+
Skills are **Category B** filesystem-bound assets. External agent runtimes read them directly from disk, so xtrm-tools owns the canonical snapshot under `.xtrm/skills/default/` and exposes active links through `.claude/skills` and `.pi/skills`.
|
|
24
|
+
|
|
25
|
+
Check and refresh with xtrm-tools:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
xt doctor --cwd <repo> --json
|
|
29
|
+
xt update --repo <repo> --apply
|
|
30
|
+
xt update --root <projects-root> --apply
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
User-authored skills belong in the user/active layer used by the local agent setup. Treat `.xtrm/skills/default/` as managed output, not a hand-edited source tree.
|
|
34
|
+
|
|
35
|
+
## Repo-shipped skills
|
|
36
|
+
|
|
37
|
+
The package ships the source copies under `config/skills/`. The active `.xtrm/skills/...` files in a project may be refreshed by xtrm-tools.
|
|
38
|
+
|
|
39
|
+
### `using-specialists-v3`
|
|
40
|
+
|
|
41
|
+
Location: `config/skills/using-specialists-v3/SKILL.md`
|
|
42
|
+
|
|
43
|
+
Canonical orchestration doctrine for substantial tracked work. It covers bead contracts, dependency graph shape, conflict-cluster mapping, advisory passes, reviewer rebuttal, debugger-restitch, E2E smoke phases, monitoring cadence, `sp merge` / `sp epic merge`, and session-end handoff. Use this for multi-step implementation, debugging, reviews, docs sync planning, and specialist orchestration.
|
|
44
|
+
|
|
45
|
+
### `using-specialists-auto`
|
|
46
|
+
|
|
47
|
+
Location: `config/skills/using-specialists-auto/SKILL.md`
|
|
48
|
+
|
|
49
|
+
Autonomous/offline orchestration overlay. It delegates shared mechanics to `using-specialists-v3` and adds auto-mode pacing, per-item loop shape, escalation triggers, and unattended-run discipline.
|
|
50
|
+
|
|
51
|
+
### `using-specialists-v2` / `using-specialists`
|
|
52
|
+
|
|
53
|
+
Locations:
|
|
54
|
+
|
|
55
|
+
- `config/skills/using-specialists-v2/SKILL.md`
|
|
56
|
+
- `config/skills/using-specialists/SKILL.md`
|
|
57
|
+
|
|
58
|
+
Older orchestration references retained for compatibility and migration context. Prefer `using-specialists-v3` for current guidance.
|
|
59
|
+
|
|
60
|
+
### `sync-docs`
|
|
61
|
+
|
|
62
|
+
Location: `config/skills/sync-docs/SKILL.md`
|
|
63
|
+
|
|
64
|
+
Single-document documentation synchronizer. One invocation must name exactly one doc in SCOPE. It uses drift scans plus bounded report/commit context and must not be treated as a whole-tree docs auditor.
|
|
65
|
+
|
|
66
|
+
### `releasing`
|
|
67
|
+
|
|
68
|
+
Location: `config/skills/releasing/SKILL.md`
|
|
69
|
+
|
|
70
|
+
Release workflow driver. Owns version bump, changelog promotion, build, commit, tag, push, and npm publish. It may dispatch `changelog-keeper` to fill `[Unreleased]` gaps, but `changelog-keeper` itself does not publish.
|
|
71
|
+
|
|
72
|
+
### `update-specialists`
|
|
73
|
+
|
|
74
|
+
Location: `config/skills/update-specialists/SKILL.md`
|
|
75
|
+
|
|
76
|
+
Reconciles specialists/xtrm drift. Current model:
|
|
77
|
+
|
|
78
|
+
- Category A runtime assets: verify with `sp doctor --check-drift`; prune stale `.specialists/default/` snapshots with `sp prune-stale-defaults`.
|
|
79
|
+
- Category B filesystem assets: verify with `xt doctor --cwd <repo> --json`; refresh with `xt update --repo <repo> --apply` or `xt update --root <root> --apply`.
|
|
80
|
+
|
|
81
|
+
### `specialists-creator`
|
|
82
|
+
|
|
83
|
+
Location: `config/skills/specialists-creator/SKILL.md`
|
|
84
|
+
|
|
85
|
+
Guides creation and repair of `.specialist.json` files. Use `sp edit`, presets, `sp view`, and validation instead of hand-written ad-hoc JSON. Always choose models from live `pi --list-models`; do not cargo-cult old examples.
|
|
86
|
+
|
|
87
|
+
### `setup-specialists`
|
|
88
|
+
|
|
89
|
+
Location: `config/skills/setup-specialists/SKILL.md`
|
|
90
|
+
|
|
91
|
+
First-run Specialists setup workflow. Bootstraps `~/.config/specialists/user.json`, checks local Pi models, applies cross-repo `sp edit --global` overrides, and now covers interactive keep-alive defaults plus waiting auto-close settings.
|
|
92
|
+
|
|
93
|
+
### Other package skills
|
|
94
|
+
|
|
95
|
+
Additional shipped skills include:
|
|
96
|
+
|
|
97
|
+
- `using-script-specialists` — synchronous `sp script` / `sp serve` integration guidance
|
|
98
|
+
- `using-kpi` — observability SQLite/KPI analysis
|
|
99
|
+
- `using-nodes` — NodeSupervisor/coordinator workflow
|
|
100
|
+
- `memory-audit-transaction` — file-backed memory audit ledger pattern
|
|
101
|
+
- service/persona authoring and maintenance skills used by local workflows
|
|
102
|
+
|
|
103
|
+
Use `find config/skills -maxdepth 2 -name SKILL.md` or `sp list` / specialist definitions to see which skills each specialist loads.
|
|
104
|
+
|
|
105
|
+
## Referencing a skill from a specialist
|
|
106
|
+
|
|
107
|
+
In specialist JSON:
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
{
|
|
111
|
+
"specialist": {
|
|
112
|
+
"skills": {
|
|
113
|
+
"paths": [".xtrm/skills/active/sync-docs/"]
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Some package skills can also be referenced by canonical name when the runtime resolver supports that package-canonical lookup. Prefer existing package examples and validate with:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
sp view <name>
|
|
123
|
+
sp config show <name> --resolved
|
|
124
|
+
sp validate
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## See also
|
|
128
|
+
|
|
129
|
+
- [authoring.md](authoring.md)
|
|
130
|
+
- [specialists-catalog.md](specialists-catalog.md)
|
|
131
|
+
- [installation.md](installation.md)
|
|
132
|
+
- [hooks.md](hooks.md)
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# Specialist handoff schema
|
|
2
|
+
|
|
3
|
+
Use at end of every `run_complete` turn, resume turns included.
|
|
4
|
+
|
|
5
|
+
Common fields for all roles:
|
|
6
|
+
- `status`: `success | partial | error`
|
|
7
|
+
- `summary`: 1-3 sentences
|
|
8
|
+
- `files_changed`: `string[]`
|
|
9
|
+
- `follow_ups`: `string[]`
|
|
10
|
+
- `risks`: `string[]`
|
|
11
|
+
- `verification`: `string[]`
|
|
12
|
+
|
|
13
|
+
Role-specific fields:
|
|
14
|
+
- `reviewer`: `verdict`, `score`, `requirement_coverage[]`
|
|
15
|
+
- `executor` / `debugger`: `symbols_modified[]`, `lint_pass`, `tests_pass`, `impact_report`
|
|
16
|
+
- `changelog-keeper`: `version`, `commit`, `tag`, `pushed`
|
|
17
|
+
- `explorer`: `findings[]`, `recommended_next`
|
|
18
|
+
- `code-sanity`: `outcome`, `findings[]`
|
|
19
|
+
- `security-auditor`: `outcome`, `findings[]`
|
|
20
|
+
- `test-engineer`: machine-readable block uses behavioral `status` (`tests_written | blocked | source_bug_suspected`), plus `coverage_map[]`, `smoke_e2e_commands[]`, `telemetry_assertions[]`, `test_runner_commands[]`, `known_deferred_paths[]`, `source_bug_suspicions[]`
|
|
21
|
+
- `test-runner`: `pass_count`, `fail_count`, `skip_count`, `commands_executed[]`, `artifact_evidence[]`, `classification[]`
|
|
22
|
+
|
|
23
|
+
Notes:
|
|
24
|
+
- Keep `reviewer` verdict shape aligned with `reviewer-verdict-format`; do not duplicate its prose rules.
|
|
25
|
+
- `tests_pass` may be `true | false | "n/a"` for executor/debugger when tests were not run.
|
|
26
|
+
- JSON block must be last in assistant turn.
|
|
27
|
+
|
|
28
|
+
## Minimal compliant block
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"status": "success",
|
|
33
|
+
"summary": "Done.",
|
|
34
|
+
"files_changed": ["config/example.json"],
|
|
35
|
+
"follow_ups": [],
|
|
36
|
+
"risks": [],
|
|
37
|
+
"verification": ["bunx tsc --noEmit"]
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Role examples
|
|
42
|
+
|
|
43
|
+
### executor / debugger
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"status": "success",
|
|
47
|
+
"summary": "Applied targeted fix and verified compile.",
|
|
48
|
+
"files_changed": ["src/a.ts"],
|
|
49
|
+
"follow_ups": [],
|
|
50
|
+
"risks": [],
|
|
51
|
+
"verification": ["bunx tsc --noEmit"],
|
|
52
|
+
"symbols_modified": ["runTask"],
|
|
53
|
+
"lint_pass": true,
|
|
54
|
+
"tests_pass": "n/a",
|
|
55
|
+
"impact_report": {
|
|
56
|
+
"files_touched": ["src/a.ts"],
|
|
57
|
+
"symbols_analyzed": ["runTask"],
|
|
58
|
+
"highest_risk": "LOW",
|
|
59
|
+
"tool_invocations": 3
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### reviewer
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"status": "success",
|
|
68
|
+
"summary": "Reviewed diff against bead.",
|
|
69
|
+
"files_changed": ["src/a.ts"],
|
|
70
|
+
"follow_ups": [],
|
|
71
|
+
"risks": [],
|
|
72
|
+
"verification": ["git diff --stat"],
|
|
73
|
+
"verdict": "PASS",
|
|
74
|
+
"score": 92,
|
|
75
|
+
"requirement_coverage": [
|
|
76
|
+
{"requirement": "schema block", "status": "met", "evidence": "present", "gap": ""}
|
|
77
|
+
]
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### changelog-keeper
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"status": "success",
|
|
85
|
+
"summary": "Release landed.",
|
|
86
|
+
"files_changed": ["CHANGELOG.md"],
|
|
87
|
+
"follow_ups": [],
|
|
88
|
+
"risks": [],
|
|
89
|
+
"verification": ["git diff --stat"],
|
|
90
|
+
"version": "1.2.3",
|
|
91
|
+
"commit": "abc1234",
|
|
92
|
+
"tag": "v1.2.3",
|
|
93
|
+
"pushed": true
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### explorer
|
|
98
|
+
```json
|
|
99
|
+
{
|
|
100
|
+
"status": "partial",
|
|
101
|
+
"summary": "Mapped likely path and one gap remains.",
|
|
102
|
+
"files_changed": [],
|
|
103
|
+
"follow_ups": ["inspect src/a.ts"],
|
|
104
|
+
"risks": ["Path may be stale"],
|
|
105
|
+
"verification": ["gitnexus_query('concept')"],
|
|
106
|
+
"findings": ["src/a.ts: likely entry point"],
|
|
107
|
+
"recommended_next": "Ask executor to patch src/a.ts"
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### code-sanity
|
|
112
|
+
```json
|
|
113
|
+
{
|
|
114
|
+
"status": "success",
|
|
115
|
+
"summary": "Checked scope and found no drift.",
|
|
116
|
+
"files_changed": ["src/a.ts"],
|
|
117
|
+
"follow_ups": [],
|
|
118
|
+
"risks": [],
|
|
119
|
+
"verification": ["git diff --stat"],
|
|
120
|
+
"outcome": "OK",
|
|
121
|
+
"findings": []
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### security-auditor
|
|
126
|
+
```json
|
|
127
|
+
{
|
|
128
|
+
"status": "partial",
|
|
129
|
+
"summary": "Reviewed changes for obvious security issues.",
|
|
130
|
+
"files_changed": ["src/a.ts"],
|
|
131
|
+
"follow_ups": [],
|
|
132
|
+
"risks": ["Input path needs caller validation"],
|
|
133
|
+
"verification": ["git diff --stat"],
|
|
134
|
+
"outcome": "findings",
|
|
135
|
+
"findings": [
|
|
136
|
+
{"severity": "medium", "file": "src/a.ts", "concern": "Unsanitized input", "source": "diff"}
|
|
137
|
+
]
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### test-engineer
|
|
142
|
+
```json
|
|
143
|
+
{
|
|
144
|
+
"status": "tests_written",
|
|
145
|
+
"summary": "Added regression coverage and smoke command contract for changed behavior.",
|
|
146
|
+
"files_changed": ["tests/a.test.ts", "tests/smoke/a-smoke.sh"],
|
|
147
|
+
"follow_ups": [],
|
|
148
|
+
"risks": [],
|
|
149
|
+
"verification": ["bunx vitest run tests/a.test.ts"],
|
|
150
|
+
"coverage_map": [
|
|
151
|
+
{"impl_path": "src/a.ts", "test_path": "tests/a.test.ts", "critical_path": "retry fallback emits terminal event"}
|
|
152
|
+
],
|
|
153
|
+
"smoke_e2e_commands": ["bash tests/smoke/a-smoke.sh"],
|
|
154
|
+
"telemetry_assertions": [
|
|
155
|
+
{"event": "job_finished", "fields": ["component", "event", "outcome"], "query_or_grep": "grep 'event=job_finished' .xtrm/logs/jobs.log", "redaction": "no secrets or raw payloads"}
|
|
156
|
+
],
|
|
157
|
+
"test_runner_commands": ["bunx vitest run tests/a.test.ts", "bash tests/smoke/a-smoke.sh"],
|
|
158
|
+
"known_deferred_paths": [],
|
|
159
|
+
"source_bug_suspicions": []
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### test-runner
|
|
164
|
+
```json
|
|
165
|
+
{
|
|
166
|
+
"status": "success",
|
|
167
|
+
"summary": "Targeted tests passed.",
|
|
168
|
+
"files_changed": ["src/a.ts"],
|
|
169
|
+
"follow_ups": [],
|
|
170
|
+
"risks": [],
|
|
171
|
+
"verification": ["bunx vitest run src/a.test.ts"],
|
|
172
|
+
"pass_count": 4,
|
|
173
|
+
"fail_count": 0,
|
|
174
|
+
"skip_count": 0,
|
|
175
|
+
"commands_executed": ["bunx vitest run src/a.test.ts"],
|
|
176
|
+
"artifact_evidence": ["logs/test-runner/latest.log", "artifacts/smoke.json"],
|
|
177
|
+
"classification": [
|
|
178
|
+
{"test": "src/a.test.ts", "classification": "in_scope", "owner": "test_engineer", "evidence": "assertion mismatch"}
|
|
179
|
+
]
|
|
180
|
+
}
|
|
181
|
+
```
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Specialists Catalog
|
|
3
|
+
scope: specialists-catalog
|
|
4
|
+
category: overview
|
|
5
|
+
version: 2.1.0
|
|
6
|
+
updated: 2026-06-23
|
|
7
|
+
synced_at: bf6baf7a
|
|
8
|
+
description: Current package-canonical specialists and what each one is for.
|
|
9
|
+
source_of_truth_for:
|
|
10
|
+
- "config/specialists/*.specialist.json"
|
|
11
|
+
- ".specialists/default/*.specialist.json"
|
|
12
|
+
- ".specialists/user/*.specialist.json"
|
|
13
|
+
domain:
|
|
14
|
+
- specialists
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Specialists Catalog
|
|
18
|
+
|
|
19
|
+
Runtime resolution is layered and package-canonical by default:
|
|
20
|
+
|
|
21
|
+
1. `.specialists/user/` — repo custom specialists and overrides, highest precedence
|
|
22
|
+
2. `.specialists/default/` — optional pins / compatibility snapshots
|
|
23
|
+
3. package-canonical `config/specialists/` — installed package fallback
|
|
24
|
+
4. legacy paths — migration compatibility only
|
|
25
|
+
|
|
26
|
+
Fresh repositories normally do not need `.specialists/default/` populated. Use `sp doctor --check-drift` and `sp prune-stale-defaults` to remove stale default snapshots; use `.specialists/user/` for intentional customization.
|
|
27
|
+
|
|
28
|
+
## Current package specialists
|
|
29
|
+
|
|
30
|
+
Run `sp list` for the live merged registry, including user-local specialists. The table below reflects package-canonical `config/specialists/*.specialist.json` at the current release.
|
|
31
|
+
|
|
32
|
+
| Name | Version | Model | Permission | Keep-alive | Typical use |
|
|
33
|
+
|---|---:|---|---|---|---|
|
|
34
|
+
| `bare` | 1.0.0 | user-configured | READ_ONLY | user-configured | Minimal read-only specialist for trusted-mode RPC; no mandatory rules. |
|
|
35
|
+
| `changelog-drafter` | 1.0.0 | user-configured | READ_ONLY | user-configured | Read-only bundle synthesis for `xt release prepare`; no publishing or edits. |
|
|
36
|
+
| `changelog-keeper` | 3.0.0 | user-configured | MEDIUM | user-configured | Fill sparse `[Unreleased]` sections from xt reports and commits; edits `CHANGELOG.md` only. |
|
|
37
|
+
| `debugger` | 2.0.0 | user-configured | HIGH | user-configured | Root-cause symptoms, regressions, flaky tests, and unknown-cause bugs before executor. |
|
|
38
|
+
| `executor` | 1.0.0 | user-configured | HIGH | user-configured | Implement already-scoped code or docs changes in an isolated worktree. |
|
|
39
|
+
| `explorer` | 1.1.0 | user-configured | READ_ONLY | user-configured | Map architecture, call flows, dependencies, and implementation options without edits. |
|
|
40
|
+
| `memory-processor` | 1.1.0 | user-configured | MEDIUM | user-configured | Curate persistent project memory into `.xtrm/memory.md`. |
|
|
41
|
+
| `node-coordinator` | 1.3.0 | user-configured | LOW | user-configured | Drive NodeSupervisor research-node runs through `sp node` commands. |
|
|
42
|
+
| `obligations-scanner` | 1.0.0 | user-configured | READ_ONLY | user-configured | Scan source for unmet obligations (TODO, FIXME, XXX, HACK) and emit actionable reports. |
|
|
43
|
+
| `overthinker` | 1.0.0 | user-configured | READ_ONLY | user-configured | Deep reasoning, tradeoff review, premortems, architecture critique. |
|
|
44
|
+
| `planner` | 1.1.0 | user-configured | HIGH | user-configured | Turn broad initiatives into phased bead boards with dependencies and tests. |
|
|
45
|
+
| `quant-methodologist` | 1.0.0 | user-configured | LOW | user-configured | Design quantitative research methodologies, backtesting frameworks, and statistical validation. |
|
|
46
|
+
| `quant-researcher` | 1.0.0 | user-configured | LOW | user-configured | Research quantitative models, market microstructure, and alpha signals. |
|
|
47
|
+
| `researcher` | 1.3.0 | user-configured | MEDIUM | user-configured | Current library/API docs, GitHub examples, and ecosystem evidence. |
|
|
48
|
+
| `reviewer` | 2.0.0 | user-configured | MEDIUM | user-configured | Compliance review of executor/debugger output via `--job`; emits PASS/PARTIAL/FAIL. |
|
|
49
|
+
| `seconder` | 1.0.0 | user-configured | READ_ONLY | user-configured | Smell pass after executor and before reviewer. |
|
|
50
|
+
| `security-auditor` | 1.0.0 | user-configured | LOW | user-configured | Threat modeling, secure-code review, dependency advisory triage; recommendations only. |
|
|
51
|
+
| `service-skills-sync` | 1.6.0 | user-configured | MEDIUM | user-configured | Sync service-oriented skill packages and drift detection across service boundaries. |
|
|
52
|
+
| `specialists-creator` | 1.4.1 | user-configured | HIGH | user-configured | Create/fix `.specialist.json` definitions and validate schema/model choices. |
|
|
53
|
+
| `sync-docs` | 3.1.0 | user-configured | MEDIUM | user-configured | Sync exactly one documentation file from scoped report/commit context. |
|
|
54
|
+
| `test-engineer` | 1.0.0 | user-configured | HIGH | user-configured | Write/update tests, fixtures, smoke/E2E harnesses, and telemetry assertions from actual implementation diff; no production fixes. |
|
|
55
|
+
| `test-runner` | 2.0.1 | user-configured | LOW | user-configured | Execute exact requested test commands first, fall back to manifest-detected suites only when needed, capture evidence, classify failures by owner; no fixes. |
|
|
56
|
+
| `transcriber` | 1.6.0 | user-configured | MEDIUM | user-configured | Transcribe audio/video content and generate searchable structured output. |
|
|
57
|
+
| `xt-merge` | 1.1.0 | user-configured | MEDIUM | user-configured | Drain xt worktree PR queues with CI/rebase/conflict handling. |
|
|
58
|
+
|
|
59
|
+
## Notable release highlights
|
|
60
|
+
|
|
61
|
+
- **Package specialists ship with `null` model and keep-alive.** v3.16+ (commit `60b33412`) removed hardcoded models and keep-alive from all package-canonical specialist definitions. Model selection and session persistence are now user-environment-specific via orchestrator config merge; see [KAN-90 upgrade notes](upgrade-notes/kan-90-global-user-config.md).
|
|
62
|
+
- **`reviewer` v2.0 is phase-2-only.** The former phase-1 reviewer responsibilities merged into `seconder` v1.0; reviewer now handles only final compliance sign-off.
|
|
63
|
+
- **`researcher` v1.3 adds web pipeline (Mode 4).** Includes DDGS + agent-browser for current web queries beyond static library docs.
|
|
64
|
+
- **New quantitative specialists** `quant-methodologist` and `quant-researcher` v1.0.0 added for financial/quantitative research workflows.
|
|
65
|
+
- **New supporting specialists:** `transcriber` v1.6.0 (media transcription), `service-skills-sync` v1.6.0 (cross-service drift detection), `obligations-scanner` v1.0.0 (TODO/FIXME tracking), and `bare` v1.0.0 (minimal trusted-mode RPC).
|
|
66
|
+
- **`sync-docs` v3.1 is single-doc only.** One bead scope must name exactly one doc. It is not a broad docs-tree auditor.
|
|
67
|
+
- **`test-engineer` v1 writes tests from actual diff evidence.** It is ambidextrous for `test-only` and `code-with-tests` chains, creates/updates test assets only, emits exact `test-runner` commands, and routes source bugs back to debugger/executor.
|
|
68
|
+
- **`test-runner` v2.0.1 is exact-command first.** It prefers orchestrator/test-engineer command lists, falls back to manifest-detected suites only when no exact command is provided, and reports owner-routed failures with evidence.
|
|
69
|
+
- **`test-runner` v2 is polyglot.** It detects `package.json`, Python, Rust, and Go manifests and runs the appropriate test command.
|
|
70
|
+
- **`changelog-keeper` v3 is file-scoped.** It fills `CHANGELOG.md` gaps only; version bump/build/tag/publish are owned by the release skill flow.
|
|
71
|
+
- **`seconder` and `security-auditor` are advisory passes.** They provide evidence and findings before final reviewer PASS.
|
|
72
|
+
|
|
73
|
+
## Discover current runtime catalog
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
sp list
|
|
77
|
+
sp list --compact
|
|
78
|
+
sp list --json
|
|
79
|
+
sp list-rules
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Tool resolution
|
|
83
|
+
|
|
84
|
+
The `Permission` column is the input tier to the manifest-driven tool resolver. Runtime tools are computed from the tier plus package/user catalogs and any per-specialist `permissions[<TIER>]` override.
|
|
85
|
+
|
|
86
|
+
Inspect a resolved specialist:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
sp config show <name> --resolved
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
See [manifest.md](manifest.md) for resolution semantics and override policy.
|
|
93
|
+
|
|
94
|
+
## See also
|
|
95
|
+
|
|
96
|
+
- [manifest.md](manifest.md)
|
|
97
|
+
- [authoring.md](authoring.md)
|
|
98
|
+
- [workflow.md](workflow.md)
|
|
99
|
+
- [skills.md](skills.md)
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Specialists Service Install
|
|
3
|
+
scope: specialists-service-install
|
|
4
|
+
category: deployment
|
|
5
|
+
version: 2.1.2
|
|
6
|
+
updated: 2026-06-24
|
|
7
|
+
synced_at: bf6baf7a
|
|
8
|
+
description: Install runbook for consumers who do not clone specialists source. Deployment steps, trust/readiness gates, hot-reload, common pitfalls.
|
|
9
|
+
source_of_truth_for:
|
|
10
|
+
- Dockerfile
|
|
11
|
+
- docker/compose.example.yml
|
|
12
|
+
cross_references:
|
|
13
|
+
- docs/specialists-service.md (HTTP contract, CLI flags, trust gates, hot-reload)
|
|
14
|
+
- docs/authoring.md (script-class schema)
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Specialists Service Install
|
|
18
|
+
|
|
19
|
+
Install path for consumers who do **not** clone specialists source.
|
|
20
|
+
|
|
21
|
+
For HTTP contract details, CLI flags (`--allow-skills`, `--allow-skills-roots`, `--reload-poll-ms`), trust gates, and hot-reload semantics, see the SSOT: **[docs/specialists-service.md](specialists-service.md)**.
|
|
22
|
+
|
|
23
|
+
## Prerequisites
|
|
24
|
+
|
|
25
|
+
- Docker
|
|
26
|
+
- host `pi` config at `~/.pi`
|
|
27
|
+
- local writable `.specialists/` directory for specs and observability state
|
|
28
|
+
|
|
29
|
+
The container reads `pi` auth from a bind-mounted `~/.pi` directory. No secret file ships in image.
|
|
30
|
+
|
|
31
|
+
## Build the image
|
|
32
|
+
|
|
33
|
+
> Image publishing to a registry is deferred. For now, build from this repo's source.
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
git clone https://github.com/Jaggerxtrm/specialists.git
|
|
37
|
+
cd specialists
|
|
38
|
+
docker build -t specialists-service:local .
|
|
39
|
+
# or with rootless podman:
|
|
40
|
+
podman build -t specialists-service:local .
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Tag whatever you want (`:local`, `:v0.1`, etc.) — your compose file references the same tag.
|
|
44
|
+
|
|
45
|
+
The image runs as non-root, UID `10001` (label `org.specialists.uid=10001`). Override at runtime with `--user $UID:$GID` (Docker) or `--userns=keep-id --user $UID:$GID` (rootless Podman) so container writes are owned by your host user. The compose template wires this automatically.
|
|
46
|
+
|
|
47
|
+
The image installs `@earendil-works/pi-coding-agent` at build time. Current service execution uses pi's subprocess runner; SDK-backed execution is future work if/when it lands.
|
|
48
|
+
|
|
49
|
+
> **Future** — `docker pull ghcr.io/<org>/specialists-service:<tag>` once the image is published.
|
|
50
|
+
|
|
51
|
+
## Author first specialist
|
|
52
|
+
|
|
53
|
+
Create one script-class specialist in `.specialists/user/hello.specialist.json`. Minimal example:
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"specialist": {
|
|
58
|
+
"metadata": {
|
|
59
|
+
"name": "hello",
|
|
60
|
+
"version": "1.0.0",
|
|
61
|
+
"description": "Tiny demo specialist",
|
|
62
|
+
"category": "demo"
|
|
63
|
+
},
|
|
64
|
+
"execution": {
|
|
65
|
+
"mode": "auto",
|
|
66
|
+
"model": "openai-codex/gpt-5.4-mini",
|
|
67
|
+
"timeout_ms": 30000,
|
|
68
|
+
"interactive": false,
|
|
69
|
+
"response_format": "json",
|
|
70
|
+
"output_type": "custom",
|
|
71
|
+
"permission_required": "READ_ONLY",
|
|
72
|
+
"requires_worktree": false,
|
|
73
|
+
"max_retries": 0
|
|
74
|
+
},
|
|
75
|
+
"prompt": {
|
|
76
|
+
"task_template": "Say hello to $name and return JSON of shape {\"greeting\": \"...\"}.",
|
|
77
|
+
"output_schema": { "required": ["greeting"] }
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Variable substitution uses `$name` (single-dollar, no braces). Pick a model your host's `~/.pi/agent/auth.json` has credentials for. The runtime contract — script-class, non-interactive, read-only, no worktree, task_template present — is enforced at request time; mismatches return `specialist_load_error`.
|
|
84
|
+
|
|
85
|
+
A working reference example ships with the repo at [`docs/examples/smoke-echo.specialist.json`](examples/smoke-echo.specialist.json) — copy it into your `.specialists/user/` to verify a fresh deployment end-to-end.
|
|
86
|
+
|
|
87
|
+
For the full schema (every required, optional, and forbidden field with explanations), see [`docs/authoring.md` § Script-class authoring](authoring.md#script-class-authoring).
|
|
88
|
+
|
|
89
|
+
## Compose file walkthrough
|
|
90
|
+
|
|
91
|
+
Copy `docker/compose.example.yml` and replace placeholders.
|
|
92
|
+
|
|
93
|
+
> **Adding to an existing multi-service stack?** See [`deploying-alongside.md`](deploying-alongside.md) for the production recipe with the three undocumented tweaks (`user:`, `HOME=/pi-home`, rw `.specialists/`) and a troubleshooting matrix.
|
|
94
|
+
|
|
95
|
+
### Container naming: dev vs consumer service
|
|
96
|
+
|
|
97
|
+
This repository's root `compose.yml` is only a local developer convenience. It now sets `container_name: sp-service-dev` so `docker ps` is visually distinct from real consumer deployments.
|
|
98
|
+
|
|
99
|
+
- `sp-service-dev` — local specialists repo dev container from `/home/dawid/dev/specialists/compose.yml`.
|
|
100
|
+
- `specialists-service` — consumer-owned sidecar/service name, for example darth-feedor's `ingestion/infra/docker-compose.yml` service that other app containers call at `http://specialists-service:8000`.
|
|
101
|
+
- `specialists-specialists-1` — legacy Docker Compose auto-name for the old local dev service (`project=specialists`, `service=specialists`); an already-running container keeps that name until it is recreated.
|
|
102
|
+
|
|
103
|
+
Use compose labels to verify ownership before debugging traffic:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
docker inspect <container> --format '{{ index .Config.Labels "com.docker.compose.project" }} {{ index .Config.Labels "com.docker.compose.service" }} {{ index .Config.Labels "com.docker.compose.project.config_files" }}'
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
No production deployment is implied by the local dev compose file.
|
|
110
|
+
|
|
111
|
+
- `image`: published tag or local build tag
|
|
112
|
+
- `user`: align host UID/GID with container UID label
|
|
113
|
+
- `.specialists:/work/.specialists:z` (omit `:z` on standard Docker; required on Fedora rootless Podman for SELinux relabel)
|
|
114
|
+
- `${HOME}/.pi:/pi-home/.pi:ro` (add `:z` if SELinux blocks access)
|
|
115
|
+
- `HOME=/pi-home`: makes pi resolve auth from mounted home
|
|
116
|
+
- `working_dir: /work`: keeps relative specialist paths anchored to consumer project
|
|
117
|
+
- `networks`: internal app network for sidecar calls
|
|
118
|
+
|
|
119
|
+
No secret file needed. pi handles model auth from its own config.
|
|
120
|
+
|
|
121
|
+
## First request
|
|
122
|
+
|
|
123
|
+
Before sending traffic, verify readiness:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
curl -sS http://localhost:8000/readyz
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Returns `200 {"ready":true}` when all checks pass, or `503` with a reason when degraded. Six failure reasons exist: `draining`, `degraded:audit`, `pi_config_unreadable`, `db_not_writable`, `empty_user_dir`, `invalid_spec_in_user_dir`. See [specialists-service.md](specialists-service.md#readiness) for full taxonomy.
|
|
130
|
+
|
|
131
|
+
For trusted single-tenant deployments needing skill-driven specs, pass trust flags at container start: `--allow-skills`, `--allow-skills-roots=<path[:path]>`. `skills.scripts` remain unsupported and are always rejected. Default is **deny all**. See [specialists-service.md](specialists-service.md#trust-flags).
|
|
132
|
+
|
|
133
|
+
Send one generate request:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
curl -sS http://localhost:8000/v1/generate \
|
|
137
|
+
-H 'content-type: application/json' \
|
|
138
|
+
-d '{"specialist":"hello","variables":{"name":"world"}}'
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Expected shape:
|
|
142
|
+
|
|
143
|
+
```json
|
|
144
|
+
{
|
|
145
|
+
"success": true,
|
|
146
|
+
"output": "...",
|
|
147
|
+
"parsed_json": { "greeting": "..." },
|
|
148
|
+
"meta": {
|
|
149
|
+
"specialist": "hello",
|
|
150
|
+
"model": "openai-codex/gpt-5.4-mini",
|
|
151
|
+
"duration_ms": 1234,
|
|
152
|
+
"trace_id": "..."
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Process health check:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
curl -sS http://localhost:8000/healthz
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
`/healthz` is process-alive only. Use `/readyz` for operational readiness.
|
|
164
|
+
|
|
165
|
+
## Verify trace row
|
|
166
|
+
|
|
167
|
+
Each call writes one row to `.specialists/db/observability.db`. The `surface` marker is stored inside the `status_json` JSON column, queryable with `json_extract`:
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
sqlite3 .specialists/db/observability.db \
|
|
171
|
+
"SELECT job_id, specialist,
|
|
172
|
+
json_extract(status_json, '\$.surface') AS surface,
|
|
173
|
+
json_extract(status_json, '\$.model') AS model,
|
|
174
|
+
json_extract(status_json, '\$.elapsed_s') AS sec
|
|
175
|
+
FROM specialist_jobs
|
|
176
|
+
WHERE json_extract(status_json, '\$.surface') = 'script_specialist'
|
|
177
|
+
ORDER BY updated_at_ms DESC LIMIT 5;"
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
This is the same DB `sp run` writes to; filter by surface to separate script-service calls from agent runs.
|
|
181
|
+
|
|
182
|
+
## Common pitfalls
|
|
183
|
+
|
|
184
|
+
- **UID mismatch.** Container default UID is `10001` (image label). To write into a bind-mounted host directory owned by your user, override at runtime: `--user "$UID:$GID"` (Docker) or `--userns=keep-id --user "$UID:$GID"` (rootless Podman). The compose template wires this with `user: "${UID:-1000}:${GID:-1000}"`.
|
|
185
|
+
- **`~/.pi` missing or empty.** Container boots, but every request fails auth lookup. Run `pi --version` on the host first and ensure at least one provider is configured in `~/.pi/agent/auth.json`.
|
|
186
|
+
- **OAuth refresh.** The default mount is `:ro` (read-only). If a provider's token expires mid-request, pi inside the container cannot refresh it back to disk. Refresh on the host (the host's pi tooling can do it interactively) and the container picks up new tokens on next file read.
|
|
187
|
+
- **Model not in `pi` auth.json.** Request fails with `auth` or `internal`. Either run `pi auth` on the host to add the provider, or pick a model the host already has access to.
|
|
188
|
+
|
|
189
|
+
### Rootless Podman / Fedora SELinux
|
|
190
|
+
|
|
191
|
+
If you're using `podman` instead of `docker` on a Fedora-family host:
|
|
192
|
+
|
|
193
|
+
- Add `:z` to bind-mount specs so SELinux relabels the dir for container access:
|
|
194
|
+
```
|
|
195
|
+
-v ./.specialists:/work/.specialists:z
|
|
196
|
+
-v $HOME/.pi:/pi-home/.pi:ro,z
|
|
197
|
+
```
|
|
198
|
+
- Add `--userns=keep-id` so the container's UID maps to your host UID instead of a subuid (otherwise the container can read/write into a "1000:1000" host dir but the kernel still denies it).
|
|
199
|
+
- Don't override `--user` to a UID outside the rootless `subuid` range; `1000:1000` (your user) is what `keep-id` will map.
|
|
200
|
+
|
|
201
|
+
A working rootless podman invocation that mirrors the compose example:
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
podman run -d --rm --name specialists \
|
|
205
|
+
--userns=keep-id --user "$UID:$GID" \
|
|
206
|
+
-v "$PWD/.specialists:/work/.specialists:z" \
|
|
207
|
+
-v "$HOME/.pi:/pi-home/.pi:ro,z" \
|
|
208
|
+
-e HOME=/pi-home \
|
|
209
|
+
-p 8000:8000 \
|
|
210
|
+
specialists-service:local
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
The compose template targets standard Docker; if you're on Fedora + rootless Podman, copy the above command form instead.
|
|
214
|
+
|
|
215
|
+
## Hot-reload
|
|
216
|
+
|
|
217
|
+
The watcher auto-reloads `.specialists/user/*.specialist.json` on change. Native `fs.watch` is default. For container environments without inotify, use `--reload-poll-ms=1000` for polling fallback. See [specialists-service.md](specialists-service.md#hot-reload).
|
|
218
|
+
|
|
219
|
+
## Upgrade story
|
|
220
|
+
|
|
221
|
+
1. bump image tag in compose file
|
|
222
|
+
2. restart container
|
|
223
|
+
3. wait for `GET /readyz` to return `{"ready":true}`
|
|
224
|
+
4. let traffic resume after readiness gate passes
|
|
225
|
+
|
|
226
|
+
Future work: multi-arch buildx, cosign, SBOM, and rollout automation.
|