Anomaly Upload Validator · Specification artifact
Test Cases & QA Checklist
What had to pass before release.
This page is rendered from that DOCX. Same document, same words.
Anomaly Upload Validator — Test Cases & QA Checklist
Platform A · Internal Tool · v3.1.4 · September 2026
Overview
This document contains 98 test cases covering all functional areas of the Anomaly Upload Validator as of v3.1.4. Test cases are derived from user story acceptance criteria, known bugs fixed during development, and regression tests. All cases are manually executable in any modern browser.
Priority Legend
| Priority | Definition |
|---|---|
| P1 - Critical | Core functional requirement. Failure blocks upload workflow or produces incorrect output data. |
| P2 - High | Important feature. Failure degrades user experience significantly or causes data quality issues. |
| P3 - Medium | Quality of life feature. Failure is noticeable but does not block core workflow. |
| P4 - Low | Minor enhancement. Failure is cosmetic or very low impact. |
Section 1 — File Ingestion (TC-01 to TC-11)
| TC ID | Description | Preconditions | Test Steps | Expected Result | Result | Priority | Story Ref |
|---|---|---|---|---|---|---|---|
| TC-01 | Upload valid CSV | Tool open in browser | Drag valid UTF-8 CSV onto drop zone | Filename + row count shown. Run Validation enables. | ✅ Pass | P1 - Critical | US-01 |
| TC-02 | Upload valid XLSX | Tool open in browser | Click drop zone, browse to XLSX, select it | Filename + row count shown. Run Validation enables. | ✅ Pass | P1 - Critical | US-01 |
| TC-03 | Upload empty file | Tool open in browser | Upload XLSX with header row but no data | Error: 'File appears empty.' No validation runs. | ✅ Pass | P2 - High | US-01 |
| TC-04 | Upload unsupported type | Tool open in browser | Drag .pdf or .txt file onto drop zone | File rejected. Error shown. No state change. | ✅ Pass | P2 - High | US-01 |
| TC-05 | Alias: Date → Inspection Date | CSV with 'Date' column (no 'Inspection Date') | Upload file, run validation | 'Date' treated as 'Inspection Date'. No missing column error. | ✅ Pass | P1 - Critical | US-02 |
| TC-06 | Alias: Turbine Serial Number → Serial Number | CSV with 'Turbine Serial Number' column | Upload file, run validation | Treated as 'Serial Number'. No missing column warning. | ✅ Pass | P2 - High | US-02 |
| TC-07 | Alias: Links → Source Images | CSV with 'Links' column | Upload file, run validation | 'Links' treated as 'Source Images'. No required field error. | ✅ Pass | P1 - Critical | US-02 |
| TC-08 | Missing required column: ID | Dataset with ID column removed | Upload file, run validation | Missing column card shown for ID. All rows show Error. | ✅ Pass | P1 - Critical | US-03 |
| TC-09 | Missing required column: Coordinates | Dataset with Coordinates column removed | Upload file, run validation | Missing column card shown. All rows get Check Internally flag. | ✅ Pass | P1 - Critical | US-03 |
| TC-10 | Missing conditional column: BladeChamber | Dataset without BladeChamber | Upload file, run validation | Shown as informational only. No rows flagged. | ✅ Pass | P3 - Medium | US-03 |
| TC-11 | Column name case-sensitive | Dataset with 'blade side' (lowercase) | Upload file, run validation | 'Blade Side' shown as missing required. Lowercase not accepted. | ✅ Pass | P2 - High | US-03 |
Section 2 — Row-Level Validation (TC-12 to TC-26)
| TC ID | Description | Preconditions | Test Steps | Expected Result | Result | Priority | Story Ref |
|---|---|---|---|---|---|---|---|
| TC-12 | Severity: valid 1–5 | Dataset with Severity 1,2,3,4,5 | Upload file, run validation | All rows pass. No Severity errors. | ✅ Pass | P1 - Critical | US-04 |
| TC-13 | Severity: invalid (0, 6, text) | Dataset with Severity 0, 6, 'High' | Upload file, run validation | Each invalid value raises Error: 'Must be 1–5'. | ✅ Pass | P1 - Critical | US-04 |
| TC-14 | Critical: valid (Yes/yes/YES/No) | Dataset with all case variants | Upload file, run validation | All case variants accepted. No errors. | ✅ Pass | P1 - Critical | US-04 |
| TC-15 | Critical: invalid (True, Y, 1) | Dataset with invalid Critical values | Upload file, run validation | Each raises Error: 'Must be Yes or No'. | ✅ Pass | P1 - Critical | US-04 |
| TC-16 | Inspection Date: valid YYYY-MM-DD | Dataset with correctly formatted dates | Upload file, run validation | All dates pass. No date errors. | ✅ Pass | P1 - Critical | US-04 |
| TC-17 | Inspection Date: invalid DD/MM/YYYY | Dataset with dates as '06/09/2024' | Upload file, run validation | Error: 'Must be YYYY-MM-DD format' for each. | ✅ Pass | P1 - Critical | US-04 |
| TC-18 | Blade Side: abbreviated codes Code 1/Code 2/Code 3/Code 4 | Dataset with 2-char codes | Upload file, run validation | All four codes accepted as valid. | ✅ Pass | P1 - Critical | US-05 |
| TC-19 | Blade Side: full descriptive names | Dataset with 'Value 1', 'Value 2' etc. | Upload file, run validation | All full names accepted as valid. | ✅ Pass | P1 - Critical | US-05 |
| TC-20 | Blade Side: invalid value ('[withheld]') | Dataset with an unrecognized pre-conversion value in Blade Side | Upload file, run validation | Error raised: 'Must be a valid Blade Side value'. | ✅ Pass | P2 - High | US-05 |
| TC-21 | Coordinates: valid ≥3 pairs | Coordinates = '[123,456], [234,567], [345,678]' | Upload file, run validation | Row passes Coordinates check. | ✅ Pass | P1 - Critical | US-04 |
| TC-22 | Coordinates: only 2 pairs | Coordinates = '[123,456], [234,567]' | Upload file, run validation | Error: 'Requires ≥3 [x,y] coordinate pairs'. | ✅ Pass | P1 - Critical | US-04 |
| TC-23 | Coordinates: empty | Dataset with empty Coordinates field | Upload file, run validation | Flagged as Check Internally. NOT flagged as Error. | ✅ Pass | P1 - Critical | US-08 |
| TC-24 | Asset: empty | Dataset with some empty Asset rows | Upload file, run validation | Check Internally flag raised. Not Error. Compliance score unaffected. | ✅ Pass | P1 - Critical | US-08 |
| TC-25 | Serial Number: empty or absent | Dataset with Serial Number missing entirely | Upload file, run validation | No flag raised. Not shown as missing column. | ✅ Pass | P1 - Critical | US-06 |
| TC-26 | Numeric fields: floating point noise | Distance (m) = '7.0000000000000007E-2' | Upload file, run validation + export XLSX | Value cleaned to 0.07 in output. No validation error. | ✅ Pass | P2 - High | US-04 |
Section 3 — Status System & Compliance Score (TC-27 to TC-32)
| TC ID | Description | Preconditions | Test Steps | Expected Result | Result | Priority | Story Ref |
|---|---|---|---|---|---|---|---|
| TC-27 | Compliance: all clean | All required fields valid | Upload file, run validation | Score = 100%. Bar is green. | ✅ Pass | P1 - Critical | US-07 |
| TC-28 | Compliance: check-internally excluded from denominator | 10 rows: 8 clean, 2 empty Coordinates | Upload file, run validation | Score = 100% (8/8). Check Internally rows excluded. | ✅ Pass | P1 - Critical | US-07 |
| TC-29 | Compliance: errors present | 10 rows: 5 clean, 5 with Severity errors | Upload file, run validation | Score = 50%. Bar is amber. | ✅ Pass | P1 - Critical | US-07 |
| TC-30 | Filter: Errors only | Dataset with mixed status types | Run validation → click Errors tab | Only Error rows visible. Others hidden. | ✅ Pass | P2 - High | US-09 |
| TC-31 | Filter: Manual Review shows Resolved | Dataset with resolved Manual Reviews | Click Manual Review filter tab | Both unresolved and Resolved rows visible. | ✅ Pass | P2 - High | US-09 |
| TC-32 | Summary cards: correct counts | Known distribution of status types | Upload file, run validation | All five cards show correct counts. | ✅ Pass | P1 - Critical | US-07 |
Section 4 — Conversion Engine (TC-33 to TC-44)
| TC ID | Description | Preconditions | Test Steps | Expected Result | Result | Priority | Story Ref |
|---|---|---|---|---|---|---|---|
| TC-33 | Format A: Element derivation (Format A) | Format A dataset with Component + Material | Upload file, run validation | '<Component>'+'<Material>' → '<Component> - <Material>'. Correct output. | ✅ Pass | P1 - Critical | US-10 |
| TC-34 | Format B: Element derivation (Format B) | Format B dataset with Component + Element (no Material) | Upload file, run validation | '<Component>'+'<Element>' (from Element col) → '<Component> - <Element>'. | ✅ Pass | P1 - Critical | US-10,US-13 |
| TC-35 | Element: empty Material and Element suffix | Component populated, Material = empty | Upload file, run validation | Input Source Component = '<Component>'. No trailing ' - '. | ✅ Pass | P1 - Critical | US-10 |
| TC-36 | Anomaly Type: Subtype present | Type and Subtype both populated | Upload file, run validation | Input Source Damage Type='<Type> - <Subtype>'. Platform A='[withheld]'. Platform B='[withheld]'. | ✅ Pass | P1 - Critical | US-11 |
| TC-37 | REGRESSION: Trailing dash (Subtype empty) | Type populated, Subtype='' (empty string) | Upload file, run validation + export XLSX | Input Source Damage Type='<Type>' (no trailing ' - '). Platform A='[withheld]'. Platform B='[withheld]'. v2.1 fix. | ✅ Pass | P1 - Critical | US-11 |
| TC-38 | Format B: Anomaly Type column (Format B) | Format B dataset with 'Anomaly Type' column (no 'Type') | Upload file, run validation | '<Anomaly Type>'+'<Subtype>' → '<Anomaly Type> - <Subtype>'. Correctly resolved. | ✅ Pass | P1 - Critical | US-11,US-13 |
| TC-39 | Blade Side: Value 3 | Blade Side = 'Value 3' | Upload file, run validation | Platform A = '[withheld]'. Platform B = '[withheld]'. | ✅ Pass | P1 - Critical | US-12 |
| TC-40 | Blade Side: Value 4 | Blade Side = 'Value 4' | Upload file, run validation | Platform A = '[withheld]'. Platform B = '[withheld]'. | ✅ Pass | P1 - Critical | US-12 |
| TC-41 | Blade Side: unrecognized value | Blade Side = 'Rotor Side' | Upload file, run validation | Manual Review raised. Shows 'MANUAL REVIEW: Rotor Side'. | ✅ Pass | P2 - High | US-12 |
| TC-42 | Blade extraction from Asset (Format A) | Format A: Blade empty, Asset='Blade A: (No Serial Number)' | Upload file, run validation | Blade field populated as 'A'. No missing field error. | ✅ Pass | P2 - High | US-13 |
| TC-43 | Blade extraction from Blade col (Format B) | Format B: Blade column = 'Blade A' | Upload file, run validation | Blade normalized to 'A'. No missing field error. | ✅ Pass | P2 - High | US-13 |
| TC-44 | Unknown Input Source Component | Component and Material pair not in the conversion table | Upload file, run validation | Manual Review raised. Platform A Element = 'MANUAL REVIEW: <derived value>'. | ✅ Pass | P1 - Critical | US-10 |
Section 5 — Manual Review Resolution (TC-45 to TC-50)
| TC ID | Description | Preconditions | Test Steps | Expected Result | Result | Priority | Story Ref |
|---|---|---|---|---|---|---|---|
| TC-45 | Resolve via dropdown | Dataset with unmatched Input Source Component | Run validation → Manual Review tab → select dropdown value | Row updates to Resolved (green). Counter increments. | ✅ Pass | P1 - Critical | US-14 |
| TC-46 | Resolved value in output | Manual Review resolved with a valid Input Source Component value | Resolve row → export XLSX → check column in output | XLSX shows the resolved value. Platform A/Platform B columns show correct values. | ✅ Pass | P1 - Critical | US-14 |
| TC-47 | Export blocked by unresolved reviews | 3 Manual Reviews, 2 resolved | Resolve 2 of 3 → check export button | Button disabled. Counter shows '2 / 3 resolved'. | ✅ Pass | P1 - Critical | US-15 |
| TC-48 | Export unlocks when all resolved | 3 Manual Reviews, all resolved | Resolve all 3 → check export button | Button enables. Counter shows 'All 3 resolved — ready to export'. | ✅ Pass | P1 - Critical | US-15 |
| TC-49 | Validation Report always available | Unresolved Manual Reviews present | Run validation → click Export Validation Report | CSV downloads. Not blocked by Manual Reviews. | ✅ Pass | P1 - Critical | US-15 |
| TC-50 | Zero Manual Reviews: export immediate | All values in conversion tables | Upload file, run validation | Export Converted XLSX enabled immediately. No progress counter. | ✅ Pass | P1 - Critical | US-15 |
Section 6 — Export (TC-51 to TC-59)
| TC ID | Description | Preconditions | Test Steps | Expected Result | Result | Priority | Story Ref |
|---|---|---|---|---|---|---|---|
| TC-51 | Validation Report: correct columns | Any dataset with issues | Run validation → Export Validation Report | CSV has columns: Row Number, Anomaly ID, Field, Status, Detail. | ✅ Pass | P1 - Critical | US-18 |
| TC-52 | Validation Report: status labels | Dataset with all four status types | Export report → open CSV | Status column has exactly: Error, Manual Review, Check Internally, Warning. | ✅ Pass | P2 - High | US-18 |
| TC-53 | Converted XLSX: two tabs | Valid dataset, all reviews resolved | Export Converted XLSX → open file | File has exactly two sheets: 'Damages Report' and 'Conversions'. | ✅ Pass | P1 - Critical | US-19 |
| TC-54 | Converted XLSX: header frozen | Exported XLSX | Open XLSX → scroll down past row 1 | Header row remains visible (frozen). | ✅ Pass | P3 - Medium | US-19 |
| TC-55 | Converted XLSX: VLOOKUP formulas present | Exported XLSX | Click Platform A Element column for any data row | Formula bar shows IFERROR(VLOOKUP(...)) — not a static value. | ✅ Pass | P1 - Critical | US-19 |
| TC-56 | REGRESSION: LEN not ISBLANK in formula | Exported XLSX | Click Input Source Component for row with empty Material | Formula shows IF(LEN(...)>0,...) — not IF(ISBLANK(...),...). v2.1 fix. | ✅ Pass | P1 - Critical | US-19 |
| TC-57 | Conversions tab editable | Exported XLSX | Open Conversions tab → add a new mapping row | New row visible and editable. VLOOKUP picks it up if within range. | ✅ Pass | P2 - High | US-20 |
| TC-58 | Exported filename format | Source file: 'source_dataset.xlsx'. Date: 2026-05-01 | Export Converted XLSX | Filename: 'source_dataset_converted_2026-05-01.xlsx'. | ✅ Pass | P3 - Medium | US-19 |
| TC-59 | MANUAL REVIEW fallback string | Unresolved row (if present in report) | Check Platform A Element for unresolved row | Shows 'MANUAL REVIEW: [original value]'. | ✅ Pass | P2 - High | US-14 |
Section 7 — Dataset Statistics & Edge Cases (TC-60 to TC-67)
| TC ID | Description | Preconditions | Test Steps | Expected Result | Result | Priority | Story Ref |
|---|---|---|---|---|---|---|---|
| TC-60 | Anomaly count | Dataset with 115 data rows | Upload file, run validation | Total Anomalies card shows 115. | ✅ Pass | P2 - High | US-16 |
| TC-61 | Unique turbine count | Dataset with 40 unique turbine IDs | Upload file, run validation | Unique Turbines card shows 40. | ✅ Pass | P2 - High | US-16 |
| TC-62 | Site breakdown table | Dataset with two distinct sites | Upload file, run validation | Both sites shown. Counts correct. Sorted by anomaly count desc. | ✅ Pass | P2 - High | US-16 |
| TC-63 | Auto-conversion count | 100 fields successfully auto-converted | Upload file, run validation | Fields Auto-Converted card shows 100. | ✅ Pass | P3 - Medium | US-17 |
| TC-64 | Reset clears all state | Dataset loaded and validated | Click Reset button | All cleared. Drop zone ready. Resolved values discarded. | ✅ Pass | P2 - High | US-01 |
| TC-65 | No data transmitted externally | Any dataset. Network monitor open | Upload, validate, export. Monitor all network requests. | No outbound requests except CDN load for SheetJS. | ✅ Pass | P1 - Critical | US-01 |
| TC-66 | Large dataset performance | Dataset with 500+ rows | Upload file, run validation | Completes within 5 seconds. No browser freeze. | ✅ Pass | P2 - High | N/A |
| TC-67 | Multi-site dataset | Dataset with rows from two sites | Upload file, run validation | All rows processed correctly. Both sites in breakdown table. | ✅ Pass | P2 - High | US-16 |
Section 8 — Regression Tests (TC-68 to TC-72)
⚠ These tests must be executed on every new version release. Regression failures indicate a previously fixed bug has been reintroduced.
| TC ID | Description | Preconditions | Test Steps | Expected Result | Result | Priority | Story Ref |
|---|---|---|---|---|---|---|---|
| TC-68 | REGRESSION: Trailing dash bug | Any dataset where Subtype is empty for some rows | Upload file, run validation. Check Input Source Damage Type for empty-Subtype rows | Input Source Damage Type = '<Type>' not '<Type> - '. Correct conversion output. (Bug fixed v2.1) | ✅ Pass | P1 - Critical | US-11 |
| TC-69 | REGRESSION: Format B Component+Element | Format B format dataset (no Material column) | Upload Format B file, run validation. Check Input Source Component. | Correct derivation using Element col as suffix. No false Manual Reviews. (Bug fixed v2.1) | ✅ Pass | P1 - Critical | US-10,US-13 |
| TC-70 | REGRESSION: Format B Anomaly Type col | Format B dataset with 'Anomaly Type' column (no 'Type') | Upload Format B file. Check Input Source Damage Type derivation. | Anomaly Type column used correctly as base. (Bug fixed v2.1) | ✅ Pass | P1 - Critical | US-11,US-13 |
| TC-71 | REGRESSION: ISBLANK vs LEN in XLSX | Exported XLSX from any dataset | Inspect Input Source Component formula for empty-Material row | Formula shows IF(LEN(...)>0,...) not IF(ISBLANK(...),...). (Bug fixed v2.1) | ✅ Pass | P1 - Critical | US-10,US-11 |
| TC-72 | REGRESSION: Blade Side codes accepted | Dataset with Code 1, Code 2, Code 3, Code 4 values | Upload file, run validation | Codes accepted as valid. No Blade Side errors. (Fix from v1.2) | ✅ Pass | P2 - High | US-05 |
Section 9 — Output Fidelity (TC-73 to TC-82)
Covers the four defects fixed between v2.7.1 and v3.1.4, where the tool produced output that looked correct and was not.
| TC ID | Description | Preconditions | Test Steps | Expected Result | Result | Priority | Story Ref |
|---|---|---|---|---|---|---|---|
| TC-73 | Derived output headers spell both company names correctly | Any valid dataset | Export converted XLSX. Read the header row from the raw file, not from a preview or summary | Columns P, Q, U, Y each render their company name as that company writes it. Columns R, V, W, Z unchanged. (Fix from v2.7.1) | ✅ Pass | P1 - Critical | US-21 |
| TC-74 | Header correction did not break the export formulas | Any valid dataset | Export converted XLSX. Inspect the lookup formulas in Q, R, V, W, Y, Z | Each formula references the correct column letter. No formula references an empty or malformed cell address. (Fix from v2.7.1) | ✅ Pass | P1 - Critical | US-21 |
| TC-75 | A file exported before v2.7.1 still ingests | An export produced at v2.7 or earlier | Upload that file, run validation | Ingests exactly as before. Column matching is unaffected by the header spelling. (Fix from v2.7.1) | ✅ Pass | P2 - High | US-21 |
| TC-76 | CSV date is not shifted by machine timezone | CSV dataset with a known inspection date | Set the machine timezone west of UTC. Upload, run validation, export | The exported date is the date in the file, not the day before. (Fix from v3.0) | ✅ Pass | P1 - Critical | US-22 |
| TC-77 | XLSX date cell is not shifted by machine timezone | XLSX dataset with genuine date cells | Repeat TC-76 with the XLSX input | The exported date matches the source cell in every timezone tested. (Fix from v3.0) | ✅ Pass | P1 - Critical | US-22 |
| TC-78 | Dated rows raise no spurious date-format error | Any dataset with a populated date column | Upload, run validation. Count date-related errors | Zero date-format errors. Before v3.0 every dated row raised one, in every timezone. (Fix from v3.0) | ✅ Pass | P1 - Critical | US-22 |
| TC-79 | A date carrying a time of day retains it | Dataset with a date cell holding a real time, e.g. 14:30 | Upload, run validation, export | The time is preserved rather than truncated to a bare date. (Fix from v3.0) | ✅ Pass | P2 - High | US-22 |
| TC-80 | Blade Chamber reaches the export | Dataset supplying a populated Blade Chamber column | Upload, run validation, export. Inspect column AA | Every row carries its Blade Chamber value. Column is not blank. (Fix from v3.1) | ✅ Pass | P1 - Critical | US-23 |
| TC-81 | Chord (%) reaches the export, as a number | Dataset supplying a populated Chord (%) column | Upload, run validation, export. Inspect column AE and its cell type | Every row carries its value, written as a number rather than text, consistent with Distance / Length / Width. (Fix from v3.1) | ✅ Pass | P1 - Critical | US-23 |
| TC-82 | Column widths match the columns they were written for | Any valid dataset | Export converted XLSX. Compare the width declarations against the header row | One width entry per output column, 39 of each. No column wears its neighbour's width. (Fix from v3.1.1) | ✅ Pass | P2 - High | US-24 |
Section 10 — Regression: Output Fidelity (TC-83 to TC-87)
⚠ These tests must be executed on every new version release, alongside Section 8. Each guards a defect that produced plausible-looking output and raised no error of its own.
| TC ID | Description | Preconditions | Test Steps | Expected Result | Result | Priority | Story Ref |
|---|---|---|---|---|---|---|---|
| TC-83 | REGRESSION: no misrendered company name anywhere in the tool | Tool source file | Search the tool for the misrendered spellings of both company names | No occurrence, in output headers, row keys, dropdown keys, field descriptions or comments. (Bug fixed v2.7.1) | ✅ Pass | P1 - Critical | US-21 |
| TC-84 | REGRESSION: timezone matrix for dates | CSV and XLSX datasets with known dates | Run both inputs at several timezones spanning UTC-10 to UTC+14, including one with a historical sub-minute offset | Identical calendar date in every combination. Zero date errors. (Bug fixed v3.0) | ✅ Pass | P1 - Critical | US-22 |
| TC-85 | REGRESSION: no output column silently empty | Dataset supplying every optional column | Export, then compare each output column against the input that feeds it | No column is blank where the input supplied a value. Blank means absent, not lost. (Bug fixed v3.1) | ✅ Pass | P1 - Critical | US-23 |
| TC-86 | REGRESSION: width list length matches column count | Tool source file | Count the entries in the column-width list and the entries in the output column list | The two counts are equal. A mismatch means widths have shifted onto the wrong columns. (Bug fixed v3.1.1) | ✅ Pass | P2 - High | US-24 |
| TC-87 | REGRESSION: conversion-driven columns do not clip | Tool source file and conversion tables | For each conversion-driven column, compare its width against the longest value in its conversion table | Every such column seats its widest possible value. (Bug fixed v3.1.4) | ✅ Pass | P3 - Medium | US-24 |
Section 11 — Regression: v2.3 to v2.7 Defects (TC-88 to TC-98)
⚠ Run with Sections 8 and 10 on every release. These guard bugs 1 to 8, which had no regression case until this section was added. Each surfaced through contact with a real delivered file rather than through review.
| TC ID | Description | Preconditions | Test Steps | Expected Result | Result | Priority | Story Ref |
|---|---|---|---|---|---|---|---|
| TC-88 | REGRESSION: bare-letter blade extracted | Dataset where the blade is a bare letter (A / B / C) rather than a full label | Upload, run validation. Inspect output column D | Blade letter resolved. No empty Asset, no Check Internally flag for it. (Bug 1, fixed v2.3) | ✅ Pass | P1 - Critical | US-27 |
| TC-89 | REGRESSION: duplicate Component columns disambiguated | Dataset carrying two columns both named "Component" — one constant at inspection level, one the anomaly component | Upload, run validation. Open the detected-columns panel | The anomaly-level column is bound, not the constant one. The panel names which column was chosen. (Bug 2, fixed v2.3) | ✅ Pass | P1 - Critical | US-02 |
| TC-90 | REGRESSION: duplicate Type columns disambiguated | Dataset carrying two columns both named "Type" — a task type and the damage type | Upload, run validation. Check the derived damage type | The damage-type column is bound. Derivation is correct and raises no false Manual Review. (Bug 3, fixed v2.3) | ✅ Pass | P1 - Critical | US-02 |
| TC-91 | REGRESSION: Format B does not emit bare row numbers | Format B dataset (Element column, no Material column) | Export converted XLSX. Inspect Input Source Component for several rows | Values read "Component - Element". No bare row number, no cascade of MANUAL REVIEW. (Bug 4, fixed v2.4) | ✅ Pass | P1 - Critical | US-10 |
| TC-92 | REGRESSION: derived component not doubled | Any dataset that exercises the component derivation | Export. Inspect Input Source Component | Value reads "<Component> - <Material>", not "<Component> - <Component> - <Material>". Raw input values are read from the untouched input row. (Bug 5, fixed v2.4) | ✅ Pass | P1 - Critical | US-10 |
| TC-93 | REGRESSION: Element lookup free of Blade Side rows | Exported XLSX, Conversions tab | Inspect the Element / Component section of the Conversions tab | Section contains element mappings only. No Blade Side rows are present in it. (Bug 6, fixed v2.4) | ✅ Pass | P2 - High | US-20 |
| TC-94 | REGRESSION: URL entity round-trip | Input file whose image URL contains one or more ampersands | Export. Compare the output hyperlink target against the input URL, character by character | Byte-for-byte identical. No &amp; in the output. Link resolves rather than returning not-found. (Bug 7, fixed v2.7) | ✅ Pass | P1 - Critical | US-26 |
| TC-95 | REGRESSION: literal "None" not carried through | Dataset where an optional column holds the literal string "None" | Upload, run validation, export | The cell is empty in the output. The word "None" does not appear as a value. (Bug 8, fixed v2.6) | ✅ Pass | P2 - High | US-02 |
| TC-96 | Header row detected beneath a metadata preamble | Dataset with several rows of metadata above the real header row | Upload the file | Header located automatically, preamble rows excluded from the data, detected row number reported on the confirmation line. (Feature, v2.3) | ✅ Pass | P1 - Critical | US-25 |
| TC-97 | <Type> - <Subtype> converts correctly | Dataset containing a <Type> anomaly with <Subtype> as its subtype | Upload, run validation, export. Inspect the derived anomaly type columns | Resolves through the conversion table to its Platform A and Platform B equivalents. No Manual Review flag. (Table entry added v2.4) | ✅ Pass | P2 - High | US-11 |
| TC-98 | D/E/F columns populated per the v2.5 schema | Dataset supplying a blade identifier, a turbine identifier and a blade serial number | Export. Inspect columns D, E and F | D holds the blade letter only; E holds the turbine identifier; F holds the blade serial. No column carries another's value. (Schema change, v2.5) | ✅ Pass | P1 - Critical | US-27 |
QA Sign-off
| Role | Name | Date | Sign-off |
|---|---|---|---|
| QA / Tester | May 2026 | ⬜ Pending | |
| Data Operations Lead | May 2026 | ⬜ Pending | |
| Engineering Lead | May 2026 | ⬜ Pending |
Sign-off above covers TC-01 to TC-72 at the v2.1 scope. TC-73 to TC-98 have not been through a separate sign-off.
Anomaly Upload Validator · Platform A · Internal Use Only · v3.1.4 · September 2026 · 98 Test Cases