@bradheitmann/odin-sentinel 0.4.5 → 0.4.7

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 (57) hide show
  1. package/AGENTS.md +64 -0
  2. package/CLAUDE.md +43 -0
  3. package/README.md +113 -302
  4. package/dist/src/mcp/server.js +43 -12
  5. package/dist/src/mcp/server.js.map +1 -1
  6. package/dist/src/protocol/schemas.d.ts +2529 -4
  7. package/dist/src/protocol/schemas.js +214 -18
  8. package/dist/src/protocol/schemas.js.map +1 -1
  9. package/dist/src/protocol/service.d.ts +96 -2
  10. package/dist/src/protocol/service.js +516 -4
  11. package/dist/src/protocol/service.js.map +1 -1
  12. package/dist/src/protocol/surface-layout.d.ts +40 -1
  13. package/dist/src/protocol/surface-layout.js +98 -1
  14. package/dist/src/protocol/surface-layout.js.map +1 -1
  15. package/dist/src/protocol/validators.d.ts +3 -0
  16. package/dist/src/protocol/validators.js +28 -0
  17. package/dist/src/protocol/validators.js.map +1 -1
  18. package/dist/src/protocol/version.d.ts +3 -0
  19. package/dist/src/protocol/version.js +3 -0
  20. package/dist/src/protocol/version.js.map +1 -1
  21. package/dist/src/telemetry/config.d.ts +8 -0
  22. package/dist/src/telemetry/config.js +24 -0
  23. package/dist/src/telemetry/config.js.map +1 -1
  24. package/dist/src/telemetry/index.d.ts +5 -5
  25. package/dist/src/telemetry/index.js +3 -3
  26. package/dist/src/telemetry/index.js.map +1 -1
  27. package/dist/src/telemetry/redactor.js +25 -7
  28. package/dist/src/telemetry/redactor.js.map +1 -1
  29. package/dist/src/telemetry/report.d.ts +108 -0
  30. package/dist/src/telemetry/report.js +83 -3
  31. package/dist/src/telemetry/report.js.map +1 -1
  32. package/dist/src/telemetry/submit.d.ts +2 -0
  33. package/dist/src/telemetry/submit.js +79 -6
  34. package/dist/src/telemetry/submit.js.map +1 -1
  35. package/docs/guides/quick-start.md +112 -44
  36. package/docs/guides/quickstart-prompts.md +46 -113
  37. package/docs/guides/recommended-starter-team.md +45 -27
  38. package/docs/reference/client-compatibility.md +20 -43
  39. package/docs/reference/cost-and-privacy.md +26 -23
  40. package/docs/reference/distribution.md +40 -55
  41. package/docs/reference/public-surface-audit.md +35 -114
  42. package/package.json +22 -6
  43. package/protocol/SCP.md +8 -1
  44. package/protocol/bootstrap-skill.md +16 -11
  45. package/protocol/closeout.yaml +7 -1
  46. package/protocol/delegation.yaml +1 -1
  47. package/protocol/model-profiles.yaml +55 -1
  48. package/protocol/receipts/boot-receipt.yaml +42 -0
  49. package/protocol/receipts/team-manifest.yaml +41 -0
  50. package/protocol/roles.yaml +69 -1
  51. package/protocol/topology.yaml +78 -36
  52. package/scripts/audit/public-surface.mjs +47 -19
  53. package/scripts/audit/verify-pack.mjs +293 -27
  54. package/templates/dev-slice-template.md +56 -0
  55. package/templates/pm-role-template.md +61 -0
  56. package/templates/qa-slice-template.md +46 -0
  57. package/templates/team-manifest-template.yaml +163 -0
@@ -1,132 +1,65 @@
1
1
  # ODIN Sentinel Quickstart Prompts
2
2
 
3
- Two prompts that take a fresh machine from *"agents installed"* to *"team running under the Sentinel Coordination Protocol."* Paste each one into a capable coding agent (Claude Code or Codex) at the indicated moment. The agents do the rest.
3
+ These prompts are starter material for a fresh machine and a fresh CMUX session.
4
+ Adjust harnesses and models to what you actually have installed.
4
5
 
