**The broken workflow.** Going from a bug report to a merged fix is mostly glue work: reading a vague report, writing a reproduction, hunting through the codebase, patching, re-running the suite and writing the PR description. It is slow, and it is where AI assistants usually cut corners: "fixing" a bug by weakening the test, or patching the symptom instead of the cause. **What we built.** Five IBM Bob 2.0 custom modes (`.bob/custom_modes.yaml`) that turn one command, `/Issue → PR Fix @issues/ISSUE-004.md`, into a branch with a regression test, a root-cause fix and a PR write-up: 1. **🎯 Issue → PR (orchestrator):** creates the branch and runs each stage as a visible Bob subtask, gating every step on the previous one's result. It never edits code itself. 2. **🧪 Reproducer:** writes the smallest pytest test that fails for the reported reason. 3. **🔍 Diagnoser:** read-only root-cause analysis with symbol navigation and a cheaper `explore` subagent. Reports file:line and every other place with the same mistake. 4. **🔧 Fixer:** minimal fix, iterating until the full suite is green. 5. **📝 PR Writer:** commits and writes the PR description (root cause, fix, verification, risk). **Guardrails enforced by Bob, not by prompts.** Each mode's edit access is restricted with `fileRegex`: the Reproducer can only touch `tests/`, the Fixer can only touch `shopcart/` and **cannot modify tests**, and the Diagnoser cannot edit at all. So the agent physically cannot "pass" by editing the test. **Honest measurement.** We seeded 10 realistic bugs (rounding, off-by-one dates, shared mutable state, overselling inventory, CSV quoting, BOM encoding, ID reuse…) into a Python order-management library, written up as user-style bug reports. Every fix is scored by **hidden acceptance tests stored outside the repo** (Bob never sees them), and only counts if the full existing suite still passes. **Results.** **9/10 bugs fixed** as judged by the hidden tests, for **~18 Bobcoins total (~2 per fixed bug)**, in three batched Bob tasks. Every fix landed on its own branch with a regression test, a conventional commit and a PR description, and no existing test assertion was changed on any branch. **The one miss is the most useful result.** ISSUE-005 (a reorder cart that mutates a past order) is a shared-mutable-state bug with two call sites. Bob fixed the one described in the report (`reorder()`) and all visible tests went green, but it missed the same aliasing in `place()`. The hidden tests caught the incomplete fix, and a second independent run made the same choice. That is exactly the failure mode that slips through code review, and why the pipeline is graded on tests the agent cannot see. **Bob 2.0 features used.** Custom modes, Agent mode, subtasks (`start_subtask`), `explore` subagents, todo lists, per-mode tool groups and `fileRegex` edit restrictions, symbol navigation, terminal execution.
Category tags: