overlord-cli 0.2608121927.0 → 0.2608131824.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 (39) hide show
  1. package/dist/connectors/AGENTS.md +6 -0
  2. package/dist/connectors/HARNESS-MATRIX.md +17 -15
  3. package/dist/connectors/VERSION +1 -1
  4. package/dist/connectors/adapters/antigravity/plugin.json +1 -1
  5. package/dist/connectors/adapters/claude/.claude-plugin/plugin.json +1 -1
  6. package/dist/connectors/adapters/claude/CAPABILITIES.md +18 -17
  7. package/dist/connectors/adapters/claude/README.md +4 -4
  8. package/dist/connectors/adapters/claude/conformance-manifest.yaml +2 -5
  9. package/dist/connectors/adapters/claude/fixtures/post-tool-use-parity.json +7 -3
  10. package/dist/connectors/adapters/claude/harness-capabilities.yaml +32 -40
  11. package/dist/connectors/adapters/claude/hooks/hooks.json +0 -69
  12. package/dist/connectors/adapters/codex/.codex-plugin/hooks.json +0 -65
  13. package/dist/connectors/adapters/codex/.codex-plugin/plugin.json +1 -1
  14. package/dist/connectors/adapters/codex/CAPABILITIES.md +14 -15
  15. package/dist/connectors/adapters/codex/README.md +3 -5
  16. package/dist/connectors/adapters/codex/conformance-manifest.yaml +2 -5
  17. package/dist/connectors/adapters/codex/fixtures/agent-session-hooks.json +7 -7
  18. package/dist/connectors/adapters/codex/harness-capabilities.yaml +22 -34
  19. package/dist/connectors/adapters/cursor/.cursor-plugin/plugin.json +1 -1
  20. package/dist/connectors/adapters/cursor/CAPABILITIES.md +9 -9
  21. package/dist/connectors/adapters/cursor/README.md +2 -7
  22. package/dist/connectors/adapters/cursor/conformance-manifest.yaml +2 -4
  23. package/dist/connectors/adapters/cursor/fixtures/fail-closed-unset.json +1 -1
  24. package/dist/connectors/adapters/cursor/fixtures/stop-calls-inbox.json +3 -6
  25. package/dist/connectors/adapters/cursor/harness-capabilities.yaml +12 -15
  26. package/dist/connectors/adapters/cursor/hooks/overlord-stop.sh +0 -11
  27. package/dist/connectors/adapters/pi/CAPABILITIES.md +20 -20
  28. package/dist/connectors/adapters/pi/conformance-manifest.yaml +2 -2
  29. package/dist/connectors/adapters/pi/extensions/overlord.ts +1 -184
  30. package/dist/connectors/adapters/pi/fixtures/agent-session-runtime.json +12 -12
  31. package/dist/connectors/adapters/pi/fixtures/inject-send-user-message.json +2 -8
  32. package/dist/connectors/adapters/pi/harness-capabilities.yaml +31 -37
  33. package/dist/connectors/core/overlord-mission/SKILL.md +11 -5
  34. package/dist/connectors/core/overlord-mission/reference/cli.md +11 -5
  35. package/dist/connectors/core/overlord-mission/reference/mcp.md +1 -0
  36. package/dist/connectors/core/scripts/overlord-mcp.mjs +39 -4
  37. package/dist/index.js +1018 -532
  38. package/dist/index.js.map +4 -4
  39. package/package.json +1 -1
@@ -80,6 +80,12 @@ stale. `yarn connectors:check` runs it alongside the connector version check.
80
80
 
81
81
  ### The rendered agent-session hook
82
82
 
83
+ Mechanical observe / decide / inject is **not a live Overlord connector path**. Latch owns
84
+ turns, tools, `awaiting_input`, and PTY answers via `latch events` and `latch send`. New
85
+ adapters must not register `ovld agent-session` hooks. Channel 1 stays on `ovld protocol`
86
+ (follow-up capture, touched-file attribution, Stop delivery reminder). The rest of this
87
+ section documents leftover CLI runtime and historical fixtures.
88
+
83
89
  Do not write a per-adapter shell script for agent-session traffic. One core script,
84
90
  `connectors/core/scripts/agent-session-hook.sh`, is rendered per adapter at `ovld agent-setup`
85
91
  time — declare the managed file as `scripts/agent-session-<action>.sh` in the manifest, and the
@@ -15,30 +15,30 @@ Legend: ✅ supported (fixture-proven) · ⛔ unsupported (harness cannot) ·
15
15
  | Adapter | Harness | Verified version | Shape | Tier | Binding | Decision hold |
16
16
  | --- | --- | --- | --- | --- | --- | --- |
17
17
  | [`antigravity`](adapters/antigravity/CAPABILITIES.md) | Antigravity CLI | `docs: Antigravity CLI v1.1.11 / Antigravity 2.0 v2.6.0` | `callback` | 0 (Unsupported) | ✅ supported | ❓ unverified |
18
- | [`claude`](adapters/claude/CAPABILITIES.md) | Claude Code | `2.1.227` | `callback` | 3 (Conversational) | ✅ supported | ✅ supported |
19
- | [`codex`](adapters/codex/CAPABILITIES.md) | Codex CLI | `0.147.0` | `callback` | 3 (Conversational) | ✅ supported | ✅ supported |
20
- | [`cursor`](adapters/cursor/CAPABILITIES.md) | Cursor Agent CLI | `2026.08.04-aaa8809` | `callback` | 3 (Conversational) | ✅ supported | ✅ supported |
18
+ | [`claude`](adapters/claude/CAPABILITIES.md) | Claude Code | `2.1.227` | `callback` | 1 (Observational) | ✅ supported | ✅ supported |
19
+ | [`codex`](adapters/codex/CAPABILITIES.md) | Codex CLI | `0.147.0` | `callback` | 1 (Observational) | ✅ supported | ✅ supported |
20
+ | [`cursor`](adapters/cursor/CAPABILITIES.md) | Cursor Agent CLI | `2026.08.04-aaa8809` | `callback` | 1 (Observational) | ✅ supported | ✅ supported |
21
21
  | [`opencode`](adapters/opencode/CAPABILITIES.md) | OpenCode | — | `controlPlane` | 3 (Conversational) | ✅ supported | ✅ supported |
