kith-coord 0.0.0-stage → 0.1.1
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/CHANGELOG.md +106 -0
- package/CODE_OF_CONDUCT.md +5 -0
- package/CONTRIBUTING.md +47 -0
- package/LICENSE +21 -0
- package/README.md +143 -2
- package/SECURITY.md +13 -0
- package/assets/brand/avatar.png +0 -0
- package/assets/brand/avatar.svg +1 -0
- package/assets/brand/lockup.png +0 -0
- package/assets/brand/lockup.svg +1 -0
- package/assets/brand/mark.svg +1 -0
- package/assets/brand/readme-header.png +0 -0
- package/assets/brand/readme-header.svg +1 -0
- package/assets/brand/social-preview.png +0 -0
- package/assets/brand/social-preview.svg +1 -0
- package/assets/brand/wordmark.png +0 -0
- package/assets/brand/wordmark.svg +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +5049 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/command-worker.d.ts +2 -0
- package/dist/command-worker.js +30 -0
- package/dist/command-worker.js.map +1 -0
- package/dist/index.d.ts +984 -0
- package/dist/index.js +3729 -0
- package/dist/index.js.map +1 -0
- package/docs/architecture.md +37 -0
- package/docs/client-validation.md +62 -0
- package/docs/integrations.md +80 -0
- package/docs/path-and-scope-rules.md +45 -0
- package/docs/protocol/tools.v1.json +425 -0
- package/docs/protocol.md +35 -0
- package/docs/reliability.md +80 -0
- package/docs/roadmap.md +42 -0
- package/docs/sessions-and-mutexes.md +97 -0
- package/docs/usage.md +101 -0
- package/docs/validation/2026-10-19-claude-client-report.json +67 -0
- package/docs/validation/2026-10-19-claude-hook-report.json +33 -0
- package/docs/validation/2026-10-19-claude-hook-unavailable-report.json +20 -0
- package/docs/validation/2026-10-19-claude-mutex-report.json +34 -0
- package/docs/validation/2026-10-19-codex-client-report.json +55 -0
- package/docs/validation/2026-10-19-codex-mutex-report.json +33 -0
- package/docs/validation/2026-10-19-path-hardening-claude.json +32 -0
- package/docs/validation/2026-10-19-path-hardening-codex.json +30 -0
- package/docs/validation/2026-10-19-recovery-claude.json +35 -0
- package/docs/validation/2026-10-19-recovery-codex.json +33 -0
- package/docs/validation/2026-10-19-sqlite-runtime-report.json +50 -0
- package/docs/validation/2026-10-20-adoption-claude.json +35 -0
- package/docs/validation/2026-10-20-adoption-codex-first-attempt.json +20 -0
- package/docs/validation/2026-10-20-adoption-codex.json +73 -0
- package/docs/validation/2026-10-20-adoption-hook-failure.json +18 -0
- package/docs/validation/2026-10-20-cursor-cli.json +38 -0
- package/docs/validation/2026-10-20-cursor-hook-unavailable.json +18 -0
- package/docs/validation/2026-10-20-subtraction-claude.json +35 -0
- package/docs/validation/2026-10-20-subtraction-codex.json +33 -0
- package/docs/validation/2026-10-20-windows-node-22.13.0.json +17 -0
- package/docs/validation/2026-10-20-windows-node-24.json +17 -0
- package/package.json +83 -4
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Sessions, ownership, and supervised commands
|
|
2
|
+
|
|
3
|
+
## Start through MCP
|
|
4
|
+
|
|
5
|
+
For agents, prefer `kith_begin_work` with a unique ID, explicit scopes and `isolateWorktree: true`. One persistent MCP connection retains its capabilities internally. Edit only the returned worktree, report edits with `kith_record_file_edit`, run serialized commands with `kith_run_with_mutex`, and complete with a project verification command. No environment exports are required for MCP-only setup. Keep the connection alive and heartbeat before expiry. See [client setup](integrations.md) and [examples](usage.md).
|
|
6
|
+
|
|
7
|
+
## Share a session with CLI and hooks
|
|
8
|
+
|
|
9
|
+
A session has a unique agent ID, a random 256-bit capability, a generation (epoch), a kernel process identity, and an expiry. An ID alone grants no ownership. The database stores a hash of the capability; public agent records and event/status responses omit it.
|
|
10
|
+
|
|
11
|
+
For a terminal workflow, initialize the environment before launching an agent client:
|
|
12
|
+
|
|
13
|
+
```sh
|
|
14
|
+
eval "$(kith session start --agent auth-worker --owner-pid "$$" --shell)"
|
|
15
|
+
kith begin --title "Refresh authentication" --scope "src/auth/**" --worktree
|
|
16
|
+
# Edit in the returned worktreePath.
|
|
17
|
+
# Launch the hook-enabled client from this environment.
|
|
18
|
+
kith heartbeat
|
|
19
|
+
kith complete
|
|
20
|
+
unset KITH_AGENT_ID KITH_SESSION_TOKEN
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
`--shell` emits quoted exports for `KITH_AGENT_ID` and `KITH_SESSION_TOKEN`. Treat the token like a password: do not paste it into issues, commits, or logs. Passing `--session-token` explicitly is supported, but an environment variable avoids placing it in the command line.
|
|
24
|
+
|
|
25
|
+
CLI sessions are anchored to their parent process unless `--owner-pid` is supplied. Shell export mode requires `--owner-pid "$$"`: sh/bash command substitution can create a transient parent, so the outer shell PID must be passed explicitly. Library and MCP sessions default to their own process. Resuming a session does not rebind that anchor. Keep the owner process alive; use heartbeats before the default five-minute expiry. Completed, expired, and replaced capabilities cannot renew or mutate the new owner’s state.
|
|
26
|
+
|
|
27
|
+
`kith session end` abandons a session and requeues unfinished tasks. `kith complete` explicitly completes work. To reuse a completed/expired ID intentionally, create a new generation:
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
eval "$(kith session start --agent auth-worker --new --owner-pid "$$" --shell)"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
`--new` does not steal a live session. Worktree paths are retained across generations. After successful worktree integration, use a new maintenance session to run `kith worktree remove`; changed, untracked, and ignored files still prevent removal.
|
|
34
|
+
|
|
35
|
+
## MCP ownership
|
|
36
|
+
|
|
37
|
+
`kith_begin_work`, `kith_claim_next_task`, and `kith_start_session` return a session token when they register or resume a session. A single stdio connection retains its granted capabilities internally. Another connection must explicitly present the capability to resume the same live ID. All agent-scoped mutation tools accept an optional `sessionToken`; a mixed CLI/hook/MCP client can inherit `KITH_AGENT_ID` and `KITH_SESSION_TOKEN` instead.
|
|
38
|
+
|
|
39
|
+
`kith_heartbeat` renews an active owned session. `kith_get_status` without an ID is a public read; supplying an ID also consumes that session’s event cursor and requires ownership. Responses provide `structuredContent`, a separately parseable JSON text block, and any coordination delta in another text block. Tool conflicts set `isError: true`.
|
|
40
|
+
|
|
41
|
+
Sessions started by the MCP process are abandoned on connection close; unfinished tasks are requeued. A hard crash is reclaimed by another operation’s process/expiry scan. A CLI command sharing that capability stops when its owning MCP session is lost.
|
|
42
|
+
|
|
43
|
+
The protocol response format follows the [MCP tool-result specification](https://modelcontextprotocol.io/specification/2025-11-25/server/tools).
|
|
44
|
+
|
|
45
|
+
## Supervised mutex commands
|
|
46
|
+
|
|
47
|
+
```sh
|
|
48
|
+
kith mutex --name package-install --lease-ms 30000 --wait-ms 60000 --timeout-ms 600000 -- pnpm install
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
The wait timeout defaults to 60 seconds. Execution has no timeout unless `--timeout-ms` is supplied. The mutex lease defaults to five minutes and is renewed at roughly one-third of the lease duration. Output streams to the terminal. Child exit statuses are preserved. SIGINT/SIGTERM cancel queued or running work; the CLI exits with 130/143 after cleanup.
|
|
52
|
+
|
|
53
|
+
A standalone mutex invocation without a pre-existing capability creates a temporary session anchored to that invocation. Reusing a live agent ID still requires its capability.
|
|
54
|
+
|
|
55
|
+
The runner records an execution guard before starting a detached process-group leader. The leader cannot launch the command until its group has been recorded and the supervisor sends a private IPC start message. A live group blocks competing acquisitions even if the resource lease or agent session has expired. If renewal fails, cancellation occurs, output exceeds its configured limit, or an execution timeout fires, Kith terminates the group before releasing the guard. It escalates from SIGTERM to SIGKILL when needed, checks the recorded group-leader identity before signalling, and bounds shutdown waits. Signal-permission errors are contained; an unconfirmed shutdown retains its guard. A worker loses permission to run when its supervisor’s IPC connection closes.
|
|
56
|
+
|
|
57
|
+
FIFO tickets live separately from the current resource lease, so releasing a mutex preserves queue order. Cancelled, dead, expired, and replaced-session waiters are pruned. Concurrent commands from the same session also serialize. Package-manager shims recognize an existing supervised package-install context, so an install wrapped explicitly in that mutex does not deadlock by reacquiring itself. This context marker is cooperative, not a security boundary. A general session heartbeat does not renew mutex leases: manual lease users must call `renewMutex` with the exact acquisition token.
|
|
58
|
+
|
|
59
|
+
This uses [Node’s POSIX detached-process support](https://nodejs.org/download/release/v22.23.0/docs/api/child_process.html). Commands must keep protected work in the supervised process group. Deliberately detached daemons, remote jobs, privileged processes that cannot be terminated, and malicious same-user code require a different lock/enforcement boundary. If Kith cannot prove that a guarded group stopped, it retains the guard and fails closed rather than granting a second runner.
|
|
60
|
+
|
|
61
|
+
## Library use
|
|
62
|
+
|
|
63
|
+
`executeWithMutex` is asynchronous. Await it before closing the engine; `close()` refuses an engine with active supervised commands.
|
|
64
|
+
|
|
65
|
+
```js
|
|
66
|
+
import { KithEngine } from 'kith-coord';
|
|
67
|
+
const engine = new KithEngine('/absolute/path/to/repository');
|
|
68
|
+
try {
|
|
69
|
+
const session = engine.fencing.registerAgent({ id: 'worker' });
|
|
70
|
+
// Another engine may resume with: fencing.resumeSession('worker', session.sessionToken).
|
|
71
|
+
const result = await engine.broker.executeWithMutex({
|
|
72
|
+
agentId: 'worker', mutexName: 'install', command: ['pnpm', 'install'],
|
|
73
|
+
leaseDurationMs: 30_000, commandTimeoutMs: 600_000,
|
|
74
|
+
});
|
|
75
|
+
console.log(result.exitCode);
|
|
76
|
+
} finally { engine.close(); }
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
The API also accepts an AbortSignal, `timeoutMs` for queue waiting, `killGraceMs`, output callbacks, and `maxOutputBytes` (16 MiB by default). Resource renew/release operations require their exact fencing token, including rejection of invented future tokens.
|
|
80
|
+
|
|
81
|
+
## Upgrade from schema 1
|
|
82
|
+
|
|
83
|
+
Stop all old Kith clients and running commands before upgrading. The schema-2 migration invalidates legacy sessions that have no capabilities, clears their coordination leases/conflicts, and requeues unfinished tasks. It preserves workspace files, worktrees, snapshots, and quarantine copies. Create fresh sessions after upgrading. Do not run an old binary against the upgraded database.
|
|
84
|
+
|
|
85
|
+
For a database backup, stop writers and use a SQLite-aware backup or preserve the database together with its WAL/SHM files. Do not copy a live `state.db` alone and assume it is complete. Broader backup/restore and downgrade tooling remains future work.
|
|
86
|
+
|
|
87
|
+
## Commands from sandboxed MCP clients
|
|
88
|
+
|
|
89
|
+
On the validated macOS Codex version, the sandboxed native shell cannot inspect process identities, so direct CLI mutex execution fails closed with `Cannot inspect mutex waiter process`. Use `kith_run_with_mutex` on the already-owned MCP connection instead:
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{"agentId":"worker","mutexName":"package-install","command":["pnpm","install"],"leaseDurationMs":30000,"commandTimeoutMs":600000}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
The executable and arguments remain separate. The working directory defaults to the registered worktree (otherwise the repository); a supplied `cwd` must resolve inside that root. The server renews the mutex while the command runs and stops it on request cancellation or connection loss, including borrowed sessions. A disconnected borrowed session retains its original owner after its command stops. Nonzero command exits set `isError: true` and retain the actual `exitCode`. Execution defaults to a 60-second timeout and 64 KiB output limit; bounded overrides are supported. Increase the client's MCP tool timeout as needed for longer commands.
|
|
96
|
+
|
|
97
|
+
This tool runs with the coordinator process permissions, outside the native client's command sandbox. Review and approve it as command execution. Cwd validation selects the working directory; it does not contain what a program can access. Use isolated worktrees and declared scopes for cooperating writers. Session capabilities never need to appear in the command arguments.
|
package/docs/usage.md
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# MCP, CLI and library workflows
|
|
2
|
+
|
|
3
|
+
## Recommended: MCP and isolated worktrees
|
|
4
|
+
|
|
5
|
+
Connect through the [MCP-only client setup](integrations.md). Each parallel agent uses its own MCP connection and worktree. No shell exports are needed when using only MCP. The connection retains its granted capability; another connection needs that capability to resume the same ID.
|
|
6
|
+
|
|
7
|
+
Call these tools on the same connection:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
kith_begin_work {"agentId":"auth-worker","title":"Refresh authentication","scopeGlobs":["src/auth/**"],"isolateWorktree":true}
|
|
11
|
+
# Edit files under the returned worktree.worktreePath.
|
|
12
|
+
kith_record_file_edit {"agentId":"auth-worker","filePath":"src/auth/middleware.ts"}
|
|
13
|
+
kith_run_with_mutex {"agentId":"auth-worker","mutexName":"project-checks","command":["pnpm","typecheck"]}
|
|
14
|
+
kith_heartbeat {"agentId":"auth-worker"}
|
|
15
|
+
kith_complete_work {"agentId":"auth-worker","verificationCmd":"pnpm typecheck"}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Use a different ID and nonoverlapping scope for another agent. An overlapping exclusive scope returns a tool error. Commands run with the MCP server permissions and require client approval; their working directory defaults to the registered worktree. Keep the connection open and heartbeat before the default five-minute session expiry. See the runnable [two-client example](../examples/two-agents.mjs).
|
|
19
|
+
|
|
20
|
+
## CLI fallback: keep the owning shell alive
|
|
21
|
+
|
|
22
|
+
CLI commands and Claude edit hooks need the same capability environment. Start from one persistent shell, then launch hook clients from it. Separate stateless shell calls do not preserve these exports or the owning shell process.
|
|
23
|
+
|
|
24
|
+
Run from the repository root, or pass `--repo /absolute/path`:
|
|
25
|
+
|
|
26
|
+
```sh
|
|
27
|
+
eval "$(kith session start --agent auth-worker --owner-pid "$$" --shell)"
|
|
28
|
+
kith begin --agent auth-worker --title "Refresh authentication" --scope "src/auth/**" --worktree
|
|
29
|
+
# Edit in the worktreePath returned in the JSON result.
|
|
30
|
+
kith status
|
|
31
|
+
kith heartbeat --agent auth-worker
|
|
32
|
+
kith complete --agent auth-worker --verify "pnpm typecheck"
|
|
33
|
+
# Open a maintenance generation to remove the retained worktree explicitly.
|
|
34
|
+
eval "$(kith session start --agent auth-worker --new --owner-pid "$$" --shell)"
|
|
35
|
+
kith worktree remove --agent auth-worker
|
|
36
|
+
kith session end
|
|
37
|
+
unset KITH_AGENT_ID KITH_SESSION_TOKEN
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Quote globs so the shell does not expand them. CLI scopes are comma-separated. Use `file:src/routes/[id]/page.tsx` for a literal filename containing glob syntax; see [scope grammar and discovery](path-and-scope-rules.md). An ID alone cannot resume another session. Dead or expired sessions release coordination resources when a mutating operation reaps them. Active supervised command guards survive expiry until shutdown is confirmed.
|
|
41
|
+
|
|
42
|
+
Completion checkpoints uncommitted worktree changes and integrates into the branch currently checked out in the selected repository checkout (`--repo` when supplied). The target must be clean. A verification failure leaves the target unchanged and the worktree available for repair. Successful completion also keeps the worktree for inspection; removal is explicit and refuses dirty, untracked, or ignored work. Existing branches are never reset to create a worktree. Hydration tries filesystem clones and falls back to an independent copy; cost depends on the filesystem and dependency size.
|
|
43
|
+
|
|
44
|
+
A verification command is optional. Without one, integration checks Git mergeability only. Choose a command that actually checks your project.
|
|
45
|
+
|
|
46
|
+
## Other CLI workflows
|
|
47
|
+
|
|
48
|
+
These agent-scoped commands assume an active session. Start one before claiming work or reserving resources:
|
|
49
|
+
|
|
50
|
+
```sh
|
|
51
|
+
eval "$(kith session start --agent worker-1 --owner-pid "$$" --shell)"
|
|
52
|
+
|
|
53
|
+
# Task dependencies
|
|
54
|
+
kith task add --id schema --title "Billing schema" --scope "src/db/**"
|
|
55
|
+
kith task add --id api --title "Billing endpoints" --depends-on schema --scope "src/api/**"
|
|
56
|
+
kith task claim --agent worker-1
|
|
57
|
+
|
|
58
|
+
# Inspect worktrees, overlaps, relative commits, FIFO tickets and command guards
|
|
59
|
+
kith status
|
|
60
|
+
# Offline observations do not reap or migrate
|
|
61
|
+
kith status --offline
|
|
62
|
+
kith recover
|
|
63
|
+
kith doctor
|
|
64
|
+
# Preview committed source/target trees; dirty inputs are refused
|
|
65
|
+
kith worktree preview --agent worker-1
|
|
66
|
+
|
|
67
|
+
# Allocate a cooperating client's port; start your service promptly
|
|
68
|
+
kith port --agent worker-1 --service web
|
|
69
|
+
|
|
70
|
+
# Serialize commands; argument boundaries are preserved after --
|
|
71
|
+
kith mutex --agent worker-1 --name package-install -- pnpm install
|
|
72
|
+
|
|
73
|
+
# Start the MCP stdio server
|
|
74
|
+
kith mcp
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The `coord` executable is an alias for `kith`. The library exports `KithEngine` and its component classes for custom integrations:
|
|
78
|
+
|
|
79
|
+
```js
|
|
80
|
+
import { KithEngine } from 'kith-coord';
|
|
81
|
+
const kith = new KithEngine('/absolute/path/to/repository');
|
|
82
|
+
try {
|
|
83
|
+
kith.fencing.registerAgent({ id: 'custom-worker' });
|
|
84
|
+
const result = kith.locks.acquireLocks({
|
|
85
|
+
agentId: 'custom-worker', patterns: ['src/auth/**'],
|
|
86
|
+
});
|
|
87
|
+
console.log(result);
|
|
88
|
+
} finally {
|
|
89
|
+
kith.close();
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## End a session
|
|
94
|
+
|
|
95
|
+
When abandoning a task, use `kith session end` from the shell that owns the session. After completion or ending, remove the exported credentials:
|
|
96
|
+
|
|
97
|
+
```sh
|
|
98
|
+
unset KITH_AGENT_ID KITH_SESSION_TOKEN
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Never include session tokens in issues, terminal recordings, or shared logs. See [session lifecycle](sessions-and-mutexes.md) for expiry and recovery.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"client": "claude",
|
|
3
|
+
"version": "2.1.301 (Claude Code)",
|
|
4
|
+
"platform": "darwin",
|
|
5
|
+
"node": "v22.23.3",
|
|
6
|
+
"scenarios": [
|
|
7
|
+
{
|
|
8
|
+
"scenario": "isolated",
|
|
9
|
+
"passed": true,
|
|
10
|
+
"tools": [
|
|
11
|
+
"kith_begin_work",
|
|
12
|
+
"kith_begin_work",
|
|
13
|
+
"kith_record_file_edit",
|
|
14
|
+
"kith_run_with_mutex",
|
|
15
|
+
"kith_complete_work",
|
|
16
|
+
"kith_get_status"
|
|
17
|
+
],
|
|
18
|
+
"hookDenialVerified": true,
|
|
19
|
+
"checks": [
|
|
20
|
+
"protected bytes unchanged",
|
|
21
|
+
"native edit",
|
|
22
|
+
"contract recorded",
|
|
23
|
+
"renewable MCP mutex command",
|
|
24
|
+
"verified integration",
|
|
25
|
+
"task completed",
|
|
26
|
+
"locks released",
|
|
27
|
+
"inherited owner preserved"
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"scenario": "shared",
|
|
32
|
+
"passed": true,
|
|
33
|
+
"tools": [
|
|
34
|
+
"kith_begin_work",
|
|
35
|
+
"kith_begin_work",
|
|
36
|
+
"kith_record_file_edit",
|
|
37
|
+
"kith_run_with_mutex",
|
|
38
|
+
"kith_complete_work",
|
|
39
|
+
"kith_get_status"
|
|
40
|
+
],
|
|
41
|
+
"hookDenialVerified": true,
|
|
42
|
+
"checks": [
|
|
43
|
+
"protected bytes unchanged",
|
|
44
|
+
"native edit",
|
|
45
|
+
"contract recorded",
|
|
46
|
+
"renewable MCP mutex command",
|
|
47
|
+
"verified integration",
|
|
48
|
+
"task completed",
|
|
49
|
+
"locks released",
|
|
50
|
+
"inherited owner preserved"
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"scenario": "hook-failure",
|
|
55
|
+
"passed": true,
|
|
56
|
+
"checks": [
|
|
57
|
+
"native Write attempted once",
|
|
58
|
+
"tool denied",
|
|
59
|
+
"marker absent"
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
],
|
|
63
|
+
"passed": true,
|
|
64
|
+
"date": "2026-10-19",
|
|
65
|
+
"scope": "Native CLI workflows, renewable MCP command supervision and failure probes; not GUI certification",
|
|
66
|
+
"configuration": "Generated settings; Codex receives server values via invocation overrides, Claude loads generated project hooks/MCP"
|
|
67
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"client": "claude",
|
|
3
|
+
"version": "2.1.301 (Claude Code)",
|
|
4
|
+
"platform": "darwin",
|
|
5
|
+
"node": "v22.23.3",
|
|
6
|
+
"scenarios": [
|
|
7
|
+
{
|
|
8
|
+
"scenario": "shared",
|
|
9
|
+
"passed": true,
|
|
10
|
+
"tools": [
|
|
11
|
+
"kith_begin_work",
|
|
12
|
+
"kith_begin_work",
|
|
13
|
+
"kith_record_file_edit",
|
|
14
|
+
"kith_complete_work",
|
|
15
|
+
"kith_get_status"
|
|
16
|
+
],
|
|
17
|
+
"hookDenialVerified": true,
|
|
18
|
+
"checks": [
|
|
19
|
+
"protected bytes unchanged",
|
|
20
|
+
"native edit",
|
|
21
|
+
"contract recorded",
|
|
22
|
+
"verified integration",
|
|
23
|
+
"task completed",
|
|
24
|
+
"locks released",
|
|
25
|
+
"inherited owner preserved"
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"passed": true,
|
|
30
|
+
"date": "2026-10-19",
|
|
31
|
+
"scope": "Native CLI, disposable worktree fixture; not GUI certification",
|
|
32
|
+
"configuration": "Generated settings; Codex receives server values via invocation overrides, Claude loads generated project hooks/MCP"
|
|
33
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"client": "claude",
|
|
3
|
+
"version": "2.1.301 (Claude Code)",
|
|
4
|
+
"platform": "darwin",
|
|
5
|
+
"node": "v22.23.3",
|
|
6
|
+
"scenarios": [
|
|
7
|
+
{
|
|
8
|
+
"scenario": "hook-failure",
|
|
9
|
+
"passed": true,
|
|
10
|
+
"checks": [
|
|
11
|
+
"native Write attempted once",
|
|
12
|
+
"tool denied",
|
|
13
|
+
"marker absent"
|
|
14
|
+
]
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"passed": true,
|
|
18
|
+
"date": "2026-10-19",
|
|
19
|
+
"scope": "Generated PreToolUse onFailure block; disposable macOS fixture"
|
|
20
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"client": "claude",
|
|
3
|
+
"version": "2.1.301 (Claude Code)",
|
|
4
|
+
"platform": "darwin",
|
|
5
|
+
"node": "v22.23.3",
|
|
6
|
+
"scenarios": [
|
|
7
|
+
{
|
|
8
|
+
"scenario": "shared",
|
|
9
|
+
"passed": true,
|
|
10
|
+
"tools": [
|
|
11
|
+
"kith_begin_work",
|
|
12
|
+
"kith_begin_work",
|
|
13
|
+
"kith_record_file_edit",
|
|
14
|
+
"kith_run_with_mutex",
|
|
15
|
+
"kith_complete_work",
|
|
16
|
+
"kith_get_status"
|
|
17
|
+
],
|
|
18
|
+
"hookDenialVerified": true,
|
|
19
|
+
"checks": [
|
|
20
|
+
"protected bytes unchanged",
|
|
21
|
+
"native edit",
|
|
22
|
+
"contract recorded",
|
|
23
|
+
"renewable MCP mutex command",
|
|
24
|
+
"verified integration",
|
|
25
|
+
"task completed",
|
|
26
|
+
"locks released",
|
|
27
|
+
"inherited owner preserved"
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"passed": true,
|
|
32
|
+
"date": "2026-10-19",
|
|
33
|
+
"scope": "Native MCP command supervision and editor workflow; macOS"
|
|
34
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"client": "codex",
|
|
3
|
+
"version": "codex-cli 0.163.0-alpha.10.2",
|
|
4
|
+
"platform": "darwin",
|
|
5
|
+
"node": "v22.23.3",
|
|
6
|
+
"scenarios": [
|
|
7
|
+
{
|
|
8
|
+
"scenario": "isolated",
|
|
9
|
+
"passed": true,
|
|
10
|
+
"tools": [
|
|
11
|
+
"kith_begin_work",
|
|
12
|
+
"kith_begin_work",
|
|
13
|
+
"kith_record_file_edit",
|
|
14
|
+
"kith_run_with_mutex",
|
|
15
|
+
"kith_complete_work",
|
|
16
|
+
"kith_get_status"
|
|
17
|
+
],
|
|
18
|
+
"checks": [
|
|
19
|
+
"protected bytes unchanged",
|
|
20
|
+
"native edit",
|
|
21
|
+
"contract recorded",
|
|
22
|
+
"renewable MCP mutex command",
|
|
23
|
+
"verified integration",
|
|
24
|
+
"task completed",
|
|
25
|
+
"locks released"
|
|
26
|
+
]
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"scenario": "shared",
|
|
30
|
+
"passed": true,
|
|
31
|
+
"tools": [
|
|
32
|
+
"kith_begin_work",
|
|
33
|
+
"kith_begin_work",
|
|
34
|
+
"kith_record_file_edit",
|
|
35
|
+
"kith_run_with_mutex",
|
|
36
|
+
"kith_complete_work",
|
|
37
|
+
"kith_get_status"
|
|
38
|
+
],
|
|
39
|
+
"checks": [
|
|
40
|
+
"protected bytes unchanged",
|
|
41
|
+
"native edit",
|
|
42
|
+
"contract recorded",
|
|
43
|
+
"renewable MCP mutex command",
|
|
44
|
+
"verified integration",
|
|
45
|
+
"task completed",
|
|
46
|
+
"locks released",
|
|
47
|
+
"inherited owner preserved"
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
],
|
|
51
|
+
"passed": true,
|
|
52
|
+
"date": "2026-10-19",
|
|
53
|
+
"scope": "Native CLI workflows, renewable MCP command supervision and failure probes; not GUI certification",
|
|
54
|
+
"configuration": "Generated settings; Codex receives server values via invocation overrides, Claude loads generated project hooks/MCP"
|
|
55
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"client": "codex",
|
|
3
|
+
"version": "codex-cli 0.163.0-alpha.10.2",
|
|
4
|
+
"platform": "darwin",
|
|
5
|
+
"node": "v22.23.3",
|
|
6
|
+
"scenarios": [
|
|
7
|
+
{
|
|
8
|
+
"scenario": "shared",
|
|
9
|
+
"passed": true,
|
|
10
|
+
"tools": [
|
|
11
|
+
"kith_begin_work",
|
|
12
|
+
"kith_begin_work",
|
|
13
|
+
"kith_record_file_edit",
|
|
14
|
+
"kith_run_with_mutex",
|
|
15
|
+
"kith_complete_work",
|
|
16
|
+
"kith_get_status"
|
|
17
|
+
],
|
|
18
|
+
"checks": [
|
|
19
|
+
"protected bytes unchanged",
|
|
20
|
+
"native edit",
|
|
21
|
+
"contract recorded",
|
|
22
|
+
"renewable MCP mutex command",
|
|
23
|
+
"verified integration",
|
|
24
|
+
"task completed",
|
|
25
|
+
"locks released",
|
|
26
|
+
"inherited owner preserved"
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
"passed": true,
|
|
31
|
+
"date": "2026-10-19",
|
|
32
|
+
"scope": "Native MCP command supervision and editor workflow; macOS"
|
|
33
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"client": "claude",
|
|
3
|
+
"version": "2.1.301 (Claude Code)",
|
|
4
|
+
"platform": "darwin",
|
|
5
|
+
"node": "v22.23.3",
|
|
6
|
+
"scenarios": [
|
|
7
|
+
{
|
|
8
|
+
"scenario": "isolated",
|
|
9
|
+
"passed": true,
|
|
10
|
+
"tools": [
|
|
11
|
+
"kith_begin_work",
|
|
12
|
+
"kith_begin_work",
|
|
13
|
+
"kith_record_file_edit",
|
|
14
|
+
"kith_run_with_mutex",
|
|
15
|
+
"kith_complete_work",
|
|
16
|
+
"kith_get_status"
|
|
17
|
+
],
|
|
18
|
+
"hookDenialVerified": true,
|
|
19
|
+
"checks": [
|
|
20
|
+
"protected bytes unchanged",
|
|
21
|
+
"native edit",
|
|
22
|
+
"contract recorded",
|
|
23
|
+
"renewable MCP mutex command",
|
|
24
|
+
"verified integration",
|
|
25
|
+
"task completed",
|
|
26
|
+
"locks released",
|
|
27
|
+
"inherited owner preserved"
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"passed": true
|
|
32
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"client": "codex",
|
|
3
|
+
"version": "codex-cli 0.163.0-alpha.10.2",
|
|
4
|
+
"platform": "darwin",
|
|
5
|
+
"node": "v22.23.3",
|
|
6
|
+
"scenarios": [
|
|
7
|
+
{
|
|
8
|
+
"scenario": "isolated",
|
|
9
|
+
"passed": true,
|
|
10
|
+
"tools": [
|
|
11
|
+
"kith_begin_work",
|
|
12
|
+
"kith_begin_work",
|
|
13
|
+
"kith_record_file_edit",
|
|
14
|
+
"kith_run_with_mutex",
|
|
15
|
+
"kith_complete_work",
|
|
16
|
+
"kith_get_status"
|
|
17
|
+
],
|
|
18
|
+
"checks": [
|
|
19
|
+
"protected bytes unchanged",
|
|
20
|
+
"native edit",
|
|
21
|
+
"contract recorded",
|
|
22
|
+
"renewable MCP mutex command",
|
|
23
|
+
"verified integration",
|
|
24
|
+
"task completed",
|
|
25
|
+
"locks released"
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"passed": true
|
|
30
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"client": "claude",
|
|
3
|
+
"version": "2.1.301 (Claude Code)",
|
|
4
|
+
"platform": "darwin",
|
|
5
|
+
"node": "v22.23.3",
|
|
6
|
+
"scenarios": [
|
|
7
|
+
{
|
|
8
|
+
"scenario": "isolated",
|
|
9
|
+
"passed": true,
|
|
10
|
+
"tools": [
|
|
11
|
+
"kith_begin_work",
|
|
12
|
+
"kith_begin_work",
|
|
13
|
+
"kith_record_file_edit",
|
|
14
|
+
"kith_run_with_mutex",
|
|
15
|
+
"kith_complete_work",
|
|
16
|
+
"kith_get_status",
|
|
17
|
+
"kith_complete_work",
|
|
18
|
+
"kith_get_status"
|
|
19
|
+
],
|
|
20
|
+
"hookDenialVerified": true,
|
|
21
|
+
"checks": [
|
|
22
|
+
"protected bytes unchanged",
|
|
23
|
+
"native edit",
|
|
24
|
+
"contract recorded",
|
|
25
|
+
"renewable MCP mutex command",
|
|
26
|
+
"failed verification and successful retry",
|
|
27
|
+
"verified integration",
|
|
28
|
+
"task completed",
|
|
29
|
+
"locks released",
|
|
30
|
+
"inherited owner preserved"
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"passed": true
|
|
35
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"client": "codex",
|
|
3
|
+
"version": "codex-cli 0.163.0-alpha.10.2",
|
|
4
|
+
"platform": "darwin",
|
|
5
|
+
"node": "v22.23.3",
|
|
6
|
+
"scenarios": [
|
|
7
|
+
{
|
|
8
|
+
"scenario": "isolated",
|
|
9
|
+
"passed": true,
|
|
10
|
+
"tools": [
|
|
11
|
+
"kith_begin_work",
|
|
12
|
+
"kith_begin_work",
|
|
13
|
+
"kith_record_file_edit",
|
|
14
|
+
"kith_run_with_mutex",
|
|
15
|
+
"kith_complete_work",
|
|
16
|
+
"kith_get_status",
|
|
17
|
+
"kith_complete_work",
|
|
18
|
+
"kith_get_status"
|
|
19
|
+
],
|
|
20
|
+
"checks": [
|
|
21
|
+
"protected bytes unchanged",
|
|
22
|
+
"native edit",
|
|
23
|
+
"contract recorded",
|
|
24
|
+
"renewable MCP mutex command",
|
|
25
|
+
"failed verification and successful retry",
|
|
26
|
+
"verified integration",
|
|
27
|
+
"task completed",
|
|
28
|
+
"locks released"
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"passed": true
|
|
33
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"date": "2026-10-19",
|
|
3
|
+
"scope": "SQLite capability compatibility; local macOS checks, hosted failure reproduction",
|
|
4
|
+
"hosted_before_fix": {
|
|
5
|
+
"run": "https://github.com/connorhriley/kith/actions/runs/39280488937",
|
|
6
|
+
"passed": [
|
|
7
|
+
"macos/22",
|
|
8
|
+
"macos/24",
|
|
9
|
+
"ubuntu/22",
|
|
10
|
+
"ubuntu/24"
|
|
11
|
+
],
|
|
12
|
+
"failed": [
|
|
13
|
+
"macos/22.13.0",
|
|
14
|
+
"ubuntu/22.13.0"
|
|
15
|
+
],
|
|
16
|
+
"cause": "no such module: fts5"
|
|
17
|
+
},
|
|
18
|
+
"local_runtimes": [
|
|
19
|
+
{
|
|
20
|
+
"node": "22.13.0",
|
|
21
|
+
"fts5": false,
|
|
22
|
+
"tests_passed": 78,
|
|
23
|
+
"tests_skipped": 2,
|
|
24
|
+
"skip_reason": "Restoration of an FTS5 index requires the unavailable module; fallback behavior is exercised.",
|
|
25
|
+
"package_consumer": "passed",
|
|
26
|
+
"two_mcp_clients": "passed"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"node": "22.23.3",
|
|
30
|
+
"fts5": true,
|
|
31
|
+
"tests_passed": 80,
|
|
32
|
+
"tests_skipped": 0
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"node": "24.22.0",
|
|
36
|
+
"fts5": true,
|
|
37
|
+
"tests_passed": 80,
|
|
38
|
+
"tests_skipped": 0
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
"real_cross_runtime_roundtrip": {
|
|
42
|
+
"result": "passed",
|
|
43
|
+
"sequence": [
|
|
44
|
+
"Create indexed state under Node 22.23.3",
|
|
45
|
+
"Update a contract and delete another under stock Node 22.13.0",
|
|
46
|
+
"Rebuild derived FTS index under Node 22.23.3 and verify only the updated contract remains"
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
"hosted_after_fix": "Pending; inspect the final commit CI run for Linux/macOS validation."
|
|
50
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"client": "claude",
|
|
3
|
+
"version": "2.1.301 (Claude Code)",
|
|
4
|
+
"platform": "darwin",
|
|
5
|
+
"node": "v22.23.3",
|
|
6
|
+
"scenarios": [
|
|
7
|
+
{
|
|
8
|
+
"scenario": "isolated",
|
|
9
|
+
"passed": true,
|
|
10
|
+
"tools": [
|
|
11
|
+
"kith_begin_work",
|
|
12
|
+
"kith_begin_work",
|
|
13
|
+
"kith_record_file_edit",
|
|
14
|
+
"kith_run_with_mutex",
|
|
15
|
+
"kith_complete_work",
|
|
16
|
+
"kith_get_status",
|
|
17
|
+
"kith_complete_work",
|
|
18
|
+
"kith_get_status"
|
|
19
|
+
],
|
|
20
|
+
"hookDenialVerified": true,
|
|
21
|
+
"checks": [
|
|
22
|
+
"protected bytes unchanged",
|
|
23
|
+
"native edit",
|
|
24
|
+
"contract recorded",
|
|
25
|
+
"renewable MCP mutex command",
|
|
26
|
+
"failed verification and successful retry",
|
|
27
|
+
"verified integration",
|
|
28
|
+
"task completed",
|
|
29
|
+
"locks released",
|
|
30
|
+
"inherited owner preserved"
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"passed": true
|
|
35
|
+
}
|