Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
40c09a0
relay-guard: compare resolved paths, so a symlinked plugin folder works
darko-mijic Oct 29, 2026
a0616ca
docs: tool-output limits per harness, and a probe to measure them
darko-mijic Oct 30, 2026
3989f7d
Merge remote-tracking branch 'origin/fix/symlinked-plugin-path' into …
darko-mijic Oct 31, 2026
b21c3e6
Merge remote-tracking branch 'origin/docs/harness-output-limits' into…
darko-mijic Oct 31, 2026
022583a
relay: deliver peer and typed messages; bound close; a cancelled brie…
darko-mijic Oct 31, 2026
4c53ea3
relay 2.2.2: wider inline reviews, Codex and Grok output budgets, cor…
darko-mijic Oct 31, 2026
8da36ac
relay 2.2.2: read every TOML form of Grok's MCP budget; narrow setup'…
darko-mijic Oct 31, 2026
807ccb7
relay 2.2.2: bound reviews by file names too; keep typed text beside …
darko-mijic Oct 31, 2026
a15ac62
relay 2.2.2: close holistic review gaps
darko-mijic Oct 31, 2026
32cda3c
relay 2.2.2: handle remaining review edges
darko-mijic Oct 31, 2026
6bf0180
Respect project Grok caps and keep symlink targets out of review input
darko-mijic Nov 1, 2026
17b1538
Use rendered review size for per-file formatting overhead
darko-mijic Nov 1, 2026
9f95acf
Preserve Grok MCP limits from managed configuration
darko-mijic Nov 1, 2026
5465c80
Resolve the default home for Grok connections without a selection
darko-mijic Nov 1, 2026
34d1b1d
docs: remove the Mods plan
darko-mijic Nov 1, 2026
17bd25c
docs: 2.2.2 release date, final candidate check, 2.x takes bug fixes …
darko-mijic Nov 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
},
"metadata": {
"description": "Run jobs on Codex, Grok Build, ZCode and Kimi Code from Claude Code like Claude agents.",
"version": "2.2.1"
"version": "2.2.2"
},
"plugins": [
{
"name": "relay",
"description": "Run jobs on Codex, Grok Build, ZCode and Kimi Code from Claude Code like Claude agents.",
"version": "2.2.1",
"version": "2.2.2",
"author": {
"name": "Libar"
},
Expand Down
5 changes: 5 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,8 @@ tests, fixtures, docs, skills, CHANGELOG entries, commit messages and pull reque
- Every version field moves together with `node scripts/bump-version.mjs <version>`.
`npm run check-version` checks them.
- The CHANGELOG groups entries under the release heading. Don't add a heading per development version.

## Release maintenance

2.x is the final Relay line and takes bug fixes only: no new features. Validate its integration in
Claude Code after harness upgrades.
20 changes: 12 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ with a state block that says what happened.
1.0.6. [NOTICE](NOTICE) keeps the attribution and license terms. [docs/design.md](docs/design.md)
explains the design.

2.x is the final Relay line and takes bug fixes only.

## Backends

A backend is named by its harness. The model family goes in `model:`.
Expand All @@ -35,8 +37,8 @@ Requirements:
- Claude Code 2.1.271 or later, for hooks on `SubagentHandback`.
- Node.js 22 or later.
- macOS or Linux. The process sweep reads the process table with `ps`.
- At least one backend CLI, signed in: the Codex CLI, Grok Build, ZCode or Kimi Code. Release 2.1.2
was checked live with Codex 0.163.0, Grok Build 1.0.60, ZCode 3.15.3 and Kimi Code 2.2.0.
- At least one backend CLI, signed in: the Codex CLI, Grok Build, ZCode or Kimi Code. Release 2.2.2
was checked live with Codex 0.166.0, Grok Build 1.0.70, ZCode 3.16.2 and Kimi Code 2.4.1.

```bash
claude plugin marketplace add libar-dev/relay-plugin-cc
Expand Down Expand Up @@ -218,8 +220,8 @@ is recorded as a job, so `/relay:status` lists it.
| `--wait`, `--background` | run in the foreground, or as a Claude background task; without either, a review you type asks, and a review Claude starts runs in the foreground |
| `[focus]` | text after the flags; `/relay:adversarial-review` only |

Grok, ZCode and Kimi read only the diff inlined in their prompt, so they refuse a change above two files
or 256 KiB before anything starts. An adversarial answer that does not match the review schema
Grok, ZCode and Kimi read only the diff inlined in their prompt, so they refuse a change above 256 KiB
before anything starts. An adversarial answer that does not match the review schema
fails the review with the raw answer in the report.

### The stop-time review gate
Expand Down Expand Up @@ -319,7 +321,7 @@ runs on command hooks and the transcript.

## Development

`package.json` names the package `@libar-dev/relay-plugin-cc`, version 2.2.0. It is private and
`package.json` names the package `@libar-dev/relay-plugin-cc`, version 2.2.2. It is private and
not published to npm. Clone the repository and run:

```bash
Expand Down Expand Up @@ -347,6 +349,8 @@ them); the version named above in this section is set by hand.

Read [docs/architecture.md](docs/architecture.md) for the code layout and module rules,
[docs/backends.md](docs/backends.md) for the backend contract,
[docs/design.md](docs/design.md) for the behavior and the reasons behind it, and
[docs/kimi.md](docs/kimi.md) for what the Kimi backend rests on and how to check a new Kimi version, and
[docs/thread-surveys.md](docs/thread-surveys.md) for the surveys of real use that fixes came from.
[docs/design.md](docs/design.md) for the behavior and the reasons behind it,
[docs/kimi.md](docs/kimi.md) for what the Kimi backend rests on and how to check a new Kimi version,
[docs/thread-surveys.md](docs/thread-surveys.md) for the surveys of real use that fixes came from, and
[docs/relay-2.2.2-validation.md](docs/relay-2.2.2-validation.md) for this release's review findings,
regressions and live-validation evidence.
27 changes: 16 additions & 11 deletions docs/design.md
Original file line number Diff line number Diff line change
Expand Up @@ -238,8 +238,10 @@ server that dies during initialization leaves an identity, and records its end:
signal, an unfinished last line, the last 4096 bytes of stderr. `server.stderr.log` keeps at most
1 MiB. JSONL lines have no size cap, so multi-megabyte results reach `events.jsonl` intact, and an
unfinished last line is never parsed. A server that relay closes gets its stdin ended, then
SIGTERM 50 ms later if it still runs, so a closed server's end record can show SIGTERM; that is
relay's own close, not a crash, and the job's state was settled before it. When the server exits
SIGTERM after 50 ms and SIGKILL after another 4,950 ms if it still runs. A process that survives
SIGKILL for another five seconds is abandoned: its pipes close, its process is unreferenced, and its
server record stays open for the next worker's sweep. Its late exit does not write to a job another
worker may own. A close timeout is reported as such, not as an observed exit. When the server exits
while a child of it holds a pipe, the client reads for 200 ms more, then closes the pipes, so the
end is recorded and every pending request settles; a request to a server that has exited fails at
once.
Expand Down Expand Up @@ -334,9 +336,11 @@ Before every relay tool call and at SubagentStop, the hook reads the transcript
received message not yet delivered, in order: steered while the job runs, continued once it ended.

- A message is recognised by its entry type and origin, never by its text: a `queued_command`
attachment from the coordinator (a `SendMessage` while the relay works), a `user` entry from the
coordinator (a message after the hand-back, taken out of the harness's fixed wrapper), or a plain
`user` turn after the prompt that is neither metadata (`isMeta`) nor a tool result.
attachment or `user` entry from the coordinator, a peer or a person, or a plain `user` turn after
the prompt that is neither metadata nor a tool result. Peer text comes from `origin.body`; the
coordinator's and person's fixed wrappers are removed. Text from any of those origins survives a
shared text/tool-result entry, while a tool-result-only entry stays out. A task notification stays
out too, and an entry of any other origin is reported as a violation rather than delivered.
- A message that arrives before the job exists is delivered by `start` once the job exists.
- Each delivery is recorded in `inbox/relay/<transcript entry uuid>.json` under the relay lock, with
the inbox message id chosen before posting. A hook cut off half way posts again under the same
Expand Down Expand Up @@ -704,12 +708,13 @@ or `adversarial-review`, so `status` lists it. A Codex review turns off the job
ZCode and Kimi, which have no schema parameter, get it in the prompt. A Grok review always runs
under Grok's `read-only` profile, and a Kimi review refuses the file writes and terminal
commands Kimi sends through the client, which is not an OS sandbox (Known limits, Kimi).
- **Inline limits.** A Grok, ZCode or Kimi review reads only the inlined change (read-only ZCode and
Kimi have no shell to run git), so it sees the whole change or does not start. Untracked files count toward
the limits and are inlined whole, and a binary file is named and counts as a file. Above two files
or 256 KiB, the review is refused before any job or process exists, with a message naming
`--base`, `--scope` and Codex. A Codex adversarial review above the limits gets a summary and
reads the diff itself with read-only git commands; untracked files there are cut at 24 KiB each.
- **Inline limit.** A Grok, ZCode or Kimi review reads only the inlined change (read-only ZCode and
Kimi have no shell to run git), so it sees the whole change or does not start. The actual serialized
repository context, including Git's rendered names and decoded file contents, must fit 256 KiB.
Above that, the review is refused before any job or process exists, with a message naming `--base`,
`--scope` and Codex. A file already known to be oversized is named without being read. A Codex
adversarial review above two files or 256 KiB gets a summary and reads the diff itself with
read-only git commands; untracked files there are cut at 24 KiB each.
- **The schema.** An adversarial answer counts only if it matches
`schemas/review-output.schema.json`: types, enums, required fields, ranges, array items and no
extra properties. One JSON code fence around the whole answer is unwrapped. Anything else fails
Expand Down
Loading
Loading