Skip to content

feat: Pluggable Reviewer Personas — separate reviewer profiles from plugin machinery#500

Open
jcasimir wants to merge 5 commits intoEveryInc:mainfrom
JumpstartLab:main
Open

feat: Pluggable Reviewer Personas — separate reviewer profiles from plugin machinery#500
jcasimir wants to merge 5 commits intoEveryInc:mainfrom
JumpstartLab:main

Conversation

@jcasimir
Copy link
Copy Markdown

@jcasimir jcasimir commented Apr 3, 2026

Why

I've been using the Compound Engineering workflow for a while and really enjoy the theory behind it. After installing the plugin, one of the first things I did was refactor the reviewers to my own tastes and preferences. To be honest, I find it entertaining to create reviewer personas named after my friends and colleagues — a Sandi Metz OO reviewer, a Jason Fried scope-cutter, that kind of thing.

But doing that meant forking the entire plugin and mixing my personal reviewer files with the plugin machinery. Every time I wanted to pull in upstream improvements, I had to work around my custom reviewers. And I realized other users probably face the same friction — the reviewer personas are really user data, not plugin infrastructure.

The Abstraction

This PR separates reviewer personas from the plugin workflow. Reviewer .md files no longer ship with the plugin. Instead, they live in external Git repos that users configure and sync on demand via /ce:refresh.

An individual or a company might have one or more repos of reviewers, or even branches within a single repo — multiple sources that people can configure. They use the main plugin from this primary repo but pull in reviewers from wherever they want.

Each reviewer file is fully self-contained: its category and select_when criteria live in frontmatter, so the orchestrator discovers reviewers dynamically. Adding a reviewer means creating one file in their repo — no fork or plugin edits needed.

What it enables

  • Personal reviewer collections — maintain your own repo of reviewers without forking the plugin
  • Team reviewer repos — a company shares a set of reviewers across all developers
  • Mix and match — configure multiple sources with priority ordering (first source wins on filename conflicts)
  • Selective syncexcept lists let you skip specific reviewers from a source
  • Easy onboarding_template-reviewer.md ships with the plugin as a starting point

How it works

  1. After install, run /ce:refresh
  2. First run creates ~/.config/compound-engineering/reviewer-sources.yaml with a default source
  3. The sync script (sync-reviewers.sh) fetches .md files from configured repos via gh (with git clone fallback)
  4. An interactive menu lets users sync, edit the config, or type natural language changes
  5. A detailed per-source summary shows exactly which reviewers were included, excluded, or overridden

Default reviewer source

I setup the existing 28 reviewers are at JumpstartLab/ce-reviewers with category and select_when added to each file's frontmatter. This is configured as the default source in the registry.

I assume you'd want to host this repo under EveryInc — please fork/recreate that repo under your org, then I can update this PR with your replacement.

Breaking change

Reviewer .md files no longer ship with the plugin. After installing or updating, users must run /ce:refresh to sync reviewers. The root README has been updated with this post-install step.

Changes

Three commits:

  1. Externalize reviewer personas — remove 28 built-in reviewer files, add .gitignore and _template-reviewer.md, add reviewer-registry.yaml with source config, refactor persona-catalog.md, update tests
  2. Add /ce:refresh — new skill with sync-reviewers.sh script, user config at ~/.config/compound-engineering/, interactive menu, except filter, conflict resolution, macOS bash 3 compatible
  3. Documentation — README updates for both the root install instructions and the plugin's reviewer section

jcasimir and others added 3 commits April 3, 2026 13:53
Reviewer .md files no longer ship with the plugin. Instead, they
live in external Git repos and are synced on demand via /ce:refresh.
This lets users customize their review team — add custom reviewers,
exclude ones they don't need, or mix reviewers from multiple repos —
without forking the plugin.

What changed:
- Removed 28 built-in reviewer .md files from agents/review/
- Added .gitignore so synced reviewers aren't committed to the plugin
- Added _template-reviewer.md as a starting point for custom reviewers
- Added reviewer-registry.yaml with source configuration (which repos
  to sync from, with except lists and conflict resolution)
