loadout-ai 0.8.0 → 0.9.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 (82) hide show
  1. package/CHANGELOG.md +76 -1
  2. package/README.md +149 -304
  3. package/SECURITY.md +21 -1
  4. package/catalog/discovered.json +27897 -25327
  5. package/catalog/packages.json +4 -4
  6. package/dist/src/cli.js +12 -4
  7. package/dist/src/commands/agents.js +3 -1
  8. package/dist/src/commands/catalog-candidate.js +150 -0
  9. package/dist/src/commands/catalog-workflows.js +147 -0
  10. package/dist/src/commands/catalog.js +9 -354
  11. package/dist/src/commands/coordinate.js +586 -0
  12. package/dist/src/commands/coordination-discussions.js +194 -0
  13. package/dist/src/commands/coordination-sessions.js +197 -0
  14. package/dist/src/commands/inventory.js +4 -2
  15. package/dist/src/core/{routing → agents}/model-config.js +7 -2
  16. package/dist/src/core/catalog/catalog.js +1 -0
  17. package/dist/src/core/catalog/registry.js +5 -19
  18. package/dist/src/core/coordination/adapters/claude-code.js +154 -0
  19. package/dist/src/core/coordination/adapters/codex.js +137 -0
  20. package/dist/src/core/coordination/adapters/types.js +64 -0
  21. package/dist/src/core/coordination/auth.js +59 -0
  22. package/dist/src/core/coordination/bridge-lease.js +79 -0
  23. package/dist/src/core/coordination/conflict-preview.js +167 -0
  24. package/dist/src/core/coordination/contract-diff.js +106 -0
  25. package/dist/src/core/coordination/coordinator.js +552 -0
  26. package/dist/src/core/coordination/crash-recovery.js +169 -0
  27. package/dist/src/core/coordination/daemon.js +667 -0
  28. package/dist/src/core/coordination/discussion.js +340 -0
  29. package/dist/src/core/coordination/events.js +161 -0
  30. package/dist/src/core/coordination/http-api.js +118 -0
  31. package/dist/src/core/coordination/interrupt-policy.js +89 -0
  32. package/dist/src/core/coordination/lock.js +110 -0
  33. package/dist/src/core/coordination/mcp-server.js +424 -0
  34. package/dist/src/core/coordination/redaction.js +85 -0
  35. package/dist/src/core/coordination/replay.js +188 -0
  36. package/dist/src/core/coordination/retention.js +128 -0
  37. package/dist/src/core/coordination/runtime.js +21 -0
  38. package/dist/src/core/coordination/session-manager.js +366 -0
  39. package/dist/src/core/coordination/watcher.js +128 -0
  40. package/dist/src/core/{routing → delegation}/first-party-skills.js +25 -13
  41. package/dist/src/core/{routing → delegation}/handoff.js +40 -9
  42. package/dist/src/core/discovery/candidate-intelligence-evidence.js +108 -0
  43. package/dist/src/core/discovery/candidate-intelligence-types.js +1 -0
  44. package/dist/src/core/discovery/candidate-intelligence-validation.js +108 -0
  45. package/dist/src/core/discovery/candidate-intelligence.js +3 -214
  46. package/dist/src/core/discovery/community.js +12 -4
  47. package/dist/src/core/discovery/github-discovery.js +6 -2
  48. package/dist/src/core/discovery/private-discovery.js +6 -2
  49. package/dist/src/core/install/reconcile.js +1 -1
  50. package/dist/src/core/install/uninstall.js +39 -3
  51. package/dist/src/core/reporting/cli-guide.js +9 -5
  52. package/dist/src/core/reporting/completion.js +43 -38
  53. package/dist/src/core/reporting/doctor.js +1 -1
  54. package/dist/src/core/runtime/bounded-json.js +65 -0
  55. package/dist/src/core/runtime/github.js +30 -16
  56. package/dist/src/core/runtime/mcp-recipes.js +1 -1
  57. package/dist/src/core/workspace/active-policy.js +1 -1
  58. package/docs/DEMO_SCRIPT.md +19 -23
  59. package/docs/DISCOVERED.md +251 -251
  60. package/docs/FEATURE_TEST_MATRIX.md +3 -3
  61. package/docs/LIVE_COLLABORATION.md +234 -0
  62. package/docs/REFERENCE.md +163 -0
  63. package/docs/RELEASE_REVIEW.md +1 -1
  64. package/docs/TESTING.md +17 -1
  65. package/docs/USER_TEST_GUIDE.md +138 -3
  66. package/docs/assets/loadout-discover-activate.webp +0 -0
  67. package/docs/assets/loadout-handoff-coordinate.webp +0 -0
  68. package/docs/assets/loadout-social-preview.png +0 -0
  69. package/docs/decisions/001-coordination-jsonl-locking.md +35 -0
  70. package/docs/decisions/002-local-daemon-authentication.md +32 -0
  71. package/docs/decisions/003-bounded-agent-discussions.md +91 -0
  72. package/docs/specs/BOUNDED_AGENT_DISCUSSIONS.md +169 -0
  73. package/docs/superpowers/plans/2026-09-03-coordination-hardening.md +231 -0
  74. package/docs/superpowers/plans/2026-09-03-release-readiness.md +232 -0
  75. package/docs/superpowers/plans/2026-09-04-bounded-agent-discussions.md +121 -0
  76. package/package.json +13 -4
  77. package/skills/loadout-handoff/SKILL.md +238 -0
  78. package/dist/src/core/routing/policy.js +0 -147
  79. package/dist/src/core/routing/route.js +0 -411
  80. package/docs/assets/loadout-workflow.png +0 -0
  81. package/skills/loadout-router/SKILL.md +0 -85
  82. /package/dist/src/core/{routing → agents}/credentials.js +0 -0
