Create a structured bug report or improvement ticket in Linear from test findings
Create well-structured tickets in Linear from test findings — both for bugs (something broken) and improvements (something that could be better).
| Type | When to use | Title prefix | Priority mapping |
|---|---|---|---|
| Bug | Something is broken — behavior deviates from spec, data is wrong, feature doesn't work | [BUG] | Severity-based (Blocker→Urgent, Critical→High, Major→Medium, Minor→Low) |
| Improvement | Something works but could be better — UX friction, inconsistency, missing feedback, accessibility gap, flow optimization | [IMPROVEMENT] | Impact-based (High user impact→High, Moderate friction→Medium, Nice-to-have→Low) |
Determine the type from context:
/exploratory-test Phase 1/2 FAIL result → /exploratory-test UX & Improvement Observations → Improvement/test-plan UX & Improvement Opportunities → ImprovementIf chaining from /exploratory-test or /analyze-failure, carry forward:
Ask for or extract from context:
If chaining from /exploratory-test or /test-plan UX observations, carry forward:
Ask for or extract from context:
If the bug is reproducible and no screenshots exist yet:
mcp__playwright__browser_navigate to the page where the bug occursbrowser_click, browser_fill_form, etc.mcp__playwright__browser_take_screenshot at the point of failuremcp__playwright__browser_snapshot to capture the accessibility tree (useful for locator-related bugs)If the bug involves data:
mcp__supabase__execute_sql to capture the current state of relevant recordsIf the bug involves errors:
mcp__playwright__browser_console_messages for JS errorsmcp__playwright__browser_network_requests for failed API calls, error responsesCRITICAL: When the bug is an AC-vs-implementation mismatch (the AC says X but the app does Y), check the Figma design BEFORE filing. The design is the source of truth, not the AC text.
mcp__figma__get_design_context or mcp__figma__get_screenshot to check the designThis step prevents false-positive bugs that waste developer time and create noise.
mcp__github__list_pull_requests for recently merged PRs in the affected repo (not just cottage-nextjs — could be pg-admin, services, etc.)mcp__github__get_pull_request_files on suspicious PRsmcp__github__list_pull_requests returns "Not Found" for a repo, fall back to CLI: gh pr list --repo Cottage-Energy/<repo> --state merged --limit 10 --json number,title,mergedAt,authormcp__github__list_commits to find changes in the affected feature area| Severity | Definition | Examples |
|---|---|---|
| Blocker | Prevents a core flow from completing. No workaround. | Can't submit move-in form. Payment fails for all users. Login broken. |
| Critical | Core flow works but produces wrong results. Data corruption risk. | Wrong amount charged. User data saved to wrong account. Enrollment created with wrong status. |
| Major | Feature broken but core flow has a workaround. Affects subset of users. | Modal doesn't close via Esc key (can use X button). Feature broken on Safari only. Edge case causes error. |
| Minor | Cosmetic, UX annoyance, or edge case with easy workaround. | Button misaligned. Typo in label. Tooltip doesn't show on hover. |
| Impact | Definition | Examples |
|---|---|---|
| High | Affects a core flow. Likely causes user confusion, drop-off, or support tickets. Wide reach. | Onboarding step with no loading indicator — users double-click and create duplicates. Confusing label causes wrong selection on payment form. |
| Medium | Noticeable friction in a common flow. Users can complete the task but the experience is suboptimal. | Form doesn't remember state after back navigation. Inconsistent button labels across similar flows. Error message says "something went wrong" with no guidance. |
| Low | Nice-to-have polish. Doesn't block or confuse but would improve the experience. | Success toast could be more descriptive. Empty state could suggest an action. Minor spacing inconsistency between mobile and desktop. |
mcp__linear__list_issues with query parameter to search for similar bugs using keywords from the bug title and affected feature (note: search_issues does not exist — use list_issues with query)Use the appropriate template based on ticket type.
Title: [BUG] <concise description of the bug>
## Description
<Brief summary — one or two sentences>
## Steps to Reproduce
1. Navigate to [URL]
2. [Action]
3. [Action]
4. Observe: [what's wrong]
## Expected Result
<What should happen>
## Actual Result
<What actually happens>
## Evidence
- Screenshot: [attached or described]
- Database state: [relevant query results]
- Console errors: [if any]
- Network errors: [if any]
## Environment
- Browser: <Chromium/Firefox/Safari/Mobile Chrome/Mobile Safari>
- Environment: <dev/staging/production>
- URL: <exact URL where bug occurs>
- Test data: <user email, account, or other identifying info>
## Suspected Cause
- PR #[number]: [title] — [brief explanation of why]
- Or: Unknown — needs investigation
## Related
- Testing ticket: [Linear ticket ID if testing a specific ticket]
- Test file: [path to automated test if it caught this]
- Related bugs: [BUG-XXX if similar issues exist]
## User Impact
<What the user experiences — describe in concrete, non-technical terms. Example: "User gets no indication the creation failed — they may think it succeeded" rather than "409 error is unhandled">
## Severity
<Blocker/Critical/Major/Minor> — <brief justification>
Title: [IMPROVEMENT] <concise description of the improvement>
## Current Experience
<What the user sees/does today — describe the friction, confusion, or gap>
- URL: <exact URL or flow step>
- Screenshot: [current state]
## Suggested Improvement
<Concrete description of what could be better — be specific and actionable>
## Why This Matters
<User impact — confusion risk, drop-off likelihood, support ticket potential, accessibility concern>
- Who is affected: <all users / specific user type / specific flow>
- How often: <every time / under specific conditions>
## Evidence
- Screenshot: [current state showing the issue]
- Comparison: [Figma design vs live app, if relevant]
- User perspective: [what a first-time user would think/feel]
## Context
- Discovered during: [exploratory session / test planning / PR review — link to ticket if applicable]
- Related flows: [other screens or flows with the same pattern]
- Related tickets: [existing tickets addressing similar areas]
## User Impact
<What the user experiences — describe the friction, confusion, or frustration in concrete terms. Keep it user-centric, not technical>
## Impact
<High/Medium/Low> — <brief justification>
mcp__linear__create_issue to create the ticket in Linear[BUG] concise description[IMPROVEMENT] concise description/create-test to create a regression test/exploratory-test to create a scripted reproduction| Tool | Purpose |
|---|---|
| Linear MCP | save_issue — create the bug report; list_issues (with query param) — check for duplicates |
| Playwright MCP | browser_navigate, browser_click, browser_take_screenshot, browser_snapshot, browser_console_messages, browser_network_requests — capture evidence |
| Supabase MCP | execute_sql — capture database state as evidence |
| GitHub MCP | list_pull_requests, get_pull_request_files, list_commits — identify suspected cause |
| gh CLI (fallback) | gh pr list --repo ... — when GitHub MCP returns 404 for a repo |
| Blocker | Symptom | Workaround |
|---|---|---|
| GitHub MCP 404 | mcp__github__list_pull_requests returns "Not Found" for pg-admin, cottage-nextjs | Use gh pr list --repo Cottage-Energy/<repo> --state merged --limit 10 --json number,title,mergedAt,author |
Linear search_issues missing | No mcp__linear__search_issues tool exists | Use mcp__linear__list_issues with query parameter instead |
| Labels not applied | labels: ["Bug"] in save_issue results in empty labels array | Label name may need exact match or label ID — verify label exists in workspace first |
After completing this skill, check: did any step not match reality? Did a tool not work as expected? Did you discover a better approach? If so, update this SKILL.md with what you learned.
mcp__linear__search_issues doesn't exist: Step 5 referenced it but the actual tool is mcp__linear__list_issues with a query param. Updated step 5 and tools table.mcp__github__list_pull_requests returned "Not Found" for Cottage-Energy/pg-admin. Had to fall back to gh pr list CLI. Added to step 3 and Common Blockers table.save_issue: Passed ["Bug"] but created issue had empty labels. Likely a name mismatch or MCP limitation. Added to Common Blockers.cottage-nextjs. PG Admin bugs come from the pg-admin repo. Updated to say "affected repo".SubscriptionMetadata. The metadata was manually INSERTed via INSERT INTO "SubscriptionMetadata" — missing transactionID and other pipeline-set fields. When retested with metadata generated by the real Inngest transaction-generation-trigger, cancel correctly set status to canceled. Manual inserts can create data that doesn't match production conditions, leading to false-positive bug reports. Before filing a bug involving system-generated data (payments, metadata, bills), always verify using the real pipeline (Inngest events, cron jobs) rather than direct DB inserts.?electricCompany=COSERV + Casper WY waitlist address (T9d) and ?gasCompany=PSEG + Dallas TX address (T9e) as "Critical bugs" because the override bypassed waitlist and cross-geography validation. But AC3 verbatim reads: "These params force specific utility companies on the user, bypassing the standard company lookup" — which includes waitlist + zip-to-utility mapping. Both findings were feature-working-as-specified, not bugs. Had to revise the Linear comment via commentUpdate to downgrade and reframe. Added feedback_reread_AC_before_flagging_bug.md to memory — rule: paste the AC text next to the observation before filing. Especially important for override/bypass behaviors where the AC explicitly permits skipping a gate. Applies to exploratory-test chain as well.MoveInPartner would have confirmed neither "mynd" nor "mindflow" exists. Had to scrub 3 Linear comments + 1 bug description via commentUpdate/issueUpdate. Added feedback_verify_partner_name_against_db.md — rule: when a partner name enters a persistent artifact (ticket, comment, report), verify via SELECT name FROM "MoveInPartner" WHERE name ILIKE '%<candidate>%' before committing.