- Refactored persona-catalog.md to explain the system rather than
  enumerate reviewers
- Updated tests to check registry structure and skip gracefully when
  reviewer files aren't present (pre-refresh)

Each reviewer's selection metadata (category, select_when) lives in
its own frontmatter, so adding a reviewer is a single file in a
single repo — no registry entry needed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
A new skill and bash script that fetches reviewer .md files from
configured Git repos into the plugin's agents/review/ directory.

Features:
- User config at ~/.config/compound-engineering/reviewer-sources.yaml
  (auto-created on first run with sensible defaults)
- Interactive menu: sync, edit config, or type natural language changes
- Multiple sources with priority ordering (first listed wins)
- Per-source except lists to skip specific reviewers
- gh CLI with git clone fallback
- Detailed per-source summary written to a file for verbatim display
- Compatible with macOS bash 3 (no associative arrays)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Root README: add /ce:refresh as a post-install step
- Plugin README: replace hardcoded reviewer list with docs for the
  pluggable system (setup, source configuration, custom reviewers,
  categories, conflict resolution)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@jcasimir jcasimir marked this pull request as ready for review April 3, 2026 20:15
@jcasimir jcasimir changed the title Pluggable reviewer personas — separate reviewer profiles from plugin machinery feat: Pluggable Reviewer Personas — separate reviewer profiles from plugin machinery Apr 3, 2026
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 70ddd607dc

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".


```bash
bash "$PLUGIN_DIR/skills/refresh/sync-reviewers.sh" \
"$PLUGIN_DIR/skills/ce-review/references/reviewer-registry.yaml" \
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep refresh skill references within its own directory

This command passes "$PLUGIN_DIR/skills/ce-review/references/reviewer-registry.yaml" as an input file, which reaches into a sibling skill. plugins/compound-engineering/AGENTS.md explicitly says a SKILL.md must only reference files inside its own skill directory because converted targets may copy skills in isolation; in that layout this path is missing and sync-reviewers.sh fails before any sync can happen. Store the default registry under skills/refresh/ (or another in-scope path) and reference it from there.

Useful? React with 👍 / 👎.

Comment on lines +296 to +298
if [ ! -f "${staging}/${filename}" ]; then
echo " Orphan: ${filename} (not in any configured source)"
fi
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Remove orphaned reviewer files when sources change

When a reviewer is removed from all configured sources (or excluded via except), the script only prints an Orphan: message and leaves the old .md file in agents/review. That means source edits do not actually take effect for previously synced reviewers, and stale personas can still be picked up by /ce:review. The sync step should delete or otherwise deactivate files not present in staging so the local reviewer set matches the configured sources.

Useful? React with 👍 / 👎.


# Fetch files
src_tmp=$(mktemp -d)
fetched_files=$(fetch_files "$repo" "$branch" "$path" "$src_tmp" 2>&1) || {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep fetch stderr out of the reviewer filename stream

Capturing fetch_files with 2>&1 mixes warning/error text into fetched_files, and the subsequent for filename in $fetched_files loop treats those tokens as filenames. In partial-failure cases (for example, one file download warning), this produces bogus include/conflict entries and noisy copy failures instead of a cleanly reported fetch result. Capture only stdout for filenames and handle stderr separately.

Useful? React with 👍 / 👎.

jcasimir and others added 2 commits April 3, 2026 15:22
The ce-reviewers repo now stores reviewer files under reviewers/
instead of at the root. Update the default source path to match.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The commented-out example in the sync script's first-run template
showed path: . which was inconsistent with the actual default
source using path: reviewers.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@tmchow
Copy link
Copy Markdown
Collaborator

tmchow commented Apr 3, 2026

Thank @jcasimir, this aligns how we've been talking about optional reviewers just takes it one step further. I want to put a pause on this one for now until we do a bit of work related to (a) renaming all the commands and (b) move our settings out of the repo like you're relying on here. This will ensure things land better.

@jcasimir
Copy link
Copy Markdown
Author

jcasimir commented Apr 3, 2026

Sounds good -- let me know if I can help. I'm feeling pretty excited about the reviewer and orchestrator pattern extraction and hope they can make it into main.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants