@jaggerxtrm/specialists 3.17.0 → 3.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +268 -134
- package/config/mandatory-rules/json-only-final-output.md +13 -0
- package/config/mandatory-rules/service-skills-diff-scan-mandatory.md +26 -0
- package/config/mandatory-rules/service-skills-gitnexus-triage.md +5 -0
- package/config/skills/setup-specialists/SKILL.md +556 -0
- package/config/skills/specialists-creator/SKILL.md +132 -4
- package/config/skills/specialists-creator/scripts/audit-spec-uniformity.mjs +1 -1
- package/config/specialists/bare.specialist.json +3 -3
- package/config/specialists/changelog-drafter.specialist.json +5 -4
- package/config/specialists/changelog-keeper.specialist.json +7 -6
- package/config/specialists/debugger.specialist.json +2 -2
- package/config/specialists/executor.specialist.json +2 -2
- package/config/specialists/explorer.specialist.json +4 -4
- package/config/specialists/memory-processor.specialist.json +3 -3
- package/config/specialists/node-coordinator.specialist.json +3 -3
- package/config/specialists/obligations-scanner.specialist.json +67 -17
- package/config/specialists/overthinker.specialist.json +3 -3
- package/config/specialists/planner.specialist.json +4 -4
- package/config/specialists/quant-methodologist.specialist.json +145 -0
- package/config/specialists/quant-researcher.specialist.json +144 -0
- package/config/specialists/researcher.specialist.json +5 -5
- package/config/specialists/reviewer.specialist.json +1 -1
- package/config/specialists/seconder.specialist.json +2 -2
- package/config/specialists/security-auditor.specialist.json +2 -2
- package/config/specialists/service-skills-sync.specialist.json +90 -75
- package/config/specialists/specialists-creator.specialist.json +4 -4
- package/config/specialists/sync-docs.specialist.json +4 -4
- package/config/specialists/test-engineer.specialist.json +3 -3
- package/config/specialists/test-runner.specialist.json +7 -7
- package/config/specialists/transcriber.specialist.json +3 -3
- package/config/specialists/xt-merge.specialist.json +4 -4
- package/dist/asset-contract.json +21 -2
- package/dist/index.js +25704 -16376
- package/dist/lib.js +9849 -6147
- package/dist/types/cli/console/components.d.ts +83 -0
- package/dist/types/cli/console/components.d.ts.map +1 -0
- package/dist/types/cli/console/config-source.d.ts +58 -0
- package/dist/types/cli/console/config-source.d.ts.map +1 -0
- package/dist/types/cli/console/forensic.d.ts +11 -0
- package/dist/types/cli/console/forensic.d.ts.map +1 -0
- package/dist/types/cli/console/git.d.ts +28 -0
- package/dist/types/cli/console/git.d.ts.map +1 -0
- package/dist/types/cli/console/help.d.ts +2 -0
- package/dist/types/cli/console/help.d.ts.map +1 -0
- package/dist/types/cli/console/log.d.ts +13 -0
- package/dist/types/cli/console/log.d.ts.map +1 -0
- package/dist/types/cli/console/repo-config.d.ts +26 -0
- package/dist/types/cli/console/repo-config.d.ts.map +1 -0
- package/dist/types/cli/console/repo-discovery.d.ts +12 -0
- package/dist/types/cli/console/repo-discovery.d.ts.map +1 -0
- package/dist/types/cli/console/runtime.d.ts +12 -0
- package/dist/types/cli/console/runtime.d.ts.map +1 -0
- package/dist/types/cli/console/subscribe-prototype.d.ts +18 -0
- package/dist/types/cli/console/subscribe-prototype.d.ts.map +1 -0
- package/dist/types/cli/console/theme.d.ts +91 -0
- package/dist/types/cli/console/theme.d.ts.map +1 -0
- package/dist/types/cli/console/types.d.ts +231 -0
- package/dist/types/cli/console/types.d.ts.map +1 -0
- package/dist/types/cli/console/view-model.d.ts +252 -0
- package/dist/types/cli/console/view-model.d.ts.map +1 -0
- package/dist/types/cli/console.d.ts +2 -0
- package/dist/types/cli/console.d.ts.map +1 -0
- package/dist/types/cli/db.d.ts.map +1 -1
- package/dist/types/cli/doctor.d.ts.map +1 -1
- package/dist/types/cli/edit.d.ts.map +1 -1
- package/dist/types/cli/epic.d.ts.map +1 -1
- package/dist/types/cli/feed.d.ts.map +1 -1
- package/dist/types/cli/forensic.d.ts +2 -0
- package/dist/types/cli/forensic.d.ts.map +1 -0
- package/dist/types/cli/format-helpers.d.ts +4 -2
- package/dist/types/cli/format-helpers.d.ts.map +1 -1
- package/dist/types/cli/help.d.ts.map +1 -1
- package/dist/types/cli/init.d.ts +10 -0
- package/dist/types/cli/init.d.ts.map +1 -1
- package/dist/types/cli/list.d.ts.map +1 -1
- package/dist/types/cli/log.d.ts.map +1 -1
- package/dist/types/cli/metrics.d.ts +2 -0
- package/dist/types/cli/metrics.d.ts.map +1 -0
- package/dist/types/cli/ps.d.ts.map +1 -1
- package/dist/types/cli/result.d.ts.map +1 -1
- package/dist/types/cli/run.d.ts +1 -0
- package/dist/types/cli/run.d.ts.map +1 -1
- package/dist/types/cli/script.d.ts +3 -0
- package/dist/types/cli/script.d.ts.map +1 -1
- package/dist/types/cli/serve.d.ts.map +1 -1
- package/dist/types/cli/setup.d.ts +19 -1
- package/dist/types/cli/setup.d.ts.map +1 -1
- package/dist/types/cli/status.d.ts.map +1 -1
- package/dist/types/cli/version-check.d.ts +1 -0
- package/dist/types/cli/version-check.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/pi/session.d.ts +11 -1
- package/dist/types/pi/session.d.ts.map +1 -1
- package/dist/types/server.d.ts +15 -0
- package/dist/types/server.d.ts.map +1 -1
- package/dist/types/specialist/benchmarks.d.ts +37 -0
- package/dist/types/specialist/benchmarks.d.ts.map +1 -0
- package/dist/types/specialist/chain-identity.d.ts +7 -1
- package/dist/types/specialist/chain-identity.d.ts.map +1 -1
- package/dist/types/specialist/control.d.ts.map +1 -1
- package/dist/types/specialist/forensic-events.d.ts +138 -0
- package/dist/types/specialist/forensic-events.d.ts.map +1 -0
- package/dist/types/specialist/forensic-renderer.d.ts +34 -0
- package/dist/types/specialist/forensic-renderer.d.ts.map +1 -0
- package/dist/types/specialist/git-diff-evidence.d.ts +28 -0
- package/dist/types/specialist/git-diff-evidence.d.ts.map +1 -0
- package/dist/types/specialist/global-config.d.ts +389 -0
- package/dist/types/specialist/global-config.d.ts.map +1 -0
- package/dist/types/specialist/launch.d.ts +1 -0
- package/dist/types/specialist/launch.d.ts.map +1 -1
- package/dist/types/specialist/live-aggregates.d.ts +46 -0
- package/dist/types/specialist/live-aggregates.d.ts.map +1 -0
- package/dist/types/specialist/loader.d.ts +50 -1
- package/dist/types/specialist/loader.d.ts.map +1 -1
- package/dist/types/specialist/model-chain.d.ts +7 -0
- package/dist/types/specialist/model-chain.d.ts.map +1 -0
- package/dist/types/specialist/model-probes.d.ts +28 -0
- package/dist/types/specialist/model-probes.d.ts.map +1 -0
- package/dist/types/specialist/node-contract.d.ts +18 -18
- package/dist/types/specialist/node-supervisor.d.ts.map +1 -1
- package/dist/types/specialist/observability-db.d.ts +1 -1
- package/dist/types/specialist/observability-db.d.ts.map +1 -1
- package/dist/types/specialist/observability-sqlite.d.ts +25 -0
- package/dist/types/specialist/observability-sqlite.d.ts.map +1 -1
- package/dist/types/specialist/preset-resolver.d.ts +56 -0
- package/dist/types/specialist/preset-resolver.d.ts.map +1 -0
- package/dist/types/specialist/prometheus-projection.d.ts +25 -0
- package/dist/types/specialist/prometheus-projection.d.ts.map +1 -0
- package/dist/types/specialist/runner.d.ts +26 -1
- package/dist/types/specialist/runner.d.ts.map +1 -1
- package/dist/types/specialist/schema.d.ts +163 -54
- package/dist/types/specialist/schema.d.ts.map +1 -1
- package/dist/types/specialist/script-runner.d.ts +5 -1
- package/dist/types/specialist/script-runner.d.ts.map +1 -1
- package/dist/types/specialist/snapshot-diff.d.ts +8 -0
- package/dist/types/specialist/snapshot-diff.d.ts.map +1 -0
- package/dist/types/specialist/source-queue.d.ts +13 -0
- package/dist/types/specialist/source-queue.d.ts.map +1 -0
- package/dist/types/specialist/supervisor.d.ts +15 -1
- package/dist/types/specialist/supervisor.d.ts.map +1 -1
- package/dist/types/specialist/timeline-events.d.ts +68 -1
- package/dist/types/specialist/timeline-events.d.ts.map +1 -1
- package/dist/types/tools/specialist/resume_specialist.tool.d.ts +4 -4
- package/dist/types/tools/specialist/specialist_status.tool.d.ts +1 -1
- package/dist/types/tools/specialist/steer_specialist.tool.d.ts +4 -4
- package/dist/types/tools/specialist/use_specialist.tool.d.ts +16 -16
- package/docs/ARCHITECTURE.md +1176 -0
- package/docs/TODO.md +9 -0
- package/docs/architecture.md +11 -0
- package/docs/archive/2026-03-13-bd-decision-context-template-plan.md +96 -0
- package/docs/archive/AGENT-HANDOFF.md +351 -0
- package/docs/archive/PARITY-ANALYSIS.md +296 -0
- package/docs/archive/SPECIALISTS_REFACTOR.md.md +30 -0
- package/docs/archive/cc-programmatic.md +216 -0
- package/docs/archive/claude-agent-sdk.md +594 -0
- package/docs/archive/decision-specialist-directory.md +41 -0
- package/docs/archive/discoveries.md +148 -0
- package/docs/archive/executor-benchmark-protocol.md +198 -0
- package/docs/archive/future-features.md +66 -0
- package/docs/archive/gzrx-completion-critique.md +183 -0
- package/docs/archive/gzrx-research-notes.md +401 -0
- package/docs/archive/gzrx-tool-catalog.md +760 -0
- package/docs/archive/iron-review-hardening-qa-chain-substrate.md +322 -0
- package/docs/archive/iron-review-hardening.html +1004 -0
- package/docs/archive/issuetracking.md +312 -0
- package/docs/archive/qa-v3.0.2.md +220 -0
- package/docs/archive/restructure.md +231 -0
- package/docs/archive/script-specialists.md +1254 -0
- package/docs/archive/spec-v3.md +792 -0
- package/docs/archive/specialist-stats.md +127 -0
- package/docs/archive/specialists-friction-audit.md +1347 -0
- package/docs/archive/specialists-runtime-critique.md +170 -0
- package/docs/archive/specialists-service-evaluation.md +713 -0
- package/docs/archive/specialists-substrate-alignment.md +255 -0
- package/docs/archive/substrate-review.md +1288 -0
- package/docs/archive/test-writer-specialist.md +254 -0
- package/docs/archive/using-specialists-v3-improvements-2026-05-09.md +600 -0
- package/docs/archive/xtrm-specialists-analysis.md +314 -0
- package/docs/authoring.md +701 -0
- package/docs/background-jobs.md +203 -0
- package/docs/bare-specialists.md +83 -0
- package/docs/benchmarks/executor-benchmark-runner.md +66 -0
- package/docs/bootstrap.md +161 -0
- package/docs/cli-reference.md +1645 -0
- package/docs/deploying-alongside.md +155 -0
- package/docs/design/README.md +36 -0
- package/docs/design/darth-feedor-migration.md +290 -0
- package/docs/design/roadmap/README.md +32 -0
- package/docs/design/roadmap/chain-templates/README.md +146 -0
- package/docs/design/roadmap/chain-templates/code-quick.formula.json +27 -0
- package/docs/design/roadmap/chain-templates/code-standard.formula.json +126 -0
- package/docs/design/roadmap/chain-templates/code-with-advisors.formula.json +128 -0
- package/docs/design/roadmap/chain-templates/code-with-tests.formula.json +76 -0
- package/docs/design/roadmap/chain-templates/debug.formula.json +128 -0
- package/docs/design/roadmap/chain-templates/doc-sync.formula.json +28 -0
- package/docs/design/roadmap/chain-templates/memory-hygiene.formula.json +27 -0
- package/docs/design/roadmap/chain-templates/planning.formula.json +27 -0
- package/docs/design/roadmap/chain-templates/premortem.formula.json +26 -0
- package/docs/design/roadmap/chain-templates/release-prep.formula.json +36 -0
- package/docs/design/roadmap/chain-templates/research-only.formula.json +28 -0
- package/docs/design/roadmap/chain-templates/restitch.formula.json +125 -0
- package/docs/design/roadmap/chain-templates/security-deep.formula.json +161 -0
- package/docs/design/roadmap/chain-templates/test-only.formula.json +52 -0
- package/docs/design/roadmap/chain-templates/triage.formula.json +35 -0
- package/docs/design/roadmap/history/handoff-from-substrate-design.md +87 -0
- package/docs/design/roadmap/history/substrate-reconciliation.md +105 -0
- package/docs/design/roadmap/specialists-roadmap.md +1193 -0
- package/docs/design/sp-console-subscribe-via-materializer.md +231 -0
- package/docs/design/sp-console-tui-mock-v2.html +293 -0
- package/docs/design/sp-console-tui-mock.html +120 -0
- package/docs/design/sp-console-tui.md +340 -0
- package/docs/design/specialist-agentops-suite.md +323 -0
- package/docs/design/substrate/channels.md +14 -0
- package/docs/design/substrate/devops-platform-engineering-prd.md +446 -0
- package/docs/design/substrate/html-design-example.md +339 -0
- package/docs/design/xtrm-tiers-architecture.svg +132 -0
- package/docs/devops/dependency-verdict-materialization.md +46 -0
- package/docs/epic-readiness.md +75 -0
- package/docs/examples/mercury-atomic-summarizer.specialist.json +26 -0
- package/docs/examples/smoke-echo-text-expected-keys.specialist.json +25 -0
- package/docs/examples/smoke-echo.specialist.json +25 -0
- package/docs/features.md +1577 -0
- package/docs/hooks.md +81 -0
- package/docs/installation.md +142 -0
- package/docs/manifest.md +184 -0
- package/docs/mcp-servers.md +73 -0
- package/docs/mcp-tools.md +71 -0
- package/docs/nodes.md +231 -0
- package/docs/observability-metrics.md +152 -0
- package/docs/operator/sp-console-v2-walkthrough.md +410 -0
- package/docs/overrides-guide.md +306 -0
- package/docs/pi-rpc-boundary.md +118 -0
- package/docs/pi-session.md +195 -0
- package/docs/release.md +22 -0
- package/docs/skills.md +132 -0
- package/docs/specialists/handoff-schema.md +181 -0
- package/docs/specialists-catalog.md +99 -0
- package/docs/specialists-service-install.md +226 -0
- package/docs/specialists-service.md +363 -0
- package/docs/surface-ownership.md +138 -0
- package/docs/upgrade-notes/kan-90-global-user-config.md +114 -0
- package/docs/upgrade-notes/kan-91-expanded-overrides.md +261 -0
- package/docs/workflow.md +114 -0
- package/docs/worktree.md +71 -0
- package/docs/worktrees.md +309 -0
- package/package.json +6 -3
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "xtrm-tools vs specialists: Architecture Analysis"
|
|
3
|
+
scope: architecture
|
|
4
|
+
category: architecture
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
updated: 2026-03-22
|
|
7
|
+
synced_at: d043215
|
|
8
|
+
description: "Final architectural decisions for the specialists/xtrm-tools split: repo boundaries, hook ownership, orchestrator pattern, Pi subprocess isolation."
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
<!-- INDEX: auto-generated by validate_doc.py — do not edit manually -->
|
|
12
|
+
| Section | Summary |
|
|
13
|
+
|---|---|
|
|
14
|
+
| [FINAL DECISIONS](#final-decisions) | - Keep as separate npm packages: `xtrm-tools` and `@jaggerxtrm/specialists` |
|
|
15
|
+
| [SPRINT ORDER](#sprint-order) | **Key decision**: xtrm is REQUIRED for hooks |
|
|
16
|
+
| [COMPLETE ISSUE CLASSIFICATION (all 30, final)](#complete-issue-classification-all-30-final) | Changes from original PARITY-ANALYSIS marked ⬆ |
|
|
17
|
+
| [HOOK CLEANUP DETAIL](#hook-cleanup-detail) | | Hook | Action | Reason | |
|
|
18
|
+
| [TECHNICAL REFERENCE](#technical-reference) | | Key / File | Set by | Read by | Value | |
|
|
19
|
+
| [MATURITY SNAPSHOT](#maturity-snapshot) | | Project | Verdict | Key gaps | |
|
|
20
|
+
| [xtrm-tools FUTURE WORK](#xtrm-tools-future-work) | These items live in `/home/dawid/dev/xtrm-tools`, NOT in specialists |
|
|
21
|
+
| [OPEN QUESTIONS](#open-questions) | 1 |
|
|
22
|
+
<!-- END INDEX -->
|
|
23
|
+
|
|
24
|
+
# xtrm-tools ↔ specialists: Complete Architecture Analysis
|
|
25
|
+
*2026-03-22 — merged from 5 deep-read agents + manual code review*
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## FINAL DECISIONS
|
|
30
|
+
|
|
31
|
+
### 1. Repo structure → SEPARATE, xtrm required for hooks
|
|
32
|
+
- Keep as separate npm packages: `xtrm-tools` and `@jaggerxtrm/specialists`
|
|
33
|
+
- **xtrm-tools is required** for the hook system (beads gates, claim-sync, compact, memory-gate)
|
|
34
|
+
- specialists handles ONLY agent running — Supervisor, Runner, MCP server, CLI
|
|
35
|
+
- No monorepo — independent release cycles, independent CLIs, different audiences
|
|
36
|
+
- specialists/hooks/ contains ONLY: specialists-complete.mjs + specialists-session-start.mjs
|
|
37
|
+
- All beads hooks are xtrm's responsibility — specialists does not bundle or ship them
|
|
38
|
+
|
|
39
|
+
### 2. Orchestrator pattern → CORRECT, keep it
|
|
40
|
+
- Claude (orchestrator) claims issue via `bd update <id> --claim`
|
|
41
|
+
- Claude spawns Pi specialist subprocess to do the work
|
|
42
|
+
- Claude closes the issue on completion and manages the full lifecycle
|
|
43
|
+
- Bead tracks the WORK UNIT, not the executor — Claude is responsible end-to-end
|
|
44
|
+
- Specialists don't need their own claim — they're tools in Claude's plan
|
|
45
|
+
|
|
46
|
+
### 3. Pi subprocess isolation → `--no-extensions` + selective `-e` re-inclusion
|
|
47
|
+
**The architectural resolution. Zero changes to xtrm required.**
|
|
48
|
+
|
|
49
|
+
Pi has `--no-extensions` / `-ne` flag (confirmed from `pi --help`) that disables auto-discovery, plus `-e <path>` to explicitly load specific extensions.
|
|
50
|
+
|
|
51
|
+
**The conflict being solved**: xtrm's beads Pi extension auto-loads in specialist Pi subprocesses and blocks file edits if no `claimed:<sessionId>` KV entry exists. The specialist's Pi session has no claim — Claude's session does. This causes silent edit blocking.
|
|
52
|
+
|
|
53
|
+
**The fix** — modify `specialists/src/pi/session.ts` spawn args:
|
|
54
|
+
```typescript
|
|
55
|
+
const args = [
|
|
56
|
+
'--mode', 'rpc',
|
|
57
|
+
'--no-session',
|
|
58
|
+
'--no-extensions', // ← disable ALL auto-discovered xtrm extensions
|
|
59
|
+
...providerArgs,
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
// Selectively re-enable useful extensions if installed
|
|
63
|
+
const piExtDir = join(homedir(), '.pi', 'agent', 'extensions');
|
|
64
|
+
const permLevel = (this.options.permissionLevel ?? '').toUpperCase();
|
|
65
|
+
if (permLevel !== 'READ_ONLY') {
|
|
66
|
+
const qgPath = join(piExtDir, 'quality-gates');
|
|
67
|
+
if (existsSync(qgPath)) args.push('-e', qgPath);
|
|
68
|
+
}
|
|
69
|
+
const ssPath = join(piExtDir, 'service-skills');
|
|
70
|
+
if (existsSync(ssPath)) args.push('-e', ssPath);
|
|
71
|
+
|
|
72
|
+
const toolsFlag = mapPermissionToTools(this.options.permissionLevel);
|
|
73
|
+
if (toolsFlag) args.push('--tools', toolsFlag);
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Extension re-inclusion policy:**
|
|
77
|
+
| Extension | Load in specialist Pi? | Reason |
|
|
78
|
+
|-----------|----------------------|--------|
|
|
79
|
+
| `beads` | ❌ NO | Blocks edits — no claim for subprocess sessionId |
|
|
80
|
+
| `session-flow` | ❌ NO | Stop gate + xt end reminder irrelevant in subprocess |
|
|
81
|
+
| `quality-gates` | ✅ YES (if installed, non-READ_ONLY) | Lint/typecheck on specialist edits — universally useful |
|
|
82
|
+
| `service-skills` | ✅ YES (if installed) | Territory routing useful |
|
|
83
|
+
| `plan-mode` | ❌ NO | Creates epic/issues — not for subprocess |
|
|
84
|
+
| `auto-update`, `compact-header`, `custom-footer`, `xtrm-loader`, `auto-session-name`, `git-checkpoint` | ❌ NO | UI/UX only |
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## SPRINT ORDER
|
|
89
|
+
|
|
90
|
+
### Phase 0: Cleanup (no new features) — ✓ COMPLETE (Epic unitAI-faf closed)
|
|
91
|
+
**Key decision**: xtrm is REQUIRED for hooks. specialists does NOT bundle beads hooks.
|
|
92
|
+
specialists/hooks/ → only specialists-complete.mjs + specialists-session-start.mjs.
|
|
93
|
+
|
|
94
|
+
1. ✓ faf.2: `--no-extensions` + conditional `-e` in session.ts (commit d143a09)
|
|
95
|
+
2. ✓ faf.1: Closed 11 stale issues, updated PARITY-ANALYSIS.md
|
|
96
|
+
3. ✓ faf.3: Deleted all 6 beads hooks; specialists/hooks/ has 2 files only
|
|
97
|
+
4. ✓ unitAI-5nm: Install rework — prereq check (xtrm required), install 2 specialists hooks, MCP registration
|
|
98
|
+
|
|
99
|
+
### Phase 1: Core bugs — ✓ COMPLETE (commit ca51fb6)
|
|
100
|
+
- **`unitAI-fgy`** ✓ Already done: `onBeadCreated` at supervisor.ts:208 fires right after `createBead` (runner.ts:166), before Pi starts
|
|
101
|
+
- **`unitAI-0ef`** ✓ Fixed: `process.once('SIGTERM', () => killFn?.())` in `Supervisor.run()`; killFn captured from `onKillRegistered`; routes SIGTERM → `session.kill()` → `SessionKilledError` → catch writes `status:'error'`
|
|
102
|
+
|
|
103
|
+
### Phase 2: Output pinning — ✓ COMPLETE (PR #42, merge commit c67c0e7)
|
|
104
|
+
- **`unitAI-iuj`** ✓ Implemented in `Supervisor.run()` after writing `result.txt`
|
|
105
|
+
- Files: `src/specialist/supervisor.ts`, `src/specialist/beads.ts`, `src/specialist/runner.ts`, `src/cli/run.ts`
|
|
106
|
+
- Behavior: if `beadId` exists, specialists now pin the full output into bead notes via `bd update <bead_id> --notes ...`
|
|
107
|
+
- Added metadata: `prompt_hash`, `git_sha`, `elapsed_ms`, `model`, `backend`
|
|
108
|
+
- Supporting change: `RunResult` now carries `promptHash`; background runs pass `beadsClient` into `Supervisor`
|
|
109
|
+
- Verification: specialist unit tests updated and passing; `npx tsc --noEmit` passing
|
|
110
|
+
|
|
111
|
+
### Phase 3: Workflow — ✓ COMPLETE (PR #45, merge commit a90a58a)
|
|
112
|
+
- **`unitAI-7fm`** ✓ `specialists init` registers `@jaggerxtrm/specialists` in `.mcp.json`
|
|
113
|
+
- **`unitAI-55d`** ✓ `specialists run --bead <id>`: bead IS the prompt; `bd show <id> --json`; single-bead orchestrator-owned lifecycle
|
|
114
|
+
- **`unitAI-slu`** ✓ Bug fixed: `--bead` runs no longer create a second tracking bead; `ownsBead` flag gates `closeBead`; orchestrator closes input bead
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## COMPLETE ISSUE CLASSIFICATION (all 30, final)
|
|
119
|
+
|
|
120
|
+
Changes from original PARITY-ANALYSIS marked ⬆.
|
|
121
|
+
|
|
122
|
+
| ID | Pri | Description | Final | Action |
|
|
123
|
+
|----|-----|-------------|-------|--------|
|
|
124
|
+
| `unitAI-0ef` | P1 | SIGTERM doesn't update job status | **DONE** ✓ | Fixed Phase 1 (commit ca51fb6) |
|
|
125
|
+
| `unitAI-0qj` | P2 | Review and reconcile unrelated .claude workflow changes | **KEEP** | Added post-analysis; review .claude/ drift |
|
|
126
|
+
| `unitAI-4az` | P1 | beads-compact-save/restore hooks | **KEEP** ⬆ | Bundle in specialists for standalone; was STALE (wrong: xtrm has them but standalone needs them too) |
|
|
127
|
+
| `unitAI-55d` | P1 | `specialists run --bead <id>` | **DONE** ✓ | Completed PR #45; single-bead orchestrator lifecycle |
|
|
128
|
+
| `unitAI-750` | P1 | Dependency-aware context injection | **KEEP** | Future — needs iuj first |
|
|
129
|
+
| `unitAI-7fm` | P1 | specialists init: register MCP at project scope | **DONE** ✓ | Completed PR #45 |
|
|
130
|
+
| `unitAI-9re` | P1 | specialists feed -f global live feed | **KEEP** | CLI feature |
|
|
131
|
+
| `unitAI-aq0` | P1 | specialists init: detect-and-defer beads hooks | **STALE** | Addressed by Phase 0 peer dep detection |
|
|
132
|
+
| `unitAI-bi6` | P1 | specialists init: install project-local hooks | **STALE** | Addressed by Phase 0 peer dep detection |
|
|
133
|
+
| `unitAI-csu` | P1 | specialists init: run bd init prerequisite | **STALE** | xtrm init handles it; peer dep model delegates |
|
|
134
|
+
| `unitAI-fgy` | P1 | Write bead_id at job creation | **DONE** ✓ | Already implemented at supervisor.ts:208 |
|
|
135
|
+
| `unitAI-iuj` | P1 | Pin specialist output to bead | **DONE** ✓ | Completed in PR #42; notes include full output + metadata |
|
|
136
|
+
| `unitAI-lmi` | P1 | Worktree Dolt bootstrap | **STALE** ✓ | `bd worktree create` handles port redirect; `--no-extensions` eliminates Pi conflict |
|
|
137
|
+
| `unitAI-msh` | P1 | Comprehensive docs | **MODIFY** | Update to document peer dep model + integration |
|
|
138
|
+
| `unitAI-pjx` | P1 | Force memory judgment on bd close | **STALE** ✓ | `beads-memory-gate.mjs` confirmed in xtrm as full blocking Stop gate |
|
|
139
|
+
| `unitAI-xr1` | P1 | Hook audit | **STALE** | Phase 0 replaces all old hooks — moot |
|
|
140
|
+
| `unitAI-0x9` | P2 | specialists installer: defer beads hooks | **STALE** | Phase 0 peer dep detection covers this |
|
|
141
|
+
| `unitAI-200` | P2 | beads-claim-sync hook | **KEEP** ⬆ | Bundle in specialists for standalone; was STALE (wrong: standalone needs it) |
|
|
142
|
+
| `unitAI-3n1` | P2 | Reduce hook verbosity | **STALE** | Phase 0 replaces with xtrm canonical (already clean) |
|
|
143
|
+
| `unitAI-5dj` | P2 | hooks-deployer review | **STALE** | overstory is separate, not relevant to specialists |
|
|
144
|
+
| `unitAI-5nm` | P2 | Retire specialists install / bin/install.js | **DONE** ✓ | Reworked: prereq checks + 2 hooks + MCP reg |
|
|
145
|
+
| `unitAI-9xa` | P2 | specialists clean | **KEEP** ⬆ | `xt clean` removes orphaned hooks, not job dirs — different scope; was STALE |
|
|
146
|
+
| `unitAI-c64` | P2 | Memory curator specialist | **KEEP** | New specialist YAML — needs iuj first |
|
|
147
|
+
| `unitAI-hgo` | P2 | specialists install is silent | **STALE** | Phase 0 reworks install with output |
|
|
148
|
+
| `unitAI-hos` | P2 | Commit/PR provenance hook | **KEEP** ⬆ | Can't move to xtrm — needs active specialist bead_id; was MODIFY→xtrm |
|
|
149
|
+
| `unitAI-kwb` | P2 | Active Jobs absent when queue empty | **KEEP** | UI bug in `specialists status` |
|
|
150
|
+
| `unitAI-mst` | P2 | Install pi-structured-return | **KEEP** | Evaluate before iuj — may simplify output pinning |
|
|
151
|
+
| `unitAI-o6j` | P2 | Sync hooks with xtrm-tools | **STALE** | Phase 0 replaces entirely |
|
|
152
|
+
| `unitAI-6op` | P3 | Dolt-backed run summaries | **KEEP** | Future — needs iuj first |
|
|
153
|
+
| `unitAI-tv3` | P3 | specialists status --job | **KEEP** | CLI enhancement |
|
|
154
|
+
| `unitAI-mk5` | P4 | ready/ markers accumulate | **KEEP** | Minor bug |
|
|
155
|
+
|
|
156
|
+
**Final counts: 11 STALE / 17 KEEP / 2 MODIFY** (was 14/13/3)
|
|
157
|
+
|
|
158
|
+
Changes from original: unitAI-4az, unitAI-200, unitAI-9xa moved STALE→KEEP; unitAI-hos moved MODIFY→KEEP
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## HOOK CLEANUP DETAIL
|
|
163
|
+
|
|
164
|
+
### specialists/hooks — what to do with each file
|
|
165
|
+
| Hook | Action | Reason |
|
|
166
|
+
|------|--------|--------|
|
|
167
|
+
| `beads-edit-gate.mjs` (54 LOC) | **Replace** with xtrm canonical | Pre-refactor: symbol counting `/^◐/gm` vs xtrm's `parseBdCounts()`; claim-per-session model vs any-in-progress |
|
|
168
|
+
| `beads-commit-gate.mjs` (59 LOC) | **Replace** with xtrm canonical | Pre-refactor |
|
|
169
|
+
| `beads-stop-gate.mjs` (53 LOC) | **Replace** with xtrm canonical | Pre-refactor |
|
|
170
|
+
| `beads-close-memory-prompt.mjs` (48 LOC) | **Delete** | Nudge-only PostToolUse; replaced by `beads-memory-gate.mjs` (blocking Stop gate) |
|
|
171
|
+
| `beads-gate-utils.mjs` (122 LOC) | **Delete** | Pulled in transitively by xtrm canonical hooks |
|
|
172
|
+
| `main-guard.mjs` (91 LOC) | **Delete** | xtrm removed from active runtime |
|
|
173
|
+
| `specialists-complete.mjs` (61 LOC) | **KEEP** | Specialists-specific: job completion banners at UserPromptSubmit |
|
|
174
|
+
| `specialists-session-start.mjs` (106 LOC) | **KEEP** | Specialists-specific: active jobs + available specialists at SessionStart |
|
|
175
|
+
|
|
176
|
+
### Add from xtrm
|
|
177
|
+
| Hook | Purpose |
|
|
178
|
+
|------|---------|
|
|
179
|
+
| `beads-claim-sync.mjs` | Auto-commit on `bd close`; writes `closed-this-session:<sessionId>` KV for memory gate |
|
|
180
|
+
| `beads-compact-save.mjs` | PreCompact: saves in_progress issue IDs to `.beads/.last_active` |
|
|
181
|
+
| `beads-compact-restore.mjs` | SessionStart: restores in_progress issues after compaction |
|
|
182
|
+
| `beads-memory-gate.mjs` | Stop: full blocking gate requiring memory evaluation after closing issues |
|
|
183
|
+
| `beads-gate-core.mjs` | Shared decision logic (pure functions) — dependency of above |
|
|
184
|
+
| `beads-gate-utils.mjs` | Shared session/bd utilities — dependency of above |
|
|
185
|
+
| `beads-gate-messages.mjs` | Shared message templates — dependency of above |
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## TECHNICAL REFERENCE
|
|
190
|
+
|
|
191
|
+
### xtrm KV namespace and state files
|
|
192
|
+
| Key / File | Set by | Read by | Value |
|
|
193
|
+
|------------|--------|---------|-------|
|
|
194
|
+
| `claimed:<sessionId>` | beads-claim-sync (on `bd update --claim`) | beads-gate-core, beads Pi ext, statusline | Issue ID |
|
|
195
|
+
| `closed-this-session:<sessionId>` | beads-claim-sync (on `bd close`) | beads-memory-gate | Issue ID |
|
|
196
|
+
| `.beads/.memory-gate-done` | agent (`touch`) | beads-memory-gate | Presence = acknowledged |
|
|
197
|
+
| `.beads/.last_active` | beads-compact-save | beads-compact-restore | `{ids, savedAt}` JSON |
|
|
198
|
+
| `.xtrm/statusline-claim` | beads-claim-sync | statusline.mjs | Claimed issue ID (plain text) |
|
|
199
|
+
| `.xtrm/debug.db` | xtrm-logger | `xtrm debug` | SQLite WAL event log |
|
|
200
|
+
|
|
201
|
+
### xtrm gate decision matrix
|
|
202
|
+
| Gate | Blocks when | Allows when |
|
|
203
|
+
|------|-------------|------------|
|
|
204
|
+
| Edit gate | No claim AND work exists | Claim active OR no work |
|
|
205
|
+
| Commit gate | Claim in_progress | No active claim |
|
|
206
|
+
| Stop gate | Claim in_progress OR (no session AND global in_progress) | Clean state |
|
|
207
|
+
| Memory gate | `closed-this-session` set AND no `.memory-gate-done` marker | No closed issue this session |
|
|
208
|
+
|
|
209
|
+
### specialists/src module map (37 files)
|
|
210
|
+
| Module | Key responsibility |
|
|
211
|
+
|--------|-------------------|
|
|
212
|
+
| `server.ts` | MCP server setup, 8 tools (4 deprecated v2) |
|
|
213
|
+
| `specialist/runner.ts` (283 LOC) | 17-step lifecycle: load→render→scripts→beads→execute→close→audit |
|
|
214
|
+
| `specialist/supervisor.ts` (242 LOC) | File-based job state: status.json, events.jsonl, result.txt, ready/ markers |
|
|
215
|
+
| `specialist/loader.ts` | 3-scope YAML discovery: project / user (`~/.agents/specialists/`) / system |
|
|
216
|
+
| `specialist/beads.ts` | BeadsClient: createBead, closeBead, auditBead, updateBeadNotes, readBead, buildBeadContext |
|
|
217
|
+
| `specialist/jobRegistry.ts` | In-memory registry (deprecated v2; v3 uses file-based Supervisor) |
|
|
218
|
+
| `pi/session.ts` | PiAgentSession: spawn pi --mode rpc, RPC over stdin/stdout NDJSON |
|
|
219
|
+
| `pi/backendMap.ts` | Provider alias map (gemini→google-gemini-cli, claude→anthropic, etc.) |
|
|
220
|
+
| `cli/run.ts` | `specialists run` — foreground + `--background` (writes Supervisor job) |
|
|
221
|
+
| `cli/status.ts` | Health check + active background jobs from `.specialists/jobs/` |
|
|
222
|
+
| `cli/stop.ts` | SIGTERM to pi PID → routed via killFn → SessionKilledError → status:'error' |
|
|
223
|
+
| `cli/feed.ts` | Tail `events.jsonl` with optional `--follow` |
|
|
224
|
+
|
|
225
|
+
### Pi --no-extensions flag (confirmed)
|
|
226
|
+
```
|
|
227
|
+
pi --no-extensions, -ne Disable extension discovery (explicit -e paths still work)
|
|
228
|
+
pi --extension, -e <path> Load specific extension (repeatable)
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### xtrm worktree + Dolt flow
|
|
232
|
+
```
|
|
233
|
+
xt claude / xt pi [name]
|
|
234
|
+
→ generate slug (4 random chars, or --name value)
|
|
235
|
+
→ bd worktree create <path> --branch xt/<slug>
|
|
236
|
+
→ git worktree add
|
|
237
|
+
→ writes .beads/dolt-server.port = <main_port> BEFORE any agent launch
|
|
238
|
+
→ writes .session-meta.json { runtime, launchedAt } into worktree root
|
|
239
|
+
→ injects statusline → worktree/.claude/settings.local.json (claude only)
|
|
240
|
+
→ launches runtime
|
|
241
|
+
|
|
242
|
+
xt attach [slug] ← NEW (xtrm v0.5.36)
|
|
243
|
+
→ reads .session-meta.json to determine runtime (claude|pi)
|
|
244
|
+
→ launches with --continue (claude) or -c (pi) for session resumption
|
|
245
|
+
→ interactive picker when multiple worktrees exist (shows timestamps + last commit)
|
|
246
|
+
→ falls back to runtime prompt if no .session-meta.json
|
|
247
|
+
|
|
248
|
+
xt worktree list
|
|
249
|
+
→ shows runtime badge, last activity timestamp, last commit, "xt attach <slug>" hint
|
|
250
|
+
|
|
251
|
+
bd commands in worktrees connect to main's Dolt server (same DB, no isolation)
|
|
252
|
+
```
|
|
253
|
+
This is why `unitAI-lmi` is STALE — bd handles port redirect natively. `xt attach` handles session resumption after unexpected close.
|
|
254
|
+
|
|
255
|
+
### xtrm install flow (simplified)
|
|
256
|
+
```
|
|
257
|
+
xtrm install
|
|
258
|
+
→ preflight diff (missing/outdated/drifted per target)
|
|
259
|
+
→ MCP sync (claude mcp add / pi install npm:...)
|
|
260
|
+
→ execute sync: skills copy, hooks via plugin, config deep-merge
|
|
261
|
+
→ claude plugin marketplace add <pkg> → claude plugin install xtrm-tools@xtrm-tools --scope user
|
|
262
|
+
→ xtrm pi install → sync config/pi/extensions/* → ~/.pi/agent/extensions/
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## MATURITY SNAPSHOT
|
|
268
|
+
| Project | Verdict | Key gaps |
|
|
269
|
+
|---------|---------|---------|
|
|
270
|
+
| specialists v3.2.0 | ⚠️ **Beta** | Phases 0-3 complete; growing test coverage; P1 backlog cleared |
|
|
271
|
+
| xtrm-tools v0.5.26 | ✅ **Stable** | 0% test coverage on 4007 LOC CLI |
|
|
272
|
+
| xtrm velocity | 2.6× faster | 428 vs 162 commits (Feb-Mar 2026) |
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## xtrm-tools FUTURE WORK
|
|
277
|
+
|
|
278
|
+
These items live in `/home/dawid/dev/xtrm-tools`, NOT in specialists.
|
|
279
|
+
|
|
280
|
+
### 1. `xt sp` command namespace — NOT YET IMPLEMENTED
|
|
281
|
+
Planned CLI surface for specialists inside xtrm:
|
|
282
|
+
- `xt sp run <name> --prompt "..."` — delegates to `specialists run`
|
|
283
|
+
- `xt sp status` — delegates to `specialists status`
|
|
284
|
+
- `xt sp stop <job>` — delegates to `specialists stop`
|
|
285
|
+
- `xt sp feed <job>` — delegates to `specialists feed`
|
|
286
|
+
Purpose: make specialists a first-class citizen of the `xt` CLI so users never have to remember two CLIs.
|
|
287
|
+
Files to create: `xtrm-tools/cli/sp.ts` or similar. Check existing CLI structure first.
|
|
288
|
+
|
|
289
|
+
### 2. specialists-aware `xtrm install`
|
|
290
|
+
When xtrm detects `@jaggerxtrm/specialists` is installed (global or local), it should optionally:
|
|
291
|
+
- Wire `specialists-complete.mjs` and `specialists-session-start.mjs` into the project's hooks
|
|
292
|
+
- These hook files live in the specialists package at `hooks/`
|
|
293
|
+
- Currently `specialists install` does this — xtrm could absorb it for integrated mode
|
|
294
|
+
Status: LOW priority — `specialists install` handles it today.
|
|
295
|
+
|
|
296
|
+
### 3. Document specialists as hard dependency consumer
|
|
297
|
+
In xtrm-tools docs/README: note that specialists requires xtrm-tools for:
|
|
298
|
+
- All beads hooks (edit/commit/stop gates, claim-sync, compact-save/restore, memory-gate)
|
|
299
|
+
- Pi extensions system (quality-gates, service-skills)
|
|
300
|
+
xtrm should reflect this in its own docs so users know to install it.
|
|
301
|
+
|
|
302
|
+
### 4. `pi-structured-return` Pi extension (evaluate)
|
|
303
|
+
`unitAI-mst` in specialists: evaluate whether `pi-structured-return` belongs in xtrm's Pi extensions.
|
|
304
|
+
If it's a general-purpose structured output extension for Pi, it belongs in xtrm.
|
|
305
|
+
If it's specialists-specific output parsing, it stays in specialists.
|
|
306
|
+
Evaluation complete: `pi-structured-return` is a useful general Pi extension, but it does not materially simplify `unitAI-iuj` because bead pinning uses Pi session output rather than parsed shell command output.
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## OPEN QUESTIONS
|
|
311
|
+
1. Should quality-gates load for READ_ONLY specialist sessions? (Probably not — nothing to lint)
|
|
312
|
+
2. `xt sp` namespace: planned but not implemented in xtrm. When?
|
|
313
|
+
3. `unitAI-mst` (pi-structured-return Pi extension): evaluated. Useful for compact shell/test output parsing, but it does not materially simplify `unitAI-iuj` because pinning uses Pi session output from `getLastOutput()`, not parsed CLI output.
|
|
314
|
+
4. Test coverage sprint item: add to roadmap or defer?
|