Releases: makedirectory/ModelPeer
Release list
v0.5.1 — doctor diagnoses Gemini's auth method
A patch release for a diagnostic bug that could cost you ten minutes and look
like a Model Peer hang.
Install
curl -fsSL https://raw.githubusercontent.com/makedirectory/ModelPeer/v0.5.1/install.sh | bashDocs: https://modelpeer.app
Fixed
model-peer doctor printed "cached OAuth is verified on first request" whenever
no auth environment variable was set, without reading the sign-in method Gemini
actually recorded in ~/.gemini/settings.json.
The state that hid is the worst one. Configured for an API key with no key
present, Gemini does not error — headless, with stdin closed, it blocks on an
auth prompt nobody can answer, and a review simply hangs.
| auth state | result |
|---|---|
deliberately wrong GEMINI_API_KEY |
fails in ~1 second, HTTP 400 |
| no key at all | hangs indefinitely |
So the difference between "misconfigured" and "hung forever" was one missing
environment variable, and doctor called that state healthy. It now names it:
Gemini authentication: BROKEN — configured for an API key, but neither GEMINI_API_KEY nor
GOOGLE_API_KEY is set. Headless calls will hang rather than
fail, because Gemini waits on a prompt that stdin cannot
answer. Export a key, or re-run `gemini` and pick another
sign-in method.
API key, Vertex AI, OAuth, and not-yet-configured report distinctly. A fresh
install with no settings file is not reported as broken.
This matters because Gemini works fine interactively in exactly this state — it
just asks you for the credential. Only the headless path Model Peer uses hangs.
How it was found
By doctor --probe, shipped one release earlier. The probe reported Gemini as
unverified while Claude and Codex passed, and the cause turned out to be local
auth rather than anything in Model Peer — which is exactly the separation the
probe was added to make.
model-peer doctor --probe is the fastest way to check your own setup.
Also
tools/bump-version.sh now refreshes this repo's own installed skills, which
stamp the version into their managed header and previously showed as stale on
every bump.
Full notes in CHANGELOG.md.
Full Changelog: v0.5.0...v0.5.1
v0.5.0 — doctor --probe
Verify the read-only contract against the CLIs you actually have installed,
rather than against Model Peer's own flags.
Install
curl -fsSL https://raw.githubusercontent.com/makedirectory/ModelPeer/v0.5.0/install.sh | bashDocs: https://modelpeer.app
model-peer doctor --probe
model-peer doctor --probe [--models LIST] [--timeout S]The smoke suite runs against stub CLIs. That is right for CI — fast, and it
consumes no usage — but it verifies the flags Model Peer passes, not what the
vendors do with them. Every wrong assumption this project has shipped was of
the second kind.
--probe creates a throwaway Git repository containing a token file and a
sentinel, then asks each installed CLI to read the token and to attempt to
modify the sentinel and create a new file.
The judgement comes from the filesystem, never from the reply. A model
claiming it could not write proves nothing; an unchanged file does. The prompt
asks the peer to attempt a write precisely so the disk can answer.
Claude 2.1.227
ok read the workspace (quoted the probe token)
ok sentinel.txt unchanged
ok created no files
Codex 0.147.0
ok read the workspace (quoted the probe token)
ok sentinel.txt unchanged
ok created no files
Gemini 0.46.0
timeout no answer within 600s — nothing verified
Verified read-only: Claude, Codex
Not verified: Gemini — no usable answer, so the contract is
untested for them, not confirmed.
A peer that times out or returns nothing is reported as unverified, not as a
pass. Exit 1 covers both an inconclusive run and a safety failure; a safety
failure — meaning the workspace actually changed — is called out separately and
loudly.
This also separates "Model Peer broke it" from "the vendor is broken here". In
the run above Gemini did not answer, and a direct gemini -p call in the same
directory hung identically. If a CLI hangs during a review, the probe tells you
which side the fault is on.
It consumes real usage — one model call per installed CLI, against your own
vendor account. It is opt-in and never part of plain doctor. The natural moment
to run it is after upgrading a vendor CLI, when the assumptions underneath Model
Peer are most likely to have moved.
Also
model-peer doctor now reports each CLI's version alongside its path, so a bug
report carries the versions of the three tools whose behaviour all of this
depends on.
Claude installed 2.1.227 /Users/you/.local/bin/claude
Codex installed 0.147.0 /opt/homebrew/bin/codex
Gemini installed 0.46.0 /opt/homebrew/bin/gemini
Full notes in CHANGELOG.md.
Full Changelog: v0.4.0...v0.5.0
v0.4.0 — skills-based init, chain-guard hardening
Setup became a skill, and the chain guards were brought in line with what the
documentation already promised.
Install
curl -fsSL https://raw.githubusercontent.com/makedirectory/ModelPeer/v0.4.0/install.sh | bashDocs: https://modelpeer.app
init stops touching your files
In 0.3.0 init wrote your AGENTS.md and symlinked CLAUDE.md and GEMINI.md
to it. A tool that rearranges someone's root context files uninvited does not get
run twice. It now installs self-contained agent skills and nothing else:
.claude/skills/cross-model-review/SKILL.md .claude/commands/peer-review.md
.claude/skills/cross-model-consult/SKILL.md .claude/commands/peer-ask.md
.codex/skills/... (both, per CLI)
.gemini/skills/...
AGENTS.md, CLAUDE.md, and GEMINI.md are never read, written, or symlinked.
Two skills, because the tool does two things that fire on different cues:
review cross-checks a diff across the whole panel, consult gets one peer's
opinion on one question.
Skill discovery was verified against the shipping CLIs rather than their docs:
gemini skills list reports them, a codex exec run lists them among its
skills, and Claude Code quotes their descriptions back from the system prompt.
New commands
model-peer update [--check] # refresh installed skills; --check is the CI form
model-peer trust # let Gemini load this project's skillsupdate only touches files that already exist and that Model Peer wrote, so it
cannot quietly widen what is in your repository.
Only Gemini needs trust — Codex loads project skills untrusted, and Claude Code
prompts once interactively. It adds one TRUST_FOLDER entry to
~/.gemini/trustedFolders.json and nothing else. Folder trust is a security
control, so init never does it for you.
Fixed
Four documented guarantees were stronger than what the code enforced. Each was
reproduced before being fixed, and each has a regression test.
- A model could appear twice in one chain. The guard compared only the tail
ofMODEL_PEER_STACK, soclaude → claudewas blocked while
claude → codex → claudewas permitted. - A peer could raise the ceiling it inherited.
--depthbeat the inherited
MODEL_PEER_MAX_DEPTH. It is now a hard cap inside a chain. - Synthesis was unbounded. Reviewers were bounded by
--timeout; the
synthesis call was not, so a hung synthesizer could hang a completed run. - A delegating Claude peer was over-granted.
Bash(model-peer:*)stopped
being read-only onceinitandupdateexisted. Delegation now grants
Bash(model-peer _delegate:*)only — an entry point that inherits every limit,
takes no options, and cannot reachinit,update,review, ortrust. - Temporary directories are removed on interrupt, not only on the normal path.
Changed
review no longer accepts --depth. Reviewers and the synthesizer are always
leaves. Reviewers that can consult one another are not independent observations,
which is the entire value of the panel. ask explores; review cross-checks.
Corrects a 0.3.0 claim: .codex/rules/ is a real directory Codex reads, but
it holds Starlark .rules files governing command execution, not agent context.
Full notes in CHANGELOG.md.
Full Changelog: v0.3.0...v0.4.0
Model Peer v0.3.0
Repository setup and orchestration robustness. model-peer init closes the gap between installing the tool and an agent ever using it; the review path is hardened against the failure modes that cost a whole run.
Install
curl -fsSL https://raw.githubusercontent.com/makedirectory/ModelPeer/v0.3.0/install.sh | bashDocs: https://modelpeer.app
Set up a repository
Installing Model Peer globally gives you a command. It does not give the coding agent in your repository a habit. One command per project fixes that:
cd ~/code/your-project
model-peer init created AGENTS.md
linked CLAUDE.md -> AGENTS.md
linked GEMINI.md -> AGENTS.md
created .claude/commands/peer-review.md (/peer-review)
--split writes one tailored file per CLI instead, each addressing that model directly and naming its two peers, so each harness loads only its own: .claude/rules/cross-model-consultation.md, AGENTS.md, GEMINI.md.
These are the paths each CLI genuinely loads, verified against the shipping binaries. .codex/rules/*.md and .gemini/global_rules.md look tidy and are never read, so init will not create them.
Rules live between <!-- BEGIN MODEL PEER RULES --> markers. Content outside them is never rewritten, so init appends below an existing AGENTS.md, is safe to re-run, and refreshes in place after an upgrade. model-peer rules check exits 1 on a missing or stale block, for CI.
Review robustness
- Bounded consultations.
--timeout(600s default,0disables,MODEL_PEER_TIMEOUT), a 30s stderr heartbeat, exit124on timeout. - Hangs actually die. On timeout the peer's whole process group is signalled. Killing only the direct child left vendor helper processes holding the inherited stdout, so the downstream pipeline never saw EOF and the hang survived the kill.
- Partial panels. A reviewer that times out, fails, or exits
0with zero output is dropped and named. Synthesis proceeds while at least two reviewers produced a real review and is refused below that. The synthesizer is told which reviewers are missing, so a partial panel is never reported as complete.--strictrestores refuse-on-any-failure.
Fixed
- Untracked files were invisible to reviewers.
git diff HEADcannot see them, andgit status --shortcollapses a new directory to a single?? src/line — an entire new package reached reviewers as one path with no filenames and no contents. Context now includes an add-diff for every untracked, non-ignored file. - Gemini failed silently in untrusted directories. Its folder-trust gate refuses to work headlessly and exits
0having produced nothing, which a panel read as "this reviewer found no issues". Model Peer now passes--skip-trust, feature-detected fromgemini --help. This does not widen the boundary. - An empty review counted as a clean review.
Docs
New pages: In your workflow and Troubleshooting. The site moved to its own domain, https://modelpeer.app.
Full notes in CHANGELOG.md.
Full Changelog: v0.2.0...v0.3.0
Model Peer v0.2.0
Cross-model peer review, now with a bounded consultation chain.
Install
curl -fsSL https://raw.githubusercontent.com/makedirectory/ModelPeer/v0.2.0/install.sh | bashAs with any remote shell installer, inspect it before piping it into a shell.
Highlights
Peer-chain depth
--depth N on ask and review, plus MODEL_PEER_MAX_DEPTH, bounds how far consultation can recurse. Default 1 (a peer answers alone), ceiling 10. The limit propagates down the chain, so a peer cannot raise its own ceiling.
model-peer ask claude "..." # depth 1: claude answers alone
model-peer ask claude --depth 2 "..." # claude may consult one further peer
model-peer review --depth 2 "..." # each reviewer may consult one peerDepth is a limit, not a permission
The governing invariant:
Increasing depth may increase how many models can participate.
Increasing depth must never increase what a model can do to the host system.
Delegation — the permission to initiate a further consultation — is tracked separately from depth and granted only where a provider's sandbox can scope it to Model Peer alone:
| Provider | Nested consultation | What delegation grants |
|---|---|---|
| Claude | yes | Bash auto-approved only for Bash(model-peer:*) |
| Codex | yes | nothing — the read-only sandbox already permits it |
| Gemini | no | n/a; its deny rules are unconditional at every depth |
Gemini is deliberately excluded: its policy engine can only allow or deny run_shell_command wholesale, and an uneven provider matrix is more honest than a weakened boundary. A depth budget a provider cannot safely hold is reported on stderr, never silently converted into a wider sandbox.
This is a known implementation limitation rather than the intended end state. The README documents a consultation broker roadmap, where peers request a consultation from the parent process instead of executing model-peer, so peers stay read-only at every depth.
Chain guards
Two independent guards, both exiting 64: the chain may not exceed the depth limit, and a model is never consulted by itself at any depth.
Fixed
model-peer reviewoverwroteMODEL_PEER_STACK, so a review launched from inside a peer chain escaped the recursion guard entirely. The synthesizer is now always a leaf.install.shembeds a verbatim copy ofbin/model-peerfor thecurlpath and could drift from it silently.make syncregenerates it;make check-syncfails the build on drift.- The documented one-line install pointed at a
YOUR_GITHUB_USERNAMEplaceholder and could never have worked. - CI had never passed on this repository —
make lintfailed shellcheck from the first commit. It is green on ubuntu and macOS as of this release.
Changed
- Agent rules consolidate into a single
AGENTS.md, withCLAUDE.mdandGEMINI.mdas symlinks so all three CLIs read one file.examples/ships one shared template instead of three near-identical copies. model-peer doctorreports the per-provider nested-consultation matrix, the effective depth limit, and any active chain.
Full detail in CHANGELOG.md.
Model Peer v0.1.0
Model Peer v0.1.0
Initial public release.
Model Peer gives Claude Code, Codex CLI, and Gemini CLI a small common interface for
independent engineering consultation:
model-peer ask claude "..."
model-peer ask codex "..."
model-peer ask gemini "..."
model-peer reviewmodel-peer review runs all installed reviewers independently against the same Git
status + patch, then asks one model to synthesize the findings. It is review-only;
no fixes are applied.
Safety defaults are intentionally conservative: Claude runs in Plan mode with
read-only inspection tools, Codex runs in a read-only sandbox with stdin closed,
and Gemini runs in Plan mode with an additional deny policy and extensions disabled.
This release is intentionally small. The goal is to test whether cross-model peer
review is useful enough to become a normal part of coding-agent workflows.