5
- The prompts are opinionated. They assume you want a working team in the smallest number of steps, not a customized one. Swap rosters or hosts at the end if you have different agents available.
6
+ ## Prompt 1 - Setup
6
7
 
7
- ---
8
+ Paste into a capable coding agent on the target machine.
8
9
 
9
- ## Prompt 1 — Setup
10
+ ```text
11
+ Set up @bradheitmann/odin-sentinel for this machine.
10
12
 
11
- **When to use:** once per machine. Paste into Claude Code or Codex on the target machine. The agent will detect what's missing, install only what's needed (Homebrew, git, Node.js, pnpm, CMUX, and the `@bradheitmann/odin-sentinel` MCP server), and wire the server into every agent host you actually have installed.
13
+ Rules:
14
+ - Detect first; install only missing prerequisites.
15
+ - Required runtime: Node.js >=22.13.0.
16
+ - Install or use @bradheitmann/odin-sentinel@latest.
17
+ - Configure only MCP hosts that already exist on this machine.
18
+ - Do not ask me to paste API keys, tokens, or OAuth values.
19
+ - Verify provider/auth status without printing secret values.
20
+ - If local inference is used, smoke-test actual visible content within timeout, not endpoint reachability alone.
21
+ - Install or prepare SCP native skill context where supported; otherwise prepare the full prompt fallback from odin.get_bootstrap_skill.
22
+ - Print configured hosts, skipped hosts, package version, and warnings.
12
23
 
13
- ```
14
- Set up the @bradheitmann/odin-sentinel MCP server on this machine. Detect what's missing, install only what's needed, configure only the agent hosts that exist on this machine.
15
-
16
- # Plan
17
- Make a 5-task plan and execute in order:
18
- 1. Prereqs (Homebrew, git, node, pnpm, cmux — install only if missing)
19
- 2. Install MCP server with explicit @latest tag
20
- 3. Smoke test the server
21
- 4. Detect installed agent hosts and wire each one
22
- 5. Print final report
23
-
24
- # Rules
25
- - Detect first, install only if missing: `command -v <tool>` for CLIs; `test -e <path>` for config dirs.
26
- - After installing pnpm fresh, run `pnpm setup && source ~/.zshrc` once.
27
- - Ignore pnpm warnings of the form "Failed to create bin … @pnpm/exe" — benign Homebrew vs pnpm self-install conflict.
28
- - Always install with `pnpm add -g @bradheitmann/odin-sentinel@latest` — the bare name can return a stale version from registry cache.
29
- - The MCP server has no `--version` flag. To verify, send a JSON-RPC initialize on stdin and parse the response.
30
- - For every JSON / TOML / YAML config file: read, merge the odin-sentinel entry, write back. Never overwrite a whole file. Preserve comments in JSONC. Create the file if missing.
31
- - Do not install agent CLIs the user doesn't have.
32
- - Do not enable telemetry, deploy Cloudflare resources, or edit anything outside the host config files listed below plus one optional line in ~/.zshrc.
33
-
34
- # Smoke test (use this exact form)
24
+ Smoke test:
35
25
  printf '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"probe","version":"0"}}}\n' | odin-sentinel-mcp
36
26
 
