BXUP Track progress & test yourself — free
QA & Testing · Hands-on lab · ~5 min read
QA & TESTING · HANDS-ON LAB

Lab 09 · Defect-Report Studio

Turn a pile of messy repro evidence — rambling session notes, a console log, a HAR excerpt — into five publication-quality defect reports with AI, verifying every repro yourself before filing. Then semantic-dedupe them against a seeded backlog that contains planted near-duplicates, and check your dedupe calls against the answer key.

Karthik's exploratory session found real problems, and his evidence is the usual crime scene: fragmentary notes typed mid-session, a console log, and a HAR capture. The AI opportunity is obvious — models turn evidence into beautifully structured reports in seconds. The AI hazard is just as obvious: a model will confidently fill evidence gaps with plausible fiction, and a fictional repro step in a filed bug costs a developer an afternoon and costs QA its credibility. This lab drills both halves: evidence-to-report drafting with a verify-before-file gate, and duplicate detection against a backlog where we planted two traps — one report that is a duplicate wearing different words, and one that looks like a duplicate but isn't.

Time, tier & cost

~75 minutes hands-on · Foundation tier (maps to module M4 and playbook PB-22). Cost: $0–1 (any capable free tier; embeddings optional).

Setup

mkdir -p qa-lab-09 && cd qa-lab-09
touch session-notes.txt console.log network.har.txt backlog.csv reports.md dedupe-log.md

session-notes.txt — the raw evidence, exactly as typed mid-session:

14:02 checkout w/ saved card -> spinner forever?? nothing happens, no error
     shown to user. console had something red
14:11 tried again w/ guest checkout, same spinner but eventually order went
     thru?? took like 40s. got 2 confirmation emails
14:19 promo box: typed SAVE10, hit enter -> whole page reloaded, cart emptied!!
     had 3 items. only on enter key, clicking Apply is fine
14:26 address form: pin 5600  38 (fat fingered space) -> form said valid,
     order created, courier api will hate this
14:31 profile pic upload: 8mb jpeg fine, 12mb jpeg -> generic "something went
     wrong". limit? no message about size anywhere
14:38 mobile viewport 375px: Pay button half off-screen, had to scroll
     horizontally to tap it. iphone SE size

console.log — captured during 14:02–14:15:

14:02:41 POST /api/payments/charge 500 (Internal Server Error)
14:02:41 Uncaught (in promise) TypeError: Cannot read properties of
         undefined (reading 'status') at PaymentForm.tsx:88
14:11:03 POST /api/payments/charge 500 (Internal Server Error)
14:11:22 POST /api/payments/charge retry attempt 2
14:11:41 POST /api/payments/charge 200
14:11:41 POST /api/orders 201
14:11:44 POST /api/orders 201

network.har.txt — condensed HAR entries for the same window:

14:02:41 POST /api/payments/charge -> 500, 1204ms
  resp: {"error":"gateway_timeout","upstream":"razorpay","request_id":"rq_881"}
14:11:03 POST /api/payments/charge -> 500, 1188ms
14:11:22 POST /api/payments/charge -> 200, 39805ms   (retry)
14:11:41 POST /api/orders -> 201, 310ms   body: {"order_id":"ORD-5521"}
14:11:44 POST /api/orders -> 201, 290ms   body: {"order_id":"ORD-5522"}

backlog.csv — the existing open backlog you must dedupe against:

id,title,summary
BUG-201,Payment spinner hangs on card decline,Saved-card payment shows infinite spinner when the gateway declines; no user-facing error. Console shows unhandled TypeError in PaymentForm.
BUG-202,Coupon field strips cart on submit,Pressing Enter in promo code input triggers full form submit and cart state is lost. Reported on Firefox.
BUG-203,Slow checkout on weekends,Checkout intermittently slow during high traffic; some payments take 30s+.
BUG-204,Address validation accepts short PIN,5-digit PIN codes pass validation; couriers reject the label downstream.
BUG-205,Upload fails silently for PNG over 10MB,Large PNG profile uploads show generic error with no size guidance.
BUG-206,Duplicate webhook events from payment gateway,Razorpay sometimes sends the charge webhook twice; dedupe layer missing.
BUG-207,Checkout button unresponsive on Safari 16,Tapping Pay does nothing on older Safari; JS error in polyfill.
BUG-208,Emails delayed during campaign sends,Confirmation emails arrive up to 1h late when marketing blasts run.
BUG-209,Cart total wrong after removing promo,Removing an applied promo leaves discounted total until refresh.
BUG-210,Horizontal scroll on order history page,Order history table overflows viewport on narrow screens.

