overlord-cli 0.2610231436.0 → 0.2610242007.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 (43) hide show
  1. package/README.md +2 -2
  2. package/dist/connectors/AGENTS.md +22 -5
  3. package/dist/connectors/VERSION +1 -1
  4. package/dist/connectors/adapters/antigravity/conformance-manifest.yaml +1 -1
  5. package/dist/connectors/adapters/antigravity/plugin.json +1 -1
  6. package/dist/connectors/adapters/antigravity/skills/record-work.md +2 -3
  7. package/dist/connectors/adapters/claude/.claude-plugin/plugin.json +1 -1
  8. package/dist/connectors/adapters/claude/codec/claude.codec.yaml +5 -0
  9. package/dist/connectors/adapters/claude/commands/record-work.md +2 -3
  10. package/dist/connectors/adapters/claude/conformance-manifest.yaml +1 -1
  11. package/dist/connectors/adapters/claude/fixtures/normalize-post-tool-use-notebook.json +1 -0
  12. package/dist/connectors/adapters/claude/fixtures/normalize-post-tool-use-shell.json +1 -0
  13. package/dist/connectors/adapters/claude/fixtures/normalize-post-tool-use-write.json +1 -0
  14. package/dist/connectors/adapters/codex/.codex-plugin/plugin.json +2 -2
  15. package/dist/connectors/adapters/codex/CAPABILITIES.md +2 -2
  16. package/dist/connectors/adapters/codex/codec/codex.codec.yaml +10 -1
  17. package/dist/connectors/adapters/codex/conformance-manifest.yaml +2 -2
  18. package/dist/connectors/adapters/codex/fixtures/normalize-post-tool-use-failed.json +42 -0
  19. package/dist/connectors/adapters/codex/fixtures/normalize-post-tool-use-rename.json +42 -0
  20. package/dist/connectors/adapters/codex/fixtures/normalize-post-tool-use.json +6 -3
  21. package/dist/connectors/adapters/codex/harness-capabilities.yaml +2 -0
  22. package/dist/connectors/adapters/cursor/.cursor-plugin/plugin.json +1 -1
  23. package/dist/connectors/adapters/cursor/codec/cursor.codec.yaml +5 -0
  24. package/dist/connectors/adapters/cursor/commands/record-work.md +2 -3
  25. package/dist/connectors/adapters/cursor/conformance-manifest.yaml +1 -1
  26. package/dist/connectors/adapters/cursor/fixtures/normalize-post-tool-use-write.json +1 -0
  27. package/dist/connectors/adapters/cursor/rules/overlord-local.mdc +1 -1
  28. package/dist/connectors/adapters/opencode/conformance-manifest.yaml +1 -1
  29. package/dist/connectors/adapters/pi/conformance-manifest.yaml +1 -1
  30. package/dist/connectors/core/README.md +1 -1
  31. package/dist/connectors/core/overlord-mission/SKILL.md +113 -70
  32. package/dist/connectors/core/overlord-mission/reference/cli.md +53 -63
  33. package/dist/connectors/core/overlord-mission/reference/context.md +1 -1
  34. package/dist/connectors/core/overlord-mission/reference/mcp.md +3 -2
  35. package/dist/connectors/core/overlord-mission/reference/record-work.md +23 -43
  36. package/dist/connectors/core/overlord-mission/reference/shell-escaping.md +7 -5
  37. package/dist/connectors/core/scripts/capture-change-hook.sh +6 -4
  38. package/dist/connectors/core/scripts/overlord-mcp.mjs +81 -164
  39. package/dist/connectors/docs/05-connectors-and-agent-plugins.md +3 -3
  40. package/dist/connectors/docs/testing.md +5 -0
  41. package/dist/index.js +8584 -2828
  42. package/dist/index.js.map +4 -4
  43. package/package.json +2 -2
package/README.md CHANGED
@@ -255,7 +255,7 @@ This module is the developer-facing home for three components defined in
255
255
  | Component | Stable id | What it owns |
256
256
  | -------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
257
257
  | CLI Layer | `cli` | Management command names/shapes, project linking & discovery, config file locations (`overlord.toml`, `.overlord/project.json`), human-readable output conventions |
