@jaggerxtrm/specialists 3.17.0 → 3.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +268 -134
- package/config/mandatory-rules/executor-delivery.md +4 -0
- package/config/mandatory-rules/json-only-final-output.md +13 -0
- package/config/mandatory-rules/service-skills-diff-scan-mandatory.md +26 -0
- package/config/mandatory-rules/service-skills-gitnexus-triage.md +5 -0
- package/config/mandatory-rules/test-runner-execution-scope.md +4 -0
- package/config/skills/setup-specialists/SKILL.md +556 -0
- package/config/skills/specialists-creator/SKILL.md +132 -4
- package/config/skills/specialists-creator/scripts/audit-spec-uniformity.mjs +1 -1
- package/config/skills/using-specialists-v3/SKILL.md +80 -20
- package/config/specialists/bare.specialist.json +3 -3
- package/config/specialists/changelog-drafter.specialist.json +5 -4
- package/config/specialists/changelog-keeper.specialist.json +7 -6
- package/config/specialists/debugger.specialist.json +2 -2
- package/config/specialists/executor.specialist.json +2 -2
- package/config/specialists/explorer.specialist.json +4 -4
- package/config/specialists/memory-processor.specialist.json +3 -3
- package/config/specialists/node-coordinator.specialist.json +3 -3
- package/config/specialists/obligations-scanner.specialist.json +67 -17
- package/config/specialists/overthinker.specialist.json +3 -3
- package/config/specialists/planner.specialist.json +4 -4
- package/config/specialists/quant-methodologist.specialist.json +145 -0
- package/config/specialists/quant-researcher.specialist.json +144 -0
- package/config/specialists/researcher.specialist.json +5 -5
- package/config/specialists/reviewer.specialist.json +1 -1
- package/config/specialists/seconder.specialist.json +2 -2
- package/config/specialists/security-auditor.specialist.json +2 -2
- package/config/specialists/service-skills-sync.specialist.json +90 -75
- package/config/specialists/specialists-creator.specialist.json +4 -4
- package/config/specialists/sync-docs.specialist.json +4 -4
- package/config/specialists/test-engineer.specialist.json +3 -3
- package/config/specialists/test-runner.specialist.json +7 -7
- package/config/specialists/transcriber.specialist.json +3 -3
- package/config/specialists/xt-merge.specialist.json +4 -4
- package/dist/asset-contract.json +22 -3
- package/dist/index.js +28711 -18517
- package/dist/lib.js +10020 -6150
- package/dist/types/cli/console/components.d.ts +83 -0
- package/dist/types/cli/console/components.d.ts.map +1 -0
- package/dist/types/cli/console/config-source.d.ts +58 -0
- package/dist/types/cli/console/config-source.d.ts.map +1 -0
- package/dist/types/cli/console/forensic.d.ts +11 -0
- package/dist/types/cli/console/forensic.d.ts.map +1 -0
- package/dist/types/cli/console/git.d.ts +28 -0
- package/dist/types/cli/console/git.d.ts.map +1 -0
- package/dist/types/cli/console/help.d.ts +2 -0
- package/dist/types/cli/console/help.d.ts.map +1 -0
- package/dist/types/cli/console/log.d.ts +13 -0
- package/dist/types/cli/console/log.d.ts.map +1 -0
- package/dist/types/cli/console/repo-config.d.ts +26 -0
- package/dist/types/cli/console/repo-config.d.ts.map +1 -0
- package/dist/types/cli/console/repo-discovery.d.ts +12 -0
- package/dist/types/cli/console/repo-discovery.d.ts.map +1 -0
- package/dist/types/cli/console/runtime.d.ts +12 -0
- package/dist/types/cli/console/runtime.d.ts.map +1 -0
- package/dist/types/cli/console/subscribe-prototype.d.ts +18 -0
- package/dist/types/cli/console/subscribe-prototype.d.ts.map +1 -0
- package/dist/types/cli/console/theme.d.ts +91 -0
- package/dist/types/cli/console/theme.d.ts.map +1 -0
- package/dist/types/cli/console/types.d.ts +231 -0
- package/dist/types/cli/console/types.d.ts.map +1 -0
- package/dist/types/cli/console/view-model.d.ts +252 -0
- package/dist/types/cli/console/view-model.d.ts.map +1 -0
- package/dist/types/cli/console.d.ts +2 -0
- package/dist/types/cli/console.d.ts.map +1 -0
- package/dist/types/cli/db.d.ts.map +1 -1
- package/dist/types/cli/doctor.d.ts.map +1 -1
- package/dist/types/cli/edit.d.ts.map +1 -1
- package/dist/types/cli/epic.d.ts.map +1 -1
- package/dist/types/cli/feed.d.ts.map +1 -1
- package/dist/types/cli/forensic.d.ts +2 -0
- package/dist/types/cli/forensic.d.ts.map +1 -0
- package/dist/types/cli/format-helpers.d.ts +4 -2
- package/dist/types/cli/format-helpers.d.ts.map +1 -1
- package/dist/types/cli/help.d.ts.map +1 -1
- package/dist/types/cli/init.d.ts +10 -0
- package/dist/types/cli/init.d.ts.map +1 -1
- package/dist/types/cli/list.d.ts.map +1 -1
- package/dist/types/cli/log.d.ts.map +1 -1
- package/dist/types/cli/merge.d.ts.map +1 -1
- package/dist/types/cli/metrics.d.ts +2 -0
- package/dist/types/cli/metrics.d.ts.map +1 -0
- package/dist/types/cli/ps.d.ts.map +1 -1
- package/dist/types/cli/result.d.ts.map +1 -1
- package/dist/types/cli/run.d.ts +20 -0
- package/dist/types/cli/run.d.ts.map +1 -1
- package/dist/types/cli/script.d.ts +3 -0
- package/dist/types/cli/script.d.ts.map +1 -1
- package/dist/types/cli/serve.d.ts.map +1 -1
- package/dist/types/cli/setup.d.ts +19 -1
- package/dist/types/cli/setup.d.ts.map +1 -1
- package/dist/types/cli/status.d.ts.map +1 -1
- package/dist/types/cli/version-check.d.ts +1 -0
- package/dist/types/cli/version-check.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/pi/session.d.ts +12 -1
- package/dist/types/pi/session.d.ts.map +1 -1
- package/dist/types/server.d.ts +15 -0
- package/dist/types/server.d.ts.map +1 -1
- package/dist/types/specialist/benchmarks.d.ts +37 -0
- package/dist/types/specialist/benchmarks.d.ts.map +1 -0
- package/dist/types/specialist/chain-identity.d.ts +7 -1
- package/dist/types/specialist/chain-identity.d.ts.map +1 -1
- package/dist/types/specialist/control.d.ts.map +1 -1
- package/dist/types/specialist/dead-job-audit.d.ts +20 -0
- package/dist/types/specialist/dead-job-audit.d.ts.map +1 -0
- package/dist/types/specialist/forensic-events.d.ts +138 -0
- package/dist/types/specialist/forensic-events.d.ts.map +1 -0
- package/dist/types/specialist/forensic-renderer.d.ts +34 -0
- package/dist/types/specialist/forensic-renderer.d.ts.map +1 -0
- package/dist/types/specialist/git-diff-evidence.d.ts +28 -0
- package/dist/types/specialist/git-diff-evidence.d.ts.map +1 -0
- package/dist/types/specialist/global-config.d.ts +389 -0
- package/dist/types/specialist/global-config.d.ts.map +1 -0
- package/dist/types/specialist/launch.d.ts +9 -0
- package/dist/types/specialist/launch.d.ts.map +1 -1
- package/dist/types/specialist/live-aggregates.d.ts +46 -0
- package/dist/types/specialist/live-aggregates.d.ts.map +1 -0
- package/dist/types/specialist/loader.d.ts +50 -1
- package/dist/types/specialist/loader.d.ts.map +1 -1
- package/dist/types/specialist/model-chain.d.ts +7 -0
- package/dist/types/specialist/model-chain.d.ts.map +1 -0
- package/dist/types/specialist/model-probes.d.ts +28 -0
- package/dist/types/specialist/model-probes.d.ts.map +1 -0
- package/dist/types/specialist/node-contract.d.ts +18 -18
- package/dist/types/specialist/node-supervisor.d.ts.map +1 -1
- package/dist/types/specialist/observability-db.d.ts +1 -1
- package/dist/types/specialist/observability-db.d.ts.map +1 -1
- package/dist/types/specialist/observability-sqlite.d.ts +101 -0
- package/dist/types/specialist/observability-sqlite.d.ts.map +1 -1
- package/dist/types/specialist/pr-drift-refresh.d.ts +17 -0
- package/dist/types/specialist/pr-drift-refresh.d.ts.map +1 -0
- package/dist/types/specialist/preset-resolver.d.ts +56 -0
- package/dist/types/specialist/preset-resolver.d.ts.map +1 -0
- package/dist/types/specialist/prometheus-projection.d.ts +25 -0
- package/dist/types/specialist/prometheus-projection.d.ts.map +1 -0
- package/dist/types/specialist/runner.d.ts +29 -1
- package/dist/types/specialist/runner.d.ts.map +1 -1
- package/dist/types/specialist/schema.d.ts +163 -54
- package/dist/types/specialist/schema.d.ts.map +1 -1
- package/dist/types/specialist/script-runner.d.ts +5 -1
- package/dist/types/specialist/script-runner.d.ts.map +1 -1
- package/dist/types/specialist/snapshot-diff.d.ts +8 -0
- package/dist/types/specialist/snapshot-diff.d.ts.map +1 -0
- package/dist/types/specialist/source-queue.d.ts +13 -0
- package/dist/types/specialist/source-queue.d.ts.map +1 -0
- package/dist/types/specialist/status-load.d.ts.map +1 -1
- package/dist/types/specialist/supervisor.d.ts +25 -1
- package/dist/types/specialist/supervisor.d.ts.map +1 -1
- package/dist/types/specialist/timeline-events.d.ts +70 -1
- package/dist/types/specialist/timeline-events.d.ts.map +1 -1
- package/dist/types/tools/specialist/resume_specialist.tool.d.ts +4 -4
- package/dist/types/tools/specialist/specialist_status.tool.d.ts +1 -1
- package/dist/types/tools/specialist/steer_specialist.tool.d.ts +4 -4
- package/dist/types/tools/specialist/use_specialist.tool.d.ts +16 -16
- package/docs/ARCHITECTURE.md +1176 -0
- package/docs/TODO.md +9 -0
- package/docs/architecture.md +11 -0
- package/docs/archive/2026-03-13-bd-decision-context-template-plan.md +96 -0
- package/docs/archive/AGENT-HANDOFF.md +351 -0
- package/docs/archive/PARITY-ANALYSIS.md +296 -0
- package/docs/archive/SPECIALISTS_REFACTOR.md.md +30 -0
- package/docs/archive/cc-programmatic.md +216 -0
- package/docs/archive/claude-agent-sdk.md +594 -0
- package/docs/archive/decision-specialist-directory.md +41 -0
- package/docs/archive/discoveries.md +148 -0
- package/docs/archive/executor-benchmark-protocol.md +198 -0
- package/docs/archive/future-features.md +66 -0
- package/docs/archive/gzrx-completion-critique.md +183 -0
- package/docs/archive/gzrx-research-notes.md +401 -0
- package/docs/archive/gzrx-tool-catalog.md +760 -0
- package/docs/archive/iron-review-hardening-qa-chain-substrate.md +322 -0
- package/docs/archive/iron-review-hardening.html +1004 -0
- package/docs/archive/issuetracking.md +312 -0
- package/docs/archive/qa-v3.0.2.md +220 -0
- package/docs/archive/restructure.md +231 -0
- package/docs/archive/script-specialists.md +1254 -0
- package/docs/archive/spec-v3.md +792 -0
- package/docs/archive/specialist-stats.md +127 -0
- package/docs/archive/specialists-friction-audit.md +1347 -0
- package/docs/archive/specialists-runtime-critique.md +170 -0
- package/docs/archive/specialists-service-evaluation.md +713 -0
- package/docs/archive/specialists-substrate-alignment.md +255 -0
- package/docs/archive/substrate-review.md +1288 -0
- package/docs/archive/test-writer-specialist.md +254 -0
- package/docs/archive/using-specialists-v3-improvements-2026-05-09.md +600 -0
- package/docs/archive/xtrm-specialists-analysis.md +314 -0
- package/docs/authoring.md +701 -0
- package/docs/background-jobs.md +203 -0
- package/docs/bare-specialists.md +83 -0
- package/docs/benchmarks/executor-benchmark-runner.md +66 -0
- package/docs/bootstrap.md +161 -0
- package/docs/cli-reference.md +1645 -0
- package/docs/deploying-alongside.md +155 -0
- package/docs/design/README.md +36 -0
- package/docs/design/darth-feedor-migration.md +290 -0
- package/docs/design/roadmap/README.md +32 -0
- package/docs/design/roadmap/chain-templates/README.md +146 -0
- package/docs/design/roadmap/chain-templates/code-quick.formula.json +27 -0
- package/docs/design/roadmap/chain-templates/code-standard.formula.json +126 -0
- package/docs/design/roadmap/chain-templates/code-with-advisors.formula.json +128 -0
- package/docs/design/roadmap/chain-templates/code-with-tests.formula.json +76 -0
- package/docs/design/roadmap/chain-templates/debug.formula.json +128 -0
- package/docs/design/roadmap/chain-templates/doc-sync.formula.json +28 -0
- package/docs/design/roadmap/chain-templates/memory-hygiene.formula.json +27 -0
- package/docs/design/roadmap/chain-templates/planning.formula.json +27 -0
- package/docs/design/roadmap/chain-templates/premortem.formula.json +26 -0
- package/docs/design/roadmap/chain-templates/release-prep.formula.json +36 -0
- package/docs/design/roadmap/chain-templates/research-only.formula.json +28 -0
- package/docs/design/roadmap/chain-templates/restitch.formula.json +125 -0
- package/docs/design/roadmap/chain-templates/security-deep.formula.json +161 -0
- package/docs/design/roadmap/chain-templates/test-only.formula.json +52 -0
- package/docs/design/roadmap/chain-templates/triage.formula.json +35 -0
- package/docs/design/roadmap/history/handoff-from-substrate-design.md +87 -0
- package/docs/design/roadmap/history/substrate-reconciliation.md +105 -0
- package/docs/design/roadmap/specialists-roadmap.md +1261 -0
- package/docs/design/sp-console-subscribe-via-materializer.md +231 -0
- package/docs/design/sp-console-tui-mock-v2.html +293 -0
- package/docs/design/sp-console-tui-mock.html +120 -0
- package/docs/design/sp-console-tui.md +340 -0
- package/docs/design/specialist-agentops-suite.md +323 -0
- package/docs/design/substrate/channels.md +14 -0
- package/docs/design/substrate/devops-platform-engineering-prd.md +446 -0
- package/docs/design/substrate/html-design-example.md +339 -0
- package/docs/design/xtrm-tiers-architecture.svg +132 -0
- package/docs/devops/dependency-verdict-materialization.md +46 -0
- package/docs/epic-readiness.md +75 -0
- package/docs/examples/mercury-atomic-summarizer.specialist.json +26 -0
- package/docs/examples/smoke-echo-text-expected-keys.specialist.json +25 -0
- package/docs/examples/smoke-echo.specialist.json +25 -0
- package/docs/features.md +1577 -0
- package/docs/hooks.md +81 -0
- package/docs/installation.md +142 -0
- package/docs/manifest.md +184 -0
- package/docs/mcp-servers.md +73 -0
- package/docs/mcp-tools.md +71 -0
- package/docs/nodes.md +231 -0
- package/docs/observability-metrics.md +152 -0
- package/docs/operator/sp-console-v2-walkthrough.md +410 -0
- package/docs/overrides-guide.md +306 -0
- package/docs/pi-rpc-boundary.md +118 -0
- package/docs/pi-session.md +195 -0
- package/docs/release.md +22 -0
- package/docs/skills.md +132 -0
- package/docs/specialists/handoff-schema.md +181 -0
- package/docs/specialists-catalog.md +99 -0
- package/docs/specialists-service-install.md +226 -0
- package/docs/specialists-service.md +363 -0
- package/docs/surface-ownership.md +138 -0
- package/docs/upgrade-notes/kan-90-global-user-config.md +114 -0
- package/docs/upgrade-notes/kan-91-expanded-overrides.md +261 -0
- package/docs/workflow.md +114 -0
- package/docs/worktree.md +71 -0
- package/docs/worktrees.md +309 -0
- package/package.json +7 -4
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Deploying specialists-service alongside an existing compose stack
|
|
2
|
+
|
|
3
|
+
You have an existing `docker-compose.yml` with services on a custom network. You want to add `specialists-service` as a sidecar that those services can call at `http://specialists-service:8000`. This page is the copyable recipe plus the three undocumented tweaks needed to make it work.
|
|
4
|
+
|
|
5
|
+
For first-time install on a fresh project, see [`specialists-service-install.md`](specialists-service-install.md). The minimal example at [`docker/compose.example.yml`](../docker/compose.example.yml) is the same shape with placeholders.
|
|
6
|
+
|
|
7
|
+
For the HTTP contract, see [`specialists-service.md`](specialists-service.md).
|
|
8
|
+
|
|
9
|
+
## The three tweaks
|
|
10
|
+
|
|
11
|
+
These are not obvious and are not enforced by the image entrypoint — they are deploy-time decisions.
|
|
12
|
+
|
|
13
|
+
### 1. `user: "1000:1000"` — host UID/GID for SQLite write perms
|
|
14
|
+
|
|
15
|
+
The image runs as UID `10001` (`specialists` user) by default. The bind mount at `.specialists/` is owned by your **host** UID — typically `1000:1000` for an interactive Linux user. Without overriding, `sp serve` crash-loops with `EPERM` or `EROFS` the first time it tries to open `observability.db`.
|
|
16
|
+
|
|
17
|
+
```yaml
|
|
18
|
+
user: "${UID:-1000}:${GID:-1000}"
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
For non-`1000` hosts, prefer the env-var form so the same compose file works across machines.
|
|
22
|
+
|
|
23
|
+
### 2. `HOME=/pi-home` — so pi finds its auth + models
|
|
24
|
+
|
|
25
|
+
The `pi` runtime resolves auth and `models.json` from `$HOME/.pi/`. The image sets `HOME=/home/specialists` for its built-in user, but consumer deployments mount the host's `~/.pi` into `/pi-home/.pi` and need pi to look there instead.
|
|
26
|
+
|
|
27
|
+
Without this, pi looks at `/root/.pi` (or `/home/specialists/.pi`) and **silently has zero models**. Symptom: every request returns `error_type: specialist_load_error` or `internal` with a model-not-found message in `error`.
|
|
28
|
+
|
|
29
|
+
```yaml
|
|
30
|
+
environment:
|
|
31
|
+
HOME: /pi-home
|
|
32
|
+
volumes:
|
|
33
|
+
- ${HOME}/.pi:/pi-home/.pi:ro
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The `:ro` is fine — pi only reads its config.
|
|
37
|
+
|
|
38
|
+
### 3. RW bind mount of `.specialists/`
|
|
39
|
+
|
|
40
|
+
The service writes `observability.db` (and SQLite's `-wal` / `-shm` siblings) into `.specialists/db/`. Mount the **directory**, not just the `.db` file, so SQLite can create siblings.
|
|
41
|
+
|
|
42
|
+
```yaml
|
|
43
|
+
volumes:
|
|
44
|
+
- ./.specialists:/work/.specialists
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The mount is intentionally **read-write**. Read-only breaks observability writes and causes `db_not_writable` from `/readyz`.
|
|
48
|
+
|
|
49
|
+
## Copyable recipe
|
|
50
|
+
|
|
51
|
+
This is the production shape from darth-feedor's `ingestion/infra/docker-compose.yml`, slightly de-projectified.
|
|
52
|
+
|
|
53
|
+
```yaml
|
|
54
|
+
services:
|
|
55
|
+
specialists-service:
|
|
56
|
+
container_name: specialists-service
|
|
57
|
+
image: specialists-service:local # build separately, or use a published tag
|
|
58
|
+
user: "${UID:-1000}:${GID:-1000}"
|
|
59
|
+
stop_grace_period: 30s
|
|
60
|
+
restart: unless-stopped
|
|
61
|
+
command: ["serve", "--port", "8000"]
|
|
62
|
+
env_file:
|
|
63
|
+
- .env # forwards Pi auth tokens / API keys
|
|
64
|
+
environment:
|
|
65
|
+
HOME: /pi-home
|
|
66
|
+
volumes:
|
|
67
|
+
- ./.specialists:/work/.specialists # rw — observability.db lives here
|
|
68
|
+
- ${HOME}/.pi:/pi-home/.pi:ro # ro — pi auth + models.json
|
|
69
|
+
networks:
|
|
70
|
+
- merc # your existing network
|
|
71
|
+
# Healthcheck is baked into the image (port 8000 default). Only declare a
|
|
72
|
+
# compose-level `healthcheck:` block when you override the listen port.
|
|
73
|
+
deploy:
|
|
74
|
+
resources:
|
|
75
|
+
limits:
|
|
76
|
+
cpus: "1.0"
|
|
77
|
+
memory: 512M
|
|
78
|
+
|
|
79
|
+
# Your other services call it at http://specialists-service:8000
|
|
80
|
+
my-app:
|
|
81
|
+
image: my-app:local
|
|
82
|
+
environment:
|
|
83
|
+
SPECIALISTS_SERVICE_URL: http://specialists-service:8000
|
|
84
|
+
depends_on:
|
|
85
|
+
specialists-service:
|
|
86
|
+
condition: service_healthy
|
|
87
|
+
networks:
|
|
88
|
+
- merc
|
|
89
|
+
|
|
90
|
+
networks:
|
|
91
|
+
merc:
|
|
92
|
+
external: true
|
|
93
|
+
name: ${MERC_NET_NAME:-mercury_dev_network}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Build the image
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
git clone https://github.com/Jaggerxtrm/specialists ~/dev/specialists
|
|
100
|
+
cd ~/dev/specialists
|
|
101
|
+
docker build -t specialists-service:local .
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
The `:local` tag matches the `image:` field above. Once a published tag is available you can swap it out.
|
|
105
|
+
|
|
106
|
+
### Bring up
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
docker compose up -d specialists-service
|
|
110
|
+
docker compose logs -f specialists-service # watch for `serve listening on 8000`
|
|
111
|
+
curl -sS http://localhost:8000/readyz # if you exposed the port; otherwise hit it from a sibling container
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
For internal-network deploys (no host port), call `/readyz` from a sibling container or use `docker exec`:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
docker exec my-app curl -sS http://specialists-service:8000/readyz
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Troubleshooting matrix
|
|
121
|
+
|
|
122
|
+
Symptom → cause → fix.
|
|
123
|
+
|
|
124
|
+
| Symptom | Likely cause | Fix |
|
|
125
|
+
|---|---|---|
|
|
126
|
+
| Container restart loop, logs show `EACCES`/`EPERM`/`EROFS` opening `observability.db` | Bind mount owned by host UID 1000, container running as UID 10001 | Add `user: "${UID:-1000}:${GID:-1000}"` |
|
|
127
|
+
| `/readyz` returns `503 db_not_writable` | `.specialists/` mounted read-only, or wrong UID | Make the mount rw; check `user:` |
|
|
128
|
+
| Every `/v1/generate` returns `error_type: internal` with `models.json not found` or `no models for ...` | `HOME` not set in environment, pi looks at `/root/.pi` | Add `environment: HOME: /pi-home` AND mount `${HOME}/.pi:/pi-home/.pi:ro` |
|
|
129
|
+
| `/readyz` returns `503 pi_config_unreadable` | `~/.pi` not mounted, or mounted at wrong path | Mount host `~/.pi` to `/pi-home/.pi`; ensure `HOME=/pi-home` |
|
|
130
|
+
| `/readyz` returns `503 empty_user_dir` | `.specialists/user/` has no `*.specialist.json` files | Author or copy at least one script-class spec into `.specialists/user/` |
|
|
131
|
+
| `/readyz` returns `503 invalid_spec_in_user_dir` | One spec file fails schema validation | Run `sp doctor` against the dir, or check container logs for the offending file path |
|
|
132
|
+
| Sibling container can't resolve `specialists-service` hostname | Sibling is not on the same network | Both services must be on the same `networks:` entry |
|
|
133
|
+
| `.specialists/db/observability.db-wal` and `-shm` files appear but the service crashes | SQLite is on a remote filesystem that breaks fcntl locking | Move `.specialists/db/` to a local-disk path |
|
|
134
|
+
| Build fails with `npm` errors during `pi` install | Network restrictions during build | Use `--network=host` on the build, or pre-pull a published `pi` version via `--build-arg PI_VERSION=<tag>` |
|
|
135
|
+
| Healthcheck never passes despite `serve listening` log | Compose-level `healthcheck:` block uses `wget`/`curl` (not in image) and overrides the baked-in node-fetch healthcheck | Remove the compose-level block — image bakes one in. Only override when you change the listen port. |
|
|
136
|
+
|
|
137
|
+
## Rootless Podman / Fedora / SELinux
|
|
138
|
+
|
|
139
|
+
For rootless podman or SELinux-enforcing hosts, append `:z` (or `:Z` for unshared bind mounts) to bind mounts:
|
|
140
|
+
|
|
141
|
+
```yaml
|
|
142
|
+
volumes:
|
|
143
|
+
- ./.specialists:/work/.specialists:z
|
|
144
|
+
- ${HOME}/.pi:/pi-home/.pi:z,ro
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
And pass `--userns=keep-id` to keep host UID matching inside the container so the `user:` override remains correct. See [`specialists-service-install.md`](specialists-service-install.md#rootless-podman--fedora-selinux) for the broader rootless flow.
|
|
148
|
+
|
|
149
|
+
## Why these tweaks aren't baked into the image
|
|
150
|
+
|
|
151
|
+
- **`user:`** is intentionally a deploy decision. The image declares its built-in UID via the `org.specialists.uid="10001"` label, but bind-mount permissions belong to the host filesystem and the operator is the only party that knows the right UID for a given deploy.
|
|
152
|
+
- **`HOME=/pi-home`** is consumer-controlled because pi auth resolution needs a stable mount target across hosts. Hard-coding a path inside the image would make the mount target image-version-dependent.
|
|
153
|
+
- **rw `.specialists/`** is fundamental: the service is a stateful sidecar (observability + reload state), and the host operator owns where that state lives.
|
|
154
|
+
|
|
155
|
+
The recipe above is the working pattern. If you find a fourth deploy-time decision that should be on this page, file a bead with `discovered-from:unitAI-2fz5b`.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Design — navigation index
|
|
2
|
+
|
|
3
|
+
> **2026-06-07 cleanup (ownvq):** chain-templates and substrate canonical moved to `~/dev/xtrm/docs/` (xtrm-product cross-cutting). What stays here is **specialists-package specific** design. Cross-cutting xtrm design lives in the xtrm monorepo.
|
|
4
|
+
|
|
5
|
+
## 🛠 `roadmap/` — specialists runtime cleanup roadmap
|
|
6
|
+
|
|
7
|
+
The specialists-runtime cleanup + substrate-alignment effort designed in the 2026-05-27/28 sessions. **Still the actionable work for the specialists package.** Reconciliation with `~/dev/xtrm/docs/temp_roadmap.md` tracked in bead `unitAI-sc03v`.
|
|
8
|
+
|
|
9
|
+
- **[`roadmap/specialists-roadmap.md`](roadmap/specialists-roadmap.md)** — CANONICAL roadmap. 12 opportunities, 8 phases. Decisions D1–D30 in §0.
|
|
10
|
+
- **[`roadmap/chain-templates/`](roadmap/chain-templates/)** — 13 evidence-backed `bd formula` files (verified vs `bd` binary). Phase 0.a installs them to `~/.beads/formulas/`.
|
|
11
|
+
- **[`roadmap/README.md`](roadmap/README.md)** — roadmap-area navigation.
|
|
12
|
+
- **[`roadmap/history/`](roadmap/history/)** — context-only artifacts that produced the roadmap. Read for context, do NOT act on.
|
|
13
|
+
|
|
14
|
+
## 📐 Specialists-package design notes (top-level)
|
|
15
|
+
|
|
16
|
+
- **[`gzrx-tool-catalog.md`](gzrx-tool-catalog.md)** — CANONICAL gzrx manifest + tool catalog design.
|
|
17
|
+
- **[`gzrx-completion-critique.md`](gzrx-completion-critique.md)** — gap analysis for the gzrx completion epic (`unitAI-qujxo`).
|
|
18
|
+
- **[`gzrx-research-notes.md`](gzrx-research-notes.md)** — research findings on agent-runtime tool registries.
|
|
19
|
+
- **[`darth-feedor-migration.md`](darth-feedor-migration.md)** — Darth Feedor migration onto specialists-service.
|
|
20
|
+
|
|
21
|
+
## 📦 `../archive/` — superseded artifacts
|
|
22
|
+
|
|
23
|
+
Earlier design iterations and historical planning that have been absorbed into canonical sources (vault, xtrm/docs, or substrate). Includes the issuetracking prototype, plans/, proposals/, other/, iron-review snapshots, friction audits, runtime critiques, substrate review notes, and Tether's predecessor design (`shepherd.md` → now `tether.md` in xtrm/docs/).
|
|
24
|
+
|
|
25
|
+
## 🏗 Cross-cutting xtrm design (NOT in this repo)
|
|
26
|
+
|
|
27
|
+
These now live in **`~/dev/xtrm/docs/`** (xtrm monorepo, vault-published):
|
|
28
|
+
|
|
29
|
+
- `substrate/substrate_design_it.md` — canonical substrate design (rev12, round-3 audit closed via `unitAI-bgyp0`).
|
|
30
|
+
- `substrate/substrate_design_en.md` — EN parallel (rev10 → rev12 propagation tracked in `unitAI-e3w1n`).
|
|
31
|
+
- `substrate/chain_templates.md` + `.html` — canonical chain-template catalog + pipeline.
|
|
32
|
+
- `channels/channels.md` — channel primitive design.
|
|
33
|
+
- `telemetry/*` — agentops + forensic + prometheus contracts.
|
|
34
|
+
- `console/*` — console product contract + handoffs.
|
|
35
|
+
- `tether.md` — always-on context injection (renamed from `shepherd.md`).
|
|
36
|
+
- `monorepo-migration.md` + `state-store-options.md` — migration architecture.
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
# Darth Feedor — Migration onto specialists-service
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-04-25
|
|
4
|
+
**Status:** Plan; gated on `specialists-service` v1.0.0 being shipped and locally validated
|
|
5
|
+
**Companion:** `docs/specialists-service.md` (the feature being adopted)
|
|
6
|
+
**Legacy reference:** `docs/script-specialists.md`
|
|
7
|
+
|
|
8
|
+
This document is the **first reference migration** of a real consumer onto `specialists-service`. The target is the darth feedor VPS stack: ingestion + squawks services that today depend on the legacy YAML-based script-specialists system and `qwen-service`.
|
|
9
|
+
|
|
10
|
+
It is project-specific. Other consumers can use the structure as a template but should write their own.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Migration shape: clean-room rebuild
|
|
15
|
+
|
|
16
|
+
- **Not** a big-bang rewrite (legacy and new run side-by-side during the migration).
|
|
17
|
+
- **Not** a backend-only swap (the legacy `SpecialistLoader` and YAML format do not survive).
|
|
18
|
+
- **Yes** a fresh implementation of the consumer side, gradual port one service at a time, single-commit deletion of legacy code at the end.
|
|
19
|
+
|
|
20
|
+
## Phase gate — feature must exist first
|
|
21
|
+
|
|
22
|
+
This migration **does not start** until:
|
|
23
|
+
|
|
24
|
+
1. `specialists-service` is built in this repo (`src/cli/serve.ts`, `Dockerfile.sp-service`, observability writer, script-class Runner branch).
|
|
25
|
+
2. A sample script-class specialist runs end-to-end against the local service.
|
|
26
|
+
3. A reference Python client successfully calls `/v1/generate` and parses the response.
|
|
27
|
+
4. `specialists-service:v1.0.0` is tagged.
|
|
28
|
+
|
|
29
|
+
If any of these fail, the migration is paused, not worked around.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Phase 0 — Locked decisions for darth feedor
|
|
34
|
+
|
|
35
|
+
| Question | Answer |
|
|
36
|
+
|---|---|
|
|
37
|
+
| Is `specialists-service` the strategic platform? | **Yes.** |
|
|
38
|
+
| Will services remain orchestrators (multi-stage)? | **Yes.** Orchestration stays in Python for this migration. |
|
|
39
|
+
| Will model transport be owned by services? | **No.** Transport moves into `specialists-service` (via pi). Services lose direct LLM access. |
|
|
40
|
+
| Is `qwen-service` retired, wrapped, or replaced? | **Replaced.** `llm_gateway/` and `~/.qwen` rotation are deleted after Phase 4. |
|
|
41
|
+
| Where do darth feedor specialists live? | `.specialists/user/` (script-class JSON). Legacy `specialists/**/*.specialist.yaml` is converted then deleted. |
|
|
42
|
+
|
|
43
|
+
These five answers are settled. Do not re-litigate during implementation.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Schema target — what every converted YAML becomes
|
|
48
|
+
|
|
49
|
+
Every legacy `*.specialist.yaml` becomes a `.specialist.json` file in `.specialists/user/` matching the **script-class** subset of the canonical schema. Authoritative reference: [`docs/authoring.md` § Script-class authoring](authoring.md#script-class-authoring). The service-side runtime constraints come from `compatGuard` in `src/specialist/script-runner.ts` and are visible in [`docs/specialists-service.md`](specialists-service.md).
|
|
50
|
+
|
|
51
|
+
### Field translation (legacy YAML → new JSON)
|
|
52
|
+
|
|
53
|
+
The legacy `script-specialists` system used a flat YAML shape; the new schema is nested under `specialist.{metadata,execution,prompt,…}`. The mapping is mechanical:
|
|
54
|
+
|
|
55
|
+
| Legacy YAML field | New JSON path | Notes |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| `name` | `specialist.metadata.name` | kebab-case unchanged |
|
|
58
|
+
| `version` | `specialist.metadata.version` | must be quoted string in JSON |
|
|
59
|
+
| `description` | `specialist.metadata.description` | one sentence |
|
|
60
|
+
| (none — implicit) | `specialist.metadata.category` | required; pick from `"analysis"`, `"workflow"`, `"synthesis"`, etc. |
|
|
61
|
+
| `model` | `specialist.execution.model` | provider/model id, e.g. `anthropic/claude-haiku-4-5` |
|
|
62
|
+
| `fallback_model` | `specialist.execution.fallback_model` | optional, recommended cross-provider |
|
|
63
|
+
| `timeout_ms` | `specialist.execution.timeout_ms` | optional, default 120000 |
|
|
64
|
+
| `max_retries` | `specialist.execution.max_retries` | **must be `0` for script class** — caller owns retries |
|
|
65
|
+
| `response_format` (`"json"`) | `specialist.execution.response_format` | `"text"` / `"json"` / `"markdown"` |
|
|
66
|
+
| `prompt` (string) | `specialist.prompt.task_template` | rendered with `$varname` (single-dollar, no braces) |
|
|
67
|
+
| `prompt_normalize` (rolling-context analyst) | second specialist JSON file | schema has one `task_template` per spec — ship a sibling spec for the normalize pass; see Multi-stage section below |
|
|
68
|
+
| `output_schema.required` | `specialist.prompt.output_schema.required` | shape preserved; nested validation is warn-only today |
|
|
69
|
+
| (must add — see Phase 0) | `specialist.execution.interactive: false` | constraint enforced by service |
|
|
70
|
+
| (must add) | `specialist.execution.requires_worktree: false` | constraint enforced by service |
|
|
71
|
+
| (must add) | `specialist.execution.permission_required: "READ_ONLY"` | constraint enforced by service |
|
|
72
|
+
|
|
73
|
+
If the legacy YAML uses anything not in this table — `tools`, `worktree_required`, `keep_alive`, host shell scripts — that field is out of scope for `specialists-service`. Stay on `sp run` for those specialists, or open a deferred bead (see `unitAI-3k6sa` for skill trust modes).
|
|
74
|
+
|
|
75
|
+
### Worked example — `mercury-atomic-summarizer`
|
|
76
|
+
|
|
77
|
+
This is the spec called out by Phase 1. The shape applies to all five YAMLs being ported. The same JSON lives in [`docs/examples/mercury-atomic-summarizer.specialist.json`](examples/mercury-atomic-summarizer.specialist.json) — copy it directly into `.specialists/user/` to start.
|
|
78
|
+
|
|
79
|
+
```json
|
|
80
|
+
{
|
|
81
|
+
"specialist": {
|
|
82
|
+
"metadata": {
|
|
83
|
+
"name": "mercury-atomic-summarizer",
|
|
84
|
+
"version": "1.0.0",
|
|
85
|
+
"description": "Summarizes one news article into one structured row.",
|
|
86
|
+
"category": "synthesis"
|
|
87
|
+
},
|
|
88
|
+
"execution": {
|
|
89
|
+
"mode": "auto",
|
|
90
|
+
"model": "anthropic/claude-haiku-4-5",
|
|
91
|
+
"fallback_model": "openai-codex/gpt-5.4-mini",
|
|
92
|
+
"timeout_ms": 60000,
|
|
93
|
+
"interactive": false,
|
|
94
|
+
"response_format": "json",
|
|
95
|
+
"output_type": "synthesis",
|
|
96
|
+
"permission_required": "READ_ONLY",
|
|
97
|
+
"requires_worktree": false,
|
|
98
|
+
"max_retries": 0
|
|
99
|
+
},
|
|
100
|
+
"prompt": {
|
|
101
|
+
"task_template": "Summarize the article below into JSON of shape {\"summary\": \"...\", \"controlled_tags\": [...]}.\n\nTitle: $title\n\nContent:\n$content",
|
|
102
|
+
"output_schema": { "required": ["summary", "controlled_tags"] }
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
The Python adapter (`shared/specialists_client.py` from Phase 1) calls this with:
|
|
109
|
+
|
|
110
|
+
```python
|
|
111
|
+
client.run("mercury-atomic-summarizer",
|
|
112
|
+
variables={"title": article.title, "content": article.body})
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Variable names must match the `$varname` tokens in the chosen template; missing variables produce `error_type: "template_variable_missing"`.
|
|
116
|
+
|
|
117
|
+
### Multi-stage specialists (rolling-context analyst)
|
|
118
|
+
|
|
119
|
+
The schema has one `task_template` per spec; there is no in-spec alternate-template lookup. For Phase 3's analyst stage (initial analysis + normalize pass), ship two specialist files:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
.specialists/user/squawk-session-analyst.specialist.json # task_template = initial analysis
|
|
123
|
+
.specialists/user/squawk-session-analyst-normalize.specialist.json # task_template = normalize the prior synthesis
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Python calls each by name:
|
|
127
|
+
|
|
128
|
+
```python
|
|
129
|
+
client.run("squawk-session-analyst", variables={"context": stage1_input})
|
|
130
|
+
client.run("squawk-session-analyst-normalize", variables={"context": stage1_output})
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
If the prompts share a system block, factor it into a shared snippet that both specs include verbatim. Two files cost less than a runtime template-lookup feature and they keep the schema strictly 1:1 with the runner.
|
|
134
|
+
|
|
135
|
+
### Validation before commit
|
|
136
|
+
|
|
137
|
+
For each converted JSON, run the in-image validator:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
docker run --rm \
|
|
141
|
+
-v "$PWD/.specialists/user:/work/.specialists/user:ro" \
|
|
142
|
+
specialists-service:local \
|
|
143
|
+
sp validate --target script /work/.specialists/user/mercury-atomic-summarizer.specialist.json
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
(`sp validate --target script` is not in v1 — see the deferred-items list in `docs/specialists-service-evaluation.md` §12. Until that lands, drop the spec into `.specialists/user/` and start `sp serve` once: the loader surfaces schema errors at request time and `compatGuard` surfaces script-class violations as `specialist_load_error`.)
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Phase 1 — Adapter and one converted spec
|
|
151
|
+
|
|
152
|
+
In the darth feedor (VPS) repo:
|
|
153
|
+
|
|
154
|
+
1. **`shared/specialists_client.py`** — thin HTTP client wrapping `specialists-service`. Public API is **service-shaped**, not runtime-shaped:
|
|
155
|
+
|
|
156
|
+
```python
|
|
157
|
+
class SpecialistsClient:
|
|
158
|
+
def run(self, name: str, variables: dict,
|
|
159
|
+
template: str = "task_template",
|
|
160
|
+
timeout_ms: int = 60_000) -> SpecialistResult: ...
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
`SpecialistResult` matches the existing `qwen_client` return shape (`success`, `output`, `error`, `error_type`, `attempts`) plus `parsed_json` and `meta.trace_id`. Existing call sites change in a minimal way.
|
|
164
|
+
|
|
165
|
+
A canonical reference implementation lives at [`clients/python/`](../../clients/python/) — stdlib-only, ~170 LOC, with a smoke test and minimal `pyproject.toml`. Copy `specialists_client.py` into `shared/specialists_client.py` (or `pip install -e clients/python/`); the public API matches this contract exactly.
|
|
166
|
+
|
|
167
|
+
2. **Convert one YAML to JSON** — start with `mercury-atomic-summarizer`. Drop into `.specialists/user/mercury-atomic-summarizer.specialist.json` per `docs/specialists-service.md` §3.
|
|
168
|
+
|
|
169
|
+
3. **Smoke test** — point a local script at staging `specialists-service`; verify one real article summarization round-trip works and produces an `articles.summary` row identical (or equivalent) to legacy output on the same input.
|
|
170
|
+
|
|
171
|
+
4. **Unit tests** for the adapter: HTTP transport, error-type mapping, JSON parsing, missing-required handling, `meta.trace_id` propagation into service logs.
|
|
172
|
+
|
|
173
|
+
## Phase 2 — Port single-stage consumers
|
|
174
|
+
|
|
175
|
+
5. **`ingestion/summarizer.py`** — replace `SpecialistLoader + render_prompt + QwenClient` with `SpecialistsClient.run(...)`. Preserve preprocessing, truncation, table injection, controlled-tags handling, and the `articles.summary` write. Run the existing service tests against `specialists-service`.
|
|
176
|
+
|
|
177
|
+
6. **`ingestion/official_docs.py`** (`official-document-analyzer`) — same pattern. Removes the direct `requests.post()` divergence at the same time. Convert the YAML to JSON in `.specialists/user/`.
|
|
178
|
+
|
|
179
|
+
After each port, run the corresponding integration tests against a real `specialists-service` instance. No production cutover until the test suite is green on the new path.
|
|
180
|
+
|
|
181
|
+
## Phase 3 — Port rolling_context (Python orchestration preserved)
|
|
182
|
+
|
|
183
|
+
7. **`squawks/rolling_context.py`** — port the **invocation layer only**. The three pipeline stages remain three Python `SpecialistsClient.run(...)` calls.
|
|
184
|
+
|
|
185
|
+
Stays in Python (these are non-goals for `specialists-service`):
|
|
186
|
+
- cross-stage state passing (extractor → curator → analyst)
|
|
187
|
+
- curator fallback to extracted events
|
|
188
|
+
- synthesis topical grounding heuristics
|
|
189
|
+
- timestamp resolution and degraded-input metadata
|
|
190
|
+
- confidence computation
|
|
191
|
+
- `squawk_rolling_context.processed_data` persistence
|
|
192
|
+
|
|
193
|
+
8. **Replay harness** — adapt `tests/test_rolling_context_specialists.py` into a regression harness that runs the full pipeline against a real `specialists-service` with recorded fixtures. **This is the safety rail; do not skip.** Rolling context has many implicit operational guarantees that can drift silently.
|
|
194
|
+
|
|
195
|
+
9. Convert the rolling-context YAMLs to JSON in `.specialists/user/`. The analyst stage becomes two files:
|
|
196
|
+
- `squawk-rolling-context.specialist.json`
|
|
197
|
+
- `squawk-event-curator.specialist.json`
|
|
198
|
+
- `squawk-session-analyst.specialist.json` (initial analysis)
|
|
199
|
+
- `squawk-session-analyst-normalize.specialist.json` (normalize pass)
|
|
200
|
+
|
|
201
|
+
Python calls each spec by name — no `template=` parameter needed.
|
|
202
|
+
|
|
203
|
+
## Phase 4 — Production cutover
|
|
204
|
+
|
|
205
|
+
10. Deploy `specialists-service` container to the VPS (sidecar pattern, one per consuming service initially — can collapse to shared later).
|
|
206
|
+
11. Switch `ingestion/summarizer` to the new adapter in production. Monitor `error_rate` / `duration_ms` queries (per `docs/specialists-service.md` §5) for one full operational cycle.
|
|
207
|
+
12. Switch `ingestion/official_docs`. Same monitoring.
|
|
208
|
+
13. Switch `squawks/rolling_context`. Watch the replay harness output; compare a week of synthesized output against legacy output on the same squawks before declaring success.
|
|
209
|
+
|
|
210
|
+
## Phase 5 — Decommission
|
|
211
|
+
|
|
212
|
+
After all three consumers run on `specialists-service` cleanly for one week:
|
|
213
|
+
|
|
214
|
+
14. Delete `shared/specialist_system/` (loader + schema).
|
|
215
|
+
15. Delete `shared/qwen_client.py`.
|
|
216
|
+
16. Delete `llm_gateway/` and remove `qwen-service` from `ingestion/infra/docker-compose.yml`.
|
|
217
|
+
17. Delete `specialists/**/*.specialist.yaml`.
|
|
218
|
+
18. Update or remove `docs/guides/qwen-service-integration-guide.md` and `specialists/SPECIALIST_SYSTEM_IMPLEMENTATION.md`.
|
|
219
|
+
19. Remove `~/.qwen` references from operator skills/runbooks.
|
|
220
|
+
|
|
221
|
+
After Phase 5 the VPS has no legacy script-specialist surface left.
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Deferred — externalizing rolling_context orchestration
|
|
226
|
+
|
|
227
|
+
Whether rolling_context's three-stage chain should eventually move out of Python and into a runtime feature is a **separate future evaluation**. If revisited, the candidate is the **node-coordinator** system in this repo (`.specialists/default/nodes/`), not `specialists-service`. That feature is built for chained specialist work; `specialists-service` is not.
|
|
228
|
+
|
|
229
|
+
This deferral is intentional and is the only future expansion point in this plan.
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Risks and mitigations
|
|
234
|
+
|
|
235
|
+
| # | Risk | Mitigation |
|
|
236
|
+
|---|---|---|
|
|
237
|
+
| 1 | Hidden behavior regression in rolling_context (retry-once, curator fallback, synthesis rejection, EOD reset) | Replay harness in Phase 3, week-long parallel comparison in Phase 4 |
|
|
238
|
+
| 2 | Losing service-owned observability during transition | `meta.trace_id` returned to Python; service logs correlate to `observability.db` rows |
|
|
239
|
+
| 3 | Partial migration leaving split-brain | Phase 5 deletes all legacy artifacts in one commit, only after Phase 4 is green |
|
|
240
|
+
| 4 | Over-generalization of `specialists-service` to absorb orchestration | §7 non-goals in `docs/specialists-service.md` are enforced; orchestration relocation is explicitly deferred |
|
|
241
|
+
| 5 | Validation gaps persisting under new branding | Shallow-required validation is documented; strict-schema validation is a follow-up feature, not in this scope |
|
|
242
|
+
| 6 | Pi backend instability replacing qwen-service instability | `specialists-service` is the only place that talks to pi; if pi changes, only one container changes |
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## File impact
|
|
247
|
+
|
|
248
|
+
### darth feedor repo
|
|
249
|
+
|
|
250
|
+
**New:**
|
|
251
|
+
- `shared/specialists_client.py`
|
|
252
|
+
- `tests/test_specialists_client.py`
|
|
253
|
+
- `.specialists/user/mercury-atomic-summarizer.specialist.json`
|
|
254
|
+
- `.specialists/user/official-document-analyzer.specialist.json`
|
|
255
|
+
- `.specialists/user/squawk-rolling-context.specialist.json`
|
|
256
|
+
- `.specialists/user/squawk-event-curator.specialist.json`
|
|
257
|
+
- `.specialists/user/squawk-session-analyst.specialist.json`
|
|
258
|
+
- rolling-context replay fixtures
|
|
259
|
+
|
|
260
|
+
**Modified:**
|
|
261
|
+
- `ingestion/summarizer.py`
|
|
262
|
+
- `ingestion/official_docs.py`
|
|
263
|
+
- `squawks/rolling_context.py`
|
|
264
|
+
- `ingestion/infra/docker-compose.yml` (add `specialists-service`, remove `qwen-service`)
|
|
265
|
+
- legacy docs (or delete and replace with pointer)
|
|
266
|
+
|
|
267
|
+
**Deleted (Phase 5):**
|
|
268
|
+
- `shared/specialist_system/`
|
|
269
|
+
- `shared/qwen_client.py`
|
|
270
|
+
- `llm_gateway/`
|
|
271
|
+
- `specialists/**/*.specialist.yaml`
|
|
272
|
+
|
|
273
|
+
### This repo
|
|
274
|
+
|
|
275
|
+
No changes for the migration itself. All `specialists-service` work happens in Phase 1 of the feature build (see `docs/specialists-service.md`).
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## Validation checklist before declaring the migration done
|
|
280
|
+
|
|
281
|
+
- [ ] `mercury-atomic-summarizer` running on `specialists-service` in production for ≥ 7 days with no regression in `articles.summary` quality vs. legacy baseline
|
|
282
|
+
- [ ] `official-document-analyzer` likewise
|
|
283
|
+
- [ ] Rolling context replay harness passes on recorded fixtures
|
|
284
|
+
- [ ] Rolling context running in production for ≥ 7 days with parallel comparison vs. legacy showing no behavioral drift
|
|
285
|
+
- [ ] All five legacy YAMLs deleted
|
|
286
|
+
- [ ] `qwen-service` and `llm_gateway/` removed from docker-compose
|
|
287
|
+
- [ ] No `~/.qwen` references in active operator runbooks
|
|
288
|
+
- [ ] `observability.db` queries (per `docs/specialists-service.md` §5) show healthy error rates
|
|
289
|
+
|
|
290
|
+
When every box is ticked, close the migration.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Roadmap — specialists-runtime cleanup + substrate-alignment
|
|
2
|
+
|
|
3
|
+
Workaround/adaptation we designed to bridge today's runtime to substrate without waiting for substrate to land. **This is the actionable work for the next ~3–4 days of specialists-auto execution.**
|
|
4
|
+
|
|
5
|
+
## What to read when
|
|
6
|
+
|
|
7
|
+
| When | File | What it gives you |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| **You're picking up the work** | bd bead `unitAI-wxi9e` (P0) | Handoff: pointer index + 3 meta-phases (validation → planning → auto-execution) + per-phase smoke checkpoints + do-not list |
|
|
10
|
+
| **You want the plan** | [`specialists-roadmap.md`](specialists-roadmap.md) | Canonical roadmap — 12 opportunities, 8 phases (0–7), decisions D1–D30, parallelization map, friction catalog, reads-forward to substrate |
|
|
11
|
+
| **You're about to install chain templates** | [`chain-templates/README.md`](chain-templates/README.md) + the 13 `.formula.json` | Phase 0.a target — copy to `~/.beads/formulas/`; substrate-aligned shape; post-pour wire-edges spec |
|
|
12
|
+
| **You're cross-checking design history** | [`history/substrate-reconciliation.md`](history/substrate-reconciliation.md) | The substrate-author's decision-delta against the roadmap. Already applied to the canonical roadmap. Read for context only. |
|
|
13
|
+
| **You're cross-checking handoff context** | [`history/handoff-from-substrate-design.md`](history/handoff-from-substrate-design.md) | The handoff from the substrate-design author to the specialists-runtime work. Names the open questions deferred to the next-agent-with-code-visibility. Already addressed in the roadmap. |
|
|
14
|
+
|
|
15
|
+
## What this is NOT
|
|
16
|
+
|
|
17
|
+
- Not substrate design — that's [`../substrate/`](../substrate/). The roadmap reads forward to substrate sections.
|
|
18
|
+
- Not implementation — the roadmap is the plan; implementation happens via the handoff bead.
|
|
19
|
+
- Not retrofit of existing artifacts (specialists, beads, etc.) — the roadmap is forward-only where retrofit cost would dominate.
|
|
20
|
+
|
|
21
|
+
## Key inputs (live system state, not files in this directory)
|
|
22
|
+
|
|
23
|
+
- `config/specialists/*.specialist.json` — 19 package-tier specialists (the dispatch catalog)
|
|
24
|
+
- `config/mandatory-rules/` — 20 rule files (template_sets injection)
|
|
25
|
+
- `config/skills/` — operator-facing skills (canonical sources)
|
|
26
|
+
- `src/specialist/` + `src/cli/` — runtime + CLI surface to modify
|
|
27
|
+
- `~/.beads/formulas/` — chain template install target (Phase 0.a populates from `chain-templates/`)
|
|
28
|
+
- `bd memories <keyword>` / `bd recall <key>` — persistent project memory (576+ entries)
|
|
29
|
+
|
|
30
|
+
## Active bead
|
|
31
|
+
|
|
32
|
+
`unitAI-wxi9e` (P0) — HANDOFF: specialists-runtime cleanup + substrate-alignment — fresh-session validation → planning → specialists-auto execution.
|