/em-review
Review what comes back. This skill is multi-mode:
- Mode A — Review: PR code review, bug-first, grounded in
edd.md + eng-works.md
- Mode B — Debug: Root cause investigation when bug emerges, hypothesis-driven
Pick mode in this priority order:
- Explicit flag (
--review / --debug) — highest priority, always honored
- Auto-detect from input — fallback when no flag:
- Input contains PR ref (diff, link, SHA, "PR #N", patch file) → Mode A (review)
- Input contains stack trace, error log, "bug", "error", "crashed", "failing", "production issue" → Mode B (debug)
- Ask user — only if input is ambiguous (both signals or neither). Use AskUserQuestion: "Pick mode: a) Review (PR diff) b) Debug (bug investigation)"
⚠ Question Format Rule
See ../../ETHOS.md principle #8. Numbered questions, AskUserQuestion if available.
When to trigger this skill
Mode A (review):
- "PR from engineer Y is ready, want to review"
- "Batch review end-of-lane (3 related PRs)"
- "Want to audit whether the PR matches the edd invariants"
Mode B (debug):
- "Production error spike in endpoint X, I'm investigating"
- "Recurring bug in tests, want root cause"
- "CI flaky, not sure of underlying cause"
- "Customer reported a bug we can't repro internally"
Mode A — Code Review
Input
- PR diff (link or patch file)
edd.md + eng-works.md (for grounding the review)
- CI run output
If plan/works files are missing → flag explicitly. Review can still run but grounding is weak. Ask the user: "Does this PR have a plan reference? a) Yes (path) b) No, ungrounded review c) Generate a retroactive plan via /em-plan"
Workflow — 4-section review
Anti-skip rule: All 4 sections must be evaluated, even if "no issues found". Skipping = anti-pattern.
Section 1: Architecture conformance
Active cognitive patterns:
- Match plan: Does PR architecture match the edd? Are deviations justified?
- Boundary integrity: Are the trust boundaries from the plan preserved?
- Conway's Law: Is module ownership clear?
Forcing questions per issue (one issue = one AskUserQuestion):
- "PR introduces new module X that wasn't in the edd. a) Justified deviation (rationale) b) Out of scope, must be a separate PR c) Plan must be updated first via /em-plan"
- "Trust boundary at [file Y line Z] — validation is missing. a) Add validation (block merge) b) Defer to follow-up ticket (justify) c) Out of scope, parking lot"
Section 2: Code quality
Active cognitive patterns:
- DRY aggressive — flag repetition
- Edge cases over speed — flag missing edge cases explicitly
- Right-sized diff — diff too large (>500 lines without rationale)? Too compressed (necessary rewrite squeezed)?
- Make change easy + make easy change — refactor + behavior bundled? Block.
- Stale diagram check — touched code with inline ASCII diagram? Update or flag.
Forcing questions:
- "Pattern duplication in [file A] and [file B] — extract or leave? a) Extract (recommend, DRY) b) Leave (justify — premature abstraction) c) TODO follow-up"
- "Diff size: N lines. Smell large. a) Justified (single logical change) b) Split into 2-3 PRs c) Backfill commit history with smaller commits"
Section 3: Test coverage
Active cognitive patterns:
- Failure modes from plan — covered in tests?
- Tests > too few — better over-test
- Boundary tests — empty, max, concurrent, partial-failure
Forcing questions:
- "Failure mode #X from the edd — test coverage? a) Yes (test name) b) No (block) c) Deferred (justify)"
- "Edge case [empty input / null / max value / concurrent] — covered? a) Yes b) Subset c) No (block T0/T1, allow T2/T3 with note)"
Detail rubric in ../../references/code-review-rubric.md.
Section 4: Performance
Active cognitive patterns:
- N+1 query check — DB access pattern
- Memory concerns — large allocation, leak risk
- Caching opportunity — flagged opportunity, not mandatory
- High-complexity hotspot — algorithm complexity
Forcing questions:
- "Loop in [file] iterates over [N items] with DB query inside — N+1 risk. a) Refactor to batch query (block) b) Acceptable (N small, justify) c) TODO with index/cache plan"
Decision routing (Mode A)
After all 4 sections:
- Approve — all blockers resolved, ready to merge → handoff to
release-engineer role or direct merge
- Request changes — blockers listed, fix loop → engineer fix → loop back to
/em-review
- Comment — minor suggestions, not blocking → engineer can merge without loop
Forcing question:
- "Decision for this PR: a) Approve (no blockers) b) Request changes (list in output) c) Comment (suggestions, mergeable)"
Output: pr-review-<sha>.md + pr-review-<sha>.html (dual output)
Must write 2 files:
pr-review-<sha>.md — source markdown (structure below)
pr-review-<sha>.html — human-readable review version, self-contained (severity badges colored Block/Major/Minor/Info, TOC + breadcrumb, code refs styled, decision summary card)
HTML render uses the template + full CSS spec from ../../references/html-template.md. <sha> is the short SHA (7 chars) of the PR head commit. Content must be 1:1 consistent between .md and .html.
MD Structure
# PR Review: [PR title or ID]
**PR:** [link / sha]
**Plan reference:** edd.md (path) / eng-works.md (path)
**Reviewed by:** em-review (Mode A)
**Date:** YYYY-MM-DD
---
## TL;DR
**Decision:** Approve / Request changes / Comment
**Blockers:** N
**Suggestions:** N
**Section breakdown:** Architecture (X issues) | Code quality (Y) | Tests (Z) | Performance (W)
---
## Section 1: Architecture Conformance
[Per issue: file:line, severity, recommendation, decision]
## Section 2: Code Quality
[Per issue: ...]
## Section 3: Test Coverage
[Per issue: ...]
## Section 4: Performance
[Per issue: ...]
---
## Forcing Questions Raised
| # | Section | Question | Response | Resolution |
|---|---------|----------|----------|------------|
---
## Decision
- **Outcome:** [Approve / Request changes / Comment]
- **Blockers (must fix):** [list with file:line]
- **Suggestions (nice to have):** [list]
- **Routing:**
- Approve → `release-engineer` role or direct merge
- Request changes → `engineer` role (fix) → `/em-review` again
- Comment → `engineer` role (merge with FYI, no loop)
---
**Generated by:** em-review (Mode A)
**Status:** [decision]
Mode B — Debug
Input
- Bug repro / stack trace / log
- Optional:
edd.md (if the bug touches an area already planned)
- Optional: production telemetry
Workflow — 5 steps (mirror investigate skill, EM-flavored)
Detail playbook in ../../references/debug-playbook.md.
Step 1: Reproduce
Can't repro = can't debug. Stop if there's only 1 anecdotal report without a repro path.
Forcing questions:
- "This bug: a) Repro consistent (clear steps) b) Repro intermittent (need additional observability) c) Anecdotal only (single report, can't repro) → if (c), stop and instrument first"
Step 2: Isolate
Narrow the surface to the minimum repro case.
- Disable an unrelated feature flag → still repro?
- Test with input subset → which one triggers it?
- Run in different env (staging vs local) → consistent?
Output: minimum repro case (smallest input + state that reproduces the bug).
Step 3: Hypothesize
List 3 hypotheses, rank by likelihood.
Format:
- Hypothesis 1 (likely): [statement]. Evidence supporting: [log/metric/code]. Evidence against: [—]. Test plan: [how to verify].
- Hypothesis 2 (less likely): ...
- Hypothesis 3 (long shot): ...
Forcing question:
- "Top hypothesis confidence: a) High (strong evidence, clear test plan) b) Medium (need more data) c) Low (still guessing — keep observing)"
Step 4: Test
Verify each hypothesis. Don't blind-fix.
Per hypothesis:
- Run targeted test / instrumented repro / code read
- Capture evidence (log line, test output, code path)
- Confirmed / refuted / inconclusive?
Step 5: Diagnose & propose fix
Root cause stated explicitly. Symptom ≠ root cause.
Fix scope decision:
- Local fix (1-3 files, contained) → proposal handoff to
engineer role
- Architectural fix (cross-module, design issue) → loop back to
/em-plan with flag "rooted in production bug X"
- Process fix (CI gap, test gap, observability gap) → ticket via
/em-works next sprint (route to engineer / qa-reviewer / devops role per gap type)
Forcing questions:
- "Before patching, is the root cause confirmed? a) Yes (evidence: ...) b) Strong hypothesis c) Guessing (continue investigation)"
- "Fix scope: a) Local (handoff engineer) b) Architectural (loop to /em-plan) c) Process (CI/test/observability gap → ticket)"
- "Test for regression — does it exist? a) Yes (test name) b) Will be added in fix PR c) Not yet decided"
Output: debug-<bug-id>.md + debug-<bug-id>.html (dual output)
Must write 2 files:
debug-<bug-id>.md — source markdown (structure below)
debug-<bug-id>.html — human-readable review version, self-contained (severity badge colored, hypothesis table, root cause card highlighted, TOC + breadcrumb)
HTML render uses the template + full CSS spec from ../../references/html-template.md. Content must be 1:1 consistent. <bug-id> is a short slug (issue number or brief description, e.g. debug-auth-timeout.html).
# Debug Trace: [bug ID or short description]
**Reported:** YYYY-MM-DD by [source]
**Severity:** Critical / High / Medium / Low
**Investigated by:** em-review (Mode B)
**Date:** YYYY-MM-DD
---
## TL;DR
**Root cause:** [1 line]
**Fix scope:** [Local / Architectural / Process]
**Routing:** [engineer / /em-plan / /em-works ticket]
**Regression test:** [planned / existing / TBD]
---
## Step 1: Reproduce
- Repro reliability: [Consistent / Intermittent / Anecdotal]
- Repro steps:
1. ...
2. ...
- Min input: [...]
- Environment: [...]
## Step 2: Isolate
- Narrowing observations:
- [observation 1]
- Minimum repro case: [...]
## Step 3: Hypothesize
### Hypothesis 1 (likely)
- **Statement:** ...
- **Evidence supporting:** ...
- **Evidence against:** ...
- **Test plan:** ...
### Hypothesis 2 (less likely)
...
### Hypothesis 3 (long shot)
...
## Step 4: Test
| Hypothesis | Test action | Evidence | Verdict |
|------------|-------------|----------|---------|
| 1 | ... | ... | Confirmed / Refuted / Inconclusive |
## Step 5: Diagnose & Fix
- **Root cause (confirmed):** ...
- **Why bug emerged:** [trigger condition]
- **Why not caught earlier:** [test gap / observability gap / review gap]
### Fix proposal
- **Scope:** Local / Architectural / Process
- **Approach:** [1 paragraph]
- **Files affected:** [list]
- **Regression test:** [test plan]
---
## Forcing Questions Raised
| # | Step | Question | Response | Resolution |
|---|------|----------|----------|------------|
---
## Routing
- **Local fix:** Handoff to `engineer` role (skill matched per env)
- **Architectural fix:** Loop back to `/em-plan` with flag "production-driven re-plan"
- **Process fix:** Ticket via `/em-works` next sprint (route to `engineer` / `qa-reviewer` / `devops` role per gap type)
---
**Generated by:** em-review (Mode B)
**Status:** [Root cause identified / Investigation ongoing]
Integration with tools
| Condition |
Behavior |
| GitHub MCP connected (Mode A) |
Auto-fetch PR diff, post review comments inline |
| Linear / GitHub Issues MCP (Mode B) |
Auto-create issue for regression / process gap |
| BigQuery MCP (Mode B) |
Pull production telemetry for evidence |
| Notion MCP |
Push debug-trace.md / pr-review.md to Notion |
| No MCP |
File saved local, user pastes manually |
Anti-pattern (don't do this)
Mode A
- ❌ Skip
pr-review-<sha>.html output. Dual output mandatory — user reviews via HTML.
- ❌ "LGTM" without annotation on T0/T1 PR. Review unmoored.
- ❌ Approve PR without reading the edd reference. Grounding weak.
- ❌ Skip a section. Anti-skip rule applies.
- ❌ Batch multiple issues into one AskUserQuestion. One issue = one question.
- ❌ "Add tests later" as a negotiable blocker on T0/T1. A block must block.
Mode B
- ❌ Skip
debug-<bug-id>.html output. Dual output mandatory — prompter reviews via HTML.
- ❌ Patch before the hypothesis is confirmed. Blind fix masking root cause.
- ❌ Stop at the symptom. "Restart fixes it" is not a diagnosis.
- ❌ Skip regression test. A bug whose fix has no test will recur.
- ❌ Architectural fix tossed to engineer ticket without looping to /em-plan. EM bypasses own job.
- ❌ "Cannot reproduce, closing" without instrumenting observability first. An anecdotal that gets dismissed = a bug that will return.
Handoff
Mode A
- Approve →
release-engineer role (skill matched per env) or direct merge
- Request changes →
engineer role fix loop → /em-review --review again
- Comment →
engineer role merge with FYI, no loop
Mode B
- Local fix →
engineer role (per fix PR) → /em-review --review per fix PR
- Architectural fix →
/em-plan with re-frame ("production bug X drove re-plan")
- Process fix →
/em-works next sprint with ticket "process improvement: [CI gap / test gap / observability]" (route to engineer / qa-reviewer / devops role per gap type)
Source: verzth/skills — distributed by TomeVault.
1---2name: em-review3description: Review what comes back from engineers — Mode A code review (PR review against edd, bug-first, regression-first), Mode B debug (root cause investigation when production bug emerges, hypothesis-driven, no blind fixes). Use when a PR is ready for engineering manager review, when a bug appears in staging or production and needs structured root-cause analysis, when CI fails repeatedly with unclear root cause, or when investigating recurring issues. Pushes back on LGTM-without-grounding and on patches-without-root-cause. Use when this capability is needed.4---56# /em-review78Review what comes back. This skill is multi-mode:910- **Mode A — Review:** PR code review, bug-first, grounded in `edd.md` + `eng-works.md`11- **Mode B — Debug:** Root cause investigation when bug emerges, hypothesis-driven1213**Pick mode in this priority order:**14151. **Explicit flag** (`--review` / `--debug`) — highest priority, always honored162. **Auto-detect from input** — fallback when no flag:17 - Input contains PR ref (diff, link, SHA, "PR #N", patch file) → **Mode A (review)**18 - Input contains stack trace, error log, "bug", "error", "crashed", "failing", "production issue" → **Mode B (debug)**193. **Ask user** — only if input is ambiguous (both signals or neither). Use AskUserQuestion: "Pick mode: a) Review (PR diff) b) Debug (bug investigation)"2021## ⚠ Question Format Rule2223See [../../ETHOS.md](../../ETHOS.md) principle #8. Numbered questions, AskUserQuestion if available.2425## When to trigger this skill2627**Mode A (review):**28- "PR from engineer Y is ready, want to review"29- "Batch review end-of-lane (3 related PRs)"30- "Want to audit whether the PR matches the edd invariants"3132**Mode B (debug):**33- "Production error spike in endpoint X, I'm investigating"34- "Recurring bug in tests, want root cause"35- "CI flaky, not sure of underlying cause"36- "Customer reported a bug we can't repro internally"3738## Mode A — Code Review3940### Input41- PR diff (link or patch file)42- `edd.md` + `eng-works.md` (for grounding the review)43- CI run output4445If plan/works files are missing → **flag explicitly**. Review can still run but grounding is weak. Ask the user: "Does this PR have a plan reference? a) Yes (path) b) No, ungrounded review c) Generate a retroactive plan via /em-plan"4647### Workflow — 4-section review4849**Anti-skip rule:** All 4 sections must be evaluated, even if "no issues found". Skipping = anti-pattern.5051#### Section 1: Architecture conformance5253Active cognitive patterns:54- **Match plan:** Does PR architecture match the edd? Are deviations justified?55- **Boundary integrity:** Are the trust boundaries from the plan preserved?56- **Conway's Law:** Is module ownership clear?5758Forcing questions per issue (one issue = one AskUserQuestion):591. "PR introduces new module X that wasn't in the edd. a) Justified deviation (rationale) b) Out of scope, must be a separate PR c) Plan must be updated first via /em-plan"602. "Trust boundary at [file Y line Z] — validation is missing. a) Add validation (block merge) b) Defer to follow-up ticket (justify) c) Out of scope, parking lot"6162#### Section 2: Code quality6364Active cognitive patterns:65- **DRY aggressive** — flag repetition66- **Edge cases over speed** — flag missing edge cases explicitly67- **Right-sized diff** — diff too large (>500 lines without rationale)? Too compressed (necessary rewrite squeezed)?68- **Make change easy + make easy change** — refactor + behavior bundled? Block.69- **Stale diagram check** — touched code with inline ASCII diagram? Update or flag.7071Forcing questions:721. "Pattern duplication in [file A] and [file B] — extract or leave? a) Extract (recommend, DRY) b) Leave (justify — premature abstraction) c) TODO follow-up"732. "Diff size: N lines. Smell large. a) Justified (single logical change) b) Split into 2-3 PRs c) Backfill commit history with smaller commits"7475#### Section 3: Test coverage7677Active cognitive patterns:78- **Failure modes from plan** — covered in tests?79- **Tests > too few** — better over-test80- **Boundary tests** — empty, max, concurrent, partial-failure8182Forcing questions:831. "Failure mode #X from the edd — test coverage? a) Yes (test name) b) No (block) c) Deferred (justify)"842. "Edge case [empty input / null / max value / concurrent] — covered? a) Yes b) Subset c) No (block T0/T1, allow T2/T3 with note)"8586Detail rubric in [../../references/code-review-rubric.md](../../references/code-review-rubric.md).8788#### Section 4: Performance8990Active cognitive patterns:91- **N+1 query check** — DB access pattern92- **Memory concerns** — large allocation, leak risk93- **Caching opportunity** — flagged opportunity, not mandatory94- **High-complexity hotspot** — algorithm complexity9596Forcing questions:971. "Loop in [file] iterates over [N items] with DB query inside — N+1 risk. a) Refactor to batch query (block) b) Acceptable (N small, justify) c) TODO with index/cache plan"9899### Decision routing (Mode A)100101After all 4 sections:1021031. **Approve** — all blockers resolved, ready to merge → handoff to `release-engineer` role or direct merge1042. **Request changes** — blockers listed, fix loop → engineer fix → loop back to `/em-review`1053. **Comment** — minor suggestions, not blocking → engineer can merge without loop106107Forcing question:108- "Decision for this PR: a) Approve (no blockers) b) Request changes (list in output) c) Comment (suggestions, mergeable)"109110### Output: `pr-review-<sha>.md` + `pr-review-<sha>.html` (dual output)111112**Must write 2 files**:1131141. **`pr-review-<sha>.md`** — source markdown (structure below)1152. **`pr-review-<sha>.html`** — human-readable review version, self-contained (severity badges colored Block/Major/Minor/Info, TOC + breadcrumb, code refs styled, decision summary card)116117HTML render uses the template + full CSS spec from [`../../references/html-template.md`](../../references/html-template.md). `<sha>` is the short SHA (7 chars) of the PR head commit. Content must be 1:1 consistent between `.md` and `.html`.118119#### MD Structure120121```markdown122# PR Review: [PR title or ID]123124**PR:** [link / sha]125**Plan reference:** edd.md (path) / eng-works.md (path)126**Reviewed by:** em-review (Mode A)127**Date:** YYYY-MM-DD128129---130131## TL;DR132133**Decision:** Approve / Request changes / Comment134**Blockers:** N135**Suggestions:** N136**Section breakdown:** Architecture (X issues) | Code quality (Y) | Tests (Z) | Performance (W)137138---139140## Section 1: Architecture Conformance141142[Per issue: file:line, severity, recommendation, decision]143144## Section 2: Code Quality145146[Per issue: ...]147148## Section 3: Test Coverage149150[Per issue: ...]151152## Section 4: Performance153154[Per issue: ...]155156---157158## Forcing Questions Raised159160| # | Section | Question | Response | Resolution |161|---|---------|----------|----------|------------|162163---164165## Decision166167- **Outcome:** [Approve / Request changes / Comment]168- **Blockers (must fix):** [list with file:line]169- **Suggestions (nice to have):** [list]170- **Routing:**171 - Approve → `release-engineer` role or direct merge172 - Request changes → `engineer` role (fix) → `/em-review` again173 - Comment → `engineer` role (merge with FYI, no loop)174175---176177**Generated by:** em-review (Mode A)178**Status:** [decision]179```180181## Mode B — Debug182183### Input184- Bug repro / stack trace / log185- Optional: `edd.md` (if the bug touches an area already planned)186- Optional: production telemetry187188### Workflow — 5 steps (mirror investigate skill, EM-flavored)189190Detail playbook in [../../references/debug-playbook.md](../../references/debug-playbook.md).191192#### Step 1: Reproduce193194Can't repro = can't debug. Stop if there's only 1 anecdotal report without a repro path.195196Forcing questions:1971. "This bug: a) Repro consistent (clear steps) b) Repro intermittent (need additional observability) c) Anecdotal only (single report, can't repro) → if (c), stop and instrument first"198199#### Step 2: Isolate200201Narrow the surface to the minimum repro case.202203- Disable an unrelated feature flag → still repro?204- Test with input subset → which one triggers it?205- Run in different env (staging vs local) → consistent?206207Output: minimum repro case (smallest input + state that reproduces the bug).208209#### Step 3: Hypothesize210211List 3 hypotheses, rank by likelihood.212213Format:214- **Hypothesis 1 (likely):** [statement]. Evidence supporting: [log/metric/code]. Evidence against: [—]. Test plan: [how to verify].215- **Hypothesis 2 (less likely):** ...216- **Hypothesis 3 (long shot):** ...217218Forcing question:2191. "Top hypothesis confidence: a) High (strong evidence, clear test plan) b) Medium (need more data) c) Low (still guessing — keep observing)"220221#### Step 4: Test222223Verify each hypothesis. Don't blind-fix.224225Per hypothesis:226- Run targeted test / instrumented repro / code read227- Capture evidence (log line, test output, code path)228- Confirmed / refuted / inconclusive?229230#### Step 5: Diagnose & propose fix231232Root cause stated explicitly. Symptom ≠ root cause.233234Fix scope decision:235- **Local fix** (1-3 files, contained) → proposal handoff to `engineer` role236- **Architectural fix** (cross-module, design issue) → loop back to `/em-plan` with flag "rooted in production bug X"237- **Process fix** (CI gap, test gap, observability gap) → ticket via `/em-works` next sprint (route to `engineer` / `qa-reviewer` / `devops` role per gap type)238239Forcing questions:2401. "Before patching, is the root cause confirmed? a) Yes (evidence: ...) b) Strong hypothesis c) Guessing (continue investigation)"2412. "Fix scope: a) Local (handoff engineer) b) Architectural (loop to /em-plan) c) Process (CI/test/observability gap → ticket)"2423. "Test for regression — does it exist? a) Yes (test name) b) Will be added in fix PR c) Not yet decided"243244### Output: `debug-<bug-id>.md` + `debug-<bug-id>.html` (dual output)245246**Must write 2 files**:2472481. **`debug-<bug-id>.md`** — source markdown (structure below)2492. **`debug-<bug-id>.html`** — human-readable review version, self-contained (severity badge colored, hypothesis table, root cause card highlighted, TOC + breadcrumb)250251HTML render uses the template + full CSS spec from [`../../references/html-template.md`](../../references/html-template.md). Content must be 1:1 consistent. `<bug-id>` is a short slug (issue number or brief description, e.g. `debug-auth-timeout.html`).252253```markdown254# Debug Trace: [bug ID or short description]255256**Reported:** YYYY-MM-DD by [source]257**Severity:** Critical / High / Medium / Low258**Investigated by:** em-review (Mode B)259**Date:** YYYY-MM-DD260261---262263## TL;DR264265**Root cause:** [1 line]266**Fix scope:** [Local / Architectural / Process]267**Routing:** [engineer / /em-plan / /em-works ticket]268**Regression test:** [planned / existing / TBD]269270---271272## Step 1: Reproduce273274- Repro reliability: [Consistent / Intermittent / Anecdotal]275- Repro steps:276 1. ...277 2. ...278- Min input: [...]279- Environment: [...]280281## Step 2: Isolate282283- Narrowing observations:284 - [observation 1]285- Minimum repro case: [...]286287## Step 3: Hypothesize288289### Hypothesis 1 (likely)290- **Statement:** ...291- **Evidence supporting:** ...292- **Evidence against:** ...293- **Test plan:** ...294295### Hypothesis 2 (less likely)296...297298### Hypothesis 3 (long shot)299...300301## Step 4: Test302303| Hypothesis | Test action | Evidence | Verdict |304|------------|-------------|----------|---------|305| 1 | ... | ... | Confirmed / Refuted / Inconclusive |306307## Step 5: Diagnose & Fix308309- **Root cause (confirmed):** ...310- **Why bug emerged:** [trigger condition]311- **Why not caught earlier:** [test gap / observability gap / review gap]312313### Fix proposal314- **Scope:** Local / Architectural / Process315- **Approach:** [1 paragraph]316- **Files affected:** [list]317- **Regression test:** [test plan]318319---320321## Forcing Questions Raised322323| # | Step | Question | Response | Resolution |324|---|------|----------|----------|------------|325326---327328## Routing329330- **Local fix:** Handoff to `engineer` role (skill matched per env)331- **Architectural fix:** Loop back to `/em-plan` with flag "production-driven re-plan"332- **Process fix:** Ticket via `/em-works` next sprint (route to `engineer` / `qa-reviewer` / `devops` role per gap type)333334---335336**Generated by:** em-review (Mode B)337**Status:** [Root cause identified / Investigation ongoing]338```339340## Integration with tools341342| Condition | Behavior |343|---------|----------|344| GitHub MCP connected (Mode A) | Auto-fetch PR diff, post review comments inline |345| Linear / GitHub Issues MCP (Mode B) | Auto-create issue for regression / process gap |346| BigQuery MCP (Mode B) | Pull production telemetry for evidence |347| Notion MCP | Push debug-trace.md / pr-review.md to Notion |348| No MCP | File saved local, user pastes manually |349350## Anti-pattern (don't do this)351352### Mode A353- ❌ **Skip `pr-review-<sha>.html` output.** Dual output mandatory — user reviews via HTML.354- ❌ **"LGTM" without annotation on T0/T1 PR.** Review unmoored.355- ❌ **Approve PR without reading the edd reference.** Grounding weak.356- ❌ **Skip a section.** Anti-skip rule applies.357- ❌ **Batch multiple issues into one AskUserQuestion.** One issue = one question.358- ❌ **"Add tests later" as a negotiable blocker on T0/T1.** A block must block.359360### Mode B361- ❌ **Skip `debug-<bug-id>.html` output.** Dual output mandatory — prompter reviews via HTML.362- ❌ **Patch before the hypothesis is confirmed.** Blind fix masking root cause.363- ❌ **Stop at the symptom.** "Restart fixes it" is not a diagnosis.364- ❌ **Skip regression test.** A bug whose fix has no test will recur.365- ❌ **Architectural fix tossed to engineer ticket without looping to /em-plan.** EM bypasses own job.366- ❌ **"Cannot reproduce, closing"** without instrumenting observability first. An anecdotal that gets dismissed = a bug that will return.367368## Handoff369370### Mode A371- **Approve** → `release-engineer` role (skill matched per env) or direct merge372- **Request changes** → `engineer` role fix loop → `/em-review --review` again373- **Comment** → `engineer` role merge with FYI, no loop374375### Mode B376- **Local fix** → `engineer` role (per fix PR) → `/em-review --review` per fix PR377- **Architectural fix** → `/em-plan` with re-frame ("production bug X drove re-plan")378- **Process fix** → `/em-works` next sprint with ticket "process improvement: [CI gap / test gap / observability]" (route to `engineer` / `qa-reviewer` / `devops` role per gap type)379380---381> Source: [verzth/skills](https://github.com/verzth/skills) — distributed by [TomeVault](https://tomevault.io).382<!-- tomevault:4.0:skill_md:2026-05-22 -->