@getmarrow/mcp 3.9.73 → 3.9.74
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/README.md +24 -19
- package/dist/cli.js +28 -26
- package/dist/cli.js.map +1 -1
- package/dist/hook-context.d.ts +1 -1
- package/dist/hook-context.d.ts.map +1 -1
- package/dist/hook-context.js +5 -9
- package/dist/hook-context.js.map +1 -1
- package/dist/hook-contract.d.ts +28 -15
- package/dist/hook-contract.d.ts.map +1 -1
- package/dist/hook-contract.js +60 -25
- package/dist/hook-contract.js.map +1 -1
- package/dist/hook-pre-action.d.ts +2 -0
- package/dist/hook-pre-action.d.ts.map +1 -1
- package/dist/hook-pre-action.js +52 -12
- package/dist/hook-pre-action.js.map +1 -1
- package/dist/hook-session.d.ts +1 -1
- package/dist/hook-session.d.ts.map +1 -1
- package/dist/hook-session.js +4 -6
- package/dist/hook-session.js.map +1 -1
- package/dist/hook.d.ts +1 -1
- package/dist/hook.d.ts.map +1 -1
- package/dist/hook.js +4 -6
- package/dist/hook.js.map +1 -1
- package/dist/host-capability.d.ts +23 -16
- package/dist/host-capability.d.ts.map +1 -1
- package/dist/host-capability.js +41 -61
- package/dist/host-capability.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +167 -120
- package/dist/index.js.map +1 -1
- package/dist/lifecycle-spool.d.ts +1 -5
- package/dist/lifecycle-spool.d.ts.map +1 -1
- package/dist/lifecycle-spool.js +11 -28
- package/dist/lifecycle-spool.js.map +1 -1
- package/package.json +1 -1
- package/scripts/control-path-canary.cjs +28 -2
- package/server.json +2 -2
package/README.md
CHANGED
|
@@ -66,7 +66,7 @@ Set the key through trusted secret storage:
|
|
|
66
66
|
export MARROW_API_KEY=mrw_live_...
|
|
67
67
|
```
|
|
68
68
|
|
|
69
|
-
For
|
|
69
|
+
For Claude Code's cooperative pre-action hook, Marrow accepts the process environment or an owner-controlled `~/.marrow/env` file with owner-only permissions. Repository-local `.env` files are intentionally ignored so project content cannot replace the account, agent, or API endpoint used for guidance. The public hook callback is still a client self-report, not certified host provenance or an external enforcement boundary.
|
|
70
70
|
|
|
71
71
|
Then configure the MCP server:
|
|
72
72
|
|
|
@@ -104,9 +104,9 @@ npx -y --package=@getmarrow/mcp@latest marrow-mcp ping
|
|
|
104
104
|
|
|
105
105
|
Detection and notification are automatic. After explicit installer activation, the local controller may restore only Marrow-managed hooks/configuration. Package upgrades, owner policy, credentials, and unrelated configuration remain explicit and subject to the operator's normal change policy.
|
|
106
106
|
|
|
107
|
-
## What's New in v3.9.
|
|
107
|
+
## What's New in v3.9.74
|
|
108
108
|
|
|
109
|
-
v3.9.
|
|
109
|
+
v3.9.74 keeps one automatic operation bound to its original runtime authorization and decision across timeout and proof-required retries, then closes that exact decision once verified proof is supplied. One outer `marrow_auto` invocation normally completes think and commit in-band within its bounded eight-second client budget. The release canary allows that complete client budget plus bounded response overhead rather than cutting the operation off at five seconds.
|
|
110
110
|
|
|
111
111
|
## Previous: v3.9.72
|
|
112
112
|
|
|
@@ -119,6 +119,7 @@ v3.9.71 makes the advertised Grok control loop true:
|
|
|
119
119
|
- default tools include `marrow_think` so the official loop can create a `decision_id` without `MARROW_TOOL_PROFILE=full`;
|
|
120
120
|
- process identity prefers `MARROW_KEY_<ROLE>` when it matches `MARROW_AGENT_ID`, so a leaked fleet env cannot 403 every status call;
|
|
121
121
|
- Grok native hooks are installed under `~/.grok/hooks/marrow.json` and hook parsers accept Grok camelCase envelopes;
|
|
122
|
+
- Grok hooks are advisory telemetry/context only. Consequential execution requires `npx @getmarrow/install run --agent <agent-id> -- -- <command>`;
|
|
122
123
|
- idle spool nudge drains up to 40 current-namespace events so the queue does not sit as a nag;
|
|
123
124
|
- if `risk_gate.enforced` is false, the gate is advisory — do not describe it as a live block;
|
|
124
125
|
- `marrow_commit.decision_id` comes from `marrow_think`, `marrow_auto`, or an arbitration runtime that actually created a decision. A normal runtime authorization is a gate receipt, not a decision.
|
|
@@ -186,9 +187,9 @@ v3.9.62 integrates four model-neutral reliability and capability contracts:
|
|
|
186
187
|
- standalone `marrow_status` uses the bounded compact API contract and can return a fresh, owner-only last-known status projection without treating it as a live gate or authorization;
|
|
187
188
|
- ordinary runtime responses expose typed `runtime_authorization` backed by the authoritative gate receipt and omit `decision_id` unless the server actually created a decision;
|
|
188
189
|
- `spool-status` and `drain-spool` report the active credential namespace separately from isolated legacy debt, and a clear active namespace exits successfully without replaying, merging, editing, or deleting old-key files;
|
|
189
|
-
- initialize, prompt, setup, and tool responses qualify coverage by `host_capability`: MCP tools are on demand, while
|
|
190
|
+
- initialize, prompt, setup, and tool responses qualify coverage by `host_capability`: MCP tools are on demand, while client-self-reported hook activity remains visible but never certifies coverage or control.
|
|
190
191
|
|
|
191
|
-
The default surface is seven tools (runtime, think, commit, ask, status, auto, handoff status) and the prompt remains named `marrow-always-on`. Host and model labels are display-only and never change auth, tenant, plan, policy, proof, schema, or API behavior. Grok
|
|
192
|
+
The default surface is seven tools (runtime, think, commit, ask, status, auto, handoff status) and the prompt remains named `marrow-always-on`. Host and model labels are display-only and never change auth, tenant, plan, policy, proof, schema, or API behavior. Grok hook activity is advisory and client-self-reported; the governed wrapper is the consequential-action boundary.
|
|
192
193
|
|
|
193
194
|
## Previous: v3.9.61
|
|
194
195
|
|
|
@@ -204,14 +205,14 @@ v3.9.61 keeps an authoritative proof-pack rejection distinct from a control-path
|
|
|
204
205
|
v3.9.60 restores the complete control-and-proof loop for ordinary MCP clients:
|
|
205
206
|
|
|
206
207
|
- cached guidance no longer cuts live status, ask, runtime, or handoff reads down to an impossible 500 ms deadline;
|
|
207
|
-
- `marrow_auto` waits for the bounded think-and-commit path and reports the live decision and proof result in-band;
|
|
208
|
+
- `marrow_auto` normally waits for the bounded think-and-commit path and reports the live decision and proof result in-band; if the client deadline is reached, the returned operation ID continues that same decision;
|
|
208
209
|
- `marrow_commit` now shares the same abort and deadline contract as the other control calls;
|
|
209
210
|
- transient retries use a one-second delay so a slow edge path is not immediately hit again;
|
|
210
211
|
- spool status surfaces backlogs under older credential namespaces without replaying them across an unverified tenant boundary;
|
|
211
212
|
- a plan-gated handoff is reported as unavailable for the current plan, not as an API or authentication outage;
|
|
212
213
|
- the release canary runs with the customer's default client deadlines instead of silently overriding them.
|
|
213
214
|
|
|
214
|
-
MCP-only hosts
|
|
215
|
+
The current package gives MCP-only hosts the same model-neutral control instructions and seven-tool default surface, but MCP transport alone remains on demand. A host or model label never changes that coverage contract. Public lifecycle callbacks and hook activity are client-self-reported and cannot verify or certify passive coverage; independent authority is required. Codex, Grok, Gemini, and similar CLI harnesses must use `npx @getmarrow/install run --agent <agent-id> -- -- <command>` for consequential commands.
|
|
215
216
|
|
|
216
217
|
## Previous: v3.9.59
|
|
217
218
|
|
|
@@ -290,7 +291,7 @@ It preserves the signed action-permit and update controls introduced in v3.9.52.
|
|
|
290
291
|
|
|
291
292
|
## Previous: v3.9.52
|
|
292
293
|
|
|
293
|
-
v3.9.52 combines operator-controlled client update notices with signed, action-bound permit verification in
|
|
294
|
+
v3.9.52 combines operator-controlled client update notices with signed, action-bound permit verification in the cooperative Claude Code hook path. That permit flow does not authenticate hook provenance or certify always-on coverage. Official MCP requests identify the installed package version, and passive context renders a request-specific server advisory with exact update and verification commands:
|
|
294
295
|
|
|
295
296
|
- update availability or unrecognized version metadata appears during normal authenticated runtime/status activity;
|
|
296
297
|
- messaging clearly states that hosted Marrow services are already current and that no local change was applied;
|
|
@@ -298,7 +299,7 @@ v3.9.52 combines operator-controlled client update notices with signed, action-b
|
|
|
298
299
|
- unknown versions do not imply a vulnerability, while server-designated security requirements remain distinct;
|
|
299
300
|
- existing MCP tools and older server responses remain compatible when no advisory is returned.
|
|
300
301
|
|
|
301
|
-
The
|
|
302
|
+
The Claude Code `PreToolUse` hook cooperatively verifies the permit before returning control to that harness. It obtains the runtime gate, records the exact governed decision, requests a permit bound to that gate, decision, target, and canonical action surfaces, and consumes it before returning. The callback itself remains client-self-reported and is not a certified external choke point:
|
|
302
303
|
|
|
303
304
|
- protected deploy, publish, merge, migration, credential, and production actions fail closed on timeout or permit failure;
|
|
304
305
|
- the permit is bound to the authenticated account, key, agent, session, action, target, canonical action surfaces, decision, and runtime gate;
|
|
@@ -307,13 +308,13 @@ The native `PreToolUse` hook verifies the permit before protected work can execu
|
|
|
307
308
|
- the bounded hook timeout prevents a control-plane wait from hanging the agent indefinitely;
|
|
308
309
|
- low-risk work retains passive/advisory behavior unless account policy requires stronger enforcement.
|
|
309
310
|
|
|
310
|
-
It preserves
|
|
311
|
+
It preserves native-hook activity diagnostics introduced in v3.9.50, with the current trust boundary applied:
|
|
311
312
|
|
|
312
|
-
- agents and owners can distinguish “MCP configured” from
|
|
313
|
+
- agents and owners can distinguish “MCP configured” from client-reported pre-action, result, and session activity without treating either as certification;
|
|
313
314
|
- `PreToolUse` requests the Marrow runtime gate before matched actions and maps `block` to deny and `review_required` to operator review;
|
|
314
315
|
- matching `PreToolUse` and result hooks share Claude Code's tool-use correlation while the session shares one workflow identity;
|
|
315
|
-
- generic integration events cannot claim native-hook coverage
|
|
316
|
-
- retries preserve correlation and
|
|
316
|
+
- generic integration events and public hook entrypoints cannot claim certified native-hook coverage;
|
|
317
|
+
- retries preserve correlation and explicitly `client_self_reported` activity in the owner-only durable spool;
|
|
317
318
|
- configuration drift can be diagnosed without sending configuration contents;
|
|
318
319
|
- missing outcome closure remains visible rather than treating tool or session exit as business success;
|
|
319
320
|
- existing MCP tools and lifecycle inputs remain compatible.
|
|
@@ -334,16 +335,16 @@ It preserves `marrow_arbitrate` from v3.9.49, the session-orientation hardening
|
|
|
334
335
|
|
|
335
336
|
Existing MCP tools and stable context API names remain compatible. Authentication, policy, proof, and validation failures are surfaced rather than retried as network failures.
|
|
336
337
|
|
|
337
|
-
|
|
338
|
+
Client hook activity alone never produces certified coverage percentages. An installed config or API-key-authenticated callback is shown as client-self-reported activity; certification requires an independent authority not supplied by the public MCP hook entrypoints.
|
|
338
339
|
|
|
339
340
|
## Governed Action Flow
|
|
340
341
|
|
|
341
|
-
|
|
342
|
+
Configured hooks can provide cooperative telemetry and context, but they are not a certified execution boundary. Before deploys, merges, publishes, migrations, credential changes, financial operations, or customer-impacting work:
|
|
342
343
|
|
|
343
344
|
1. Call `marrow_agent_runtime` or `marrow_decision_brief`.
|
|
344
345
|
2. Stop when the returned decision is `block` or `review_required`; otherwise follow its prior lesson and proof contract.
|
|
345
346
|
3. Call `marrow_think` or `marrow_auto` to record intent and obtain the `decision_id` that will be closed. Keep `marrow_agent_runtime.runtime_authorization.id` separate as the gate receipt for consequential work.
|
|
346
|
-
4. Perform the action only when its gate allows it. For
|
|
347
|
+
4. Perform the action only when its gate allows it. For Codex, Grok, Gemini, and similar CLI harnesses, use the governed wrapper: `npx @getmarrow/install run --agent <agent-id> -- -- <command>`.
|
|
347
348
|
5. Call `marrow_commit` with that `decision_id`, the outcome, gate receipt, and required proof.
|
|
348
349
|
|
|
349
350
|
`marrow_agent_runtime` returns `runtime_authorization` with the authoritative gate receipt. Ordinary runtime checks do not create a decision, so they omit `decision_id`; call `marrow_think` (or use `marrow_auto`) when a decision must be created and closed. An arbitration runtime that actually creates a decision returns that server-created `decision_id`. This contract is identical across MCP-compatible hosts and SDK-owned runtimes.
|
|
@@ -444,22 +445,26 @@ it does not run models, retain prompts, or infer a winner from labels.
|
|
|
444
445
|
|
|
445
446
|
## Passive Use
|
|
446
447
|
|
|
447
|
-
`npx -y --package=@getmarrow/mcp@latest marrow-mcp setup` configures supported prompt, pre-action, tool-result, and session-stop hooks. Configuration
|
|
448
|
+
`npx -y --package=@getmarrow/mcp@latest marrow-mcp setup` configures supported prompt, pre-action, tool-result, and session-stop hooks. Configuration, public hook argv, and API-key-authenticated callbacks are client self-reports. They preserve raw lifecycle activity but do not prove that the host invoked a hook or certify passive control.
|
|
448
449
|
|
|
449
450
|
### Capability and coverage contract
|
|
450
451
|
|
|
451
452
|
| Integration mode | Coverage Marrow can claim |
|
|
452
453
|
| --- | --- |
|
|
453
454
|
| MCP tools-only | On demand; covers only explicit MCP tool calls |
|
|
454
|
-
|
|
|
455
|
+
| Configured native hooks | Cooperative telemetry/context only; activity is client-self-reported and coverage remains unverified |
|
|
455
456
|
| `createPassiveRuntime().install()` | Only the owned Node process, and only while that runtime is installed and running |
|
|
456
457
|
| Governed runner | Only the command launched through the wrapper |
|
|
457
458
|
| Custom host | Requires a bounded event adapter; covers only the lifecycle events whose receipts Marrow observes |
|
|
458
459
|
|
|
459
|
-
This contract is model-neutral. A model name, host header, config file, installed hook entry,
|
|
460
|
+
This contract is model-neutral. A model name, host header, API key, public hook entrypoint, config file, installed hook entry, successful MCP handshake, or client-self-reported lifecycle callback does not certify passive coverage or enforcement. An unknown MCP host therefore gets the generic `mcp-client` identity and the same on-demand tools, schemas, and API semantics as a named host.
|
|
460
461
|
|
|
461
462
|
When invoked by a supported host, the configured hooks send compact classifications and lifecycle receipts. They do not need raw prompts, completions, command output, tool output, or credentials. A completed tool or session does not automatically become a successful business outcome; explicit success/failure closure is required.
|
|
462
463
|
|
|
464
|
+
Setup installs distinct Claude Code and Grok hook entrypoints. The public entrypoint supplies only a client-reported display label; it is not host provenance. Hook event JSON cannot select the lifecycle harness or agent. Agent identity comes only from owner configuration when present, otherwise the request omits it so the authenticated service can derive the credential-bound identity. Every hook lifecycle event is marked `source: client_self_reported` and omits `capability_level: native_hooks`, adapter certification, configuration fingerprints, expected hooks, and observed-hook certification fields. Legacy, unknown, and custom entrypoints stay generic.
|
|
465
|
+
|
|
466
|
+
Claude Code hooks may cooperatively request guidance and apply the harness permission response, but that does not certify always-on control. Grok hooks are advisory telemetry/context only: `grok-pre-action-hook` never issues, verifies, or consumes an action permit and never claims enforcement. Codex, Grok, Gemini, and similar CLI harnesses must run consequential commands through `npx @getmarrow/install run --agent <agent-id> -- -- <command>`. Unknown and custom hosts remain on demand unless they provide a bounded event adapter, whose activity is still not certification without an independent authority.
|
|
467
|
+
|
|
463
468
|
Transient lifecycle receipts use a bounded owner-only spool and are retried with stable event IDs. Operators can inspect and drain it without exposing event content:
|
|
464
469
|
|
|
465
470
|
```bash
|
package/dist/cli.js
CHANGED
|
@@ -40,16 +40,16 @@ function parseArgs() {
|
|
|
40
40
|
if (args[i] === 'setup' || args[i] === '--setup') {
|
|
41
41
|
result.setup = true;
|
|
42
42
|
}
|
|
43
|
-
if (
|
|
43
|
+
if (['hook', '--hook', 'claude-hook', 'grok-hook'].includes(args[i])) {
|
|
44
44
|
result.hook = true;
|
|
45
45
|
}
|
|
46
|
-
if (
|
|
46
|
+
if (['context-hook', '--context-hook', 'claude-context-hook', 'grok-context-hook'].includes(args[i])) {
|
|
47
47
|
result.contextHook = true;
|
|
48
48
|
}
|
|
49
|
-
if (
|
|
49
|
+
if (['pre-action-hook', '--pre-action-hook', 'claude-pre-action-hook', 'grok-pre-action-hook'].includes(args[i])) {
|
|
50
50
|
result.preActionHook = true;
|
|
51
51
|
}
|
|
52
|
-
if (
|
|
52
|
+
if (['session-hook', '--session-hook', 'claude-session-hook', 'grok-session-hook'].includes(args[i])) {
|
|
53
53
|
result.sessionHook = true;
|
|
54
54
|
}
|
|
55
55
|
if (args[i] === 'spool-status' || args[i] === '--spool-status') {
|
|
@@ -162,7 +162,7 @@ function runSetup() {
|
|
|
162
162
|
|
|
163
163
|
Use Marrow according to the capability evidence returned by the MCP server:
|
|
164
164
|
|
|
165
|
-
1. **MCP baseline is on demand:** MCP transport exposes tools; it does not provide passive hooks.
|
|
165
|
+
1. **MCP baseline is on demand:** MCP transport exposes tools; it does not provide passive hooks. Public hook callbacks and local configuration are client-self-reported activity, not certified coverage.
|
|
166
166
|
2. **Before risky actions:** Respect the returned \`allow\`, \`warn\`, \`review_required\`, or \`block\` decision and its proof contract. Call \`marrow_agent_runtime\` explicitly when verified passive coverage cannot cover the action.
|
|
167
167
|
3. **After meaningful work:** Record the real success or failure with \`marrow_commit\` or \`marrow_auto\`. A tool exit or session end is not proof that the business outcome succeeded.
|
|
168
168
|
4. **Unfinished work:** Leave pending outcomes visible. Do not invent success to clear a closure item.
|
|
@@ -172,9 +172,9 @@ Use Marrow according to the capability evidence returned by the MCP server:
|
|
|
172
172
|
|
|
173
173
|
Do not skip the gate or outcome. Marrow's value comes from controlling the action before execution and preserving evidence afterward.
|
|
174
174
|
|
|
175
|
-
Capability boundaries:
|
|
175
|
+
Capability boundaries: configured native hooks provide cooperative telemetry or context only; \`createPassiveRuntime().install()\` covers only its owned Node process while installed; a governed wrapper covers only its wrapped command; and a custom host needs a bounded event adapter. A model name, host label, API key, public hook entrypoint, installed configuration, or client-self-reported callback is not proof of coverage or enforcement. For Codex, Grok, Gemini, and similar CLI harnesses, run consequential commands through \`npx @getmarrow/install run --agent <agent-id> -- -- <command>\`.
|
|
176
176
|
|
|
177
|
-
For
|
|
177
|
+
For bounded outcome capture: \`marrow_auto({ action: "did X", outcome: "result Y", success: true })\`. One outer invocation normally completes think and commit in-band within its bounded client budget. If the host or network deadline is reached, retry with the returned \`operation_id\`; Marrow continues the same operation and never opens a second decision.
|
|
178
178
|
${MARROW_BLOCK_END}`;
|
|
179
179
|
let dir = process.cwd();
|
|
180
180
|
let claudeMdPath = null;
|
|
@@ -217,44 +217,44 @@ ${MARROW_BLOCK_END}`;
|
|
|
217
217
|
}
|
|
218
218
|
const hookInstall = (0, hook_1.installPostToolUseHook)(process.cwd());
|
|
219
219
|
if (hookInstall.installed) {
|
|
220
|
-
process.stdout.write('Configured PostToolUse hook.
|
|
220
|
+
process.stdout.write('Configured PostToolUse hook. Activity is client-self-reported and does not certify action-result coverage.\n');
|
|
221
221
|
}
|
|
222
222
|
else {
|
|
223
|
-
process.stdout.write('PostToolUse hook configuration is present.
|
|
223
|
+
process.stdout.write('PostToolUse hook configuration is present. Activity is client-self-reported and does not certify action-result coverage.\n');
|
|
224
224
|
}
|
|
225
225
|
const contextHookInstall = (0, hook_context_1.installUserPromptSubmitHook)(process.cwd());
|
|
226
226
|
if (contextHookInstall.installed) {
|
|
227
|
-
process.stdout.write('Configured UserPromptSubmit hook.
|
|
227
|
+
process.stdout.write('Configured UserPromptSubmit hook. Activity is client-self-reported and does not certify passive prompt coverage.\n');
|
|
228
228
|
}
|
|
229
229
|
else {
|
|
230
|
-
process.stdout.write('UserPromptSubmit hook configuration is present.
|
|
230
|
+
process.stdout.write('UserPromptSubmit hook configuration is present. Activity is client-self-reported and does not certify passive prompt coverage.\n');
|
|
231
231
|
}
|
|
232
232
|
const preActionHookInstall = (0, hook_pre_action_1.installPreActionHook)(process.cwd());
|
|
233
233
|
if (preActionHookInstall.installed) {
|
|
234
|
-
process.stdout.write('Configured PreToolUse hook.
|
|
234
|
+
process.stdout.write('Configured PreToolUse hook. Activity is client-self-reported and does not certify pre-action control.\n');
|
|
235
235
|
}
|
|
236
236
|
else {
|
|
237
|
-
process.stdout.write('PreToolUse hook configuration is present.
|
|
237
|
+
process.stdout.write('PreToolUse hook configuration is present. Activity is client-self-reported and does not certify pre-action control.\n');
|
|
238
238
|
}
|
|
239
239
|
const sessionHookInstall = (0, hook_session_1.installSessionEndHook)(process.cwd());
|
|
240
240
|
if (sessionHookInstall.installed) {
|
|
241
|
-
process.stdout.write('Configured Stop hook.
|
|
241
|
+
process.stdout.write('Configured Stop hook. Activity is client-self-reported and does not certify session-end coverage.\n');
|
|
242
242
|
}
|
|
243
243
|
else {
|
|
244
|
-
process.stdout.write('Stop hook configuration is present.
|
|
244
|
+
process.stdout.write('Stop hook configuration is present. Activity is client-self-reported and does not certify session-end coverage.\n');
|
|
245
245
|
}
|
|
246
246
|
const grokHookInstall = (0, hook_contract_1.installGrokNativeHooks)();
|
|
247
247
|
if (grokHookInstall.installed) {
|
|
248
|
-
process.stdout.write(`Configured Grok
|
|
248
|
+
process.stdout.write(`Configured Grok advisory hooks at ${grokHookInstall.settingsPath}. Their activity is client-self-reported and never certifies coverage or enforcement; consequential commands require npx @getmarrow/install run --agent <agent-id> -- -- <command>.\n`);
|
|
249
249
|
}
|
|
250
250
|
else {
|
|
251
|
-
process.stdout.write(`Grok
|
|
251
|
+
process.stdout.write(`Grok advisory hook configuration is present at ${grokHookInstall.settingsPath}. Its activity is client-self-reported and never certifies coverage or enforcement; consequential commands require npx @getmarrow/install run --agent <agent-id> -- -- <command>.\n`);
|
|
252
252
|
}
|
|
253
253
|
process.stdout.write(`Hook settings: ${hookInstall.settingsPath}\n`);
|
|
254
254
|
process.stdout.write('Set MARROW_AUTO_HOOK=false to disable passive hooks.\n');
|
|
255
255
|
process.stdout.write('Set MARROW_PASSIVE_BRIEF=false to disable automatic decision briefs, or MARROW_PASSIVE_BRIEF=always to brief every prompt.\n');
|
|
256
256
|
process.stdout.write('Set MARROW_HOOK_DEBUG=true for write-side hook diagnostics, or MARROW_CONTEXT_HOOK_DEBUG=true for prompt-context diagnostics.\n');
|
|
257
|
-
process.stdout.write('Setup completed. MCP tools remain on demand;
|
|
257
|
+
process.stdout.write('Setup completed. MCP tools remain on demand; configured hook activity is client-self-reported and does not certify passive coverage or enforcement.\n');
|
|
258
258
|
process.exit(0);
|
|
259
259
|
}
|
|
260
260
|
const cliArgs = parseArgs();
|
|
@@ -902,7 +902,7 @@ if (process.argv[2] !== 'keys') {
|
|
|
902
902
|
},
|
|
903
903
|
{
|
|
904
904
|
name: 'marrow_run',
|
|
905
|
-
description: '
|
|
905
|
+
description: 'Governed outcome capture. Records intent, obtains a gate for risky work, and closes only with an explicit measured result.',
|
|
906
906
|
inputSchema: {
|
|
907
907
|
type: 'object',
|
|
908
908
|
properties: {
|
|
@@ -922,7 +922,7 @@ if (process.argv[2] !== 'keys') {
|
|
|
922
922
|
},
|
|
923
923
|
{
|
|
924
924
|
name: 'marrow_auto',
|
|
925
|
-
description: 'Durably capture low-risk activity
|
|
925
|
+
description: 'Durably capture low-risk activity. One outer invocation normally completes in-band within the bounded client budget; a deadline continuation reuses the same operation_id and never opens a second decision. Outcomes remain pending unless success is explicit; risky completion still requires a fresh gate and measured proof.',
|
|
926
926
|
inputSchema: {
|
|
927
927
|
type: 'object',
|
|
928
928
|
properties: {
|
|
@@ -1771,7 +1771,7 @@ if (process.argv[2] !== 'keys') {
|
|
|
1771
1771
|
prompts: [
|
|
1772
1772
|
{
|
|
1773
1773
|
name: 'marrow-always-on',
|
|
1774
|
-
description: 'Marrow control and proof contract
|
|
1774
|
+
description: 'Marrow control and proof contract. MCP tools are on demand; host activity is client-self-reported and coverage remains unverified without independent authority.',
|
|
1775
1775
|
arguments: [],
|
|
1776
1776
|
_meta: { host_capability: mcpHostCapability() },
|
|
1777
1777
|
},
|
|
@@ -1791,7 +1791,7 @@ if (process.argv[2] !== 'keys') {
|
|
|
1791
1791
|
}
|
|
1792
1792
|
const hostCapability = mcpHostCapability();
|
|
1793
1793
|
success(id, {
|
|
1794
|
-
description: 'Marrow control and proof contract —
|
|
1794
|
+
description: 'Marrow control and proof contract — MCP tools are on demand, host activity is client-self-reported, and coverage is unverified without independent authority',
|
|
1795
1795
|
_meta: { host_capability: hostCapability },
|
|
1796
1796
|
messages: [
|
|
1797
1797
|
{
|
|
@@ -1804,12 +1804,12 @@ if (process.argv[2] !== 'keys') {
|
|
|
1804
1804
|
|
|
1805
1805
|
${(0, host_capability_1.hostCapabilityInstructions)(hostCapability)}
|
|
1806
1806
|
|
|
1807
|
-
|
|
1807
|
+
Configured native hooks can cooperatively report or inject context for these bounded lifecycle stages, but their callbacks are client-self-reported activity and do not certify control:
|
|
1808
1808
|
- UserPromptSubmit can request relevant policy, warnings, lessons, and a decision brief before risky work.
|
|
1809
1809
|
- PostToolUse can record compact tool success or failure receipts.
|
|
1810
1810
|
- Stop can keep unfinished outcomes visible instead of silently treating session exit as success.
|
|
1811
1811
|
|
|
1812
|
-
Hooks never make a blocked action safe. Before a consequential action, respect the returned allow, warn, review_required, or block decision and its required proof.
|
|
1812
|
+
Hooks never make a blocked action safe and are not an external execution choke point. Before a consequential action, respect the returned allow, warn, review_required, or block decision and its required proof. For Codex, Grok, Gemini, and similar CLI harnesses, use npx @getmarrow/install run --agent <agent-id> -- -- <command>.
|
|
1813
1813
|
|
|
1814
1814
|
When runtime/status returns a client_update notice, tell the operator and use its exact update and verification commands only when local change policy permits. Never silently change packages or configuration.
|
|
1815
1815
|
|
|
@@ -2044,6 +2044,9 @@ Marrow is not a replacement agent or a standalone memory app. Context and prior
|
|
|
2044
2044
|
baseUrl: BASE_URL,
|
|
2045
2045
|
deferDelivery: false,
|
|
2046
2046
|
event: {
|
|
2047
|
+
...(delivered?.operation_id ? {
|
|
2048
|
+
event_id: `auto_${delivered.committed ? 'closed' : 'pending'}_${delivered.operation_id}`,
|
|
2049
|
+
} : {}),
|
|
2047
2050
|
event_type: delivered?.committed
|
|
2048
2051
|
? 'outcome_committed'
|
|
2049
2052
|
: !highRisk && outcomeSuccess === false
|
|
@@ -2058,8 +2061,7 @@ Marrow is not a replacement agent or a standalone memory app. Context and prior
|
|
|
2058
2061
|
action,
|
|
2059
2062
|
outcome_state: delivered?.committed ? 'closed' : 'pending',
|
|
2060
2063
|
success: delivered?.committed ? outcomeSuccess : highRisk ? undefined : outcomeSuccess,
|
|
2061
|
-
|
|
2062
|
-
capability_level: 'mcp',
|
|
2064
|
+
source: 'client_self_reported',
|
|
2063
2065
|
},
|
|
2064
2066
|
});
|
|
2065
2067
|
const response = {
|