37
- Expect `"serverInfo":{"name":"odin-sentinel","version":"<X.Y.Z>"}`. If absent, stop and report.
38
-
39
- # Hosts to detect and configure
40
- For each: detect → if installed, merge the entry into the listed config file (idempotent). Every entry uses `command = "odin-sentinel-mcp"` with no args.
41
-
42
- - Claude Code: `command -v claude` → `claude mcp add odin-sentinel -- odin-sentinel-mcp`
43
- - Codex: `command -v codex` → `~/.codex/config.toml` [mcp_servers.odin-sentinel] command = "odin-sentinel-mcp"
44
- - Cursor: `command -v cursor-agent` → `~/.cursor/mcp.json` mcpServers.odin-sentinel = { command: "odin-sentinel-mcp" }
45
- - Factory Droid: `command -v droid` → `~/.factory/mcp.json` mcpServers.odin-sentinel = { type: "stdio", command: "odin-sentinel-mcp", disabled: false }
46
- - Kilo Code: `command -v kilocode` → `~/.kilocode/mcp.json` (same shape as Cursor)
47
- - Pi: `command -v pi` → `~/.pi/mcp.json` (same shape as Cursor)
48
- - OpenCode: `command -v opencode` → `~/.config/opencode/opencode.json` mcp.odin-sentinel = { type: "local", command: ["odin-sentinel-mcp"], enabled: true }
49
- - Crush: `command -v crush` → `~/.config/crush/crush.json` mcp.odin-sentinel = { type: "stdio", command: "odin-sentinel-mcp" }
50
- - Goose: `command -v goose` → `~/.config/goose/config.yaml` extensions.odin-sentinel = { type: stdio, cmd: odin-sentinel-mcp, enabled: true }
51
- - OpenHands: `command -v openhands` → `~/.openhands/config.toml` [mcp.stdio_servers.odin-sentinel] name = "odin-sentinel", command = "odin-sentinel-mcp"
52
- - Zed: `test -e ~/.config/zed` → `~/.config/zed/settings.json` context_servers.odin-sentinel = { source: "custom", command: "odin-sentinel-mcp", enabled: true }
53
- - VS Code: `command -v code` → `~/Library/Application Support/Code/User/mcp.json` servers.odin-sentinel = { type: "stdio", command: "odin-sentinel-mcp" }
54
-
55
- # Final report
56
- Print:
57
- - installed odin-sentinel version
58
- - which hosts were configured
59
- - which hosts were skipped (one line each, with reason "not installed")
60
- - any non-fatal warnings
61
-
62
- Then print these three lines and stop:
63
-
64
- Setup complete.
65
- Restart any agent host you configured (their MCP config is cached at startup).
66
- To boot a team: open CMUX, launch your Executive PM agent in the first surface, paste your team-roster prompt.
27
+ Expected version: 0.4.7.
67
28
  ```
68
29
 
69
- After it finishes, **restart any agent host it touched** — each one caches MCP server configs at startup. Skipping the restart is the most common reason "the MCP server isn't showing up" after a clean install.
70
-
71
- ---
72
-
73
- ## Prompt 2 — Team Bootstrap
30
+ Restart any host whose MCP config changed.
74
31
 
75
- **When to use:** every time you spin up a new project. Open CMUX, launch Codex in the first surface, paste this. Codex acts as `A/EXEC-PM`, reads the Sentinel Coordination Protocol from the bundled skill, and stages a two-team layout (executive office + one development pod). The roster below is opinionated — substitute models or hosts you actually have.
32
+ ## Prompt 2 - Governed Team Bootstrap
76
33
 
77
- ```
78
- You are A/EXEC-PM. Bootstrap a 2-team Sentinel Coordination Protocol session in this CMUX workspace.
79
-
80
- # Procedure
81
- 1. Call odin.get_version. Confirm >= 0.4.4.
82
- 2. Call odin.get_bootstrap_skill. Read the full SCP contract. Follow it for the remainder of this session — particularly: you are the sole staffing authority, sole CMUX surface custodian, and you must complete the pre-staffing gate before every spawn.
83
- 3. Call odin.compute_surface_layout with teamCount=2. Confirm the canonical layout is [A] [B].
84
- 4. Call odin.compute_surface_layout_gate with fromTeamCount=1, toTeamCount=2. Execute the cmux operations it lists.
85
- 5. Stage the team per the roster below. For each surface: create it via cmux, confirm it exists and is empty, send the agent launch command, then send the occupant boot prompt requesting an SCP_BOOT_RECEIPT.
86
-
87
- # Roster (substitute hosts/models if you have different agents available)
88
-
89
- Team A — Executive Office (column 0, 5 surfaces stacked as tabs):
90
- | Slot | Agent host | Model |
91
- |---------------|---------------|-----------------|
92
- | A/EXEC-PM | Codex | (you) |
93
- | A/EXEC-ODIN | Codex | high-reasoning |
94
- | A/EXEC-ASST | Kilo Code | Composer-2 |
95
- | A/EXEC-RSCH | Cursor | Kimi-K-2.5 |
96
- | A/EXEC-QA | OpenCode | Kimi-K-2.5 |
97
-
98
- Team B — Development Pod (column 1, 5 surfaces stacked as tabs):
99
- | Slot | Agent host | Model |
100
- |---------------|---------------|-----------------|
101
- | B/TEAM-PM | Claude Code | Opus-4.7 |
102
- | B/ODIN | Codex | high-reasoning |
103
- | B/DEV-1 | Droid (Factory) | Kimi-K-2.6 |
104
- | B/QA-1 | Crush | GLM-5.1 |
105
- | B/SHADOW-1 | Claude Code | Haiku |
106
-
107
- # Constraints
108
- - You are the only role permitted to invoke cmux surface operations (new-split, new-surface, move-surface, close-surface).
109
- - No hidden subagents. Every agent must occupy a visible CMUX surface.
110
- - TEAM PMs do not staff their own pods. All staffing is yours.
111
- - A/EXEC-ODIN holds binding HALT authority over you. Honor HALT directives.
112
- - Context window soft threshold 70% / hard 90% per agent. Force handoff or lockdown on hard breach.
113
-
114
- # Closeout signal
115
- After all 10 surfaces are spawned, all 10 boot receipts received, and odin.validate_team_manifest passes, emit a single line:
116
-
117
- STAGED_AND_IDLE: 2 teams, 10 occupants, layout=[A] [B]
118
-
119
- Then wait for the user's first product directive. Do not begin work until dispatched.
120
- ```
34
+ Open CMUX first. Paste into the agent that will act as EXEC PM.
121
35
 
122
- When `STAGED_AND_IDLE` appears, the team is ready for your first directive.
36
+ ```text
37
+ You are A/EXEC-PM. Bootstrap a Sentinel Coordination Protocol governed team in this CMUX workspace.
123
38
 
124
- ---
39
+ Procedure:
40
+ 1. Call odin.get_version and confirm version 0.4.7 or newer.
41
+ 2. Call odin.get_bootstrap_skill and read the public SCP contract.
42
+ 3. Confirm CMUX is active and you are in the same workspace as the team slots.
43
+ 4. Compute the target layout with odin.compute_surface_layout using profile=human_cmux_quad.
44
+ 5. Use human-readable spatial/pod organization. Do not use tab-only layout as the canonical surface.
45
+ 6. Check each planned role for MCP readiness, skill or prompt fallback readiness, auth/account readiness, and local inference readiness if used.
46
+ 7. Do not launch occupants until readiness passes or you record a waiver/substitution.
47
+ 8. Ask each launched role for a boot receipt.
48
+ 9. Validate the team manifest before dispatching work.
125
49
 
126
- ## Scaling beyond 2 teams
50
+ Role policy:
51
+ - PM owns routing, activation, scope, acceptance criteria, waivers, and escalation.
52
+ - DEV implements only assigned write scope and cannot QA-accept its own work.
53
+ - QA starts fresh, verifies independently, and does not fix during QA.
54
+ - ODIN monitors actively by default and intervenes on health, scope, delivery, or drift.
55
+ - Agents without MCP/skill/full-protocol proof are NON_GOVERNED_ONE_SHOT_ONLY, not persistent governed roles.
127
56
 
128
- To add a third development pod (Team C), tell `A/EXEC-PM`:
57
+ After readiness passes, emit:
58
+ STAGED_AND_IDLE: <team-count> teams, manifest validated, awaiting first directive.
59
+ ```
129
60
 
130
- > Stage Team C as a new development pod identical in role shape to Team B. Call `odin.compute_surface_layout_gate fromTeamCount=2 toTeamCount=3` first and follow its checklist. The canonical layout becomes `[A] [B/C]` — Team A in the tall column, B and C stacked in the right column.
61
+ ## Scaling
131
62
 
132
- The same pattern scales out to 4, 5, 6, 7, 8 teams. The packing rule is in `odin://protocol/topology`.
63
+ Add pods only after EXEC PM recomputes the CMUX layout and records readiness for
64
+ the new role slots. Keep EXEC PM in the same workspace as the governed team by
65
+ default.
@@ -1,35 +1,53 @@
1
1
  # Recommended Starter Team
2
2
 
