Trường Số QA/Bug report template
Trường Số · QA test suite · Phase 1 · 10/09/2026
Bug report template
The exact format used in Phase 2 for bugs/index.html and bugs.json. One bug per distinct root cause; link every bug to the test case that found it and to the PRD rule it violates. Severity is about impact on a center, not about how hard the fix is.
Key facts, origin and limits
Drafted by an AI assistant in a single session on 10/09/2026 as part of the Trường Số QA suite, under the request quoted verbatim on the dashboard. A proposal for team review, not a sign-off.
Sources
- The Trường Số PRD set (Draft v1, 10/09/2026): user stories, screen tables, business rules and permission matrices, plus the Cloud theme reference.
Limits
- Phase 1 (authoring) only. Cases are executed in Phase 2 against the local build; results are recorded in
testcases.jsonandruns/run-1/, and every result field is stillnot_run. - Cases inherit any open question or inconsistency in the PRDs they trace to.
1Severity scale
| Level | Definition | Go/no-go |
|---|---|---|
| P0 S1 Blocker | Data loss, money wrong, security or tenancy breach, crash on a P0 path, or the daily loop cannot be completed. Stops the release. | No-go while open |
| P1 S2 Major | A P0/P1 story fails or a workaround is needed; wrong totals on a report; permission leak that only hides UI; broken empty/error state on a main screen. | No-go above 3 open on P0 stories |
| P2 S3 Minor | Functional deviation with easy workaround; copy not matching the glossary; validation message wrong; responsive issue at 1024; a11y issue that does not block. | Fix before pilot |
| P3 S4 Cosmetic | Alignment, spacing, colour token off, tooltip text, non-blocking console warning. | Backlog |
2Fields
| Field | Rule |
|---|---|
id | BUG-<mod>-<nnn> (e.g. BUG-FIN-004) |
severity | S1 | S2 | S3 | S4 |
module | 01-admissions-crm | 02-students-sis | ... |
title | One line, imperative facts: what is wrong, where |
environment | {"build": "commit sha or HANDOFF build id", "url": "http://localhost:<port>/route", "role": "U-ACAD-A", "browser": "Chrome 140 (Playwright channel chrome)", "viewport": "1440x900 | 1024x768 | 390x844", "locale": "vi | en", "tenant": "BIG | EMPTY"} |
test_case | TS-FIN-021 |
prd_ref | 05 FIN-04, §6 rule 3 |
preconditions | Fixture state at start |
steps | ["1.", "2.", "3."] |
expected | Exact text, count, state or URL expected (copied from the case) |
actual | What happened, with the exact text shown |
evidence | ["screenshots/BUG-FIN-004-1.png", "curl output or HAR excerpt", "console error"] |
reproducibility | always | intermittent (n/10) | once |
suggested_fix | Optional pointer for the build agent (file/route/rule) |
status | new | confirmed | fixed | verified | wontfix | duplicate-of BUG-... |
found_in_run | run-1 |
verified_in_run | null |
3Filled example
{
"id": "BUG-FIN-001",
"severity": "S1",
"module": "05-tuition-and-finance",
"title": "Overpayment accepted: cash payment 800,000 on INV-2 with 700,000 remaining creates a paid invoice with negative remaining",
"environment": {
"build": "abc1234",
"url": "http://localhost:3000/finance/tuition/INV-2/pay",
"role": "U-ACC",
"browser": "Chrome 140",
"viewport": "1440x900",
"locale": "vi",
"tenant": "BIG"
},
"test_case": "TS-FIN-023",
"prd_ref": "05 §6 rule 2 (overpayment refused)",
"preconditions": "INV-2 partial, remaining 700,000",
"steps": [
"Open INV-2, click Thu tiền",
"Enter 800,000, Tiền mặt, CD-A",
"Confirm"
],
"expected": "Inline error \"Vượt số còn lại (700.000 đ)\"; no payment created",
"actual": "Payment PT-Q1-202609-0007 created; invoice shows Còn lại -100.000 đ",
"evidence": [
"screenshots/BUG-FIN-001-1.png",
"POST /api/v3/teacher/school-finance/tuitions/INV-2/pay -> 200"
],
"reproducibility": "always",
"suggested_fix": "Validate amount <= remaining server-side in the pay handler and in the dialog",
"status": "new",
"found_in_run": "run-1",
"verified_in_run": null
}4Reporting rules
- Reproduce twice before filing; record reproducibility honestly.
- Quote exact on-screen text in actual; never paraphrase.
- Attach the request and response for API-level failures (curl line and status).
- One screenshot per state (before, after) at the viewport where it failed; name files by bug id.
- Do not modify application code; suggested_fix is a pointer only.
- Duplicates are closed as duplicate-of; the first report keeps the id.
- Each bug lists the test case; each failed test case in testcases.json lists its bug ids.
Trường Số (truongso.net) · FLYER internal