@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.
- package/AGENTS.md +64 -0
- package/CLAUDE.md +43 -0
- package/README.md +113 -302
- package/dist/src/mcp/server.js +43 -12
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/protocol/schemas.d.ts +2529 -4
- package/dist/src/protocol/schemas.js +214 -18
- package/dist/src/protocol/schemas.js.map +1 -1
- package/dist/src/protocol/service.d.ts +96 -2
- package/dist/src/protocol/service.js +516 -4
- package/dist/src/protocol/service.js.map +1 -1
- package/dist/src/protocol/surface-layout.d.ts +40 -1
- package/dist/src/protocol/surface-layout.js +98 -1
- package/dist/src/protocol/surface-layout.js.map +1 -1
- package/dist/src/protocol/validators.d.ts +3 -0
- package/dist/src/protocol/validators.js +28 -0
- package/dist/src/protocol/validators.js.map +1 -1
- package/dist/src/protocol/version.d.ts +3 -0
- package/dist/src/protocol/version.js +3 -0
- package/dist/src/protocol/version.js.map +1 -1
- package/dist/src/telemetry/config.d.ts +8 -0
- package/dist/src/telemetry/config.js +24 -0
- package/dist/src/telemetry/config.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +5 -5
- package/dist/src/telemetry/index.js +3 -3
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/redactor.js +25 -7
- package/dist/src/telemetry/redactor.js.map +1 -1
- package/dist/src/telemetry/report.d.ts +108 -0
- package/dist/src/telemetry/report.js +83 -3
- package/dist/src/telemetry/report.js.map +1 -1
- package/dist/src/telemetry/submit.d.ts +2 -0
- package/dist/src/telemetry/submit.js +79 -6
- package/dist/src/telemetry/submit.js.map +1 -1
- package/docs/guides/quick-start.md +112 -44
- package/docs/guides/quickstart-prompts.md +46 -113
- package/docs/guides/recommended-starter-team.md +45 -27
- package/docs/reference/client-compatibility.md +20 -43
- package/docs/reference/cost-and-privacy.md +26 -23
- package/docs/reference/distribution.md +40 -55
- package/docs/reference/public-surface-audit.md +35 -114
- package/package.json +22 -6
- package/protocol/SCP.md +8 -1
- package/protocol/bootstrap-skill.md +16 -11
- package/protocol/closeout.yaml +7 -1
- package/protocol/delegation.yaml +1 -1
- package/protocol/model-profiles.yaml +55 -1
- package/protocol/receipts/boot-receipt.yaml +42 -0
- package/protocol/receipts/team-manifest.yaml +41 -0
- package/protocol/roles.yaml +69 -1
- package/protocol/topology.yaml +78 -36
- package/scripts/audit/public-surface.mjs +47 -19
- package/scripts/audit/verify-pack.mjs +293 -27
- package/templates/dev-slice-template.md +56 -0
- package/templates/pm-role-template.md +61 -0
- package/templates/qa-slice-template.md +46 -0
- package/templates/team-manifest-template.yaml +163 -0
|
@@ -1,132 +1,65 @@
|
|
|
1
1
|
# ODIN Sentinel Quickstart Prompts
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
6
|
+
## Prompt 1 - Setup
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
Paste into a capable coding agent on the target machine.
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
```text
|
|
11
|
+
Set up @bradheitmann/odin-sentinel for this machine.
|
|
10
12
|
|
|
11
|
-
|
|
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
|
-
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
## Prompt 2 — Team Bootstrap
|
|
30
|
+
Restart any host whose MCP config changed.
|
|
74
31
|
|
|
75
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
57
|
+
After readiness passes, emit:
|
|
58
|
+
STAGED_AND_IDLE: <team-count> teams, manifest validated, awaiting first directive.
|
|
59
|
+
```
|
|
129
60
|
|
|
130
|
-
|
|
61
|
+
## Scaling
|
|
131
62
|
|
|
132
|
-
|
|
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
|
-
|
|
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
|
|
12
|
-
| --- | --- | --- |
|
|
13
|
-
| `A/EXEC-PM` |
|
|
14
|
-
| `A/EXEC-ODIN` |
|
|
15
|
-
| `A/EXEC-ASST` |
|
|
16
|
-
| `A/EXEC-RSCH` |
|
|
17
|
-
| `A/EXEC-QA` |
|
|
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
|
|
22
|
-
| --- | --- | --- |
|
|
23
|
-
| `<TEAM>/TEAM-PM` |
|
|
24
|
-
| `<TEAM>/ODIN` |
|
|
25
|
-
| `<TEAM>/DEV-1` |
|
|
26
|
-
| `<TEAM>/QA-1` |
|
|
27
|
-
| `<TEAM>/SHADOW-1` |
|
|
28
|
-
|
|
29
|
-
##
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
|
4
|
-
|
|
5
|
-
|
|
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
|
|
7
|
+
## Compatibility Layers
|
|
8
8
|
|
|
9
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
##
|
|
18
|
+
## Native And WASM Clients
|
|
18
19
|
|
|
19
|
-
Native clients that can spawn
|
|
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
|
-
|
|
28
|
+
Clients that cannot spawn stdio should use a host bridge or a static snapshot
|
|
29
|
+
from `odin.export_protocol_snapshot`.
|
|
29
30
|
|
|
30
|
-
|
|
31
|
-
- `tools/call`
|
|
32
|
-
- `resources/list`
|
|
33
|
-
- `resources/read`
|
|
31
|
+
## CMUX Boundary
|
|
34
32
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
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
|
-
|
|
8
|
+
Normal MCP operation is local stdio:
|
|
11
9
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
14
|
+
No network call is required for normal protocol reads, validation tools, startup
|
|
15
|
+
packets, delegation packets, or closeout checklists.
|
|
21
16
|
|
|
22
|
-
|
|
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
|
-
|
|
25
|
-
MCP client <-> local stdio process <-> protocol files
|
|
26
|
-
```
|
|
22
|
+
## Secret Handling
|
|
27
23
|
|
|
28
|
-
|
|
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
|
-
|
|
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
|
-
|
|
34
|
+
## Local Inference
|
|
33
35
|
|
|
34
|
-
|
|
35
|
-
|
|
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
|
|
4
|
-
|
|
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
|
-
##
|
|
7
|
+
## Current Public Versions
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
```
|
|
9
|
+
- npm package/server: `0.4.7`
|
|
10
|
+
- minimum compatible child MCP version: `0.4.5`
|
|
11
11
|
|
|
12
|
-
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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.
|