Reproduce Bug
Use this skill when the goal is to reproduce a reported bug quickly and with low friction.
Keep the scope narrow:
- Prove whether the reported bug can be reproduced.
- Capture the lightest evidence that makes the result clear.
- Return a clear result with repro steps and artifact paths.
Do not use this skill for broad QA, new bug discovery, or root-cause analysis.
Preflight
Before starting any browser-based reproduction:
- Confirm the
dogfood skill is available and read it first for browser setup and evidence capture.
- If browser reproduction is needed but
dogfood is not ready, do not loop on failing browser steps. Return BLOCKED with the missing setup or prerequisite.
Inputs
Collect only the context needed to attempt reproduction:
- bug summary
- expected behavior
- actual behavior
- conditions under which it occurs (environment, data, timing, account), if known
- starting URL, screen, command, or environment
- known repro steps, if any
- account, auth, test data, or feature flag prerequisites
If the bug report is vague, reduce it to one testable repro target before proceeding.
Treat the original report and its attached media as the authority on the symptom (what was seen and when), not as proof of the cause. This skill does not own root cause: cause statements in the report are hypotheses for the owner, never findings to accept. Reuse the report's existing details and media; do not re-interview the reporter for what the report already contains.
Modes
Choose exactly one primary mode:
browser-interactive
- Use when the bug requires clicks, typing, navigation, async state changes, or a multi-step user journey.
browser-static
- Use when the bug is visible on load and a screenshot is enough to prove it.
non-browser
- Use when the bug is reproduced more directly through a command, API call, file output, log, or data check.
- iOS user journeys count here: load the
argent skill and replay the reported entry point as a flow on a simulator or connected iPhone. Save the flow ONLY at _ai/task/{SLUG}/reproduction/flows/<safe-name>.yaml (safe name: letters, numbers, _, -) so verification-gate can replay the exact file on the candidate.
- The flow must assert the initial screen state and the expected behavior (not just that the actions ran) — the reproduction contract in the
argent skill. Establish that the installed app matches the exact candidate before replay; missing/stale app means build/install via xcodebuildmcp-cli first, or BLOCKED if provenance cannot be established.
- The flow result plus
--json report is the observable proof; mechanical proof (build, logs) stays with xcodebuildmcp-cli.
Prefer the smallest repro path that still proves the bug clearly.
Workflow
Define the repro target.
- State the exact behavior you are trying to trigger.
- Keep it to one bug at a time.
Map the shortest repro flow.
- Start from the first meaningful action.
- End at the exact failing state or at proof that the bug did not occur.
- Avoid extra setup steps unless they are required to trigger the issue.
- Keep the flow rerunnable as the cheapest faithful before/after check: after a fix, the same entry point should flip the expected/actual contrast without rework.
Attempt reproduction.
Reproduce through the reported entry point: the screen, command, or flow the reporter actually used. A unit test, a different code path, or a mocked dependency can support a finding but never confirms a real user-flow bug by itself.
Prefer user-visible proof first: show what the user actually sees going wrong, then add mechanical proof (logs, command output, file state) to pin the failure. Observable alone can be ambiguous; mechanical alone can miss the user's actual experience.
When the requester explicitly asks for a screenshot (or other specific artifact), capture it or return BLOCKED naming the missing prerequisite; do not substitute a different artifact silently.
Check for existing faithful evidence (logs, screenshots, reports from the actual flow) before spending on a new reproduction; valid existing evidence that matches the reported entry point can avoid a new expensive repro run.
Clearly mark controlled evidence (staging data, seeded fixtures, scripted runs); it supports diagnosis but never proves live user behavior on its own.
Record observations separately from hypotheses. "The save button produced no network call" is an observation; "the handler is not wired" is a hypothesis. Report only what was observed; leave cause claims to the fix stage.
Prefer existing logs over new instrumentation.
Reuse the smallest part of the dogfood workflow needed to reproduce the reported bug.
Capture 📸 when a single static proof state is enough.
Capture 🎥 when the bug requires interaction or timing proof; prefer one recording for the full sequence.
For non-browser, run the shortest direct repro path available.
Prefer concrete proof: failing output, wrong response, missing file, broken state, or other observable result.
Decide the result.
REPRODUCED: the reported bug was triggered and proven.
NOT_REPRODUCED: the reported bug did not occur after a reasonable attempt.
BLOCKED: required auth, data, environment, or tooling is missing.
Report the result.
Evidence Rules
- Match the evidence to the bug.
- Prefer cheap user-observable proof (what the user sees) plus mechanical proof (logs, command output, file state) together; observable alone can be ambiguous, mechanical alone can miss the user's actual experience.
- Use screenshots for static visible issues.
- Use a single full-sequence video for interaction-heavy repros.
- Never capture secrets, tokens, private user data, or unnecessary personal information.
- If a task directory exists, store artifacts under
_ai/task/{SLUG}/reproduction/ with screenshots/ and videos/ subfolders.
- For iOS flow reproduction, the replayable flow itself is durable evidence: keep it at
_ai/task/{SLUG}/reproduction/flows/<safe-name>.yaml alongside the other artifacts.
- Always include artifact paths when evidence exists.
Output
Use this exact structure:
## Reproduction Result
- Mode: `browser-interactive|browser-static|non-browser`
- Bug: [short bug summary]
- Repro target: [exact behavior tested]
- Result: `REPRODUCED|NOT_REPRODUCED|BLOCKED`
### Repro Steps
- [short numbered or ordered steps]
### Evidence
- [artifact path or "No artifacts"]
### Notes
- [key failure point, proof point, or blocker; observations only, kept separate from any cause hypothesis]
### Next Action
- [fix bug / refine bug report / unblock environment / one diagnostic question to owner if cause is unclear]
Examples
browser-interactive: Open settings -> toggle notifications -> save -> page resets and loses the new state.
browser-static: Open pricing page -> CTA text is clipped on mobile.
non-browser: Run import command -> command exits successfully but no output file is created.
non-browser (iOS flow): Launch app -> open settings -> toggle notifications -> save -> toggle reverts instead of persisting.
1---2name: reproduce-bug3description: Lightweight SOP for reproducing bugs and proving whether a reported issue can be triggered. Use when Claude needs to reproduce a bug, validate a bug report, capture a repro video or screenshot, and return a clear REPRODUCED/NOT_REPRODUCED/BLOCKED result. When browser-based reproduction is needed, rely on the dogfood skill for browser setup, navigation, and evidence capture.4---56# Reproduce Bug78Use this skill when the goal is to reproduce a reported bug quickly and with low friction.910Keep the scope narrow:1112- Prove whether the reported bug can be reproduced.13- Capture the lightest evidence that makes the result clear.14- Return a clear result with repro steps and artifact paths.1516Do not use this skill for broad QA, new bug discovery, or root-cause analysis.1718## Preflight1920Before starting any browser-based reproduction:2122- Confirm the `dogfood` skill is available and read it first for browser setup and evidence capture.23- If browser reproduction is needed but `dogfood` is not ready, do not loop on failing browser steps. Return `BLOCKED` with the missing setup or prerequisite.2425## Inputs2627Collect only the context needed to attempt reproduction:2829- bug summary30- expected behavior31- actual behavior32- conditions under which it occurs (environment, data, timing, account), if known33- starting URL, screen, command, or environment34- known repro steps, if any35- account, auth, test data, or feature flag prerequisites3637If the bug report is vague, reduce it to one testable repro target before proceeding.3839Treat the original report and its attached media as the authority on the symptom (what was seen and when), not as proof of the cause. This skill does not own root cause: cause statements in the report are hypotheses for the owner, never findings to accept. Reuse the report's existing details and media; do not re-interview the reporter for what the report already contains.4041## Modes4243Choose exactly one primary mode:44451. `browser-interactive`46 - Use when the bug requires clicks, typing, navigation, async state changes, or a multi-step user journey.472. `browser-static`48 - Use when the bug is visible on load and a screenshot is enough to prove it.493. `non-browser`50 - Use when the bug is reproduced more directly through a command, API call, file output, log, or data check.51 - iOS user journeys count here: load the `argent` skill and replay the reported entry point as a flow on a simulator or connected iPhone. Save the flow ONLY at `_ai/task/{SLUG}/reproduction/flows/<safe-name>.yaml` (safe name: letters, numbers, `_`, `-`) so `verification-gate` can replay the exact file on the candidate.52 - The flow must assert the initial screen state and the expected behavior (not just that the actions ran) — the reproduction contract in the `argent` skill. Establish that the installed app matches the exact candidate before replay; missing/stale app means build/install via `xcodebuildmcp-cli` first, or `BLOCKED` if provenance cannot be established.53 - The flow result plus `--json` report is the observable proof; mechanical proof (build, logs) stays with `xcodebuildmcp-cli`.5455Prefer the smallest repro path that still proves the bug clearly.56## Workflow57581. Define the repro target.59 - State the exact behavior you are trying to trigger.60 - Keep it to one bug at a time.61622. Map the shortest repro flow.63 - Start from the first meaningful action.64 - End at the exact failing state or at proof that the bug did not occur.65 - Avoid extra setup steps unless they are required to trigger the issue.66 - Keep the flow rerunnable as the cheapest faithful before/after check: after a fix, the same entry point should flip the expected/actual contrast without rework.67683. Attempt reproduction.6970 - Reproduce through the reported entry point: the screen, command, or flow the reporter actually used. A unit test, a different code path, or a mocked dependency can support a finding but never confirms a real user-flow bug by itself.71 - Prefer user-visible proof first: show what the user actually sees going wrong, then add mechanical proof (logs, command output, file state) to pin the failure. Observable alone can be ambiguous; mechanical alone can miss the user's actual experience.72 - When the requester explicitly asks for a screenshot (or other specific artifact), capture it or return `BLOCKED` naming the missing prerequisite; do not substitute a different artifact silently.73 - Check for existing faithful evidence (logs, screenshots, reports from the actual flow) before spending on a new reproduction; valid existing evidence that matches the reported entry point can avoid a new expensive repro run.74 - Clearly mark controlled evidence (staging data, seeded fixtures, scripted runs); it supports diagnosis but never proves live user behavior on its own.75 - Record observations separately from hypotheses. "The save button produced no network call" is an observation; "the handler is not wired" is a hypothesis. Report only what was observed; leave cause claims to the fix stage.76 - Prefer existing logs over new instrumentation.77 - Reuse the smallest part of the `dogfood` workflow needed to reproduce the reported bug.78 - Capture `📸` when a single static proof state is enough.79 - Capture `🎥` when the bug requires interaction or timing proof; prefer one recording for the full sequence.8081 - For `non-browser`, run the shortest direct repro path available.82 - Prefer concrete proof: failing output, wrong response, missing file, broken state, or other observable result.83844. Decide the result.8586 - `REPRODUCED`: the reported bug was triggered and proven.87 - `NOT_REPRODUCED`: the reported bug did not occur after a reasonable attempt.88 - `BLOCKED`: required auth, data, environment, or tooling is missing.89905. Report the result.9192## Evidence Rules9394- Match the evidence to the bug.95- Prefer cheap user-observable proof (what the user sees) plus mechanical proof (logs, command output, file state) together; observable alone can be ambiguous, mechanical alone can miss the user's actual experience.96- Use screenshots for static visible issues.97- Use a single full-sequence video for interaction-heavy repros.98- Never capture secrets, tokens, private user data, or unnecessary personal information.99- If a task directory exists, store artifacts under `_ai/task/{SLUG}/reproduction/` with `screenshots/` and `videos/` subfolders.100- For iOS flow reproduction, the replayable flow itself is durable evidence: keep it at `_ai/task/{SLUG}/reproduction/flows/<safe-name>.yaml` alongside the other artifacts.101- Always include artifact paths when evidence exists.102103## Output104105Use this exact structure:106107```md108## Reproduction Result109110- Mode: `browser-interactive|browser-static|non-browser`111- Bug: [short bug summary]112- Repro target: [exact behavior tested]113- Result: `REPRODUCED|NOT_REPRODUCED|BLOCKED`114115### Repro Steps116117- [short numbered or ordered steps]118119### Evidence120121- [artifact path or "No artifacts"]122123### Notes124125- [key failure point, proof point, or blocker; observations only, kept separate from any cause hypothesis]126127### Next Action128129- [fix bug / refine bug report / unblock environment / one diagnostic question to owner if cause is unclear]130```131132## Examples133134- `browser-interactive`: Open settings -> toggle notifications -> save -> page resets and loses the new state.135- `browser-static`: Open pricing page -> CTA text is clipped on mobile.136- `non-browser`: Run import command -> command exits successfully but no output file is created.137- `non-browser` (iOS flow): Launch app -> open settings -> toggle notifications -> save -> toggle reverts instead of persisting.