Steps

  1. Draft with AI from the full evidence bundle. Paste all three evidence files into Claude/ChatGPT: "Draft defect reports from this evidence. For each distinct defect: title (symptom + condition, ≤80 chars), environment, numbered repro steps, expected vs actual, severity with one-line justification, and — critically — attach only evidence that appears verbatim in the inputs; where evidence is missing, write EVIDENCE GAP rather than inventing." Save the raw drafts into reports.md under "AI drafts."
  2. Count the defects before trusting the count. The session notes contain six timestamped observations; the AI will produce somewhere between four and seven reports. Decide yourself how many distinct defects exist — in particular, are 14:02 and 14:11 one defect or two, and is the duplicate-emails detail its own defect? Write your ruling and reasoning in reports.md before moving on (the answer key rules on this).
  3. Run the verify-before-file gate. For each draft, walk every repro step against the evidence: does the console line, HAR entry, or note actually support it? Mark each step ✔ (evidenced), ~ (plausible inference, labeled as such), or ✗ (invented). Models routinely invent specifics here — a card number, a browser version, an exact error message the user "saw." Every ✗ gets rewritten or cut. Log the invented details you caught; that list is scored.
  4. Upgrade the two weakest reports by interrogating the evidence. The payment defect deserves a root-cause-visible report: the HAR shows a gateway_timeout from the upstream with a request_id, the console shows the unhandled TypeError that turns a failed charge into a silent spinner, and the double POST /api/orders (201 twice, two order ids, two emails) shows the retry path creating duplicate orders. Your report should separate symptom (silent hang), defect (unhandled rejection at PaymentForm.tsx:88), and consequence (retry double-charge path), with the request_id quoted for the backend team.
  5. Finalize five reports. Publication bar: a developer can start work without asking you anything. Title states symptom + trigger; steps are numbered and evidenced; expected/actual are one line each; severity justified (the duplicate-order path is the severity king here — money moves twice); every evidence citation is verbatim.
  6. Dedupe against the backlog. For each of your five, compare against backlog.csv — either prompt the model ("For each new report, list the top-2 closest backlog items with a similarity judgment and a DUPLICATE / RELATED / NEW verdict, with reasoning") or compute embeddings (any embedding endpoint, cosine against title+summary) and then judge the top hits yourself. Record verdicts and reasoning per report in dedupe-log.md. Wording overlap is not duplication and wording difference is not novelty — judge on mechanism, not vocabulary.
  7. Make the two hard calls explicitly. Two backlog items are planted to test exactly this: one of your reports matches an existing bug's mechanism despite sharing almost no words with it, and one backlog item shares almost every word with one of your reports while describing a different defect. Name both in dedupe-log.md and defend each verdict in two sentences.
  8. Score against the answer key. Check: defect count, invented-detail catches, severity ranking, and all five dedupe verdicts. Record your misses and — for any dedupe miss — whether vocabulary similarity fooled you in the direction the trap intended.
Pro Tip

File the mechanism, not the vocabulary. "Spinner forever on saved card" and "payment shows infinite spinner on decline" may be the same bug or different bugs — the console stack line and the upstream error body are what decide it, and they are exactly the evidence an AI draft will omit unless you pin it to verbatim citations.

Verify

  • Five reports in reports.md, every repro step marked ✔/~/✗ during the gate, zero ✗ surviving.
  • The invented-details log lists at least two AI fabrications you caught (or an explicit note that your run produced none, with the drafts as proof).
  • The payment report separates symptom / defect / consequence and quotes rq_881 and PaymentForm.tsx:88.
  • dedupe-log.md has a verdict + reasoning for all five, including the two hard calls.
  • Severity ordering written and justified.

Self-grading rubric (pass = 7/10):

