Skip to content

feat(review): make the default reviewer medium-agnostic - #571

Merged
jlong merged 1 commit into
mainfrom
jlong/review-make-the-default-reviewer-medium-agnostic-bring-something-up-only-if-the-workflow-declares-how-else-do-nothing-silently
Aug 16, 2026
Merged

feat(review): make the default reviewer medium-agnostic#571
jlong merged 1 commit into
mainfrom
jlong/review-make-the-default-reviewer-medium-agnostic-bring-something-up-only-if-the-workflow-declares-how-else-do-nothing-silently

Conversation

@jlong

@jlong jlong commented Aug 16, 2026

Copy link
Copy Markdown
Owner

Task

The default reviewer instructions are framed entirely around a web "server", so when a workflow declares no serve recipe the review agent narrates a justification for the absent server ("No server came up, by design — 1. no serve recipe... 2. native macOS app...") instead of just presenting the diff. Shelbi reviews web, desktop, AND mobile apps; the review workspace is about bringing up whatever the user wants to review, not a server specifically. Guiding principle (user, 2026-08-16): if the workflow does not specify how to bring something up, the reviewer does nothing and does not mention it — it presents the diff and hands off.

Scope decision (user, 2026-08-16): Behavior + prose only. Generalize the vocabulary and behavior in the reviewer prose; keep the existing workflow review: recipe mechanism and schema unchanged (it already supports an optional URL / ready-probe, so it works for non-server mediums). Do NOT rename the workflow schema field. Pair with a config-upgrade sniffer so existing projects self-heal.

Current Behavior

crates/shelbi-state/src/default_review.md.template:

  • Step 1 "Read your serve recipe" (~lines 26-49): server-centric — looks for a ## Review serve recipe section, warns about framework default port / port 3000.
  • No-recipe branch (~lines 40-44): "The workflow declares no serve recipe, so this is a diff-only review. Say so in your summary (step 4)..."
  • Step 4 ready summary (line 110): "any setup warnings or, for a diff-only review, why no server came up." ← this is what makes the agent write a justification essay about the missing server.

Observed 2026-08-16 in the contextstore project's review pane (task rust-rewrite): the agent produced a two-reason explanation of why no server came up, inferred the app is native macOS AppKit, etc. — all noise for a project that simply declares no recipe.

Expected Behavior

Medium-agnostic reviewer:

  • Recipe present: run it verbatim to bring up the reviewable thing (web server + URL, desktop app window, mobile simulator build, etc.). Report how to view it (URL when the recipe declares one; otherwise whatever the recipe brings up).
  • No recipe: bring nothing up and do not narrate the absence. Present the diff and hand off. No "diff-only" essay, no "why no server came up", no mention of servers/ports at all.
  • Keep the existing guard against launching anything the workflow did not declare (no auto-detecting a framework, no rogue port-3000 server) — but frame it medium-neutrally ("don't bring up anything the workflow didn't ask for"), not as server-specific.

Technical Details / Deliverables

  1. Reword crates/shelbi-state/src/default_review.md.template:
    • Replace server-centric vocabulary with medium-neutral "review recipe" language throughout ("serve recipe" -> "review recipe"; drop "framework default port" / "port 3000" framing in favor of "don't bring up anything the workflow didn't declare").
    • No-recipe branch: reviewer brings nothing up and says nothing about it; present the diff, emit the ready signal with no URL, hand off. Remove the instruction to "say [it's diff-only] in your summary".
    • Step 4 line 110: remove "why no server came up"; when no recipe ran, the summary is just branch + one-line task summary + any real setup warnings (never an explanation of a missing server).
  2. Injected dispatch-prompt section header: the reviewer looks for a ## Review serve recipe section that the dispatch-prompt builder injects (see agent_workspaces.rs / workflow.rs). If the template's section name is generalized (e.g. ## Review recipe), rename the injected header to match so prose and injection stay in sync. This is prompt text only — the workflow YAML schema key stays unchanged.
  3. Skill: apply the same vocabulary/behavior update to crates/shelbi-state/src/skills/load_run_detection.SKILL.md (currently "Running the review serve recipe" / diff-only framing).
  4. Tests: update the assertions in crates/shelbi-state/src/agent_workspaces.rs that pin DEFAULT_REVIEW_INSTRUCTIONS.contains("Review serve recipe") / "diff-only" and DEFAULT_REVIEW_LOAD_RUN_SKILL.contains("Review serve recipe") to the new wording; add a test asserting the no-recipe path instructs bringing nothing up with no server narration.
  5. Config-upgrade sniffer (NeedsJudgment) in crates/shelbi-cli/src/commands/config_upgrade.rs over the review agent's instructions surface (project.<name>.agent.<agent>.instructions, and the review skill surface if enumerated in config_surfaces.rs): detect the old server-centric reviewer wording (e.g. "why no server came up" / "serve recipe" diff-only framing) and hand the orchestrator a boot finding to repair its own copy. Existing projects (contextstore included) self-heal on next boot. (See the AGENTS.md "Changing shipped defaults" guardrail — a default change without a sniffer doesn't reach existing installs.)