22
- | [`pi`](adapters/pi/CAPABILITIES.md) | Pi Coding Agent | `0.83.0` | `extension` | 3 (Conversational) | ✅ supported | ✅ supported |
22
+ | [`pi`](adapters/pi/CAPABILITIES.md) | Pi Coding Agent | `0.83.0` | `extension` | 1 (Observational) | ✅ supported | 🚧 not-implemented |
23
23
 
24
24
  ## Capabilities
25
25
 
26
26
  | Capability | `antigravity` | `claude` | `codex` | `cursor` | `opencode` | `pi` |
27
27
  | --- | --- | --- | --- | --- | --- | --- |
28
28
  | `observe.prompt` | ⛔ unsupported | ✅ supported | ✅ supported | ✅ supported | 🚧 not-implemented | ✅ supported |
29
- | `observe.toolCall` | 🚧 not-implemented | 🚧 not-implemented | ✅ supported | ✅ supported | 🚧 not-implemented | ✅ supported |
30
- | `observe.toolResult` | 🚧 not-implemented | ✅ supported | ✅ supported | ✅ supported | ✅ supported | 🚧 not-implemented |
31
- | `observe.fileEdit` | 🚧 not-implemented | ✅ supported | ✅ supported | ✅ supported | ✅ supported | 🚧 not-implemented |
32
- | `observe.sessionLifecycle` | 🚧 not-implemented | ✅ supported | ✅ supported | 🚧 not-implemented | ✅ supported | ✅ supported |
33
- | `decide.shell` | 🚧 not-implemented | ✅ supported | ✅ supported | ✅ supported | ✅ supported | ✅ supported |
34
- | `decide.mcp` | ❓ unverified | ✅ supported | ✅ supported | ✅ supported | ✅ supported | ✅ supported |
35
- | `decide.fileWrite` | 🚧 not-implemented | ✅ supported | ✅ supported | 🚧 not-implemented | 🚧 not-implemented | ✅ supported |
36
- | `decide.anyTool` | 🚧 not-implemented | 🚧 not-implemented | 🚧 not-implemented | ✅ supported | ✅ supported | ✅ supported |
37
- | `decide.universal` | ❓ unverified | ✅ supported | ✅ supported | ⛔ unsupported | 🚧 not-implemented | ✅ supported |
29
+ | `observe.toolCall` | 🚧 not-implemented | 🚧 not-implemented | 🚧 not-implemented | 🚧 not-implemented | 🚧 not-implemented | 🚧 not-implemented |
30
+ | `observe.toolResult` | 🚧 not-implemented | 🚧 not-implemented | 🚧 not-implemented | ✅ supported | ✅ supported | 🚧 not-implemented |
31
+ | `observe.fileEdit` | 🚧 not-implemented | ✅ supported | 🚧 not-implemented | ✅ supported | ✅ supported | 🚧 not-implemented |
32
+ | `observe.sessionLifecycle` | 🚧 not-implemented | 🚧 not-implemented | 🚧 not-implemented | 🚧 not-implemented | ✅ supported | 🚧 not-implemented |
33
+ | `decide.shell` | 🚧 not-implemented | 🚧 not-implemented | 🚧 not-implemented | 🚧 not-implemented | ✅ supported | 🚧 not-implemented |
34
+ | `decide.mcp` | ❓ unverified | 🚧 not-implemented | 🚧 not-implemented | 🚧 not-implemented | ✅ supported | 🚧 not-implemented |
35
+ | `decide.fileWrite` | 🚧 not-implemented | 🚧 not-implemented | 🚧 not-implemented | 🚧 not-implemented | 🚧 not-implemented | 🚧 not-implemented |
36
+ | `decide.anyTool` | 🚧 not-implemented | 🚧 not-implemented | 🚧 not-implemented | 🚧 not-implemented | ✅ supported | 🚧 not-implemented |
37
+ | `decide.universal` | ❓ unverified | 🚧 not-implemented | 🚧 not-implemented | ⛔ unsupported | 🚧 not-implemented | 🚧 not-implemented |
38
38
  | `answer.structuredQuestion` | ❓ unverified | ❓ unverified | ❓ unverified | ⛔ unsupported | 🚧 not-implemented | 🚧 not-implemented |
39
39
  | `answer.persistentAllow` | 🚧 not-implemented | 🚧 not-implemented | ❓ unverified | ⛔ unsupported | 🚧 not-implemented | ⛔ unsupported |
40
- | `inject.midTurn` | ⛔ unsupported | ✅ supported | ❓ unverified | ⛔ unsupported | ✅ supported | ✅ supported |
41
- | `inject.turnBoundary` | 🚧 not-implemented | ✅ supported | ✅ supported | ✅ supported | ✅ supported | ✅ supported |
40
+ | `inject.midTurn` | ⛔ unsupported | 🚧 not-implemented | ❓ unverified | ⛔ unsupported | ✅ supported | 🚧 not-implemented |
41
+ | `inject.turnBoundary` | 🚧 not-implemented | 🚧 not-implemented | 🚧 not-implemented | ✅ supported | ✅ supported | 🚧 not-implemented |
42
42
  | `inject.nextTurn` | 🚧 not-implemented | 🚧 not-implemented | 🚧 not-implemented | ✅ supported | ✅ supported | 🚧 not-implemented |
43
43
  | `terminal.concurrentAnswer` | ❓ unverified | ⛔ unsupported | ⛔ unsupported | ⛔ unsupported | ✅ supported | ⛔ unsupported |