3
- ODIN is opinionated, but not rigid.
4
-
5
- The profiles below are a good starting point for a visible multi-agent session.
6
- They are not bundled dependencies. Install and configure the harnesses you want,
7
- then point them at ODIN Sentinel through MCP.
3
+ This is a small, visible starter shape for ODIN Sentinel. It is not a dependency
4
+ list and not a guarantee that every named harness is ready on your machine.
8
5
 
9
6
  ## Executive Office
10
7
 
11
- | Role | Suggested Harness | Suggested Model Class | Why |
12
- | --- | --- | --- | --- |
13
- | `A/EXEC-PM` | Codex CLI | GPT-5.5-class frontier reasoning model | Stable coordination, claim-bound reporting, and careful instruction handling. |
14
- | `A/EXEC-ODIN` | Codex CLI | GPT-5.5-class frontier reasoning model | Sentinel work: staying awake, polling, quality control, and closeout hygiene. |
15
- | `A/EXEC-ASST` | Claude Code | Claude Haiku-class fast assistant model | Low-latency ledger work, reminders, artifact indexing, and simple checks. |
16
- | `A/EXEC-RSCH` | Droid | Kimi K2.6-class orchestration model | Research, alternatives, synthesis, and context recovery. |
17
- | `A/EXEC-QA` | Droid | Kimi K2.6-class review model | Independent process review, evidence checks, and drift detection. |
8
+ | Role | Suggested Harness Type | Responsibility |
9
+ | --- | --- | --- |
10
+ | `A/EXEC-PM` | Strong coordination agent | Routing, activation, assignments, waivers, escalation. |
11
+ | `A/EXEC-ODIN` | Strong monitoring agent | Health, scope, drift, permission waits, closeout hygiene. |
12
+ | `A/EXEC-ASST` | Fast assistant | Ledger notes, reminders, artifact index, delivery checks. |
13
+ | `A/EXEC-RSCH` | Research/synthesis agent | Alternatives, context recovery, risk analysis. |
14
+ | `A/EXEC-QA` | Independent reviewer | Process review and drift detection. |
18
15
 
19
16
  ## Development Pod
20
17
 
21
- | Role | Suggested Harness | Suggested Model Class | Why |
22
- | --- | --- | --- | --- |
23
- | `<TEAM>/TEAM-PM` | Claude Code | Claude Opus/Sonnet-class coding model | Pod orchestration, task decomposition, dispatch, and worker follow-up. |
24
- | `<TEAM>/ODIN` | Codex CLI | GPT-5.5-class frontier reasoning model | Lightweight pod sentinel duties, blocker detection, and quality reminders. |
25
- | `<TEAM>/DEV-1` | Droid | Kimi K2.6-class coding model | Bounded implementation work. |
26
- | `<TEAM>/QA-1` | Crush | GLM-5.1-class independent review model | Independent QA with a different review style from the implementer. |
27
- | `<TEAM>/SHADOW-1` | Droid | Kimi K2.6-class review model | Second-pass critique, architectural concerns, and risk surfacing. |
28
-
29
- ## Notes
30
-
31
- Use faster models for ledger work, routine research, and low-risk monitoring.
32
- Use stronger models for coordination, implementation, QA, and places where the
33
- cost of a missed detail is high.
34
-
35
- The defaults live in `protocol/model-profiles.yaml`. Change them freely.
18
+ | Role | Suggested Harness Type | Responsibility |
19
+ | --- | --- | --- |
20
+ | `<TEAM>/TEAM-PM` | Coding-capable coordinator | Pod assignments, follow-up, blocker routing. |
21
+ | `<TEAM>/ODIN` | Monitor | Polling, scope reminders, unsafe-lane freezes. |
22
+ | `<TEAM>/DEV-1` | Implementer | Bounded code/docs changes inside assigned write scope. |
23
+ | `<TEAM>/QA-1` | Independent reviewer | Fresh-context QA; no self-fixes during QA. |
24
+ | `<TEAM>/SHADOW-1` | Read-only reviewer | Optional second-pass critique and risk surfacing. |
25
+
26
+ ## Readiness Before Launch
27
+
28
+ Each persistent role should have:
29
+
30
+ - MCP server proof or an accepted fallback path.
31
+ - Native skill context where supported, or full prompt fallback.
32
+ - Auth/account readiness checked without printing secrets.
33
+ - Local inference smoke-tested if used.
34
+ - CMUX locator recorded in the same workspace.
35
+ - Watcher assignment recorded in the team manifest.
36
+
37
+ Role slots may exist before readiness. Occupants should wait until readiness
38
+ passes or EXEC PM records a waiver/substitution.
39
+
40
+ ## ODIN Roles Are Active Monitors
41
+
42
+ ODIN roles are not passive receipt emitters. Their default job is to watch for
43
+ stall, scope drift, missed delivery, permission waits, stale versions, and role
44
+ boundary breaches. Default active-watch cadence is 30 seconds. Treat 5 minutes
45
+ without meaningful progress as `WATCH_WARN` and 10 minutes without heartbeat or
46
+ observable progress as `STALLED`, unless the team manifest explicitly declares a
47
+ known long-running command. ODIN roles must re-arm the next watch tick instead
48
+ of returning to passive idle.
49
+
50
+ Human-facing translation: ODIN pauses are safety rails. They protect the
51
+ operator from silent failures, surprise costs, secret exposure, and agents going
52
+ off task. A warning or halt should explain the blocker in plain language and
53
+ offer the next safe choice; it should not blame the operator.
@@ -1,23 +1,23 @@
1
1
  # Client Compatibility
2
2
 
3
- ODIN Sentinel is implemented in TypeScript and runs on Node.js, but MCP clients
4
- do not need to be TypeScript or JavaScript. Clients interact with the server
5
- through MCP over stdio, which is JSON-RPC framed over standard input/output.
3
+ ODIN Sentinel is implemented in TypeScript and runs on Node.js `>=22.13.0`.
4
+ Clients can be written in any language that can speak MCP over stdio or consume a
5
+ protocol snapshot.
6
6
 
7
- ## Compatibility Contract
7
+ ## Compatibility Layers
8
8
 
9
- The server keeps the MCP boundary language-neutral:
9
+ - MCP server: language-neutral JSON-RPC over stdio.
10
+ - Native skill: host-specific context for automatic invocation and role behavior.
11
+ - Plugin: host install path that may bundle MCP config and native skill.
12
+ - Full prompt injection: fallback for hosts without MCP or native skill support.
10
13
 
11
- - tools accept and return JSON-compatible values
12
- - resources return text, JSON, Markdown, or YAML content
13
- - no tool requires a JavaScript object prototype, class instance, or local Node-specific object
14
- - no tool requires filesystem access from the client
15
- - fallback protocol snapshots are returned as plain filename-to-text maps
14
+ A persistent governed role should have MCP plus native skill or full prompt proof.
15
+ If it does not, mark it `NON_GOVERNED_ONE_SHOT_ONLY`: it can do bounded one-shot
16
+ help, but should not occupy a persistent governed role.
16
17
 
17
- ## Rust, Zig, Go, And Native Clients
18
+ ## Native And WASM Clients
18
19
 
19
- Native clients that can spawn stdio subprocesses should launch the server as a
20
- subprocess:
20
+ Native clients that can spawn subprocesses should launch:
21
21
 
22
22
  ```text
23
23
  command: node
@@ -25,35 +25,12 @@ args: [/path/to/odin-sentinel/dist/src/bin/index.js]
25
25
  transport: stdio
26
26
  ```
27
27
 
28
- Then call normal MCP methods:
28
+ Clients that cannot spawn stdio should use a host bridge or a static snapshot
29
+ from `odin.export_protocol_snapshot`.
29
30
 
30
- - `tools/list`
31
- - `tools/call`
32
- - `resources/list`
33
- - `resources/read`
31
+ ## CMUX Boundary
34
32
 
35
- ## WebAssembly Clients
36
-
37
- WASM runtimes vary. Some can spawn subprocesses through a host capability; many
38
- cannot. If the WASM client cannot spawn a stdio process, use one of these
39
- patterns:
40
-
41
- 1. Host bridge: native host process runs `odin-sentinel` and exposes MCP calls
42
- to the WASM guest.
43
- 2. Sidecar bridge: an external local process runs `odin-sentinel` and the WASM
44
- client talks to the host through its supported bridge channel.
45
- 3. Snapshot fallback: call `odin.export_protocol_snapshot` from a capable host and
46
- provide the generated text files to the WASM agent as static context.
47
-
48
- ## Portability Limits
49
-
50
- The current server runtime requires Node.js 20 or newer. This does not restrict
51
- the client implementation language; it only means the machine hosting the MCP
52
- server needs Node available.
53
-
54
- Future options if a pure native server is needed:
55
-
56
- - Rust MCP server using the same `protocol/` data files.
57
- - Go MCP server using the same `protocol/` data files.
58
- - Single-file generated JSON protocol bundle for embedded clients.
59
- - WASI-compatible read-only server if the target runtime supports stdio.
33
+ CMUX is required for governed team mode because role slots must be visible,
34
+ locatable, and human-readable. Tab-only layouts are degraded. The canonical mode
35
+ is one CMUX workspace with spatial/pod organization and EXEC PM in the same
36
+ workspace by default.
@@ -1,35 +1,38 @@
1
1
  # Cost And Privacy
2
2
 
3
- ODIN Sentinel does not provide inference.
3
+ ODIN Sentinel does not provide inference and does not host a backend. Users pay
4
+ for their own harnesses, model providers, and local inference hardware.
4
5
 
5
- It does not proxy model calls, host a backend, phone home, collect telemetry, or
6
- ship credentials. It is a local MCP server that returns protocol resources,
7
- startup packets, validation results, delegation envelopes, closeout checklists,
8
- and fallback text snapshots.
6
+ ## Network And Telemetry Boundary
9
7
 
10
- ## Who Pays For What
8
+ Normal MCP operation is local stdio:
11
9
 
12
- The maintainer does not pay when another person runs ODIN Sentinel locally.
13
-
14
- Users are responsible for their own harness setup and any model calls those
15
- harnesses make. ODIN Sentinel only returns coordination data over MCP.
16
-
17
- ODIN Sentinel only names preferred harness slots and model capability profiles.
18
- Those are dispatch preferences, not hosted compute.
10
+ ```text
11
+ MCP client <-> local stdio process <-> bundled protocol files
12
+ ```
19
13
 
20
- ## Network Boundary
14
+ No network call is required for normal protocol reads, validation tools, startup
15
+ packets, delegation packets, or closeout checklists.
21
16
 
22
- The server is stdio-only by default:
17
+ ODIN Sentinel includes optional telemetry/session-report helper tools. They are
18
+ user-invoked, redaction-oriented, and should not be described as automatic
19
+ collection. Do not claim "no telemetry" without the qualifier that telemetry is
20
+ not automatic and requires an explicit tool call/configured destination.
23
21
 
24
- ```text
25
- MCP client <-> local stdio process <-> protocol files
26
- ```
22
+ ## Secret Handling
27
23
 
28
- No network call is required for normal operation.
24
+ Do not paste API keys, OAuth material, tokens, or passwords into docs/prompts.
25
+ Ask whether providers are configured through Doppler, 1Password CLI,
26
+ environment variables, direnv, mise, or dotenv-style files. Verify status by
27
+ name/count/status only, never by printing secret values.
29
28
 
30
- ## Standalone Boundary
29
+ Beginner-safe wording: "Please make sure this tool is signed in or configured
30
+ outside the chat. If it is not, we can pause, use a different harness, or keep
31
+ that role slot empty." Do not ask the user to reveal where the secret value is
32
+ stored unless they volunteer a non-secret path or tool name.
31
33
 
32
- ODIN Sentinel is standalone.
34
+ ## Local Inference
33
35
 
34
- The default handoff search list uses `.odin/` paths. A fresh repo does not need
35
- any separate orchestration system installed for ODIN Sentinel to work.
36
+ Endpoint reachability is not enough. A local model is ready only if it returns
37
+ visible content within the session timeout and does not return only
38
+ `reasoning_content`.
@@ -1,27 +1,27 @@
1
1
  # Distribution
2
2
 
3
- ODIN Sentinel is a local stdio MCP server. The simplest public distribution is
4
- an npm package that ships prebuilt JavaScript and protocol files.
3
+ ODIN Sentinel public artifacts are the GitHub repository, npm package, optional
4
+ host plugin, public bootstrap skill/resource, public templates, and docs. When
5
+ public protocol semantics change, update them together.
5
6
 