@@ -108,11 +108,11 @@ the capability table names native, adapted, and unsupported surfaces honestly.
108
108
  Run the entire required gate with one command:
109
109
 
110
110
  ```bash
111
- npm run verify
111
+ npm run verify:full
112
112
  ```
113
113
 
114
- `npm run verify:full` is an alias for the same CLI release gate. The individual stages
115
- are listed below for focused reruns and diagnosis.
114
+ This is the release gate. It runs the normal verification path plus coverage.
115
+ The individual stages are listed below for focused reruns and diagnosis.
116
116
 
117
117
  | Command | Coverage | Expected result |
118
118
  | -------------------------- | ----------------------------------------------------------------------- | -------------------------------------------------- |
@@ -0,0 +1,234 @@
1
+ # Live Claude Code ↔ Codex coordination
2
+
3
+ Live coordination is beta in 0.9.0. The ordinary `loadout handoff` inbox is
4
+ the stable fallback: it is durable, understandable, and does not run either
5
+ provider automatically.
6
+
7
+ ## What “shared memory” means
8
+
9
+ Loadout shares structured project facts, not private conversations or model
10
+ context windows. Both agents can see the same tasks, file ownership, versioned
11
+ contracts, decisions, progress, blockers, verification results, and cursors.
12
+ Every accepted event is persisted before a watcher, dashboard, or provider
13
+ bridge sees it.
14
+
15
+ ```text
16
+ Claude Code CLI <----> provider bridge <----> Codex SDK
17
+ |
18
+ coordination protocol
19
+ .handoff/coordination.jsonl
20
+ / | \
21
+ CLI MCP HTTP/SSE
22
+ ```
23
+
24
+ The source of truth is an append-only project JSONL log protected by an
25
+ exclusive cross-process lock. There is no cloud service and no SQLite database.
26
+ Sequence numbers, acknowledgements, and snapshots make reconnects deterministic.
27
+
28
+ ## Three operating levels
29
+
30
+ 1. **Durable handoff (stable):** `loadout handoff` passes a bounded task and
31
+ context to the next agent session.
32
+ 2. **Shared coordination protocol (beta):** CLI or MCP tools publish and read
33
+ structured events. Agents see changes when they call `snapshot`/`subscribe`,
34
+ while the local daemon and dashboard can observe changes immediately.
35
+ 3. **Provider bridge (beta, opt-in):** a long-running local process resumes
36
+ provider sessions and submits relevant events as new follow-up turns.
37
+ 4. **Bounded design discussion (beta, opt-in):** Claude Code and Codex
38
+ alternate proposals and critiques on one question, then record a decision.
39
+
40
+ The bridge does not inject into an already-running turn. Delivery happens at a
41
+ safe turn boundary because that is what the supported Claude Code CLI and Codex
42
+ SDK interfaces provide.
43
+
44
+ ## Quick protocol test (no paid agent turn)
45
+
46
+ Run these commands in a disposable Git repository:
47
+
48
+ ```bash
49
+ loadout coord own claude-code src/api
50
+ loadout coord contract checkout-api --agent claude-code \
51
+ --body "POST /api/checkout -> 201 { id: string }"
52
+ loadout coord snapshot codex
53
+ loadout coord ack codex 1
54
+ loadout coord release claude-code src/api
55
+ loadout coord status
56
+ loadout coord replay
57
+ ```
58
+
59
+ The contract revision is allocated atomically when `--revision` is omitted.
60
+ Overlapping exclusive ownership is rejected. A future acknowledgement or stale
61
+ explicit contract revision is rejected as a conflict.
62
+
63
+ ## Connect the MCP server
64
+
65
+ `loadout serve` starts a protocol-only stdio MCP server in the current project.
66
+ It exposes `claim_task`, `release_ownership`, `publish_contract`,
67
+ `publish_update`, `subscribe`, `ack`, and `snapshot`. Contract revisions
68
+ auto-increment when omitted.
69
+
70
+ For Claude Code, add the server at project scope using its MCP command:
71
+
72
+ ```bash
73
+ claude mcp add --transport stdio --scope project loadout-coordination -- loadout serve
74
+ ```
75
+
76
+ For Codex, add this table to `~/.codex/config.toml` (or use the equivalent
77
+ Codex MCP configuration UI):
78
+
79
+ ```toml
80
+ [mcp_servers."loadout-coordination"]
81
+ command = "loadout"
82
+ args = ["serve"]
83
+ ```
84
+
85
+ Restart the host after changing its MCP configuration. The server inherits the
86
+ host process working directory, so confirm the agent opened the intended
87
+ project before publishing coordination state.
88
+
89
+ ## Run the provider bridge
90
+
91
+ First check what is available:
92
+
93
+ ```bash
94
+ loadout coord agents detect
95
+ ```
96
+
97
+ You can start sessions through Loadout (this runs paid provider turns):
98
+
99
+ ```bash
100
+ loadout coord agents start claude-code "Own the backend and publish endpoint contracts"
101
+ loadout coord agents start codex "Own the frontend and consume backend contracts"
102
+ ```
103
+
104
+ Copy the returned IDs, then keep both attached:
105
+
106
+ ```bash
107
+ loadout coord agents bridge \
108
+ claude-code:<session-id> \
109
+ codex:<thread-id>
110
+ ```
111
+
112
+ You can instead track an existing known host session without running a provider
113
+ turn with `loadout coord agents attach provider:session-id`. The provider validates
114
+ the ID when a later `send` or `bridge` operation submits a turn. `loadout coord
115
+ agents list` shows project-tracked sessions, and `loadout coord agents send`
116
+ performs one explicit follow-up turn.
117
+
118
+ Bridge safeguards:
119
+
120
+ - only one bridge process can own a project at a time;
121
+ - events route to different providers concurrently;
122
+ - update and acknowledgement events are passive by default and do not spend a
123
+ provider turn;
124
+ - contract, task, decision, done, ownership, and error events are delivered at
125
+ the next safe boundary;
126
+ - automatic delivery stops after 20 turns per session unless
127
+ `--max-turns <n>` changes the cap;
128
+ - provider responses are printed but never saved in `.handoff`;
129
+ - injected event text is labeled untrusted project data and must not authorize
130
+ commands, scope expansion, publishing, or destructive actions;
131
+ - the project kill switch blocks CLI, MCP, daemon, compaction, and provider
132
+ turns.
133
+
134
+ Use `loadout daemon kill "reason"` to stop coordination and
135
+ `loadout daemon resume` to re-enable it.
136
+
137
+ ## Let Claude Code and Codex debate one feature
138
+
139
+ Use a design room when both agents should compare approaches before either one
140
+ claims files or writes code:
141
+
142
+ ```bash
143
+ loadout coord discuss start "REST or GraphQL for checkout?" \
144
+ --agents claude-code,codex \
145
+ --rounds 2 \
146
+ --max-turns 5 \
147
+ --timeout 120
148
+ ```
149
+
150
+ `--agents` starts fresh sessions lazily. To continue existing conversations,
151
+ replace it with explicit IDs:
152
+
153
+ ```bash
154
+ loadout coord discuss start "REST or GraphQL for checkout?" \
155
+ --sessions claude-code:<session-id> codex:<thread-id> \
156
+ --rounds 2 --max-turns 5
157
+ ```
158
+
159
+ The first participant is the proposer; use `--proposer codex` to swap roles.
160
+ One round means one proposer turn and one reviewer turn. Synthesis costs one
161
+ additional turn, so the exact required count is `rounds * 2 + 1`. Loadout
162
+ rejects an insufficient budget, invalid provider set, invalid timeout, or mixed
163
+ fresh/existing mode before it starts a paid turn.
164
+
165
+ Every prompt says that the response is public, will be persisted, and must not
166
+ edit files, run commands, use tools, or reveal private reasoning. Every public
167
+ statement has a thread ID and reply ID. The final synthesis records the selected
168
+ decision, rationale, credible alternatives, and unresolved disagreement. Review
169
+ it later without spending quota:
170
+
171
+ ```bash
172
+ loadout coord discuss list
173
+ loadout coord discuss show <thread-id>
174
+ loadout coord replay
175
+ ```
176
+
177
+ The discussion holds the same singleton lease as the provider bridge, checks
178
+ the kill switch before every provider turn, never retries a rejected or invalid
179
+ response silently, and defaults to a 120-second per-turn timeout. It does not
180
+ begin implementation automatically.
181
+
182
+ ## Optional daemon and dashboard
183
+
184
+ ```bash
185
+ loadout daemon start
186
+ ```
187
+
188
+ The daemon binds only to `127.0.0.1`. It prints an authenticated dashboard URL
189
+ whose token is carried in the URL fragment, moved immediately into browser
190
+ session storage, and removed from visible history. REST and SSE accept bearer
191
+ headers only; query-string tokens, non-loopback Host headers, and cross-origin
192
+ browser requests are rejected. The token and session state are project-local
193
+ files with mode `0600`.
194
+
195
+ The dashboard is observability, not an agent injector. Use the MCP tools or the
196
+ provider bridge for agent-to-agent delivery.
197
+
198
+ ## Safety and data model
199
+
200
+ - Event schemas cap names, descriptions, context, payloads, arrays, and paths.
201
+ - Secret-like keys and values are redacted at the canonical write boundary, so
202
+ CLI, MCP, and HTTP writes follow the same rule.
203
+ - Ownership claims use normalized project-relative paths and detect directory /
204
+ child overlap.
205
+ - Contract revisions and event sequences are allocated while holding the same
206
+ project lock.
207
+ - Compaction first writes a complete archival copy and aborts if archival fails.
208
+ - Corrupt JSONL lines are reported rather than hiding valid neighboring events.
209
+ - `.handoff/coordination.jsonl` is project data. Do not commit it when its facts
210
+ are private; add the appropriate `.handoff` paths to `.gitignore`.
211
+
212
+ ## Honest limitations
213
+
214
+ - This is durable shared state plus follow-up turns, not one simultaneous model
215
+ context or provider-to-provider hidden channel.
216
+ - Claude Code and Codex authentication, quotas, billing, and host session IDs
217
+ remain provider concerns.
218
+ - The bridge cannot steer a turn already in progress.
219
+ - The design-room kill switch cannot cancel a provider call already in flight;
220
+ it prevents persistence and the next provider turn.
221
+ - A provider may fail, time out, reject a resume ID, or return output Loadout
222
+ cannot parse. The event stays durable and can still be consumed manually.
223
+ - The bridge is local to one machine and one repository. Remote teams need a
224
+ separately designed authenticated transport; this release intentionally does
225
+ not expose the daemon to a network.
226
+
227
+ ## Evidence
228
+
229
+ The coordination test suite covers concurrent writers, ownership conflicts,
230
+ revision allocation, malformed logs, redaction, authenticated HTTP/SSE, MCP
231
+ stdio framing, retention failure safety, kill-switch behavior, provider CLI/SDK
232
+ shapes, session replay, concurrent provider delivery, passive policy, and the
233
+ automatic-turn cap. The package smoke test verifies the compiled MCP artifact is
234
+ included in the npm tarball.
@@ -0,0 +1,163 @@
1
+ # Loadout Reference
2
+
3
+ Detailed configuration, profiles, integrations, and discovery documentation.
4
+ For the quick start, see the [README](../README.md).
5
+
6
+ ## Profiles
7
+
8
+ Loadout is opinionated when you want it to be and precise when you do not. The
9
+ modes differ in one thing: how much of the reviewed catalog they install.
10
+
11
+ | Mode | Sources | Skills | Active by default |
12
+ | --------- | --------------------- | ------ | -------------------------------- |
13
+ | `stable` | 4 | 30 | yes — recommended starting point |
14
+ | `power` | 8 | 56 | yes |
15
+ | `maximum` | all reviewed | all | **no — downloaded but disabled** |
16
+ | `custom` | your `--package` list | varies | yes |
17
+
18
+ **Maximum is the one worth understanding.** It downloads the entire reviewed
19
+ library and leaves every skill _disabled_. Nothing reaches an agent prompt until
20
+ a project activates what it needs:
21
+
22
+ ```bash
23
+ loadout setup --mode maximum --yes
24
+ cd ~/code/my-app
25
+ loadout optimize --project . # scans the repo, proposes an active set
26
+ loadout activate # enable just those here
27
+ ```
28
+
29
+ That trade is deliberate: disk is cheap and context is not. A large disabled
30
+ library plus a small active set beats installing everything into every prompt.
31
+
32
+ ### Stable: the essentials
33
+
34
+ Stable is the recommended daily driver: **30 selected skill directories from four
35
+ pinned public sources**, installed into each agent you choose.
36
+
37
+ | Included source | What Stable takes from it | GitHub |
38
+ | ---------------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
39
+ | [Superpowers](https://github.com/obra/superpowers) | Planning, execution, testing, review, verification | [![GitHub stars](https://img.shields.io/github/stars/obra/superpowers?style=flat&label=stars)](https://github.com/obra/superpowers) |
40
+ | [Context7](https://github.com/upstash/context7) | Current documentation and MCP workflows | [![GitHub stars](https://img.shields.io/github/stars/upstash/context7?style=flat&label=stars)](https://github.com/upstash/context7) |
41
+ | [Addy Osmani Agent Skills](https://github.com/addyosmani/agent-skills) | Engineering, frontend, debugging, performance, docs, shipping | [![GitHub stars](https://img.shields.io/github/stars/addyosmani/agent-skills?style=flat&label=stars)](https://github.com/addyosmani/agent-skills) |
42
+ | [Agent Skills Marketplace](https://github.com/wshobson/agents) | Architecture, review, error handling, JavaScript, Python | [![GitHub stars](https://img.shields.io/github/stars/wshobson/agents?style=flat&label=stars)](https://github.com/wshobson/agents) |
43
+
44
+ ```bash
45
+ loadout setup --mode stable
46
+ loadout setup --mode stable --yes
47
+ ```
48
+
49
+ ### Power: a larger cross-project toolkit
50
+
51
+ Power draws a skill-level allowlist from eight major collections.
52
+
53
+ | Included source | Focus | GitHub |
54
+ | ------------------------------------------------------------------------ | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
55
+ | [Anthropic Skills](https://github.com/anthropics/skills) | Documents, frontend, MCP building, web testing | [![GitHub stars](https://img.shields.io/github/stars/anthropics/skills?style=flat&label=stars)](https://github.com/anthropics/skills) |
56
+ | [OpenAI Skills](https://github.com/openai/skills) | CLI, docs, browser work, images, security | [![GitHub stars](https://img.shields.io/github/stars/openai/skills?style=flat&label=stars)](https://github.com/openai/skills) |
57
+ | [Vercel Agent Skills](https://github.com/vercel-labs/agent-skills) | React, web design, composition, deployment | [![GitHub stars](https://img.shields.io/github/stars/vercel-labs/agent-skills?style=flat&label=stars)](https://github.com/vercel-labs/agent-skills) |
58
+ | [Superpowers](https://github.com/obra/superpowers) | Planning, debugging, testing, collaboration | [![GitHub stars](https://img.shields.io/github/stars/obra/superpowers?style=flat&label=stars)](https://github.com/obra/superpowers) |
59
+ | [UI UX Pro Max](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill) | UI systems, slides, styling, product design | [![GitHub stars](https://img.shields.io/github/stars/nextlevelbuilder/ui-ux-pro-max-skill?style=flat&label=stars)](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill) |
60
+ | [Context7](https://github.com/upstash/context7) | Current documentation and MCP workflows | [![GitHub stars](https://img.shields.io/github/stars/upstash/context7?style=flat&label=stars)](https://github.com/upstash/context7) |
61
+ | [Agent Skills Marketplace](https://github.com/wshobson/agents) | Architecture, testing, APIs, TypeScript, Python | [![GitHub stars](https://img.shields.io/github/stars/wshobson/agents?style=flat&label=stars)](https://github.com/wshobson/agents) |
62
+ | [Awesome Copilot](https://github.com/github/awesome-copilot) | Codebase knowledge, plans, browser and security workflows | [![GitHub stars](https://img.shields.io/github/stars/github/awesome-copilot?style=flat&label=stars)](https://github.com/github/awesome-copilot) |
63
+
64
+ ```bash
65
+ loadout setup --mode power
66
+ ```
67
+
68
+ ### Maximum: download broadly, activate intelligently
69
+
70
+ Downloads every non-archived, technically screened skill component into
71
+ Loadout's **disabled local library**. Then let the current project choose:
72
+
73
+ ```bash
74
+ loadout setup --mode maximum
75
+ loadout recommend --project .
76
+ loadout optimize --project . --limit 30
77
+ loadout optimize --project . --limit 30 --yes
78
+ ```
79
+
80
+ ### Custom: take exact control
81
+
82
+ ```bash
83
+ # Replace the managed profile
84
+ loadout setup --mode custom --package superpowers --package context7
85
+
86
+ # Add without replacing
87
+ loadout install --mode custom --package humanizer
88
+ loadout install --mode custom --package obsidian-skills --agents claude-code,cursor
89
+ ```
90
+
91
+ Run `loadout profiles` to compare every mode.
92
+
93
+ ## MCP integrations
94
+
95
+ Profiles never start MCP servers silently.
96
+
97
+ ```bash
98
+ loadout mcp-recipe # list recipes
99
+ loadout mcp-recipe --credential-free # no-credential subset
100
+ loadout mcp-recipe playwright --agent claude-code # preview
101
+ loadout mcp-recipe playwright --agent claude-code --yes # configure
102
+ loadout mcp-recipe playwright --agent claude-code --verify # test
103
+ ```
104
+
105
+ Configuration alone does not start the server. Test a real connection separately
106
+ with `--connect --approve-risk`. Loadout can reference credentials from environment
107
+ variables or the OS keychain without printing their values.
108
+
109
+ ## Optional runtime tools
110
+
111
+ [Graphify](https://github.com/Graphify-Labs/graphify) is an optional codebase graph
112
+ tool. It does not require an LLM API key:
113
+
114
+ ```bash
115
+ loadout tool graphify
116
+ loadout tool graphify --yes --approve-risk
117
+ loadout tool graphify --remove --yes --approve-risk
118
+ ```
119
+
120
+ Executable tools remain an explicit choice instead of hiding inside a profile.
121
+
122
+ ## Catalog and discovery
123
+
124
+ The catalog is not a frozen list. Loadout separates **discovery** from
125
+ **installation** so a viral repo can be noticed quickly without being trusted
126
+ blindly.
127
+
128
+ ```bash
129
+ loadout discover --source all --queue # find candidates
130
+ loadout review-queue # inspect the queue
131
+ loadout candidate inspect owner/repository # deep inspection
132
+ loadout update # check for source changes
133
+ loadout health --updates # managed source health
134
+ ```
135
+
136
+ Daily checks are opt-in and read-only:
137
+
138
+ ```bash
139
+ loadout autopilot --yes
140
+ loadout autopilot --status
141
+ ```
142
+
143
+ ## Manage skills you already have
144
+
145
+ ```bash
146
+ loadout scan # read-only inventory
147
+ loadout reconcile --refresh # compare with catalog
148
+ loadout reconcile --yes # record ownership for exact matches
149
+ loadout reconcile --replace-outdated # preview replacing old copies
150
+ ```
151
+
152
+ Unknown or ambiguous copies stay untouched.
153
+
154
+ ## Agent support
155
+
156
+ Loadout's adapter capability matrix covers **12 agents**: Claude Code, Cline,
157
+ Codex, Cursor, Gemini CLI, GitHub Copilot, Hermes, Junie, Kiro CLI, OpenCode,
158
+ Roo Code, Windsurf.
159
+
160
+ See the [complete feature matrix](./FEATURE_TEST_MATRIX.md) for configured
161
+ paths, filesystem lifecycle, platform, and native-host evidence.
162
+
163
+ Use `loadout doctor --verbose` for the local component matrix.
@@ -22,6 +22,6 @@ For current behavior and evidence, use:
22
22
  [sanitized July 19 live checks](./evidence/live-checks-2026-07-19.json) only when
23
23
  investigating that historical release line.
24
24
 
25
- The current release gate is `npm run verify`. Publication status must be checked
25
+ The current release gate is `npm run verify:full`. Publication status must be checked
26
26
  against the npm registry and the corresponding GitHub release rather than inferred
27
27
  from this archived document.
package/docs/TESTING.md CHANGED
@@ -68,7 +68,23 @@ checks the current pinned Stable sources and remains network-dependent.
68
68
 
69
69
  Run `npm run verify` for formatting, lint, types, deterministic evidence checks, all
70
70
  Vitest suites, both CLI journeys, package smoke, and the performance gate.
71
- `npm run verify:full` is retained as an alias for the same complete CLI gate.
71
+ Run `npm run verify:full` before a release; it runs that gate and then enforces
72
+ the global and security-sensitive per-file coverage floors.
73
+
74
+ The coordination suites exercise the protocol separately from paid providers:
75
+
76
+ ```bash
77
+ npx vitest run 'tests/coordination*.test.ts'
78
+ npm run test:package
79
+ ```
80
+
81
+ They cover cross-process ordering, ownership/revision conflicts, redaction,
82
+ retention and recovery, daemon authentication, MCP framing, provider command/SDK
83
+ shapes, automatic watcher delivery, passive interrupt policy, singleton bridge
84
+ ownership, bounded two-agent discussion turns and reply chains, leases, and
85
+ runaway-turn limits. Fake provider drivers are used for deterministic
86
+ tests; the suite does not spend Claude or Codex quota. Follow the disposable
87
+ manual flow in `docs/USER_TEST_GUIDE.md` for an intentional real-host test.
72
88
 
73
89
  Current npm publication, the current pinned Stable repositories, and GitHub repository
74
90
  settings are external state. Check them separately with:
@@ -192,7 +192,142 @@ GitHub token; use `loadout mcp-recipe --credential-free` to exclude every servic
192
192
  credential too. Browser configuration and real connection testing remain explicit.
193
193
  Graphify is a separate runtime tool, not an MCP server.
194
194
 
195
- ## 8. Preview complete cleanup
195
+ ## 8. Test handoff and live coordination in a disposable repository
196
+
197
+ Create a temporary Git repository so the test does not add handoff files to a
198
+ real project:
199
+
200
+ ```bash
201
+ mkdir loadout-coordination-test
202
+ cd loadout-coordination-test
203
+ git init
204
+ ```
205
+
206
+ First test the stable session-boundary inbox:
207
+
208
+ ```bash
209
+ loadout handoff codex "Implement the frontend" --context "Claude owns src/api; consume checkout-api"
210
+ loadout handoff codex
211
+ loadout handoff
212
+ ```
213
+
214
+ Copy the task ID printed by the inbox, then settle it:
215
+
216
+ ```bash
217
+ loadout handoff --done <task-id>
218
+ loadout handoff codex
219
+ ```
220
+
221
+ Next test structured coordination without running either model:
222
+
223
+ ```bash
224
+ loadout coord own claude-code src/api
225
+ loadout coord own codex src/web
226
+ loadout coord contract checkout-api --agent claude-code \
227
+ --body "POST /api/checkout -> 201 { id: string }"
228
+ loadout coord snapshot codex
229
+ loadout coord ack codex 2
230
+ loadout coord status
231
+ loadout coord replay
232
+ ```
233
+
234
+ Sequence numbers are printed by each command; use the actual latest relevant
235
+ sequence if it differs from `2`. Confirm that the first overlapping exclusive
236
+ claim is refused, then release the original path and confirm the retry succeeds:
237
+
238
+ ```bash
239
+ loadout coord own codex src/api/checkout.ts
240
+ loadout coord release claude-code src/api
241
+ loadout coord own codex src/api/checkout.ts
242
+ ```
243
+
244
+ Test the authenticated live dashboard in one terminal:
245
+
246
+ ```bash
247
+ loadout daemon start
248
+ ```
249
+
250
+ Open the exact dashboard URL it prints. In a second terminal, run another
251
+ `loadout coord update` and confirm it appears. A bare `/api/status` request
252
+ without the bearer token should return `401`. Press Ctrl+C in the daemon
253
+ terminal when finished.
254
+
255
+ Test the packaged MCP transport without changing either agent's configuration:
256
+
257
+ ```bash
258
+ loadout serve
259
+ ```
260
+
261
+ The process waits for MCP JSON-RPC on stdin and should print no banners or prose
262
+ to stdout. Press Ctrl+C. Host-specific configuration and the exact tool list are
263
+ in [the live coordination guide](./LIVE_COLLABORATION.md).
264
+
265
+ Finally, inspect the provider bridge surface:
266
+
267
+ ```bash
268
+ loadout coord agents detect
269
+ loadout coord agents list
270
+ loadout coord agents bridge --help
271
+ ```
272
+
273
+ The next commands run real provider turns and may consume Claude/Codex quota.
274
+ Only run them when you intentionally want that test:
275
+
276
+ ```bash
277
+ loadout coord agents start claude-code "Claim backend files and publish a test contract"
278
+ loadout coord agents start codex "Read the shared snapshot and acknowledge the contract"
279
+ loadout coord agents bridge claude-code:<session-id> codex:<thread-id> --max-turns 4
280
+ ```
281
+
282
+ While the bridge runs, publish a new contract from another terminal. Confirm
283
+ both provider sessions can proceed concurrently and that the bridge prints
284
+ their responses. Progress-only `update` events remain passive by default. Use
285
+ Ctrl+C to stop the bridge. Activate `loadout daemon kill "user test"` to verify
286
+ that new coordination writes and provider turns stop, then run
287
+ `loadout daemon resume`.
288
+
289
+ Now test an actual back-and-forth design discussion. This spends exactly three
290
+ provider turns: one Claude proposal, one Codex critique, and one Claude
291
+ synthesis. Neither agent should edit the disposable repository.
292
+
293
+ ```bash
294
+ loadout coord discuss start "Should this test service expose REST or GraphQL?" \
295
+ --agents claude-code,codex \
296
+ --rounds 1 \
297
+ --max-turns 3 \
298
+ --timeout 120
299
+ ```
300
+
301
+ Confirm all of the following before publishing:
302
+
303
+ 1. stderr announces exactly three paid provider turns before either provider
304
+ runs;
305
+ 2. Claude Code proposes a design and Codex directly critiques that proposal;
306
+ 3. Claude's synthesis names a decision, rationale, alternatives, and any
307
+ unresolved disagreement;
308
+ 4. `loadout coord discuss list` reports the thread as `closed`;
309
+ 5. `loadout coord discuss show <thread-id>` shows the linked public transcript;
310
+ 6. `loadout coord replay` includes the discussion and the resulting decision;
311
+ 7. `git status --short` shows that neither agent edited a project file.
312
+
313
+ Repeat with known real session IDs to validate resumption:
314
+
315
+ ```bash
316
+ loadout coord discuss start "What validation boundary should this service use?" \
317
+ --sessions claude-code:<session-id> codex:<thread-id> \
318
+ --rounds 1 --max-turns 3
319
+ ```
320
+
321
+ For the kill-switch check, start a two-round discussion in one terminal and run
322
+ `loadout daemon kill "stop design room"` in another while the first provider
323
+ turn is active. The in-flight provider may finish, but its response must not be
324
+ persisted and Codex must not receive the next turn. Run `loadout daemon resume`
325
+ after confirming the halt.
326
+
327
+ Delete the disposable repository after inspection. Its `.handoff` directory
328
+ contains the local task/event audit trail, token, and session IDs.
329
+
330
+ ## 9. Preview complete cleanup
196
331
 
197
332
  ```bash
198
333
  loadout uninstall
@@ -211,7 +346,7 @@ cleanup deliberately deletes Loadout's snapshots, so it is the last lifecycle te
211
346
  ## Troubleshooting and recovery
212
347
 
213
348
  - **`loadout` is not found after installation:** confirm `npm install --global
214
- loadout-ai@0.5.9` completed, run `hash -r`, and confirm npm's global binary
349
+ loadout-ai@0.9.0` completed, run `hash -r`, and confirm npm's global binary
215
350
  directory is on `PATH`. For a source checkout, run `npm run build` and `npm link`.
216
351
  - **A preview asks for `--approve-risk`:** read the reported scripts, domains,
217
352
  credentials, binaries, or instruction findings. If you accept that specific plan,
@@ -238,7 +373,7 @@ loadout-ai@0.5.9` completed, run `hash -r`, and confirm npm's global binary
238
373
  Unmanaged content is preserved, and modified managed files can make cleanup refuse
239
374
  until you explicitly review the command's force path.
240
375
 
241
- ## 9. Advanced surface
376
+ ## 10. Advanced surface
242
377
 
243
378
  The first help screen deliberately focuses on daily use. Existing advanced
244
379
  commands have not been removed:
@@ -0,0 +1,35 @@
1
+ # ADR 001: JSONL plus a project lock for coordination state
2
+
3
+ - Status: accepted
4
+ - Date: 2026-09-03
5
+
6
+ ## Context
7
+
8
+ Loadout coordinates a small number of local coding-agent processes in one
9
+ repository. Events need durable ordering, human inspectability, recovery after
10
+ partial writes, and parity across CLI, MCP, HTTP, and provider adapters. A
11
+ database would add installation, migration, backup, and corruption-recovery
12
+ surface before the expected workload requires indexed storage.
13
+
14
+ ## Decision
15
+
16
+ Use `.handoff/coordination.jsonl` as the source of truth. Serialize every
17
+ mutation with `.handoff/coordination.lock`, created exclusively with owner-only
18
+ permissions. Allocate event sequences and contract revisions while holding that
19
+ lock. Derive current ownership, contracts, acknowledgements, and snapshots from
20
+ validated events.
21
+
22
+ Compaction holds the same lock, writes a complete owner-only archive first,
23
+ then atomically replaces the working log with a valid summary and retained
24
+ events. Missing files mean empty state; other I/O errors propagate. Invalid
25
+ lines are reported without hiding valid neighbors.
26
+
27
+ ## Consequences
28
+
29
+ - The audit trail is readable and easy to back up or remove.
30
+ - Independent local processes cannot allocate duplicate sequences or accept
31
+ conflicting ownership claims concurrently.
32
+ - Reads are linear in the active log, so retention must keep it bounded.
33
+ - This design is for local repository coordination, not a remote multi-user
34
+ service. A future remote transport would require a separate trust and storage
35
+ decision rather than exposing this daemon to a network.