44
44
  | `terminal.statusSurface` | ❓ unverified | 🚧 not-implemented | ❓ unverified | ❓ unverified | 🚧 not-implemented | 🚧 not-implemented |
@@ -58,6 +58,8 @@ Legend: ✅ supported (fixture-proven) · ⛔ unsupported (harness cannot) ·
58
58
  | `cursor` | `reads-claude-hook-config` | high | unverified | required | `taxonomy-7.1` |
59
59
  | `cursor` | `allowlist-precedence` | medium | unverified | required | `taxonomy-7.8` |
60
60
  | `opencode` | `harness-version-unverified` | medium | unverified | required | `agent-session-verify-opencode-frames` |
61
+ | `pi` | `no-native-floor-fails-open` | high | verified | accepted | — |
62
+ | `pi` | `block-is-visible-to-the-model` | medium | verified | accepted | — |
61
63
  | `pi` | `typed-api-version-coupling` | medium | unverified | required | `taxonomy-7.10` |
62
64
 
63
65
  ## Reading this table
@@ -1 +1 @@
1
- 0.3.22
1
+ 0.3.25
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://antigravity.google/schemas/v1/plugin.json",
3
3
  "name": "overlord",
4
- "version": "0.3.22",
4
+ "version": "0.3.25",
5
5
  "description": "Chat-driven access to Overlord mission protocol workflows through skills and MCP.",