Acceptance Criteria

  • With a workflow that declares a review recipe, the reviewer runs it verbatim and reports how to view the result (URL when declared) — unchanged for the web case.
  • With a workflow that declares NO review recipe, the reviewer brings nothing up and its summary contains no mention of servers/ports/"why no server came up" — just the diff, branch, and task summary.
  • The default template and load-run skill use medium-neutral language (no "serve recipe" / "framework default port" / "port 3000" framing); the injected dispatch-prompt section header matches the template.
  • The guard against launching an undeclared app/server is preserved (medium-neutral wording).
  • A project whose forked review instructions still carry the old server-centric wording produces a NeedsJudgment config-upgrade finding on hub start / reload; a project already on the new wording produces none.
  • cargo build/test/clippy green; updated + new tests in agent_workspaces.rs pass.

Auto-opened by Shelbi — review at: /Users/jlong/.shelbi/projects/shelbi/tasks/review-make-the-default-reviewer-medium-agnostic-bring-something-up-only-if-the-workflow-declares-how-else-do-nothing-silently.md

The review charter and load-run skill were framed entirely around a web
"server", so a workflow declaring no serve recipe made the reviewer
narrate a justification for the absent server ("no server came up, by
design...") instead of just presenting the diff. Shelbi reviews web,
desktop, and mobile apps; the review workspace is about bringing up
whatever the workflow declares.

Guiding principle: if the workflow doesn't say how to bring something up,
the reviewer brings nothing up and says nothing about it — it presents
the diff and hands off.

Changes:
- default_review.md.template + load_run_detection.SKILL.md: medium-neutral
  "review recipe" vocabulary throughout; dropped "serve recipe" /
  "diff-only" / "framework default port" / "port 3000" framing. No-recipe
  branch now brings nothing up and narrates nothing (removed the "say so
  in your summary" and "why no server came up" instructions). Guard
  against launching an undeclared app is kept, reframed medium-neutrally.
- workspace.rs: renamed the injected dispatch-prompt section header
  `## Review serve recipe` -> `## Review recipe` so prose and injection
  stay in sync. This is prompt text only; the workflow `review:` YAML
  schema key is unchanged (it already supports non-web mediums via its
  optional url/ready fields).
- config_upgrade.rs: added a NeedsJudgment sniffer over the review agent's
  instructions + load-run skill surfaces that detects the legacy
  server-centric wording ("serve recipe" / "diff-only" / "why no server
  came up") and hands the orchestrator a finding to repair its own copy.
  Classified NeedsJudgment (not AutoHeal) because these are prose a project
  may have forked and customized, so a mechanical rewrite risks local
  edits. Existing projects self-heal on next boot.
- Updated the pinned charter/skill test assertions and added no-recipe /
  medium-neutral coverage; new sniffer tests assert legacy->NeedsJudgment,
  new wording->clean, and the shipped defaults->clean.

Decision not asked about: kept every internal Rust "diff-only" / "serve
recipe" identifier and the site docs describing the `review:` config
mechanism as-is, per the scope decision to change reviewer prose/behavior
only and leave the workflow schema untouched.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercel Bot commented Aug 16, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
shelbi Ready Ready Preview Aug 16, 2026 9:22pm

Request Review

@jlong
jlong merged commit 796a879 into main Aug 16, 2026
3 checks passed
@jlong
jlong deleted the jlong/review-make-the-default-reviewer-medium-agnostic-bring-something-up-only-if-the-workflow-declares-how-else-do-nothing-silently branch August 16, 2026 21:24
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.

1 participant