kith-coord 0.0.0-stage → 0.1.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.
- package/CHANGELOG.md +98 -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 +5022 -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 +983 -0
- package/dist/index.js +3708 -0
- package/dist/index.js.map +1 -0
- package/docs/architecture.md +37 -0
- package/docs/client-validation.md +51 -0
- package/docs/integrations.md +75 -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 +78 -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-subtraction-claude.json +35 -0
- package/docs/validation/2026-10-20-subtraction-codex.json +33 -0
- package/package.json +83 -4
package/docs/protocol.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Kith coordination protocol 1.0
|
|
2
|
+
|
|
3
|
+
Kith is a local ledger for cooperating coding agents. Clients share one repository's coordination state, including across linked Git worktrees. The transport is MCP over stdio (`kith mcp --repo /absolute/checkout`). No hosted service or Kith API key is required. The server process has the user's filesystem and command permissions.
|
|
4
|
+
|
|
5
|
+
## Versioning and schemas
|
|
6
|
+
|
|
7
|
+
`KITH_PROTOCOL_VERSION` and status responses advertise `1.0.0`. Package releases (`kith-coord`, beginning at 0.1.0) and the SQLite storage schema (2) have independent versions. The [tool snapshot](protocol/tools.v1.json) contains all 13 tool names, descriptions and JSON input schemas, exported from an actual MCP `tools/list` response. `pnpm protocol:check` rejects snapshot drift in CI. Update deliberately using `pnpm protocol:export`.
|
|
8
|
+
|
|
9
|
+
For protocol 1.x, existing tool names, required input fields and the ownership/claim semantics below remain compatible. New optional fields/tools and additive result fields use a minor version; compatible repairs use a patch version. Removing tools, adding required inputs or changing ownership semantics requires a major version. Clients should ignore unknown result fields. The snapshot describes inputs; it is not a machine-validated schema for every result or a guarantee of source-level library compatibility.
|
|
10
|
+
|
|
11
|
+
Successful tool replies place the same JSON object in `structuredContent` and the first text block. Additional text may contain an advisory event delta. Inspect `isError` and the operation's fields: a computed preview with `clean:false` is a successful observation of a conflict, not permission to integrate. Exceptions are MCP tool errors. Never infer successful work from the client process exit code alone.
|
|
12
|
+
|
|
13
|
+
## Sessions and claims
|
|
14
|
+
|
|
15
|
+
- `kith_start_session` or `kith_begin_work` grants a random session capability for a unique `agentId`. The owning MCP connection retains it. Another connection needs the capability to resume that generation; an ID is not authorization. Tokens are returned at grant/resume and must not be logged. Public status omits capabilities and their hashes.
|
|
16
|
+
- `kith_heartbeat` renews an owned active generation before expiry (five minutes by default). It cannot revive an expired or completed generation. Engine startup may reap expired/dead owners and requeue unfinished tasks. Active supervised command guards remain until shutdown is confirmed.
|
|
17
|
+
- `kith_begin_work` declares an intent and atomically acquires its supported scope claims. An overlapping exclusive claim returns a conflict. Use `isolateWorktree:true`, and edit only the returned `worktree.worktreePath`. Worktrees separate files while claims describe cooperative ownership across checkouts.
|
|
18
|
+
- `kith_check_and_lock_files` acquires file/glob/symbol claims using fencing generations. See [scope rules](path-and-scope-rules.md); unsupported patterns are rejected. Direct filesystem writes and bypassed hooks are outside this protocol's enforcement boundary.
|
|
19
|
+
- `kith_add_task` adds tasks with priority, scope and optional `dependsOn`. `kith_claim_next_task` atomically claims the next unblocked task and its scope. `kith_get_status` lists tasks. These are the canonical names; there are no redundant task aliases or capability-matching scheduler.
|
|
20
|
+
- `kith_record_file_edit` reports actual worktree changes. `kith_publish_contract` publishes an explicit interface record. Contract analysis and exact-name reuse hints are advisory, not proof of semantic compatibility.
|
|
21
|
+
- `kith_acquire_port` reserves a port among Kith clients. The OS probe socket is released; unrelated processes can still bind it. `kith_run_with_mutex` executes literal argv under a renewable named FIFO mutex and persistent process-group guard. Cancellation/disconnect stops the guarded command before release. Do not detach protected work from its supervised group.
|
|
22
|
+
|
|
23
|
+
## Workspace observation and integration
|
|
24
|
+
|
|
25
|
+
`kith_get_status` preserves agents, tasks, locks, contracts, conflicts, resources, merge queue, quarantine and events. It adds `protocolVersion`, `mutexWaiters` (ticket order), `commandGuards`, and `workspaces`. Normal status observes active owners; offline inspection also includes retained recorded worktrees. Each workspace reports its path, recorded and actual branch, HEAD, dirty paths (including rename sources), last commit time/age, last heartbeat, lease expiry, availability, and dirty-file overlaps with active peers. `ahead`/`behind` compare against `comparisonBase`, the selected integration checkout's observed HEAD. Commit age is descriptive; an old commit is not evidence of a dead agent. Missing/unreadable workspaces are marked unavailable, not clean. Git observations are sequential snapshots, not a transaction over all files/checkouts.
|
|
26
|
+
|
|
27
|
+
`kith_preview_integrate` requires an owned registered worktree on its recorded branch, committed source changes, and a clean integration target. It reports frozen `sourceHead`/`targetHead`, branch names, `clean`, and exact Git conflict paths. Dirty inputs return `ok:false` and are not checkpointed. Git may write unreachable merge-tree objects, but preview never stages files, advances refs or rewrites worktree contents. Authorization can renew the session and deliver an event delta. A clean preview does not run project verification or guarantee a later integration: inputs can change.
|
|
28
|
+
|
|
29
|
+
`kith_complete_work` checkpoints source changes and integrates through a separate staging worktree into the selected checkout's current branch. Supply `verificationCmd`; without it, only Git mergeability is checked. Dirty/racing targets, Git conflicts and failing or mutating verification refuse integration. Failure retains source work, task and claims for repair/retry. Successful completion releases ownership/resources and retains the source worktree for explicit inspection/removal. External Git writers must coordinate too.
|
|
30
|
+
|
|
31
|
+
## Offline inspection
|
|
32
|
+
|
|
33
|
+
Normal CLI/MCP status opens the engine and may migrate or reap. `kith status --offline`, `kith recover`, and `kith doctor` instead inspect a private copy of the database plus matching SQLite sidecars. They never initialize/migrate the original, renew/release claims, clear guards, or remove work. If files change while being copied or validation fails, observation is unavailable; stop writers and preserve the complete set before retrying. `recover` lists retained worktree directories, recorded owners, expired claims, unfinished integrations and lock-file presence. It performs no automatic repair. See [recovery](reliability.md).
|
|
34
|
+
|
|
35
|
+
Preview refuses repositories with configured custom merge drivers because Git can execute their commands during merge-tree. It does not silently substitute a different merge policy. Actual integration can run trusted project code and still needs an appropriate verification command.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Reliability contract and recovery
|
|
2
|
+
|
|
3
|
+
Kith coordinates cooperating coding agents through work claims, isolated worktrees, shared local resources and verification before integration. This contract describes tested behavior and recovery boundaries.
|
|
4
|
+
|
|
5
|
+
Scope intersection is exact within the documented grammar; unsupported scopes are rejected. Contract analysis is advisory. Kith does not provide an OS sandbox, distributed consensus, or proof that two changes are semantically compatible.
|
|
6
|
+
|
|
7
|
+
## Behavior covered by regression tests
|
|
8
|
+
|
|
9
|
+
- Conflicting exclusive file locks and task claims have unique owners under simultaneous process contention.
|
|
10
|
+
- Port reservations are rechecked atomically after asynchronous OS probes; exhaustion returns an error.
|
|
11
|
+
- Setup previews without writes, preserves unrelated JSON settings, and rejects malformed config before writing selected configuration.
|
|
12
|
+
- Worktree creation refuses an existing path or branch; removal refuses local, untracked, or ignored changes.
|
|
13
|
+
- Integration refuses a dirty target and concurrent Kith integrations; failed or mutating verification preserves the target and source worktree for retry. Checks cannot change the candidate commit, tracked/index contents, or leave new nonignored files behind.
|
|
14
|
+
- Unresolved Git conflicts fail integration without custom source/JSON rewriting. Source and target work remain available for explicit repair and retry.
|
|
15
|
+
- Shadow-tree deletions reach Git; invalid merge inputs surface errors.
|
|
16
|
+
- Bash recovery preserves current workspace bytes by default and saves before/after copies.
|
|
17
|
+
- Event pagination does not acknowledge unseen events.
|
|
18
|
+
- Commands passed after `--` retain their argument boundaries and child exit status.
|
|
19
|
+
- Long commands renew leases; expiry, cancellation, supervisor death, and suspension do not permit overlapping guarded command groups.
|
|
20
|
+
- FIFO tickets survive release, and cancelled waiters do not block the queue.
|
|
21
|
+
- Separate CLI/MCP clients cannot mutate a live ID without its capability; old tokens cannot clean up a replacement session.
|
|
22
|
+
- Generated hook commands, MCP wire initialization/calls, worktree reporting, failed verification followed by repair/retry, completion, and disconnect recovery run end to end against actual subprocesses.
|
|
23
|
+
- A killed MCP owner can be recovered from a stopped database/WAL backup: its task is requeued, old capability rejected and worktree preserved for a new owning session.
|
|
24
|
+
- Unknown or missing schema versions are refused before writable database setup. Failed legacy migrations roll back ownership/schema changes and preserve workspace and recovery files.
|
|
25
|
+
|
|
26
|
+
These are test scenarios, not universal guarantees. CI coverage and real usage need to grow together.
|
|
27
|
+
|
|
28
|
+
## Important limits
|
|
29
|
+
|
|
30
|
+
**Hooks.** Clients must actually invoke hooks, use the same repository state, and agree on agent IDs. Missing or bypassed hooks do not prevent filesystem writes. Claude/Cursor hooks need matching `KITH_AGENT_ID` and `KITH_SESSION_TOKEN` when mixed with CLI commands. Malformed pre-tool execution errors exit with status 2, which the client uses to block the tool. Some payload shapes and client versions remain untested.
|
|
31
|
+
|
|
32
|
+
**Sessions and leases.** Mutations require a capability bound to the active session generation. Process anchors are fixed on resume, real process identities replace test liveness sentinels, and expired/completed sessions cannot be revived by heartbeat. Sessions default to five minutes; use heartbeat before expiry. Supervised command mutexes renew their leases and preserve FIFO tickets across handoff. Active command-group guards survive expiry and are released only after the group stops. A protected daemon that escapes its group is outside this boundary. See [sessions and mutexes](sessions-and-mutexes.md) for lifecycle, cancellation, and upgrade details.
|
|
33
|
+
|
|
34
|
+
**Bash recovery.** Snapshots skip large files, symlinks, and generated/dependency directories. One snapshot is stored per agent. Overlapping commands can replace snapshots, and a shared-workspace snapshot cannot distinguish a sibling's legitimate concurrent edits from a command's unauthorized edits. The default saves current and pre-command recovery copies without changing workspace bytes. Explicit library callers can opt into `restoreLockedFiles: true` only when they control all writers; restoration is best effort and can restore older bytes. Prefer worktrees. This is not a safe attribution or security mechanism.
|
|
35
|
+
|
|
36
|
+
**Ports.** A reservation coordinates Kith clients but releases its OS probe socket immediately. Another process can bind the port before your service does. Handle bind failures.
|
|
37
|
+
|
|
38
|
+
**Git.** Integration targets the currently checked-out branch, not a hardcoded main branch. External Git writers can race with integration. Dependency hydration and speculative verification may run project code with your privileges. Verification uses a shared dependency symlink in the staging tree; choose checks that do not mutate shared dependencies. Worktree hydration can copy `.env` files; treat those worktrees as sensitive.
|
|
39
|
+
|
|
40
|
+
**Configuration.** Preflight refuses malformed selected configuration before writes. Private setup backups are persisted before client-file writes; disk failure can still leave partial configuration requiring inspection. Uninstall restores only unchanged recorded writes and preserves user edits, coordination state and the ignore rule. Custom Git hooks and third-party hook managers require manual integration. See [setup recovery](integrations.md#diagnose-and-undo-setup).
|
|
41
|
+
|
|
42
|
+
## Recovery
|
|
43
|
+
|
|
44
|
+
1. Stop all clients, writers and supervised commands. Inspect Git status in every worktree. Use `kith status --offline` or `kith recover` for inspection without migration/reaping; `kith doctor` diagnoses configuration/runtime too. These commands copy the database and matching sidecars into a private temporary directory, validate/read that copy, and leave original bytes alone. An unstable or damaged snapshot is reported unavailable. Normal CLI/MCP status opens the engine and may migrate or reap owners.
|
|
45
|
+
2. Preserve worktree contents and quarantine files before removing state. Never delete `.coord` as routine cleanup: it contains worktrees, snapshots, and quarantine backups.
|
|
46
|
+
3. If integration reports busy after a crash, inspect `.coord/merge-train.lock`, confirm its process is no longer running, and preserve any `_merge_train_*` worktree before manually removing the stale lock.
|
|
47
|
+
4. Repair conflicts or failed checks in the source branch/worktree, then retry integration on the same session with a suitable verification command. Use checks that leave tracked/index contents and HEAD unchanged. Put formatters and fixers in the source worktree first. Ignored build/test outputs and Kith's unchanged dependency hydration are allowed; new nonignored staging files are rejected.
|
|
48
|
+
5. To remove a worktree, commit or preserve local files first. After completing its session, start a new maintenance generation with `kith session start --agent <id> --new --owner-pid "$$" --shell`. Kith deliberately does not force removal.
|
|
49
|
+
6. Inspect `mutex_runs` before manually removing a stuck command guard. Confirm its worker group and protected descendants cannot still execute. A process that escaped the group may require external recovery. Never clear a live guard to bypass a busy result.
|
|
50
|
+
|
|
51
|
+
### Stopped database backups and interrupted agents
|
|
52
|
+
|
|
53
|
+
Preserve `state.db` together with any matching `state.db-wal` and `state.db-shm` files after every client/writer has stopped. Keep worktrees, snapshots, quarantine copies and the private `setup/` ledger too. `recover` reports retained worktree directories, recorded owners, expired claims, unfinished integrations and lock-file presence; it does not repair or release anything. A crash can leave committed data only in the WAL; copying `state.db` alone can lose it. Restore the database and its matching sidecars as one stopped set, preserving the current set separately first. Never mix a restored database with sidecars from another snapshot or restore while old clients remain alive. These are tested recovery scenarios, not a corruption-repair tool.
|
|
54
|
+
|
|
55
|
+
After an MCP owner dies, reconnect and inspect the queued tasks and retained worktree before claiming work. `kith_claim_next_task` with the same agent ID can create a fresh session generation and retain that worktree; verify the returned task ID/scope before continuing because it claims the highest-priority eligible task. The old capability is invalid. Do not request another isolated worktree over the retained path: creation deliberately refuses to replace existing work. Repair/report edits there, then complete with a read-only project check.
|
|
56
|
+
|
|
57
|
+
Startup also refuses missing/empty databases when worktrees or recovery files remain, orphan SQLite sidecars, missing required tables or ownership columns, invalid/regressed fencing counters and SQLite-detected page damage. It preserves that state for inspection; it does not reconstruct lost ownership. Empty first initialization can be retried only when no recovery files remain. Fencing exhaustion fails without rounding or resetting the counter.
|
|
58
|
+
|
|
59
|
+
Unsupported or missing schema metadata requires inspection of a preserved copy. Do not edit the version value to force an upgrade. A supported schema-1 upgrade invalidates legacy ownership and requeues unfinished tasks; an error rolls back those database changes. A process killed after migration writes but before commit is covered by a regression that reopens the old state, retries the upgrade and reclaims the queued task without changing unfinished files or recovery copies. Stop older clients before upgrading or retrying.
|
|
60
|
+
|
|
61
|
+
The SQLite implementation requires Node's unflagged SQLite API: [Node SQLite documentation](https://nodejs.org/download/release/latest-jod/docs/api/sqlite.html). Generated Claude integration follows the [hook reference](https://code.claude.com/docs/en/hooks) and [project MCP configuration](https://code.claude.com/docs/en/mcp).
|
|
62
|
+
|
|
63
|
+
## Existing databases
|
|
64
|
+
|
|
65
|
+
No full-text SQLite extension is required. Contracts, tasks, locks and supervised commands use the canonical tables on every supported runtime. Older derived `contracts_fts` tables are left intact but are no longer read or maintained. Stop all clients before upgrading. Do not mix versions or rely on downgrading to an older search index after new contract writes. No schema reset, new tables or automatic repair are involved.
|
|
66
|
+
|
|
67
|
+
## Paths, scopes and merge boundaries
|
|
68
|
+
|
|
69
|
+
See [path and scope rules](path-and-scope-rules.md) for repository discovery, literal route filenames, supported glob grammar, symlink handling and conflict refusal. These checks assume cooperating writers: a process replacing filesystem links between a check and a write can race path checks. Hardlink aliases and a hostile filesystem writer are outside the containment boundary. Git merges non-conflicting edits; project verification still determines whether that combined change works.
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
## Observations and previews
|
|
73
|
+
|
|
74
|
+
Workspace status distinguishes recorded branch/lease from observed Git state. Dirty overlap means the same relative path is changed in multiple active checkouts; it does not prove a merge conflict. Ahead/behind uses the reported target HEAD, not a fetched remote branch. Commit age does not trigger release; ownership TTL and heartbeat remain authoritative. Unavailable observations must not be interpreted as clean.
|
|
75
|
+
|
|
76
|
+
`kith_preview_integrate` uses committed source/target trees and reports Git's exact conflict paths. It refuses dirty inputs rather than silently checkpointing them. It can create unreachable Git objects but leaves files/indexes/refs untouched; normal session authorization can renew a heartbeat. Actual completion rechecks inputs and performs the requested project verification independently. A successful preview is not a verification result.
|
|
77
|
+
|
|
78
|
+
Preview refuses repositories with configured custom merge drivers because Git can execute their commands during merge-tree. It does not silently substitute a different merge policy. Actual integration can run trusted project code and still needs an appropriate verification command.
|
package/docs/roadmap.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Roadmap
|
|
2
|
+
|
|
3
|
+
Success means a new contributor can reproduce a two-agent workflow, understand its boundaries, preserve work through failure, and extend one client adapter without rewriting the engine.
|
|
4
|
+
|
|
5
|
+
## 1. Reliability foundation — implemented
|
|
6
|
+
|
|
7
|
+
Implemented: non-destructive configuration merging and previews, safer worktree lifecycle, serialized Kith integration, atomic port reservations, Git conflict refusal, surfaced Git errors, preserved command arguments, event pagination, non-destructive Bash recovery defaults, actual process contention coverage, contributor docs, license text, and a CI definition.
|
|
8
|
+
|
|
9
|
+
The canonical upstream is [connorhriley/kith](https://github.com/connorhriley/kith). Hosted results are available in [Actions](https://github.com/connorhriley/kith/actions/workflows/ci.yml); workflow configuration alone is not evidence of a passing matrix.
|
|
10
|
+
|
|
11
|
+
## 2. Session, command, and client validation — implemented
|
|
12
|
+
|
|
13
|
+
Capability-owned session generations now protect agent-scoped mutation boundaries; process anchors cannot be silently rebound and liveness uses actual kernel identities. Schema 2 invalidates legacy unowned sessions while preserving files. Commands renew leases asynchronously, preserve FIFO tickets, and retain a process-group execution guard across expiry, cancellation, suspension, or supervisor crashes. CLI signals and output are supervised. Actual MCP stdio clients and generated hook commands now cover worktree reports, Git hooks, verification, completion, and disconnect recovery. A two-client disposable example is available with `pnpm demo`.
|
|
14
|
+
|
|
15
|
+
These gates are covered locally. Version-specific native Codex and Claude CLI runs are recorded in [client validation](client-validation.md). Other releases, GUI discovery, and persisted project trust need separate validation.
|
|
16
|
+
|
|
17
|
+
## 3. Path, scope and merge hardening — implemented; recovery next
|
|
18
|
+
|
|
19
|
+
- Exact scope-language intersection for literals, `*`, `?` and whole-segment `**`, with generated witness checks, dotfile coverage, explicit literal-file scopes and conservative handling of legacy unsupported scopes.
|
|
20
|
+
- Redesign shared-tree Bash attribution before considering automatic restoration as a default. Gate: sibling edits cannot be reverted by another agent's post-hook.
|
|
21
|
+
- Shared common-Git-directory discovery from roots, subdirectories, linked worktrees, symlink aliases and separate Git directories; physical containment, external-link refusal, literal framework paths and invoking-index Git guards have regression coverage.
|
|
22
|
+
- Git conflicts require explicit source-worktree repair and retry; no custom source/JSON rewriting remains. Actual Git regressions preserve symlink targets, unusual filenames and non-UTF-8 bytes.
|
|
23
|
+
- Legacy migration rollback/retry (including a process killed before commit), damaged-state refusal and stopped WAL backup restoration have regressions, including killed MCP ownership and worktree continuation. Broader upgrade/downgrade combinations and corrupted-state repair remain unvalidated.
|
|
24
|
+
|
|
25
|
+
## 4. Broaden integration validation
|
|
26
|
+
|
|
27
|
+
Cursor native hook payload/command fixtures, enforcement modes, private setup backups and conservative uninstall are implemented. Add manual workflows against actual Claude/Cursor/Codex application releases. Extend the current stdio/hook lifecycle and cancellation tests to other supported payload shapes. Cover paths with spaces, nested workspaces, custom Git hooks, missing Git identity, and crashes. Measure latency and memory in reproducible small and large repository fixtures before publishing performance claims.
|
|
28
|
+
|
|
29
|
+
## 5. Public project and release operations
|
|
30
|
+
|
|
31
|
+
The canonical upstream is established. The package identity is `kith-coord` (CLI `kith`); release checks include an actual installed-package MCP consumer. Input schemas and claim/status semantics are recorded under protocol 1.0 with a CI drift check. Maintain registry ownership, maintainer access, security/moderation contacts and the decision process. Private vulnerability reporting is enabled on the canonical upstream. Run the CI matrix on real pull requests. Publish a prerelease only after a packed-package clean-install check, dependency review, documented support matrix, changelog, rollback procedure, and end-to-end demo. Add provenance and automated publishing after ownership and credentials are established.
|
|
32
|
+
|
|
33
|
+
## 6. Adaptability after the core is sound
|
|
34
|
+
|
|
35
|
+
Define parser and client adapter interfaces, add configuration for project-specific verification/hydration, and ship small runnable examples. Prioritize requests backed by concrete user workflows. Keep enforcement, advisory analysis, and presentation separate.
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
## Requested priorities and remaining gates
|
|
39
|
+
|
|
40
|
+
The current adoption pass adds optional Claude/Cursor block/warn/off hooks, richer status and committed-tree conflict previews, offline inspection/recovery reports, doctor, tracked setup/uninstall and a versioned input-schema snapshot. Atomic task claims/dependencies, port leases, supervised command mutexes, explicit contracts/symbol lock scopes and stopped WAL restore already exist; keep their canonical tool names rather than adding aliases.
|
|
41
|
+
|
|
42
|
+
Next work needs concrete workflow validation: capability-filtered queue claims, named port/env/install bundles, broader Windows/process validation, and MCP registry publication. Optional notes, PR helpers, interoperable third-party ledgers and fleet spawning are proposals, not implemented behavior or release promises. No dashboard, model router or autonomous PR fixer is planned. Public adoption claims require actual user evidence.
|
|
@@ -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
|
+
}
|