6
6
  "author": {
7
7
  "name": "Cooperativ",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord",
3
- "version": "0.3.22",
3
+ "version": "0.3.25",
4
4
  "description": "Overlord mission protocol workflow for Claude Code — attach/update/ask/deliver, slash commands, and hook-driven activity capture.",
5
5
  "author": {
6
6
  "name": "Cooperativ",
@@ -2,11 +2,11 @@
2
2
 
3
3
  # Claude Code — Overlord agent-session capabilities
4
4
 
5
- **Adapter** `claude` · **Codec** `claude` · **Integration shape** `callback` · **Capability tier** 3 (Conversational)
5
+ **Adapter** `claude` · **Codec** `claude` · **Integration shape** `callback` · **Capability tier** 1 (Observational)
6
6
 
7
7
  **Harness version verified** `2.1.227` · **range** `>=2.1.0` · **scheme** `semver`
8
8
 
9
- **Descriptor digest** `5c25dafa68e2f4d0862be4378f4b7a2506ace3a4fe6b806a0e392188604f20d8`
9
+ **Descriptor digest** `833a35cecb73aa9b34b40036eb6d3088dd729ca6be465d1ee228dae2c5a8269d`
10
10
 
11
11
  > The tier is derived from passing fixtures, never authored. `unsupported` means the harness
12
12
  > cannot do it — do not attempt it. `not-implemented` means it is buildable and unbuilt: that is
@@ -45,33 +45,34 @@ Per-command `timeout` in seconds with no documented ceiling. Omitting `decision`
45
45
  | --- | --- | --- | --- |
46
46
  | `observe.prompt` | ✅ supported | `UserPromptSubmit` | fixtures: `fixtures/normalize-user-prompt-submit.json` |
47
47
  | `observe.toolCall` | 🚧 not-implemented | `PreToolUse` | tracked as `agent-session-phase-2` |
48
- | `observe.toolResult` | ✅ supported | `PostToolUse` | fixtures: `fixtures/normalize-post-tool-use-shell.json`, `fixtures/agent-session-hook-unbound.json` |
48
+ | `observe.toolResult` | 🚧 not-implemented | `PostToolUse` | tracked as `latch-engine` |
49
49
  | `observe.fileEdit` | ✅ supported | `PostToolUse` | fixtures: `fixtures/normalize-post-tool-use-write.json`, `fixtures/post-tool-use-parity.json` |
50
- | `observe.sessionLifecycle` | ✅ supported | `SessionStart` | fixtures: `fixtures/normalize-session-start.json` |
51
- | `decide.shell` | ✅ supported | `PermissionRequest` | fixtures: `fixtures/permission-request.json`, `fixtures/decision-codec.json` |
52
- | `decide.mcp` | ✅ supported | `PermissionRequest` | fixtures: `fixtures/permission-request.json`, `fixtures/decision-codec.json` |
53
- | `decide.fileWrite` | ✅ supported | `PermissionRequest` | fixtures: `fixtures/permission-request.json`, `fixtures/decision-codec.json` |
54
- | `decide.anyTool` | 🚧 not-implemented | `PreToolUse` | tracked as `agent-session-phase-2` |
55
- | `decide.universal` | ✅ supported | `PermissionRequest` | fixtures: `fixtures/permission-request.json`, `fixtures/decision-codec.json` |
50
+ | `observe.sessionLifecycle` | 🚧 not-implemented | `SessionStart` | tracked as `latch-engine` |
51
+ | `decide.shell` | 🚧 not-implemented | `PermissionRequest` | tracked as `latch-engine` |
52
+ | `decide.mcp` | 🚧 not-implemented | `PermissionRequest` | tracked as `latch-engine` |
53
+ | `decide.fileWrite` | 🚧 not-implemented | `PermissionRequest` | tracked as `latch-engine` |
54
+ | `decide.anyTool` | 🚧 not-implemented | `PreToolUse` | tracked as `latch-engine` |
55
+ | `decide.universal` | 🚧 not-implemented | `PermissionRequest` | tracked as `latch-engine` |
56
56
  | `answer.structuredQuestion` | ❓ unverified | `Elicitation` | tracked as `agent-session-verify-claude-elicitation` |
57
57
  | `answer.persistentAllow` | 🚧 not-implemented | `PermissionRequest.decision.updatedPermissions` | tracked as `agent-session-standing-permissions` |
58
- | `inject.midTurn` | ✅ supported | `asyncRewake` | fixtures: `fixtures/inject-async-rewake.json`, `fixtures/agent-session-inbox-unbound.json` |
59
- | `inject.turnBoundary` | ✅ supported | `Stop` | fixtures: `fixtures/inject-stop-block.json`, `fixtures/agent-session-inbox-unbound.json` |
58
+ | `inject.midTurn` | 🚧 not-implemented | `asyncRewake` | tracked as `latch-engine` |
59
+ | `inject.turnBoundary` | 🚧 not-implemented | `Stop` | tracked as `latch-engine` |
60
60
  | `inject.nextTurn` | 🚧 not-implemented | `Stop` | tracked as `agent-session-phase-4` |
61
61
  | `terminal.concurrentAnswer` | ⛔ unsupported | — | The native permission prompt is drawn only after the hook returns, so nobody can answer in the terminal while Overlord holds the decision. Holding is simultaneously the only way to answer remotely and the reason the terminal cannot participate. (evidence: `connector-harness-taxonomy.md#12-the-axis-that-actually-matters`) |
62
62
  | `terminal.statusSurface` | 🚧 not-implemented | `statusMessage` | tracked as `agent-session-phase-2` |
63
63
 
64
64
  ### Capability notes
65
65
 
66
- - **`observe.prompt`** — Two registrations now ride UserPromptSubmit: the legacy hook that posts `user_follow_up` mission events through the Connector → Protocol surface, and the normalized agent-session event this capability grades. Both stay installed until the normalized path has proven equivalent follow-up attribution; replacing a working capture with an unproven one is how a migration loses data quietly.
66
+ - **`observe.prompt`** — Two registrations used to ride UserPromptSubmit. Mechanical agent-session observation moved to Latch `events`. This capability grades the protocol follow-up hook that posts `user_follow_up` mission events; that Channel 1 path stays installed.
67
67
  - **`observe.toolCall`** — Deliberately unregistered in Phase 1. PreToolUse is decision-capable: registering it for observation alone would put a script in front of every tool call for no benefit a PostToolUse registration does not already provide, while inheriting the blast radius of the decision path. It lands with the codecs that can actually use it.
68
- - **`observe.fileEdit`** — The shipped PostToolUse hook that records touched files into the per-session log used by `deliver` for change attribution is untouched and still registered. The normalized event is additive: `fixtures/post-tool-use-parity.json` guards both registrations being present, because the migration must not repair observation by regressing change attribution.
69
- - **`observe.sessionLifecycle`** — SessionStart only. There is no matching stop-class registration: continuing or observing a session a user believed had finished is a larger surprise than a missing row, and the Stop event is decision-capable in a way SessionStart is not.
70
- - **`decide.universal`** — Unlike Cursor, Claude has one event that covers every approval, so a single registration can reach every decision rather than a per-tool-class slice.
68
+ - **`observe.toolResult`** — Mechanical tool-result observation moved to Latch `events`. The protocol PostToolUse hook still records touched files for delivery attribution.
69
+ - **`observe.fileEdit`** — The shipped PostToolUse hook that records touched files into the per-session log used by `deliver` for change attribution remains registered. Mechanical agent-session observation is no longer a live Overlord path.
70
+ - **`observe.sessionLifecycle`** — SessionStart observation moved to Latch `events`. There is no matching Overlord registration.
71
+ - **`decide.universal`** — Remote permission decisions moved to Latch `awaiting_input` / `latch send --resolve`. The native Claude prompt owns approvals when Latch is absent.
71
72
  - **`answer.structuredQuestion`** — Elicitation/ElicitationResult hook events exist in the binary but their request and response shapes were not read. Write the fixture before relying on them.
72
73
  - **`answer.persistentAllow`** — Structurally available, deliberately unbuilt. A standing permission grant needs its own design, confirmation, audit language, and RBAC review before any remote surface offers it.
73
- - **`inject.midTurn`** — SessionStart and PostToolUse register `agent-session-inbox.sh` with `asyncRewake: true`. Exit code 2 wakes the model with stderr as a system reminder — that is Delivered.
74
- - **`inject.turnBoundary`** — Stop returns `decision: "block"` with the instruction as `reason`, which continues the turn with that text. The model receives it, so this path also reports Delivered.
74
+ - **`inject.midTurn`** — Session-input injection moved off Overlord connectors. Latch PTY write is Phase 3.
75
+ - **`inject.turnBoundary`** — Turn-boundary injection moved off Overlord connectors. The protocol Stop hook still reminds the agent to deliver when needed.
75
76
  - **`inject.nextTurn`** — No distinct next-turn-only path yet; turn-boundary Stop covers the portable fallback.
76
77
  - **`terminal.statusSurface`** — `statusMessage` is static install-time configuration with no per-request interpolation and no session-binding predicate, so it renders in unbound sessions too. It must be worded as an option, never as an instruction.
77
78
 
@@ -19,7 +19,7 @@ Claude Code plugin that exposes the Overlord local mission workflow to any Claud
19
19
  ### Requirements
20
20
 
21
21
  - Overlord CLI (`ovld`) on `PATH`. See the Overlord docs / Settings → Agents & MCP.
22
- - `MISSION_ID` is exported automatically when a Claude session is launched from Overlord; outside that launch, set it manually before calling the permission hook.
22
+ - `MISSION_ID` is exported automatically when a Claude session is launched from Overlord.
23
23
 
24
24
  ### Install (recommended)
25
25
 
@@ -85,9 +85,9 @@ This connector is intentionally reviewable against the four connector layers in
85
85
 
86
86
  - `skills/overlord-mission/SKILL.md` — Claude adapter template with a `<!-- @connector-core -->` marker; setup interpolates shared core content at install time.
87
87
  - `commands/*.md` — slash commands for session routing, objective discussion, mission creation, and work recording.
88
- - `hooks/hooks.json` + `scripts/*.sh` — mission follow-up and touched-file capture plus the
89
- scoped `ovld agent-session` observe, decision, and injection paths. Decision failures emit no
90
- native response, so Claude retains its normal permission behavior.
88
+ - `hooks/hooks.json` + `scripts/*.sh` — Channel 1 mission follow-up (`UserPromptSubmit`),
89
+ touched-file capture (`PostToolUse`), and Stop delivery reminder. Mechanical harness
90
+ observation, permission, and injection are Latch's (`latch events` / PTY).
91
91
  - `userConfig` for `overlord_url` and `user_token`; the hook scripts use the `ovld protocol` CLI and pass the plugin's USER_TOKEN to that CLI as `Overlord_USER_TOKEN`.
92
92
  - `conformance-manifest.yaml` — connector conformance declaration for the Overlord contract.
93
93
  - `prompt-wrapper.md` — Claude launch context-file guidance.
@@ -11,11 +11,11 @@ connector:
11
11
  # `capabilities` and `hookTypes` are the DEPRECATED hook-named projection, retained for
12
12
  # one release. `harnessCapabilities` is the authoritative source.
13
13
  integrationShape: callback
14
- capabilityTier: 3
14
+ capabilityTier: 1
15
15
  harnessCapabilities:
16
16
  path: connectors/adapters/claude/harness-capabilities.yaml
17
17
  schemaVersion: 1
18
- digest: "5c25dafa68e2f4d0862be4378f4b7a2506ace3a4fe6b806a0e392188604f20d8"
18
+ digest: "833a35cecb73aa9b34b40036eb6d3088dd729ca6be465d1ee228dae2c5a8269d"
19
19
  capabilities:
20
20
  - followUpHook
21
21
  - permissionHook
@@ -48,9 +48,6 @@ connector:
48
48
  - "commands/record-work.md"
49
49
  - "commands/spawn.md"
50
50
  - "hooks/hooks.json"
51
- - "scripts/agent-session-event.sh"
52
- - "scripts/agent-session-request.sh"
53
- - "scripts/agent-session-inbox.sh"
54
51
  - "scripts/permission-hook.sh"
55
52
  - "scripts/post-tool-use-hook.sh"
56
53
  - "scripts/stop-hook.sh"
@@ -1,13 +1,17 @@
1
1
  {
2
2
  "fixtureVersion": 1,
3
3
  "kind": "source-guard",
4
- "description": "Migration parity guard. The normalized agent-session event registration is ADDITIVE: the legacy PostToolUse hook that feeds touched-file change attribution, and the legacy UserPromptSubmit hook that posts follow-up mission events, must both remain registered alongside it. Deleting either to 'clean up' would silently break delivery attribution or follow-up capture, and neither failure is visible until someone tries to deliver.",
4
+ "description": "Channel 1 protocol hooks remain registered. Mechanical agent-session observe/decide/inject is no longer a live Overlord path.",
5
5
  "path": "connectors/adapters/claude/hooks/hooks.json",
6
6
  "assert": {
7
7
  "mustContain": [
8
8
  "scripts/post-tool-use-hook.sh",
9
- "scripts/user-prompt-submit-hook.sh",
10
- "scripts/agent-session-event.sh"
9
+ "scripts/user-prompt-submit-hook.sh"
10
+ ],
11
+ "mustNotContain": [
12
+ "scripts/agent-session-event.sh",
13
+ "scripts/agent-session-request.sh",
14
+ "scripts/agent-session-inbox.sh"
11
15
  ]
12
16
  }
13
17
  }
@@ -50,11 +50,9 @@ capabilities:
50
50
  native: UserPromptSubmit
51
51
  fixtures: [fixtures/normalize-user-prompt-submit.json]
52
52
  notes: >-
53
- Two registrations now ride UserPromptSubmit: the legacy hook that posts `user_follow_up`
54
- mission events through the Connector → Protocol surface, and the normalized agent-session
55
- event this capability grades. Both stay installed until the normalized path has proven
56
- equivalent follow-up attribution; replacing a working capture with an unproven one is how
57
- a migration loses data quietly.
53
+ Two registrations used to ride UserPromptSubmit. Mechanical agent-session observation
54
+ moved to Latch `events`. This capability grades the protocol follow-up hook that posts
55
+ `user_follow_up` mission events; that Channel 1 path stays installed.
58
56
  observe.toolCall:
59
57
  status: not-implemented
60
58
  native: PreToolUse
@@ -65,11 +63,12 @@ capabilities:
65
63
  PostToolUse registration does not already provide, while inheriting the blast radius of
66
64
  the decision path. It lands with the codecs that can actually use it.
67
65
  observe.toolResult:
68
- status: supported
66
+ status: not-implemented
69
67
  native: PostToolUse
70
- fixtures:
71
- - fixtures/normalize-post-tool-use-shell.json
72
- - fixtures/agent-session-hook-unbound.json
68
+ trackedAs: latch-engine
69
+ notes: >-
70
+ Mechanical tool-result observation moved to Latch `events`. The protocol PostToolUse
71
+ hook still records touched files for delivery attribution.
73
72
  observe.fileEdit:
74
73
  status: supported
75
74
  native: PostToolUse
@@ -78,40 +77,38 @@ capabilities:
78
77
  - fixtures/post-tool-use-parity.json
79
78
  notes: >-
80
79
  The shipped PostToolUse hook that records touched files into the per-session log used by
81
- `deliver` for change attribution is untouched and still registered. The normalized event
82
- is additive: `fixtures/post-tool-use-parity.json` guards both registrations being present,
83
- because the migration must not repair observation by regressing change attribution.
80
+ `deliver` for change attribution remains registered. Mechanical agent-session observation
81
+ is no longer a live Overlord path.
84
82
  observe.sessionLifecycle:
85
- status: supported
83
+ status: not-implemented
86
84
  native: SessionStart
87
- fixtures: [fixtures/normalize-session-start.json]
85
+ trackedAs: latch-engine
88
86
  notes: >-
89
- SessionStart only. There is no matching stop-class registration: continuing or observing a
90
- session a user believed had finished is a larger surprise than a missing row, and the Stop
91
- event is decision-capable in a way SessionStart is not.
87
+ SessionStart observation moved to Latch `events`. There is no matching Overlord
88
+ registration.
92
89
  decide.shell:
93
- status: supported
90
+ status: not-implemented
94
91
  native: PermissionRequest
95
- fixtures: [fixtures/permission-request.json, fixtures/decision-codec.json]
92
+ trackedAs: latch-engine
96
93
  decide.mcp:
97
- status: supported
94
+ status: not-implemented
98
95
  native: PermissionRequest
99
- fixtures: [fixtures/permission-request.json, fixtures/decision-codec.json]
96
+ trackedAs: latch-engine
100
97
  decide.fileWrite:
101
- status: supported
98
+ status: not-implemented
102
99
  native: PermissionRequest
103
- fixtures: [fixtures/permission-request.json, fixtures/decision-codec.json]
100
+ trackedAs: latch-engine
104
101
  decide.anyTool:
105
102
  status: not-implemented
106
103
  native: PreToolUse
107
- trackedAs: agent-session-phase-2
104
+ trackedAs: latch-engine
108
105
  decide.universal:
109
- status: supported
106
+ status: not-implemented
110
107
  native: PermissionRequest
111
- fixtures: [fixtures/permission-request.json, fixtures/decision-codec.json]
108
+ trackedAs: latch-engine
112
109
  notes: >-
113
- Unlike Cursor, Claude has one event that covers every approval, so a single
114
- registration can reach every decision rather than a per-tool-class slice.
110
+ Remote permission decisions moved to Latch `awaiting_input` / `latch send --resolve`.
111
+ The native Claude prompt owns approvals when Latch is absent.
115
112
  answer.structuredQuestion:
116
113
  status: unverified
117
114
  native: Elicitation
@@ -127,23 +124,18 @@ capabilities:
127
124
  Structurally available, deliberately unbuilt. A standing permission grant needs its own
128
125
  design, confirmation, audit language, and RBAC review before any remote surface offers it.
129
126
  inject.midTurn:
130
- status: supported
127
+ status: not-implemented
131
128
  native: asyncRewake
132
- fixtures:
133
- - fixtures/inject-async-rewake.json
134
- - fixtures/agent-session-inbox-unbound.json
129
+ trackedAs: latch-engine
135
130
  notes: >-
136
- SessionStart and PostToolUse register `agent-session-inbox.sh` with `asyncRewake: true`.
137
- Exit code 2 wakes the model with stderr as a system reminder — that is Delivered.
131
+ Session-input injection moved off Overlord connectors. Latch PTY write is Phase 3.
138
132
  inject.turnBoundary:
139
- status: supported
133
+ status: not-implemented
140
134
  native: Stop
141
- fixtures:
142
- - fixtures/inject-stop-block.json
143
- - fixtures/agent-session-inbox-unbound.json
135
+ trackedAs: latch-engine
144
136
  notes: >-
145
- Stop returns `decision: "block"` with the instruction as `reason`, which continues the
146
- turn with that text. The model receives it, so this path also reports Delivered.
137
+ Turn-boundary injection moved off Overlord connectors. The protocol Stop hook still
138
+ reminds the agent to deliver when needed.
147
139
  inject.nextTurn:
148
140
  status: not-implemented
149
141
  native: Stop
@@ -1,16 +1,5 @@
1
1
  {
2
2
  "hooks": {
3
- "PermissionRequest": [
4
- {
5
- "matcher": ".*",
6
- "hooks": [
7
- {
8
- "type": "command",
9
- "command": "${CLAUDE_PLUGIN_ROOT}/scripts/agent-session-request.sh"
10
- }
11
- ]
12
- }
13
- ],
14
3
  "UserPromptSubmit": [
15
4
  {
16
5
  "matcher": ".*",
@@ -20,15 +9,6 @@
20
9
  "command": "${CLAUDE_PLUGIN_ROOT}/scripts/user-prompt-submit-hook.sh"
21
10
  }
22
11
  ]
23
- },
24
- {
25
- "matcher": ".*",
26
- "hooks": [
27
- {
28
- "type": "command",
29
- "command": "${CLAUDE_PLUGIN_ROOT}/scripts/agent-session-event.sh"
30
- }
31
- ]
32
12
  }
33
13
  ],
34
14
  "PostToolUse": [
@@ -40,25 +20,6 @@
40
20
  "command": "${CLAUDE_PLUGIN_ROOT}/scripts/post-tool-use-hook.sh"
41
21
  }
42
22
  ]
43
- },
44
- {
45
- "matcher": ".*",
46
- "hooks": [
47
- {
48
- "type": "command",
49
- "command": "${CLAUDE_PLUGIN_ROOT}/scripts/agent-session-event.sh"
50
- }
51
- ]
52
- },
53
- {
54
- "matcher": ".*",
55
- "hooks": [
56
- {
57
- "type": "command",
58
- "command": "${CLAUDE_PLUGIN_ROOT}/scripts/agent-session-inbox.sh",
59
- "asyncRewake": true
60
- }
61
- ]
62
23
  }
63
24
  ],
64
25
  "Stop": [
@@ -70,36 +31,6 @@
70
31
  "command": "${CLAUDE_PLUGIN_ROOT}/scripts/stop-hook.sh"
71
32
  }
72
33
  ]
73
- },
74
- {
75
- "matcher": ".*",
76
- "hooks": [
77
- {
78
- "type": "command",
79
- "command": "${CLAUDE_PLUGIN_ROOT}/scripts/agent-session-inbox.sh"
80
- }
81
- ]
82
- }
83
- ],
84
- "SessionStart": [
85
- {
86
- "matcher": ".*",
87
- "hooks": [
88
- {
89
- "type": "command",
90
- "command": "${CLAUDE_PLUGIN_ROOT}/scripts/agent-session-event.sh"
91
- }
92
- ]
93
- },
94
- {
95
- "matcher": ".*",
96
- "hooks": [
97
- {
98
- "type": "command",
99
- "command": "${CLAUDE_PLUGIN_ROOT}/scripts/agent-session-inbox.sh",
100
- "asyncRewake": true
101
- }
102
- ]
103
34
  }
104
35
  ]
105
36
  }
@@ -1,17 +1,5 @@
1
1
  {
2
2
  "hooks": {
3
- "PermissionRequest": [
4
- {
5
- "matcher": ".*",
6
- "hooks": [
7
- {
8
- "type": "command",
9
- "command": "/bin/sh -c 'exec \"${CODEX_PLUGIN_ROOT:-$HOME/.codex/plugins/overlord}/scripts/agent-session-request.sh\"'",
10
- "timeout": 35
11
- }
12
- ]
13
- }
14
- ],
15
3
  "UserPromptSubmit": [
16
4
  {
17
5
  "matcher": ".*",
@@ -21,59 +9,6 @@
21
9
  "command": "/bin/sh -c 'exec \"${CODEX_PLUGIN_ROOT:-$HOME/.codex/plugins/overlord}/scripts/user-prompt-submit-hook.sh\"'"
22
10
  }
23
11
  ]
24
- },
25
- {
26
- "matcher": ".*",
27
- "hooks": [
28
- {
29
- "type": "command",
30
- "command": "/bin/sh -c 'exec \"${CODEX_PLUGIN_ROOT:-$HOME/.codex/plugins/overlord}/scripts/agent-session-event.sh\"'"
31
- }
32
- ]
33
- }
34
- ],
35
- "PreToolUse": [
36
- {
37
- "matcher": ".*",
38
- "hooks": [
39
- {
40
- "type": "command",
41
- "command": "/bin/sh -c 'exec \"${CODEX_PLUGIN_ROOT:-$HOME/.codex/plugins/overlord}/scripts/agent-session-event.sh\"'"
42
- }
43
- ]
44
- }
45
- ],
46
- "PostToolUse": [
47
- {
48
- "matcher": ".*",
49
- "hooks": [
50
- {
51
- "type": "command",
52
- "command": "/bin/sh -c 'exec \"${CODEX_PLUGIN_ROOT:-$HOME/.codex/plugins/overlord}/scripts/agent-session-event.sh\"'"
53
- }
54
- ]
55
- }
56
- ],
57
- "SessionStart": [
58
- {
59
- "matcher": ".*",
60
- "hooks": [
61
- {
62
- "type": "command",
63
- "command": "/bin/sh -c 'exec \"${CODEX_PLUGIN_ROOT:-$HOME/.codex/plugins/overlord}/scripts/agent-session-event.sh\"'"
64
- }
65
- ]
66
- }
67
- ],
68
- "Stop": [
69
- {
70
- "matcher": ".*",
71
- "hooks": [
72
- {
73
- "type": "command",
74
- "command": "/bin/sh -c 'exec \"${CODEX_PLUGIN_ROOT:-$HOME/.codex/plugins/overlord}/scripts/agent-session-inbox.sh\"'"
75
- }
76
- ]
77
12
  }
78
13
  ]