6
- ## Recommended Install Path
7
+ ## Current Public Versions
7
8
 
8
- ```bash
9
- npm i -g @bradheitmann/odin-sentinel
10
- ```
9
+ - npm package/server: `0.4.7`
10
+ - minimum compatible child MCP version: `0.4.5`
11
11
 
12
- MCP client configuration can then use the installed binary directly:
12
+ Private local skill copies may differ for personal workflow reasons. Release
13
+ checks must not rely on private local paths and must distinguish intentional
14
+ private-local divergence from repo-internal public artifact drift.
13
15
 
14
- ```json
15
- {
16
- "mcpServers": {
17
- "odin-sentinel": {
18
- "command": "odin-sentinel-mcp"
19
- }
20
- }
21
- }
16
+ ## Install Paths
17
+
18
+ Global install:
19
+
20
+ ```bash
21
+ npm i -g @bradheitmann/odin-sentinel
22
22
  ```
23
23
 
24
- For zero-install via `npx`:
24
+ Zero-install MCP config:
25
25
 
26
26
  ```json
27
27
  {
@@ -34,9 +34,7 @@ For zero-install via `npx`:
34
34
  }
35
35
  ```
36
36
 
37
- ## Local Clone Path
38
-
39
- For source builds:
37
+ Source build:
40
38
 
41
39
  ```bash
42
40
  pnpm install
@@ -44,39 +42,26 @@ pnpm run build
44
42
  node dist/src/bin/index.js
45
43
  ```
46
44
 
47
- Then point the client at the built file:
48
-
49
- ```json
50
- {
51
- "mcpServers": {
52
- "odin-sentinel": {
53
- "command": "node",
54
- "args": ["/absolute/path/to/odin-sentinel/dist/src/bin/index.js"]
55
- }
56
- }
57
- }
58
- ```
59
-
60
- ## Advanced Root Override
61
-
62
- The server normally finds its bundled `protocol/` directory automatically.
63
-
64
- Advanced deployments can set `ODIN_SENTINEL_ROOT` to point at another checked-out
65
- ODIN Sentinel root that contains the full `protocol/` tree. Most users do not
66
- need this.
67
-
68
- ## Binary Strategy
69
-
70
- A native binary is possible, but it should not be the first distribution path.
71
- The server is small, stdio-only, and already fits the package manager workflow
72
- most MCP clients expect.
73
-
74
- Good future binary routes:
75
-
76
- - Rust or Go implementation over the same `protocol/` files.
77
- - Generated single-file protocol bundle for embedded clients.
78
- - Homebrew formula once the public package name and release cadence are stable.
79
-
80
- Avoid a bundled Node executable unless users ask for it. Those bundles tend to
81
- make asset paths, source maps, and platform support more awkward than the code
82
- deserves.
45
+ ## Release Checklist
46
+
47
+ Before publishing or updating a plugin/skill listing:
48
+
49
+ 1. Update GitHub source, docs, protocol resources, public templates, and package
50
+ metadata together.
51
+ 2. Confirm npm package metadata includes repository, homepage, bugs, license,
52
+ engines, and files.
53
+ 3. Confirm package contents exclude private planning workspaces and local evidence paths.
54
+ 4. Confirm `protocol/SCP.md` and `protocol/bootstrap-skill.md` carry the same
55
+ public version and minimum compatible child MCP version.
56
+ 5. Confirm public docs do not contain stale MCP/server version references.
57
+ 6. Confirm telemetry wording explains that session-report submission is optional
58
+ and user-invoked.
59
+ 7. Run offline release validation: `pnpm run validate`.
60
+ 8. Run pack dry-run: `pnpm pack --dry-run`.
61
+ 9. Tag the release only after GitHub, npm, plugin, public skill/bootstrap, docs,
62
+ and version tags agree.
63
+
64
+ ## Public Templates
65
+
66
+ The npm package intentionally ships `templates/` plus `AGENTS.md` and
67
+ `CLAUDE.md`. They are starter templates, not private planning artifacts.