258
- | Protocol Layer | `protocol` | `ovld protocol` subcommands and flags, session lifecycle (`attach → (update\|heartbeat)* → (ask\|deliver)`), context-assembly format, delivery payload + change-rationale recording |
258
+ | Protocol Layer | `protocol` | `ovld protocol` subcommands and flags, session lifecycle (`attach → (update\|heartbeat)* → (ask\|deliver)`), context-assembly format, delivery payload + declared-path recording |
259
259
  | Runner Layer | `runner` | `execution_requests` queue claiming and launch, working-directory resolution, `ovld runner` commands, execution-target selection |
260
260
 
261
261
  These stay distinct components in the contract (separate interaction surfaces
@@ -273,7 +273,7 @@ colocation convention):
273
273
  - [03 — Agent Protocol](https://github.com/cooperativ-labs/OpenOverlord/blob/main/cli/docs/03-agent-protocol.md): `ovld protocol` lifecycle, context assembly, updates, delivery, attachments.
274
274
  - [04 — Runner and Launch Execution](https://github.com/cooperativ-labs/OpenOverlord/blob/main/cli/docs/04-runner-and-launch-execution.md): execution requests, local runner, launch command generation, auto-advance.
275
275
  - [06 — Core Domain and Lifecycle](https://github.com/cooperativ-labs/OpenOverlord/blob/main/cli/docs/06-core-domain-and-lifecycle.md): projects, missions, objectives, sessions, events, statuses, state transitions.
276
- - [11 — Review, Artifacts, and Change Tracking](https://github.com/cooperativ-labs/OpenOverlord/blob/main/cli/docs/11-review-artifacts-and-change-tracking.md): delivery review records, artifacts, objective-ledger evidence, and optional rationale annotations.
276
+ - [11 — Review, Artifacts, and Change Tracking](https://github.com/cooperativ-labs/OpenOverlord/blob/main/cli/docs/11-review-artifacts-and-change-tracking.md): delivery review records, artifacts, objective-ledger evidence, and declared paths.
277
277
  - [Test Plan](https://github.com/cooperativ-labs/OpenOverlord/blob/main/cli/docs/testing.md): test plan for the `cli`, `protocol`, and `runner` components — management commands, protocol lifecycle/attach-shape/validation conformance, runner queue atomicity, and surface smoke tests. Part of the root [TEST_PLAN.md](https://github.com/cooperativ-labs/OpenOverlord/blob/main/TEST_PLAN.md).
278
278
 
279
279
  ### Code & Tests
@@ -85,11 +85,28 @@ A connector may invoke `ovld protocol capture-change` from a native post-mutatio
85
85
  `OVERLORD_OBJECTIVE_ID` is explicit in the launch environment. Mission scope is recovered from
86
86
  that objective's exact active-session binding; cwd never selects it. The hook must remain silent
87
87
  and perform no write when the objective id or `ovld` is unavailable. A directly named native edit
88
- path records objective-bound, non-exclusive `declared_edit`/`direct` evidence only after the
89
- connector-owned codec normalizes it as `file.edited`. The hook must pass its connector key through
90
- `--agent`; generic payload path parsing is forbidden. Codec-normalized read, search, and fetch
91
- callbacks are silent no-ops. Mutation-capable callbacks without a normalized edit path, plus shell,
92
- generic, unknown, and unmapped callbacks, record unavailable evidence health. Every hook
88
+ path records objective-bound, non-exclusive `declared_edit` evidence only after the
89
+ connector-owned codec normalizes it as `file.edited` **and** its outcome is `ok`. The hook must
90
+ pass its connector key through `--agent`; generic payload path parsing is forbidden.
91
+
92
+ Outcome is decided in the codec, never guessed in capture:
93
+
94
+ - `outcomePath` decodes a boolean, status word, or numeric exit code; `outcomeExitCodePrefix`
95
+ decodes a leading `<prefix><n>` line of a text result (Codex `apply_patch`: `Exit code: 0`).
96
+ Only the decoded value is kept.
97
+ - `successOnly: true` declares that the harness emits this event only for successful calls and
98
+ routes failures elsewhere. It must cite source/binary evidence for the harness version in the
99
+ codec comment and be pinned by a normalized-event fixture; never infer it from an event name.
100
+ - An absent or unrecognized result is unknown, never success.
101
+
102
+ Capture then applies: `ok` with exact paths appends evidence; `blocked` appends nothing;
103
+ `error`/`cancelled` append nothing and record sticky `outcome_partial` (a non-atomic edit may have
104
+ partially applied, so the agent declares actual writes); unknown records `outcome_unavailable`;
105
+ shell records `shell_activity_unverified` (coverage uncertainty, never a claimed write); other
106
+ no-path, generic, and unmapped callbacks record `direct_path_unavailable`. Codec-normalized
107
+ read, search, and fetch callbacks append no evidence but still record callback observation.
108
+ Patch-text extraction reduces `*** Add|Update|Delete File:` and `*** Move to:` headers, so a
109
+ rename keeps both endpoints. Every hook
93
110
  registration must be backed by a `script-io` fixture, and every mutation window claim must be
94
111
  backed by a `mutation-window` fixture. Claude, Codex, and Cursor render this callback from
95
112
  `connectors/core/scripts/capture-change-hook.sh`; their adapter directories own only the native
@@ -1 +1 @@
1
- 0.3.53
1
+ 0.3.57
@@ -1,4 +1,4 @@
1
- contractVersion: "164"
1
+ contractVersion: "167"
2
2
  componentType: connector
3
3
  componentKey: antigravity
4
4
  label: "Antigravity Connector"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://antigravity.google/schemas/v1/plugin.json",
3
3
  "name": "overlord",
4
- "version": "0.3.53",
4
+ "version": "0.3.57",
5
5
  "description": "Chat-driven access to Overlord mission protocol workflows through skills and MCP.",
6
6
  "author": {
7
7
  "name": "Cooperativ",
@@ -9,8 +9,7 @@ This creates a mission with one completed objective, lands it in the review colu
9
9
  Synthesize from the current conversation:
10
10
  - `objective`: what was asked / what was done (1-3 sentences).
11
11
  - `summary`: reviewer-friendly narrative of what changed and why.
12
- - `changeRationales` (optional): reviewer annotations for changes whose reason is not obvious (`filePath`, `label`, `summary`, `why`, `impact`, optional `hunks`).
13
- - `changedFiles` (optional, `record-work` only): files known from this completed chat work that have no rationale. Each entry is an object with canonical repository-relative `filePath` and optional `vcsStatus`; never infer ownership from a shared-worktree-wide status or diff.
12
+ - `declaredPaths` (optional): repository-relative paths you know this work changed, as a JSON string array (deleted files and both rename endpoints are valid). They are recorded as Declared; never infer them from a shared-worktree-wide status or diff, and never explain files one by one.
14
13
  - `title` (optional): mission title; defaults to a title derived from the objective.
15
14
  - `artifacts` (optional): `next_steps`, `test_results`, `decision`, `note`, `url`.
16
15
 
@@ -19,7 +18,7 @@ If a command argument is present, treat it as additional context to weave into t
19
18
  Run:
20
19
  `ovld protocol record-work --agent antigravity --payload-file -`
21
20
 
22
- and stream a JSON object `{ "objective": "...", "summary": "...", "artifacts": [...], "changeRationales": [...], "changedFiles": [...] }` on stdin via a single-quoted heredoc (`<<'EOF'`).
21
+ and stream a JSON object `{ "objective": "...", "summary": "...", "artifacts": [...], "declaredPaths": [...] }` on stdin via a single-quoted heredoc (`<<'EOF'`).
23
22
 
24
23
  After the command succeeds, report the new `MISSION_ID`.
25
24
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord",
3
- "version": "0.3.53",
3
+ "version": "0.3.57",
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",
@@ -33,6 +33,11 @@ events:
33
33
  origin: agent
34
34
  toolPath: tool_name
35
35
  inputPath: tool_input
36
+ # Success-only by harness contract: Claude Code's hook table (verified in the shipped
37
+ # 2.1.310 binary) reads "PostToolUse — Run after successful tool" and routes failures to
38
+ # the separate PostToolUseFailure event, which Overlord does not register. A failed or
39
+ # denied Write therefore never reaches capture as native evidence.
40
+ successOnly: true
36
41
  # A file-mutating tool becomes `file.edited` instead, so the feed can show a change
37
42
  # timeline without the reader having to know which tool names mutate files.
38
43
  fileEditKind: file.edited
@@ -9,8 +9,7 @@ Immediately record the work you just completed in this chat as a new Overlord mi
9
9
  Synthesize from the current conversation:
10
10
  - `objective`: what was asked / what was done (1–3 sentences).
11
11
  - `summary`: reviewer-friendly narrative of what changed and why.
12
- - `changeRationales` (optional): reviewer annotations for changes whose reason is not obvious (`filePath`, `label`, `summary`, `why`, `impact`, optional `hunks`).
13
- - `changedFiles` (optional, `record-work` only): files known from this completed chat work that have no rationale. Each entry is an object with canonical repository-relative `filePath` and optional `vcsStatus`; never infer ownership from a shared-worktree-wide status or diff.
12
+ - `declaredPaths` (optional): repository-relative paths you know this work changed, as a JSON string array (deleted files and both rename endpoints are valid). They are recorded as Declared; never infer them from a shared-worktree-wide status or diff, and never explain files one by one.
14
13
  - `title` (optional): mission title; defaults to a title derived from the objective.
15
14
  - `artifacts` (optional): `next_steps`, `test_results`, `decision`, `note`, `url`.
16
15
 
@@ -22,7 +21,7 @@ Run:
22
21
  and stream a single JSON object on stdin via a single-quoted heredoc (`<<'EOF'`):
23
22
 
24
23
  ```
25
- { "objective": "...", "summary": "...", "title": "...", "changeRationales": [...], "changedFiles": [...], "artifacts": [...] }
24
+ { "objective": "...", "summary": "...", "title": "...", "declaredPaths": [...], "artifacts": [...] }
26
25
  ```
27
26
 
28
27
  After the command succeeds, report the new `MISSION_ID`.
@@ -1,4 +1,4 @@
1
- contractVersion: "164"
1
+ contractVersion: "167"
2
2
  componentType: connector
3
3
  componentKey: claude
4
4
  label: "Claude Code Connector"
@@ -33,6 +33,7 @@
33
33
  "subject": "notebooks/analysis.ipynb",
34
34
  "detail": "26 bytes",
35
35
  "paths": ["notebooks/analysis.ipynb"],
36
+ "outcome": "ok",
36
37
  "formatterVersion": 1
37
38
  }
38
39
  },
@@ -38,6 +38,7 @@
38
38
  "action": "Run a shell command",
39
39
  "subject": "yarn",
40
40
  "detail": "yarn test --silent",
41
+ "outcome": "ok",
41
42
  "formatterVersion": 1
42
43
  }
43
44
  },
@@ -36,6 +36,7 @@
36
36
  "paths": [
37
37
  "config/secrets.ts"
38
38
  ],
39
+ "outcome": "ok",
39
40
  "formatterVersion": 1
40
41
  }
41
42
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord",
3
- "version": "0.3.53",
3
+ "version": "0.3.57",
4
4
  "description": "Chat-driven access to Overlord mission protocol workflows with hook-driven activity capture.",
5
5
  "author": {
6
6
  "name": "Cooperativ",
@@ -38,7 +38,7 @@
38
38
  "defaultPrompt": [
39
39
  "Attach to Overlord mission 123 and summarize the context before editing code",
40
40
  "Post an execute update to this Overlord mission after a meaningful implementation step",
41
- "Deliver this Overlord mission with artifacts and change rationales"
41
+ "Deliver this Overlord mission with a summary and any declared paths"
42
42
  ],
43
43
  "brandColor": "#1E6B5C",
44
44
  "composerIcon": "./assets/icon.png",
@@ -6,7 +6,7 @@
6
6
 
7
7
  **Harness version verified** `0.147.0` · **range** `>=0.124.0` · **scheme** `semver`
8
8
 
9
- **Descriptor digest** `4d4908a81023cf7943ebbcb35d8477751f97d916597adc3bf3cec63bdb58dc4b`
9
+ **Descriptor digest** `b3120edbb3f8a017801de0b9b085c42f05f1d7c335246e224cd283e874ddc542`
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
@@ -59,7 +59,7 @@ path. Runtime file evidence is unavailable for this adapter.
59
59
  | `observe.prompt` | ✅ supported | `UserPromptSubmit` | fixtures: `fixtures/normalize-user-prompt.json` |
60
60
  | `observe.toolCall` | 🚧 not-implemented | `PreToolUse` | tracked as `latch-engine` |
61
61
  | `observe.toolResult` | 🚧 not-implemented | `PostToolUse` | tracked as `latch-engine` |
62
- | `observe.fileEdit` | ✅ supported | `PostToolUse` | fixtures: `fixtures/normalize-post-tool-use.json`, `fixtures/agent-session-hooks.json`, `fixtures/post-tool-use-hook.json`, `fixtures/post-tool-use-unbound.json` |
62
+ | `observe.fileEdit` | ✅ supported | `PostToolUse` | fixtures: `fixtures/normalize-post-tool-use.json`, `fixtures/normalize-post-tool-use-failed.json`, `fixtures/normalize-post-tool-use-rename.json`, `fixtures/agent-session-hooks.json`, `fixtures/post-tool-use-hook.json`, `fixtures/post-tool-use-unbound.json` |
63
63
  | `observe.sessionLifecycle` | 🚧 not-implemented | `SessionStart` | tracked as `latch-engine` |
64
64
  | `decide.shell` | 🚧 not-implemented | `PermissionRequest` | tracked as `latch-engine` |
65
65
  | `decide.mcp` | 🚧 not-implemented | `PermissionRequest` | tracked as `latch-engine` |
@@ -28,13 +28,22 @@ events:
28
28
  inputPath: tool_input
29
29
  callIdPath: tool_use_id
30
30
  turnIdPath: turn_id
31
+ # Codex runs PostToolUse after a handler returns a result, but apply_patch reports its own
32
+ # failure inside that result: `tool_response` is text whose first line is `Exit code: <n>`
33
+ # (upstream codex-rs hook test `post_tool_use_records_additional_context_for_apply_patch`
34
+ # asserts the `Exit code: 0` / `Success. Updated the following files:` shape). Only the
35
+ # leading exit code is decoded; the text is never retained. A missing or unrecognized
36
+ # line stays unknown, so capture records outcome_unavailable rather than native evidence.
37
+ outcomePath: tool_response
38
+ outcomeExitCodePrefix: 'Exit code: '
31
39
  fileEditKind: file.edited
32
40
  filePathPaths:
33
41
  - file_path
34
42
  - filePath
35
43
  - path
36
44
  # Codex apply_patch carries destinations in bounded patch headers rather
37
- # than a standalone path field. The codec extracts only those headers.
45
+ # than a standalone path field. The codec extracts only Add/Update/Delete
46
+ # File and Move to headers, so a rename keeps both endpoints.
38
47
  filePathPatchTextPaths:
39
48
  - command
40
49
  - patch
@@ -1,4 +1,4 @@
1
- contractVersion: "164"
1
+ contractVersion: "167"
2
2
  componentType: connector
3
3
  componentKey: codex
4
4
  label: "Codex Connector"
@@ -14,7 +14,7 @@ connector:
14
14
  harnessCapabilities:
15
15
  path: connectors/adapters/codex/harness-capabilities.yaml
16
16
  schemaVersion: 1
17
- digest: "4d4908a81023cf7943ebbcb35d8477751f97d916597adc3bf3cec63bdb58dc4b"
17
+ digest: "b3120edbb3f8a017801de0b9b085c42f05f1d7c335246e224cd283e874ddc542"
18
18
  # ── END GENERATED ────────────────────────────────────────────────────────────
19
19
  installPath: "~/.codex/plugins/overlord"
20
20
  managedFiles:
@@ -0,0 +1,42 @@
1
+ {
2
+ "fixtureVersion": 1,
3
+ "kind": "normalized-event",
4
+ "description": "Codex PostToolUse for an apply_patch that ran and exited non-zero (`Exit code: 1`). The codec decodes outcome `error`, so capture appends no native evidence for the attempted path and records outcome_partial instead. The tool output (with a credential) never enters the envelope.",
5
+ "codec": "codec/codex.codec.yaml",
6
+ "occurredAt": "2026-08-01T00:00:00.000Z",
7
+ "payload": {
8
+ "session_id": "codex-session-1",
9
+ "turn_id": "turn-1",
10
+ "tool_use_id": "call-3",
11
+ "transcript_path": "/Users/jake/.codex/sessions/secret.jsonl",
12
+ "cwd": "/repo",
13
+ "hook_event_name": "PostToolUse",
14
+ "tool_name": "apply_patch",
15
+ "tool_input": {
16
+ "command": "*** Begin Patch\n*** Update File: /repo/src/attempted.ts\n@@\n-const a = 1;\n+const a = 'AKIAIOSFODNN7EXAMPLE';\n*** End Patch"
17
+ },
18
+ "tool_response": "Exit code: 1\nWall time: 0.1 seconds\nOutput:\nerror: hunk failed near postgres://user:hunter2@db/app\n"
19
+ },
20
+ "expect": {
21
+ "eventId": "ev_4f0111e1e5440a7f448e6fda0caaaf82",
22
+ "producerSequence": null,
23
+ "occurredAt": "2026-08-01T00:00:00.000Z",
24
+ "kind": "file.edited",
25
+ "severity": "info",
26
+ "nativeEvent": "PostToolUse",
27
+ "nativeTurnId": "turn-1",
28
+ "nativeCallId": "call-3",
29
+ "subagentId": null,
30
+ "correlationId": "codex-session-1",
31
+ "origin": "agent",
32
+ "summary": "Write a file",
33
+ "payload": {
34
+ "tool": "edit",
35
+ "action": "Write a file",
36
+ "paths": ["src/attempted.ts"],
37
+ "outcome": "error",
38
+ "formatterVersion": 1
39
+ }
40
+ },
41
+ "mustNotContain": ["AKIAIOSFODNN7EXAMPLE", "hunter2", "secret.jsonl", "/Users/jake"]
42
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "fixtureVersion": 1,
3
+ "kind": "normalized-event",
4
+ "description": "Codex PostToolUse for a successful apply_patch rename plus delete. `*** Move to:` is reduced alongside Update/Delete headers so both rename endpoints and the deleted path become exact evidence; hunk content never enters the envelope.",
5
+ "codec": "codec/codex.codec.yaml",
6
+ "occurredAt": "2026-08-01T00:00:00.000Z",
7
+ "payload": {
8
+ "session_id": "codex-session-1",
9
+ "turn_id": "turn-1",
10
+ "tool_use_id": "call-4",
11
+ "transcript_path": "/Users/jake/.codex/sessions/secret.jsonl",
12
+ "cwd": "/repo",
13
+ "hook_event_name": "PostToolUse",
14
+ "tool_name": "apply_patch",
15
+ "tool_input": {
16
+ "command": "*** Begin Patch\n*** Update File: /repo/src/old-name.ts\n*** Move to: /repo/src/new-name.ts\n@@\n-export const key = 'AKIAIOSFODNN7EXAMPLE';\n+export const key = process.env.KEY;\n*** Delete File: /repo/src/removed.ts\n*** End Patch"
17
+ },
18
+ "tool_response": "Exit code: 0\nWall time: 0.1 seconds\nOutput:\nSuccess. Updated the following files:\nM src/new-name.ts\nD src/removed.ts\n"
19
+ },
20
+ "expect": {
21
+ "eventId": "ev_93222a9e39bc13fdd124587e3a68962e",
22
+ "producerSequence": null,
23
+ "occurredAt": "2026-08-01T00:00:00.000Z",
24
+ "kind": "file.edited",
25
+ "severity": "info",
26
+ "nativeEvent": "PostToolUse",
27
+ "nativeTurnId": "turn-1",
28
+ "nativeCallId": "call-4",
29
+ "subagentId": null,
30
+ "correlationId": "codex-session-1",
31
+ "origin": "agent",
32
+ "summary": "Write a file",
33
+ "payload": {
34
+ "tool": "edit",
35
+ "action": "Write a file",
36
+ "paths": ["src/old-name.ts", "src/new-name.ts", "src/removed.ts"],
37
+ "outcome": "ok",
38
+ "formatterVersion": 1
39
+ }
40
+ },
41
+ "mustNotContain": ["AKIAIOSFODNN7EXAMPLE", "hunter2", "secret.jsonl", "/Users/jake"]
42
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "fixtureVersion": 1,
3
3
  "kind": "normalized-event",
4
- "description": "Recorded Codex PostToolUse payload proving file edits are reduced to structural metadata and never leak written content or tool output.",
4
+ "description": "Codex PostToolUse apply_patch payload in the upstream hook shape (tool_input.command patch text; tool_response text whose first line is `Exit code: 0`). Proves the edit is reduced to structural metadata plus a decoded `ok` outcome and never leaks written content or tool output.",
5
5
  "codec": "codec/codex.codec.yaml",
6
6
  "occurredAt": "2026-08-01T00:00:00.000Z",
7
7
  "payload": {
@@ -12,8 +12,10 @@
12
12
  "cwd": "/repo",
13
13
  "hook_event_name": "PostToolUse",
14
14
  "tool_name": "apply_patch",
15
- "tool_input": { "command": "*** Begin Patch\n*** Update File: /repo/src/token.ts\n+const key = 'AKIAIOSFODNN7EXAMPLE';\n*** End Patch" },
16
- "tool_response": { "text": "changed with postgres://user:hunter2@db/app" }
15
+ "tool_input": {
16
+ "command": "*** Begin Patch\n*** Update File: /repo/src/token.ts\n+const key = 'AKIAIOSFODNN7EXAMPLE';\n*** End Patch"
17
+ },
18
+ "tool_response": "Exit code: 0\nWall time: 0.1 seconds\nOutput:\nSuccess. Updated the following files:\nM src/token.ts\nconnected with postgres://user:hunter2@db/app\n"
17
19
  },
18
20
  "expect": {
19
21
  "eventId": "ev_bf289659aca425896e8c26747d35c87e",
@@ -32,6 +34,7 @@
32
34
  "tool": "edit",
33
35
  "action": "Write a file",
34
36
  "paths": ["src/token.ts"],
37
+ "outcome": "ok",
35
38
  "formatterVersion": 1
36
39
  }
37
40
  },
@@ -75,6 +75,8 @@ capabilities:
75
75
  native: PostToolUse
76
76
  fixtures:
77
77
  - fixtures/normalize-post-tool-use.json
78
+ - fixtures/normalize-post-tool-use-failed.json
79
+ - fixtures/normalize-post-tool-use-rename.json
78
80
  - fixtures/agent-session-hooks.json
79
81
  - fixtures/post-tool-use-hook.json
80
82
  - fixtures/post-tool-use-unbound.json
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord",
3
- "version": "0.3.53",
3
+ "version": "0.3.57",
4
4
  "description": "Overlord mission protocol workflow for Cursor — attach/update/ask/deliver, slash commands, MCP bridge, and follow-up capture.",
5
5
  "author": {
6
6
  "name": "Cooperativ",
@@ -68,6 +68,11 @@ events:
68
68
  toolPath: tool_name
69
69
  inputPath: tool_input
70
70
  callIdPath: call_id
71
+ # Success-only by harness contract. The shipped cursor-agent 2026.09.23 executor fires
72
+ # postToolUse from `fireSuccessAsync` only when the tool result `isSuccess` (or its stream
73
+ # succeeded); errors, aborts, and preToolUse/permission denials go to `postToolUseFailure`
74
+ # with `error_message`/`failure_type`, which Overlord does not register.
75
+ successOnly: true
71
76
  fileEditKind: file.edited
72
77
  # Live Cursor Write payloads use file_path; path/filePath match the write
73
78
  # formatter's key order so an alternate Cursor dialect still captures.
@@ -3,14 +3,13 @@ Immediately record the work you just completed in this chat as a new Overlord mi
3
3
  Synthesize from the current conversation:
4
4
  - `objective`: what was asked / what was done.
5
5
  - `summary`: reviewer-friendly narrative of what changed and why.
6
- - `changeRationales` (optional): reviewer annotations for changes whose reason is not obvious (`filePath`, `label`, `summary`, `why`, `impact`, optional `hunks`).
7
- - `changedFiles` (optional, `record-work` only): files known from this completed chat work that have no rationale. Each entry is an object with canonical repository-relative `filePath` and optional `vcsStatus`; never infer ownership from a shared-worktree-wide status or diff.
6
+ - `declaredPaths` (optional): repository-relative paths you know this work changed, as a JSON string array (deleted files and both rename endpoints are valid). They are recorded as Declared; never infer them from a shared-worktree-wide status or diff, and never explain files one by one.
8
7
  - `title` (optional): mission title; defaults to a title derived from the objective.
9
8
  - `artifacts` (optional): `next_steps`, `test_results`, `decision`, `note`, `url`.
10
9
 
11
10
  If text was provided after `/record-work`, treat it as additional context for the summary.
12
11
 
13
- Run `ovld protocol record-work --payload-file -` and stream a single JSON object `{ "objective": "...", "summary": "...", "title": "...", "changeRationales": [...], "changedFiles": [...], "artifacts": [...] }` on stdin via a single-quoted heredoc.
12
+ Run `ovld protocol record-work --payload-file -` and stream a single JSON object `{ "objective": "...", "summary": "...", "title": "...", "declaredPaths": [...], "artifacts": [...] }` on stdin via a single-quoted heredoc.
14
13
 
15
14
  After the command succeeds, report the new MISSION_ID.
16
15
 
@@ -1,4 +1,4 @@
1
- contractVersion: "164"
1
+ contractVersion: "167"
2
2
  componentType: connector
3
3
  componentKey: cursor
4
4
  label: "Cursor Connector"
@@ -34,6 +34,7 @@
34
34
  "subject": "config/secrets.ts",
35
35
  "detail": "99 bytes",
36
36
  "paths": ["config/secrets.ts"],
37
+ "outcome": "ok",
37
38
  "formatterVersion": 1
38
39
  }
39
40
  },
@@ -9,5 +9,5 @@ alwaysApply: true
9
9
  - If the user asks from chat to use Overlord, use `/prompt` for new missions, `/load` for read-only context by mission ID, `/connect` to route the session onto an existing mission, and `/attach` when the user explicitly wants execution.
10
10
  - If you need other protocol commands or flags, run `ovld protocol help` instead of guessing.
11
11
 
12
- Normal delivery is summary-only; the objective ledger syncs independently. Use `ovld protocol changes` only to inspect ledger sync and hook health, never to infer ownership from a shared worktree.
12
+ Normal delivery is summary-only; the objective ledger syncs independently. Before delivering, read the captured paths once with `ovld protocol changes --objective-id <id>`, declare only files you know you changed that capture missed with `--paths` / `--paths-file`, and summarize by behavior or component. Never diff a shared worktree or infer ownership from it.
13
13
  **Never revert, restore, or delete file changes from other agents or missions.** Leave unrelated dirty files intact.
@@ -1,4 +1,4 @@
1
- contractVersion: "164"
1
+ contractVersion: "167"
2
2
  componentType: connector
3
3
  componentKey: opencode
4
4
  label: "OpenCode Connector"
@@ -1,4 +1,4 @@
1
- contractVersion: "164"
1
+ contractVersion: "167"
2
2
  componentType: connector
3
3
  componentKey: pi
4
4
  label: "PI Connector"
@@ -21,7 +21,7 @@ follow:
21
21
  - treat mission context as authoritative
22
22
  - update or heartbeat while working
23
23
  - ask exactly one blocking question and stop
24
- - deliver last with artifacts and change rationales
24
+ - deliver last with a behavior-level summary, declaring only paths native capture missed
25
25
  - use safe stdin/file flags for shell-special payloads
26
26
  - repair local auth/setup before asking the user to intervene
27
27