79
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord",
3
- "version": "0.3.22",
3
+ "version": "0.3.25",
4
4
  "description": "Chat-driven access to Overlord mission protocol workflows with hook-driven activity capture.",
5
5
  "author": {
6
6
  "name": "Cooperativ",
@@ -2,11 +2,11 @@
2
2
 
3
3
  # Codex CLI — Overlord agent-session capabilities
4
4
 
5
- **Adapter** `codex` · **Codec** `codex` · **Integration shape** `callback` · **Capability tier** 3 (Conversational)
5
+ **Adapter** `codex` · **Codec** `codex` · **Integration shape** `callback` · **Capability tier** 1 (Observational)
6
6
 
7
7
  **Harness version verified** `0.147.0` · **range** `>=0.124.0` · **scheme** `semver`
8
8
 
9
- **Descriptor digest** `4b318751579af39c81ea0c1ea7be718d66cda313622f1c5edb1cff5e3dfe8659`
9
+ **Descriptor digest** `e0d536667a5616d1a662c7225fc8ef439b5d7cdce1d6703e577190c9e5c6d9c5`
10
10
 
11
11
  > The tier is derived from passing fixtures, never authored. `unsupported` means the harness
12
12
  > cannot do it — do not attempt it. `not-implemented` means it is buildable and unbuilt: that is
@@ -45,28 +45,27 @@ Per-hook timeouts in seconds; the documentation gives a 600-second default. The
45
45
  | Capability | Status | Native | Evidence |
46
46
  | --- | --- | --- | --- |
47
47
  | `observe.prompt` | ✅ supported | `UserPromptSubmit` | fixtures: `fixtures/normalize-user-prompt.json` |
48
- | `observe.toolCall` | ✅ supported | `PreToolUse` | fixtures: `fixtures/normalize-pre-tool-use.json` |
49
- | `observe.toolResult` | ✅ supported | `PostToolUse` | fixtures: `fixtures/normalize-post-tool-use.json` |
50
- | `observe.fileEdit` | ✅ supported | `PostToolUse` | fixtures: `fixtures/normalize-post-tool-use.json` |
51
- | `observe.sessionLifecycle` | ✅ supported | `SessionStart` | fixtures: `fixtures/normalize-session-start.json` |
52
- | `decide.shell` | ✅ supported | `PermissionRequest` | fixtures: `fixtures/permission-request.json`, `fixtures/decision-codec.json` |
53
- | `decide.mcp` | ✅ supported | `PermissionRequest` | fixtures: `fixtures/permission-request.json`, `fixtures/decision-codec.json` |
54
- | `decide.fileWrite` | ✅ supported | `PermissionRequest` | fixtures: `fixtures/permission-request.json`, `fixtures/decision-codec.json` |
48
+ | `observe.toolCall` | 🚧 not-implemented | `PreToolUse` | tracked as `latch-engine` |
49
+ | `observe.toolResult` | 🚧 not-implemented | `PostToolUse` | tracked as `latch-engine` |
50
+ | `observe.fileEdit` | 🚧 not-implemented | `PostToolUse` | tracked as `latch-engine` |
51
+ | `observe.sessionLifecycle` | 🚧 not-implemented | `SessionStart` | tracked as `latch-engine` |
52
+ | `decide.shell` | 🚧 not-implemented | `PermissionRequest` | tracked as `latch-engine` |
53
+ | `decide.mcp` | 🚧 not-implemented | `PermissionRequest` | tracked as `latch-engine` |
54
+ | `decide.fileWrite` | 🚧 not-implemented | `PermissionRequest` | tracked as `latch-engine` |
55
55
  | `decide.anyTool` | 🚧 not-implemented | `PreToolUse` | tracked as `agent-session-phase-4` |
56
- | `decide.universal` | ✅ supported | `PermissionRequest` | fixtures: `fixtures/permission-request.json`, `fixtures/decision-codec.json` |
56
+ | `decide.universal` | 🚧 not-implemented | `PermissionRequest` | tracked as `latch-engine` |
57
57
  | `answer.structuredQuestion` | ❓ unverified | `ToolRequestUserInput` | tracked as `taxonomy-7.2` |
58
58
  | `answer.persistentAllow` | ❓ unverified | — | tracked as `taxonomy-7.4` |
59
59
  | `inject.midTurn` | ❓ unverified | `ThreadInjectItems` | tracked as `taxonomy-7.2` |
60
- | `inject.turnBoundary` | ✅ supported | `Stop` | fixtures: `fixtures/agent-session-hooks.json` |
60
+ | `inject.turnBoundary` | 🚧 not-implemented | `Stop` | tracked as `latch-engine` |
61
61
  | `inject.nextTurn` | 🚧 not-implemented | `Stop` | tracked as `agent-session-phase-4` |
62
62
  | `terminal.concurrentAnswer` | ⛔ unsupported | — | On the hook path the native prompt is drawn only after the callback returns, so the terminal cannot answer while Overlord holds the decision. (A future app-server integration could change this; it would be a different integrationShape.) (evidence: `connector-harness-taxonomy.md#12-the-axis-that-actually-matters`) |
63
63
  | `terminal.statusSurface` | ❓ unverified | — | tracked as `taxonomy-7.9` |
64
64
 
65
65
  ### Capability notes
66
66
 
67
- - **`observe.toolCall`** — PreToolUse fires for MCP tool calls, not only shell and patch tools. Re-verified against the installed 0.146.0 binary and the matching upstream tag: the upstream suite `hooks_mcp.rs` (under codex-rs/core/tests/suite) proves a PreToolUse hook can both deny and rewrite an MCP call before it executes, and the binary carries a distinct "Tool call blocked by PreToolUse hook: {}. Tool: {}" message alongside the shell-only one. `tool_name` is the full MCP identifier (`mcp__<server>__<tool>`) and the matcher matches that string, so a matcher written for a bare tool name will silently never fire.
68
- - **`observe.toolResult`** — Also covers MCP tool results, on the same 0.146.0 evidence as `observe.toolCall`. What PostToolUse cannot do is rewrite one: the binary rejects a returned `updatedMCPToolOutput` as unsupported. Observation of an MCP result is therefore reliable; mutation of it is not.
69
- - **`decide.universal`** — Codex PermissionRequest covers Bash, apply_patch/Edit/Write, and MCP tool names. The codec emits only documented allow/deny behavior and deliberately never emits reserved `updatedInput`, `updatedPermissions`, or `interrupt` fields.
67
+ - **`observe.toolCall`** — Mechanical PreToolUse observation moved to Latch `events`.
68
+ - **`decide.universal`** — Remote permission decisions moved to Latch `awaiting_input` / `latch send --resolve`.
70
69
  - **`answer.structuredQuestion`** — `codex app-server` exposes ToolRequestUserInput with per-option label/description and an autoResolutionMs — an ACP-shaped structured question in everything but name. It is unreachable until the single-subscriber question is settled.
71
70
  - **`inject.midTurn`** — ThreadInjectItems/TurnSteer exist on the experimental app-server surface only. The binary carries "expected exactly one client subscribed to the thread, found {}", so if the TUI is that one client Overlord cannot also subscribe and this path is closed.
72
71
 
@@ -81,7 +80,7 @@ Per-hook timeouts in seconds; the documentation gives a 600-second default. The
81
80
 
82
81
  **`two-integration-surfaces-could-disagree`** — Hooks and `codex app-server` can both answer a permission. A session driven by both would race in a way no revision CAS can settle, so exactly one surface must be chosen and documented before either is built.
83
82
 
84
- **`shipped-permission-hook-inert`** — The former PermissionRequest hook called a nonexistent protocol command in the background. The managed registration now invokes the fixed request runtime directly.
83
+ **`shipped-permission-hook-inert`** — The former PermissionRequest hook called a nonexistent protocol command in the background. The connector no longer registers a PermissionRequest hook; the native prompt owns approvals when Latch is absent.
85
84
 
86
85
  **`prompt-and-agent-hook-handlers-inert`** — Codex 0.146.0 accepts three hook handler types — `command`, `prompt`, and `agent` — but only `command` runs. Hook discovery parses `prompt` and `agent` and then skips them with a "not supported yet" warning, so a manifest that used either would install cleanly, list in `hooks`, and never execute. The connector must keep emitting `command` handlers only, and must not read the presence of these variants in the schema as availability. `command` is a shell command line run through `$SHELL -lc` (`/bin/sh` when SHELL is unset) — it is not restricted to Bash and not restricted to shell scripting, since the command may invoke any interpreter.
87
86