@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.
Files changed (246) hide show
  1. package/README.md +268 -134
  2. package/config/mandatory-rules/json-only-final-output.md +13 -0
  3. package/config/mandatory-rules/service-skills-diff-scan-mandatory.md +26 -0
  4. package/config/mandatory-rules/service-skills-gitnexus-triage.md +5 -0
  5. package/config/skills/setup-specialists/SKILL.md +556 -0
  6. package/config/skills/specialists-creator/SKILL.md +132 -4
  7. package/config/skills/specialists-creator/scripts/audit-spec-uniformity.mjs +1 -1
  8. package/config/specialists/bare.specialist.json +3 -3
  9. package/config/specialists/changelog-drafter.specialist.json +5 -4
  10. package/config/specialists/changelog-keeper.specialist.json +7 -6
  11. package/config/specialists/debugger.specialist.json +2 -2
  12. package/config/specialists/executor.specialist.json +2 -2
  13. package/config/specialists/explorer.specialist.json +4 -4
  14. package/config/specialists/memory-processor.specialist.json +3 -3
  15. package/config/specialists/node-coordinator.specialist.json +3 -3
  16. package/config/specialists/obligations-scanner.specialist.json +67 -17
  17. package/config/specialists/overthinker.specialist.json +3 -3
  18. package/config/specialists/planner.specialist.json +4 -4
  19. package/config/specialists/quant-methodologist.specialist.json +145 -0
  20. package/config/specialists/quant-researcher.specialist.json +144 -0
  21. package/config/specialists/researcher.specialist.json +5 -5
  22. package/config/specialists/reviewer.specialist.json +1 -1
  23. package/config/specialists/seconder.specialist.json +2 -2
  24. package/config/specialists/security-auditor.specialist.json +2 -2
  25. package/config/specialists/service-skills-sync.specialist.json +90 -75
  26. package/config/specialists/specialists-creator.specialist.json +4 -4
  27. package/config/specialists/sync-docs.specialist.json +4 -4
  28. package/config/specialists/test-engineer.specialist.json +3 -3
  29. package/config/specialists/test-runner.specialist.json +7 -7
  30. package/config/specialists/transcriber.specialist.json +3 -3
  31. package/config/specialists/xt-merge.specialist.json +4 -4
  32. package/dist/asset-contract.json +21 -2
  33. package/dist/index.js +25704 -16376
  34. package/dist/lib.js +9849 -6147
  35. package/dist/types/cli/console/components.d.ts +83 -0
  36. package/dist/types/cli/console/components.d.ts.map +1 -0
  37. package/dist/types/cli/console/config-source.d.ts +58 -0
  38. package/dist/types/cli/console/config-source.d.ts.map +1 -0
  39. package/dist/types/cli/console/forensic.d.ts +11 -0
  40. package/dist/types/cli/console/forensic.d.ts.map +1 -0
  41. package/dist/types/cli/console/git.d.ts +28 -0
  42. package/dist/types/cli/console/git.d.ts.map +1 -0
  43. package/dist/types/cli/console/help.d.ts +2 -0
  44. package/dist/types/cli/console/help.d.ts.map +1 -0
  45. package/dist/types/cli/console/log.d.ts +13 -0
  46. package/dist/types/cli/console/log.d.ts.map +1 -0
  47. package/dist/types/cli/console/repo-config.d.ts +26 -0
  48. package/dist/types/cli/console/repo-config.d.ts.map +1 -0
  49. package/dist/types/cli/console/repo-discovery.d.ts +12 -0
  50. package/dist/types/cli/console/repo-discovery.d.ts.map +1 -0
  51. package/dist/types/cli/console/runtime.d.ts +12 -0
  52. package/dist/types/cli/console/runtime.d.ts.map +1 -0
  53. package/dist/types/cli/console/subscribe-prototype.d.ts +18 -0
  54. package/dist/types/cli/console/subscribe-prototype.d.ts.map +1 -0
  55. package/dist/types/cli/console/theme.d.ts +91 -0
  56. package/dist/types/cli/console/theme.d.ts.map +1 -0
  57. package/dist/types/cli/console/types.d.ts +231 -0
  58. package/dist/types/cli/console/types.d.ts.map +1 -0
  59. package/dist/types/cli/console/view-model.d.ts +252 -0
  60. package/dist/types/cli/console/view-model.d.ts.map +1 -0
  61. package/dist/types/cli/console.d.ts +2 -0
  62. package/dist/types/cli/console.d.ts.map +1 -0
  63. package/dist/types/cli/db.d.ts.map +1 -1
  64. package/dist/types/cli/doctor.d.ts.map +1 -1
  65. package/dist/types/cli/edit.d.ts.map +1 -1
  66. package/dist/types/cli/epic.d.ts.map +1 -1
  67. package/dist/types/cli/feed.d.ts.map +1 -1
  68. package/dist/types/cli/forensic.d.ts +2 -0
  69. package/dist/types/cli/forensic.d.ts.map +1 -0
  70. package/dist/types/cli/format-helpers.d.ts +4 -2
  71. package/dist/types/cli/format-helpers.d.ts.map +1 -1
  72. package/dist/types/cli/help.d.ts.map +1 -1
  73. package/dist/types/cli/init.d.ts +10 -0
  74. package/dist/types/cli/init.d.ts.map +1 -1
  75. package/dist/types/cli/list.d.ts.map +1 -1
  76. package/dist/types/cli/log.d.ts.map +1 -1
  77. package/dist/types/cli/metrics.d.ts +2 -0
  78. package/dist/types/cli/metrics.d.ts.map +1 -0
  79. package/dist/types/cli/ps.d.ts.map +1 -1
  80. package/dist/types/cli/result.d.ts.map +1 -1
  81. package/dist/types/cli/run.d.ts +1 -0
  82. package/dist/types/cli/run.d.ts.map +1 -1
  83. package/dist/types/cli/script.d.ts +3 -0
  84. package/dist/types/cli/script.d.ts.map +1 -1
  85. package/dist/types/cli/serve.d.ts.map +1 -1
  86. package/dist/types/cli/setup.d.ts +19 -1
  87. package/dist/types/cli/setup.d.ts.map +1 -1
  88. package/dist/types/cli/status.d.ts.map +1 -1
  89. package/dist/types/cli/version-check.d.ts +1 -0
  90. package/dist/types/cli/version-check.d.ts.map +1 -1
  91. package/dist/types/index.d.ts +1 -1
  92. package/dist/types/pi/session.d.ts +11 -1
  93. package/dist/types/pi/session.d.ts.map +1 -1
  94. package/dist/types/server.d.ts +15 -0
  95. package/dist/types/server.d.ts.map +1 -1
  96. package/dist/types/specialist/benchmarks.d.ts +37 -0
  97. package/dist/types/specialist/benchmarks.d.ts.map +1 -0
  98. package/dist/types/specialist/chain-identity.d.ts +7 -1
  99. package/dist/types/specialist/chain-identity.d.ts.map +1 -1
  100. package/dist/types/specialist/control.d.ts.map +1 -1
  101. package/dist/types/specialist/forensic-events.d.ts +138 -0
  102. package/dist/types/specialist/forensic-events.d.ts.map +1 -0
  103. package/dist/types/specialist/forensic-renderer.d.ts +34 -0
  104. package/dist/types/specialist/forensic-renderer.d.ts.map +1 -0
  105. package/dist/types/specialist/git-diff-evidence.d.ts +28 -0
  106. package/dist/types/specialist/git-diff-evidence.d.ts.map +1 -0
  107. package/dist/types/specialist/global-config.d.ts +389 -0
  108. package/dist/types/specialist/global-config.d.ts.map +1 -0
  109. package/dist/types/specialist/launch.d.ts +1 -0
  110. package/dist/types/specialist/launch.d.ts.map +1 -1
  111. package/dist/types/specialist/live-aggregates.d.ts +46 -0
  112. package/dist/types/specialist/live-aggregates.d.ts.map +1 -0
  113. package/dist/types/specialist/loader.d.ts +50 -1
  114. package/dist/types/specialist/loader.d.ts.map +1 -1
  115. package/dist/types/specialist/model-chain.d.ts +7 -0
  116. package/dist/types/specialist/model-chain.d.ts.map +1 -0
  117. package/dist/types/specialist/model-probes.d.ts +28 -0
  118. package/dist/types/specialist/model-probes.d.ts.map +1 -0
  119. package/dist/types/specialist/node-contract.d.ts +18 -18
  120. package/dist/types/specialist/node-supervisor.d.ts.map +1 -1
  121. package/dist/types/specialist/observability-db.d.ts +1 -1
  122. package/dist/types/specialist/observability-db.d.ts.map +1 -1
  123. package/dist/types/specialist/observability-sqlite.d.ts +25 -0
  124. package/dist/types/specialist/observability-sqlite.d.ts.map +1 -1
  125. package/dist/types/specialist/preset-resolver.d.ts +56 -0
  126. package/dist/types/specialist/preset-resolver.d.ts.map +1 -0
  127. package/dist/types/specialist/prometheus-projection.d.ts +25 -0
  128. package/dist/types/specialist/prometheus-projection.d.ts.map +1 -0
  129. package/dist/types/specialist/runner.d.ts +26 -1
  130. package/dist/types/specialist/runner.d.ts.map +1 -1
  131. package/dist/types/specialist/schema.d.ts +163 -54
  132. package/dist/types/specialist/schema.d.ts.map +1 -1
  133. package/dist/types/specialist/script-runner.d.ts +5 -1
  134. package/dist/types/specialist/script-runner.d.ts.map +1 -1
  135. package/dist/types/specialist/snapshot-diff.d.ts +8 -0
  136. package/dist/types/specialist/snapshot-diff.d.ts.map +1 -0
  137. package/dist/types/specialist/source-queue.d.ts +13 -0
  138. package/dist/types/specialist/source-queue.d.ts.map +1 -0
  139. package/dist/types/specialist/supervisor.d.ts +15 -1
  140. package/dist/types/specialist/supervisor.d.ts.map +1 -1
  141. package/dist/types/specialist/timeline-events.d.ts +68 -1
  142. package/dist/types/specialist/timeline-events.d.ts.map +1 -1
  143. package/dist/types/tools/specialist/resume_specialist.tool.d.ts +4 -4
  144. package/dist/types/tools/specialist/specialist_status.tool.d.ts +1 -1
  145. package/dist/types/tools/specialist/steer_specialist.tool.d.ts +4 -4
  146. package/dist/types/tools/specialist/use_specialist.tool.d.ts +16 -16
  147. package/docs/ARCHITECTURE.md +1176 -0
  148. package/docs/TODO.md +9 -0
  149. package/docs/architecture.md +11 -0
  150. package/docs/archive/2026-03-13-bd-decision-context-template-plan.md +96 -0
  151. package/docs/archive/AGENT-HANDOFF.md +351 -0
  152. package/docs/archive/PARITY-ANALYSIS.md +296 -0
  153. package/docs/archive/SPECIALISTS_REFACTOR.md.md +30 -0
  154. package/docs/archive/cc-programmatic.md +216 -0
  155. package/docs/archive/claude-agent-sdk.md +594 -0
  156. package/docs/archive/decision-specialist-directory.md +41 -0
  157. package/docs/archive/discoveries.md +148 -0
  158. package/docs/archive/executor-benchmark-protocol.md +198 -0
  159. package/docs/archive/future-features.md +66 -0
  160. package/docs/archive/gzrx-completion-critique.md +183 -0
  161. package/docs/archive/gzrx-research-notes.md +401 -0
  162. package/docs/archive/gzrx-tool-catalog.md +760 -0
  163. package/docs/archive/iron-review-hardening-qa-chain-substrate.md +322 -0
  164. package/docs/archive/iron-review-hardening.html +1004 -0
  165. package/docs/archive/issuetracking.md +312 -0
  166. package/docs/archive/qa-v3.0.2.md +220 -0
  167. package/docs/archive/restructure.md +231 -0
  168. package/docs/archive/script-specialists.md +1254 -0
  169. package/docs/archive/spec-v3.md +792 -0
  170. package/docs/archive/specialist-stats.md +127 -0
  171. package/docs/archive/specialists-friction-audit.md +1347 -0
  172. package/docs/archive/specialists-runtime-critique.md +170 -0
  173. package/docs/archive/specialists-service-evaluation.md +713 -0
  174. package/docs/archive/specialists-substrate-alignment.md +255 -0
  175. package/docs/archive/substrate-review.md +1288 -0
  176. package/docs/archive/test-writer-specialist.md +254 -0
  177. package/docs/archive/using-specialists-v3-improvements-2026-05-09.md +600 -0
  178. package/docs/archive/xtrm-specialists-analysis.md +314 -0
  179. package/docs/authoring.md +701 -0
  180. package/docs/background-jobs.md +203 -0
  181. package/docs/bare-specialists.md +83 -0
  182. package/docs/benchmarks/executor-benchmark-runner.md +66 -0
  183. package/docs/bootstrap.md +161 -0
  184. package/docs/cli-reference.md +1645 -0
  185. package/docs/deploying-alongside.md +155 -0
  186. package/docs/design/README.md +36 -0
  187. package/docs/design/darth-feedor-migration.md +290 -0
  188. package/docs/design/roadmap/README.md +32 -0
  189. package/docs/design/roadmap/chain-templates/README.md +146 -0
  190. package/docs/design/roadmap/chain-templates/code-quick.formula.json +27 -0
  191. package/docs/design/roadmap/chain-templates/code-standard.formula.json +126 -0
  192. package/docs/design/roadmap/chain-templates/code-with-advisors.formula.json +128 -0
  193. package/docs/design/roadmap/chain-templates/code-with-tests.formula.json +76 -0
  194. package/docs/design/roadmap/chain-templates/debug.formula.json +128 -0
  195. package/docs/design/roadmap/chain-templates/doc-sync.formula.json +28 -0
  196. package/docs/design/roadmap/chain-templates/memory-hygiene.formula.json +27 -0
  197. package/docs/design/roadmap/chain-templates/planning.formula.json +27 -0
  198. package/docs/design/roadmap/chain-templates/premortem.formula.json +26 -0
  199. package/docs/design/roadmap/chain-templates/release-prep.formula.json +36 -0
  200. package/docs/design/roadmap/chain-templates/research-only.formula.json +28 -0
  201. package/docs/design/roadmap/chain-templates/restitch.formula.json +125 -0
  202. package/docs/design/roadmap/chain-templates/security-deep.formula.json +161 -0
  203. package/docs/design/roadmap/chain-templates/test-only.formula.json +52 -0
  204. package/docs/design/roadmap/chain-templates/triage.formula.json +35 -0
  205. package/docs/design/roadmap/history/handoff-from-substrate-design.md +87 -0
  206. package/docs/design/roadmap/history/substrate-reconciliation.md +105 -0
  207. package/docs/design/roadmap/specialists-roadmap.md +1193 -0
  208. package/docs/design/sp-console-subscribe-via-materializer.md +231 -0
  209. package/docs/design/sp-console-tui-mock-v2.html +293 -0
  210. package/docs/design/sp-console-tui-mock.html +120 -0
  211. package/docs/design/sp-console-tui.md +340 -0
  212. package/docs/design/specialist-agentops-suite.md +323 -0
  213. package/docs/design/substrate/channels.md +14 -0
  214. package/docs/design/substrate/devops-platform-engineering-prd.md +446 -0
  215. package/docs/design/substrate/html-design-example.md +339 -0
  216. package/docs/design/xtrm-tiers-architecture.svg +132 -0
  217. package/docs/devops/dependency-verdict-materialization.md +46 -0
  218. package/docs/epic-readiness.md +75 -0
  219. package/docs/examples/mercury-atomic-summarizer.specialist.json +26 -0
  220. package/docs/examples/smoke-echo-text-expected-keys.specialist.json +25 -0
  221. package/docs/examples/smoke-echo.specialist.json +25 -0
  222. package/docs/features.md +1577 -0
  223. package/docs/hooks.md +81 -0
  224. package/docs/installation.md +142 -0
  225. package/docs/manifest.md +184 -0
  226. package/docs/mcp-servers.md +73 -0
  227. package/docs/mcp-tools.md +71 -0
  228. package/docs/nodes.md +231 -0
  229. package/docs/observability-metrics.md +152 -0
  230. package/docs/operator/sp-console-v2-walkthrough.md +410 -0
  231. package/docs/overrides-guide.md +306 -0
  232. package/docs/pi-rpc-boundary.md +118 -0
  233. package/docs/pi-session.md +195 -0
  234. package/docs/release.md +22 -0
  235. package/docs/skills.md +132 -0
  236. package/docs/specialists/handoff-schema.md +181 -0
  237. package/docs/specialists-catalog.md +99 -0
  238. package/docs/specialists-service-install.md +226 -0
  239. package/docs/specialists-service.md +363 -0
  240. package/docs/surface-ownership.md +138 -0
  241. package/docs/upgrade-notes/kan-90-global-user-config.md +114 -0
  242. package/docs/upgrade-notes/kan-91-expanded-overrides.md +261 -0
  243. package/docs/workflow.md +114 -0
  244. package/docs/worktree.md +71 -0
  245. package/docs/worktrees.md +309 -0
  246. 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.