Skip to content

Releases: makedirectory/ModelPeer

v0.5.1 — doctor diagnoses Gemini's auth method

Choose a tag to compare

@makedirectory makedirectory released this 11 Aug 05:39
ffd6e66

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 | bash

Docs: 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

Choose a tag to compare

@makedirectory makedirectory released this 11 Aug 05:14
6faa0a4

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 | bash

Docs: 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

Choose a tag to compare

@makedirectory makedirectory released this 11 Aug 03:34
fbbfd65

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 | bash

Docs: 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 skills

update 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
    of MODEL_PEER_STACK, so claude → claude was blocked while
    claude → codex → claude was permitted.
  • A peer could raise the ceiling it inherited. --depth beat 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 once init and update existed. Delegation now grants
    Bash(model-peer _delegate:*) only — an entry point that inherits every limit,
    takes no options, and cannot reach init, update, review, or trust.
  • 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

Choose a tag to compare

@makedirectory makedirectory released this 10 Aug 23:41
ba0ed9c

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 | bash

Docs: 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, 0 disables, MODEL_PEER_TIMEOUT), a 30s stderr heartbeat, exit 124 on 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 0 with 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. --strict restores refuse-on-any-failure.

Fixed

  • Untracked files were invisible to reviewers. git diff HEAD cannot see them, and git status --short collapses 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 0 having produced nothing, which a panel read as "this reviewer found no issues". Model Peer now passes --skip-trust, feature-detected from gemini --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

Choose a tag to compare

@makedirectory makedirectory released this 09 Aug 18:51
1849587

Cross-model peer review, now with a bounded consultation chain.

Install

curl -fsSL https://raw.githubusercontent.com/makedirectory/ModelPeer/v0.2.0/install.sh | bash

As 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 peer

Depth 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 review overwrote MODEL_PEER_STACK, so a review launched from inside a peer chain escaped the recursion guard entirely. The synthesizer is now always a leaf.
  • install.sh embeds a verbatim copy of bin/model-peer for the curl path and could drift from it silently. make sync regenerates it; make check-sync fails the build on drift.
  • The documented one-line install pointed at a YOUR_GITHUB_USERNAME placeholder and could never have worked.
  • CI had never passed on this repository — make lint failed 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, with CLAUDE.md and GEMINI.md as symlinks so all three CLIs read one file. examples/ ships one shared template instead of three near-identical copies.
  • model-peer doctor reports the per-provider nested-consultation matrix, the effective depth limit, and any active chain.

Full detail in CHANGELOG.md.

Model Peer v0.1.0

Choose a tag to compare

@makedirectory makedirectory released this 07 Aug 13:43

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 review

model-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.