FibreTrace QC Test Script — Test Cases (condensed)
Source: .local/qc-test-script/fibretrace-qc-test-script.docx (v1.0, received from Malcolm 2026-08-19). Plain-text extraction: extracted.txt (line numbers cited in analysis.md refer to that file). 50 cases across 6 sections + sign-off. Sections run in order: FT Admin creates the data every other persona depends on. Results are recorded per release in the companion CSV (fibretrace-qc-test-script.csv). Every screen also gets the four cross-cutting checks: on-screen text/terminology, error messages, presence + destination of contextual CTAs, and KPI values reconciling with the underlying lists.
Key rules under test
- 1 CU (Claim Unit / credit unit) = 1 kg. CU = quantity × net weight × blend %.
- Blend % must come from the admin product-category configuration, never a hard-coded value.
- A company is a Fibre Producer only if registered as a producer on a programme. An SDU or EWR assignment alone is a feature gate, not a persona.
- Verification / scan IDs and blockchain GUIDs are obfuscated by default; they unmask only when linked to a claim.
- Reservations default to an 18-month expiry and may carry negative entries (capacity release).
- Reservations, nominations and claims must reconcile: reserved ≥ nominated ≥ claimed.
Test environment checklist
- One programme with capacity, one program owner, one Tier 0 participant, one Tier 1 manufacturer, one Tier 4 producer.
- At least one facility + scanner per manufacturer, one SDU and one EWR source per producer.
- A company with the Insights module on and one with it off.
- A brand-new empty account per persona to test first-login empty states.
Test cases
| ID | Persona | Route | What it tests | Expected result (condensed) |
|---|---|---|---|---|
| A-01 | FT Admin | /admin/programs | Create a fibre programme: name, fibre type, status active, start/end dates, default blend % | Programme listed as Active; creation toast; on re-open every field persisted, no blank blend % |
| A-02 | FT Admin | /admin/programs | Assign a reservation (capacity) to the Tier 0 retailer: amount in CU, start date, expiry | Reservation row shows CU + expiry; expiry defaults to 18 months when blank; value echoed on retailer’s /claim-position Program Capacity card as Total Amount Reserved |
| A-03 | FT Admin | /admin/reservation-requests | Approve one reservation request, reject another with a reason | Approval creates a positive-CU reservation history entry and leaves pending; rejection shows reason; requesting company sees updated capacity |
| A-04 | FT Admin | /admin/reservation-requests | Negative adjustment (capacity release): add a reservation history entry with negative CU | Negative value accepted and saved; Total Amount Reserved decreases; no validation error blocking the minus sign |
| A-05 | FT Admin | /admin/companies | Add a Tier 1 manufacturer: type, 3-letter company code, country; register on programme | Company saved with unique code; Programme column shows registration + role Manufacturer; role derived from registration tables, not activity |
| A-06 | FT Admin | /admin/companies | Add a Tier 4 fibre producer and register it against the programme as producer | Role Fibre Producer for that programme only; Producer sidebar (Production / SDU / EWR) appears only after registration, not from an SDU assignment alone |
| A-07 | FT Admin | /admin/companies | Add a Tier 0 retailer/brand as programme participant | Participant listed under programme; Traceability Workflow menu (Link your POs / Ready to Claim / Verification Records) available at first login |
| A-08 | FT Admin | /admin/companies | Enable optional modules (incl. Insights): toggle on, save, reload | Toggle persists; Insights appears under Program Configuration for that company only; other companies unchanged |
| A-09 | FT Admin | /admin/companies | Create a program owner: flag company, invite owner user, add programme credentials (certificates, documents, claim wording) | Owner user receives invite and lands on /owner; uploads visible on /owner/certificates and /owner/documents and referenced in participant evidence |
| A-10 | FT Admin | /admin/signup-requests | Approve a self-service signup (assign company + role); reject a second | Approved user logs in with correct persona menu; rejected user sees rejection state on /signup/status; no anonymous access |
| A-11 | FT Admin | /admin/facilities, /admin/scanners | Register facility for the Tier 1 company; create scanner and assign to it | Scanner shows facility + owning company; appears in the Tier 1 user’s /scanners list only |
| A-12 | FT Admin | /admin/licensing | Add/edit a facility licence line (cost, period) | Licence cost stored and surfaced on the customer’s facility record / billing view; no NaN or blank currency |
| A-13 | FT Admin | /admin/overrides | Add a rate/quantity override for a programme or company, then raise a nomination | New nomination uses the override values (blend %, rate) rather than defaults |
| A-14 | FT Admin | /admin/claim-verifications | Repair verification-to-claim links: add one verification to a claim, remove one | Claim CU total recalculates; connection status flips Inert ↔ Linked; claim company name appears on the verification |
| A-15 | FT Admin | /admin/settings | Toggle ‘Obfuscate verification IDs’ off then on | Default is ON; when ON, scan/verification IDs and blockchain GUIDs masked everywhere except records linked to a claim |
| O-01 | Program Owner | /owner | Owner KPI strip after login | All metrics in credit units (CU); unlinked demand and over-commitment highlighted red when commitments exceed programme capacity |
| O-02 | Program Owner | /owner/certificates, /owner/documents | Upload certificate with expiry; upload programme document assigned to programme | Items listed with expiry dates; expired items flagged; assigned items appear in participant verification records |
| O-03 | Program Owner | /owner/program-uptake, /owner/program-record | Review uptake by participant and programme record items | Volumes reconcile with admin reservations and participant claims (same CU totals) |
| P-01 | Tier 4 Producer | sidebar (menu gating) | Producer menu only for registered producers: log in as registered producer, then as SDU-assigned-only company | Registered producer sees Production (SDU / EWR / Manual); SDU-only company does NOT see Production or SDU Device Status |
| P-02 | Tier 4 Producer | /sdu | SDU device status and feed: check states (feeding, idle, paused, fault) | Each SDU shows current status, facility, last activity; labels match device state; no unknown/blank status |
| P-03 | Tier 4 Producer | /fibre-creation | Create fibre via SDU: start and end an SDU-fed production run | Production record created with SDU reference, facility, weight, pigment/FTID; volume totals update on producer dashboard |
| P-04 | Tier 4 Producer | /fibre-creation | Create fibre via EWR: record an EWR-based production entry | Record saved with EWR source; appears in production list distinguishable from SDU runs |
| P-05 | Tier 4 Producer | /fibre-creation | Manual production entry (date, facility, weight, programme) | Accepted with weight/date validation; Manual source labelled; admin sees it under /admin/fibre-production |
| P-06 | Tier 4 Producer | /fibre-creation | Production limits: attempt entry exceeding the producer’s programme allocation | Clear blocking error naming the limit; no partial record written |
| M-01 | Tier 1 Manufacturer | /facilities, /facilities/add | Add a new facility with address/country; review licence cost shown | Facility saved; licence cost/fee displayed with currency; facility selectable when requesting a scanner |
| M-02 | Tier 1 Manufacturer | /scanners | Request a scanner for the new facility; admin assigns; reload | Scanner listed against the correct facility; unassigned facilities show an empty state with a request CTA |
| M-03 | Tier 1 Manufacturer | /verifications (Scan History) | Perform/simulate scans on the assigned scanner; open Scan History | Each scan row shows date, facility, scanner, volume; scan/verification ID obfuscated; connection status = Inert with tooltip explaining it is not yet linked |
| M-04 | Tier 1 Manufacturer | /partners | Invite a partner by 3-letter company code (test lower case, e.g. ‘tar’) | Code match case-insensitive; invalid code gives clear ‘company not found’; accepted invite makes partner selectable on nominations |
| M-05 | Tier 1 Manufacturer | /link-to-po | Link scans to a PO / nomination: select shared nomination line, attach scans, propose the claim | Only scans from own (or shared) facilities selectable; linked CU total shown, cannot silently exceed the PO line; proposal moves line to Ready to Claim for the retailer |
| M-06 | Tier 1 Manufacturer | /link-to-po | Cross-company facility guard: link a scan from a facility not belonging to the PO partner | Blocked with explicit message, not a generic 500; legitimately shared scans must succeed |
| M-07 | Tier 1 Manufacturer | / (dashboard) | Manufacturer KPIs after linking | Counts for scans, linked CU, open nominations match the underlying lists; empty states when nothing to action |
| R-01 | Tier 0 Retailer/Brand | /purchase-orders | Create a nomination (PO) manually: multiple lines with HS codes, categories, qty, net weight; assign to Tier 1; share | Blend % pulled from admin/product-category config (not hard-coded); CU per line = qty × net weight × blend, 1 CU = 1 kg; multi-line totals sum; status draft → shared |
| R-02 | Tier 0 Retailer/Brand | /purchase-orders | Import POs from CSV/file; review import summary | Valid rows imported with categories mapped; invalid rows reported per-row with reason; nothing silently dropped |
| R-03 | Tier 0 Retailer/Brand | /claim-position | Program capacity and reservation history | Only Total Amount Reserved as headline; Reservation History (incl. negative releases + expiry dates) on same page; red ‘Over limit’ warning when PO-raised CU exceeds the reservation |
| R-04 | Tier 0 Retailer/Brand | /claim-position | Request more reservation with a CU estimate | Request appears in /admin/reservation-requests; once approved, capacity and over-limit warning update |
| R-05 | Tier 0 Retailer/Brand | Add reservation modal | CU estimator via product lines (qty, weight, blend) | Estimated CU recalculates live and carries into the request; zero/blank inputs do not produce NaN |
| R-06 | Tier 0 Retailer/Brand | /ready-to-claim | Review manufacturer proposals; inspect a line where manufacturer qty differs from PO | Variance vs PO highlighted; lines whose claiming CU exceeds the reservation flagged; ‘deselect to fit’ reduces selection to remaining capacity |
| R-07 | Tier 0 Retailer/Brand | /ready-to-claim | Bulk approval: select multiple lines, approve; repeat with insufficient credits | Success creates claims for every selected line; shortfall shows clear blocking message naming it; no partial/duplicate claims |
| R-08 | Tier 0 Retailer/Brand | Activate/claim modal | Claim the entire remaining volume of a nomination | PO status closes off (fully claimed/closed); obfuscated summary of PO lines + scans shown in modal before confirming |
| R-09 | Tier 0 Retailer/Brand | Partial shipment | Claim part of a nomination line | Remaining CU correct, line stays claimable; status shows partially claimed |
| R-10 | Tier 0 Retailer/Brand | /claims | Verification record content: expand a claim row; use ‘Add certificate’ | Linked evidence, consignment, supply chain map, Program Scope & Methods render; certificate attaches and persists; no dead ‘view more details’ link |
| R-11 | Tier 0 Retailer/Brand | /claims | Add extra verifications from own scans and scans shared with the company | Only permitted verifications listed; claim CU total updates; verification IDs unmask once linked and show the claiming company name |
| R-12 | Tier 0 Retailer/Brand | / (dashboard) | Tier 0 KPIs and at-a-glance widget, with data and with a fresh/empty account | KPI CU totals reconcile with /claim-position and /claims; capacity modal breaks down nominated vs not-yet-nominated CU; empty account shows dashed ‘Create a nomination’ placeholder, not a broken card |
| R-13 | Tier 0 Retailer/Brand | /insights | Insights module (Walmart only in test data): filters Year/Quarter/Month/All, compare toggle, chart CSV export, ‘Export all data’ | Charts redraw per filter; forecast line only with enough points; CSV row counts + totals match on-screen KPIs; module hidden for companies without the flag |
| X-01 | Cross-cutting | cross-page | Verification matches scans: compare one claim’s verification list to Scan History and the manufacturer’s linked scans | Same scan count and identical CU total in all three places; no scan on two claims |
| X-02 | Cross-cutting | all pages | Terminology sweep: walk the whole menu per persona | Consistent wording: Nominations (not Purchase Order), Verification Records (not Claims), Traceability Workflow, Scan History, Scanner Records, Claim Unit (CU) / credit units, ‘Claim’ (never ‘Activate’) |
| X-03 | Cross-cutting | all forms | Error/validation messages: submit each key form empty, zero, over-limit, duplicate | Field-level messages human-readable and specific; no raw database/trigger text, no silent failure, no unhandled console error |
| X-04 | Cross-cutting | open actions | Contextual CTAs for states: partner not connected, items blocked from claiming, no reservation, no scanner | Each state offers the right CTA (Invite partner / go to Ready to Claim / request reservation / request scanner) landing on the correct page |
| X-05 | Cross-cutting | cross-persona | Persona isolation: open another persona’s routes directly (e.g. /admin, /owner, /sdu) | Access denied or redirect; no other company’s data visible in lists, exports or IDs |
| X-06 | Cross-cutting | new account | First-login experience: brand-new company of each persona | Every landing page shows an intentional empty state with a next-step CTA — no unexplained zero-value KPI grid, no legacy screens |
Sign-off areas
FT Admin · Program Owner · Tier 4 Producer · Tier 1 Manufacturer · Tier 0 Retailer · Cross-cutting — each with Tester / Date / Pass-Fail / Notes columns.