Dimension012
Defect separationMerged or split wronglyDefensible, thin reasoningMatches key with reasoning
Verification gateDrafts filed as-isGate run, catches unloggedGate run, fabrications logged
Evidence useGeneric reportsSome citationsVerbatim citations incl. request_id/stack line
Dedupe accuracy≤2 of 5 verdicts right3–4 right5 right incl. both traps
Severity judgmentUnrankedRankedDuplicate-order path ranked top, justified
▸Answer key — defect count, planted duplicates, and expected verdictsoptional deep dive — click to expand

Correct defect separation (5 reports). (1) Silent payment failure + duplicate orders — 14:02 and 14:11 are one defect cluster with two evidenced facets: the unhandled promise rejection at PaymentForm.tsx:88 makes gateway failures silent, and the retry path produced two POST /api/orders 201s (ORD-5521/5522) and two emails. One report, symptom/defect/consequence structure; filing the duplicate-order facet as its own linked report is also accepted if cross-referenced. Splitting 14:02 vs 14:11 into two unrelated bugs, or dropping the duplicate-order evidence, loses the point. (2) Enter key in promo field empties cart (14:19). (3) PIN validation accepts malformed input (14:26 — note the evidence shows a 7-char string with an internal space, not a 5-digit pin). (4) Oversized JPEG fails with no size guidance (14:31). (5) Pay button clipped at 375px (14:38).

The five dedupe verdicts:

  • Report 1 vs BUG-201 — DUPLICATE (trap #1, different words, same mechanism). BUG-201 says "on card decline," your evidence says gateway timeout — but the mechanism is identical: any charge failure hits the same unhandled TypeError in PaymentForm and hangs silently. Same defect, different trigger; correct action is duplicate-with-comment adding the timeout trigger, the request_id, and the duplicate-order consequence (which may warrant escalating BUG-201's severity). Calling it NEW because "decline ≠ timeout" is the intended vocabulary-trap failure. BUG-206 is related (gateway duplication theme) but not the same defect — bonus for noting the distinction.
  • Report 2 vs BUG-202 — DUPLICATE. Near-verbatim match; the honest easy call. (Your evidence adds Chrome to its Firefox note — comment, don't refile.)
  • Report 3 vs BUG-204 — NOT a duplicate (trap #2, similar words, different mechanism). BUG-204: 5-digit PINs pass length validation. Your finding: a 7-character string with an embedded space passes — a sanitization/format defect, not the known length defect; fixing BUG-204's length check would not fix yours. Verdict NEW (RELATED accepted only if the report text still demands a separate fix). Marking it DUPLICATE is the planted false-positive failure.
  • Report 4 vs BUG-205 — RELATED/NEW, defended. BUG-205 is PNG over 10MB; yours is JPEG at 12MB with the same silent-error symptom. Likely the same missing size-guard, but the evidence doesn't prove shared code path; either NEW-linked-to-205 or DUPLICATE-with-comment scores, silence about 205 doesn't.
  • Report 5 vs BUG-210 — NOT a duplicate. Same theme (responsive overflow), different page, different element, different consequence (checkout-blocking vs cosmetic). NEW; BUG-207 is also a distractor (unresponsive Pay button — mechanism is JS error, not layout).

Expected AI fabrications to catch (any two): an invented browser/OS in environment, invented user-visible error text for the 14:02 hang (the note says no error shown), a specific card type/number, invented file-size limit ("10MB limit exceeded"), merged or renumbered timestamps, or a fabricated "steps to reproduce" for the 40s delay. Severity order: report 1 top (financial: double order/charge path), then promo-cart-wipe (data loss), then PIN (downstream ops), clipped button (conversion, device-scoped), upload messaging (UX). Reasonable swaps of the middle three are fine if argued; anything above report 1 is not.

Key Takeaway:

AI turns messy evidence into publication-shaped reports instantly — and will invent whatever the evidence doesn't supply, in the same confident voice. The verify-before-file gate and mechanism-level dedupe are the QA value-add: every step evidenced, every fabrication caught, and duplicates judged by failing mechanism, never by matching vocabulary.

This is the free reading view. Open BXUP to track your progress, run the hands-on labs, and prove it with original, exam-pattern assessments.
© Anvi Innovate · BXUP — Be Exponentially Upskilled · BXUP is an independent learning platform, not affiliated with or endorsed by AWS, Microsoft, Google, NVIDIA, IBM, Salesforce, Databricks, Oracle or Anthropic. All trademarks belong to their respective owners. · bxup.in