the organization · Internal Tool · v2.1 · May 2026
Overview
This document contains the user stories and acceptance criteria for the Anomaly Upload Validator. Stories are organized by epic and reflect delivered functionality as of v2.1. Each story follows the format: "As a [persona], I want [capability], so that [outcome]." Acceptance criteria are written as testable, unambiguous conditions.
Story Map
Story Map
| Epic | Name | Stories | Version | Status |
| EP-01 | File Ingestion | 2 stories | v1.0 | ✅ Done |
| EP-02 | Validation | 4 stories | v1.0–v1.2 | ✅ Done |
| EP-03 | Status & Compliance | 3 stories | v1.1–v1.2 | ✅ Done |
| EP-04 | Conversion Engine | 4 stories | v2.0–v2.1 | ✅ Done |
| EP-05 | Manual Review Resolution | 2 stories | v2.0 | ✅ Done |
| EP-06 | Results Dashboard | 2 stories | v1.0–v2.0 | ✅ Done |
| EP-07 | Export | 3 stories | v1.0–v2.0 | ✅ Done |
EP-01 — File Ingestion
Uploading raw source platform exports into the tool.
US-01 — Upload a dataset file
US-01 — Upload a dataset file
| Field | Detail |
| Persona | Data Coordinator |
| Priority | Must Have |
| Status | Done |
| Version | v1.0 |
User Story:
As a Data Coordinator, I want to upload a CSV or XLSX file by dragging it into the tool or browsing for it, so that I can begin validating a dataset without needing any technical setup.
Acceptance Criteria
- AC-01: Tool accepts .csv, .xlsx, and .xls file formats.
- AC-02: User can drag and drop a file onto the designated drop zone.
- AC-03: User can alternatively click the drop zone to open a file browser.
- AC-04: On successful load, the filename and total data row count are displayed.
- AC-05: If the file is empty or cannot be parsed, a clear error message is shown and no validation runs.
- AC-06: No file data is transmitted to any external server at any point.
US-02 — Have column names normalized automatically
US-02 — Have column names normalized automatically
| Field | Detail |
| Persona | Data Coordinator |
| Priority | Must Have |
| Status | Done |
| Version | v1.0 |
User Story:
As a Data Coordinator, I want the tool to automatically handle common column name variations in source platform exports, so that I don't have to manually rename columns before uploading.
Acceptance Criteria
- AC-01: "Date" is treated as "Inspection Date".
- AC-02: "Blade Chamber" is treated as "BladeChamber".
- AC-03: "Chord (%)" is treated as "Chord(%)".
- AC-04: "Turbine Serial Number" is treated as "Serial Number".
- AC-05: "Links" is treated as "Source Images".
- AC-06: Unrecognized column names are passed through unchanged and do not cause errors.
- AC-07: Normalisation is applied silently — no notification shown to the user.
Note: Alias map is defined as a named constant in the tool script. Engineering can extend it without touching validation logic.
EP-02 — Validation
Checking datasets against the the Internal Platform upload specification.
US-03 — See which required columns are missing
US-03 — See which required columns are missing
| Field | Detail |
| Persona | Data Coordinator |
| Priority | Must Have |
| Status | Done |
| Version | v1.0 |
User Story:
As a Data Coordinator, I want the tool to tell me which required columns are missing from my dataset, so that I can fix the file before attempting an upload.
Acceptance Criteria
- AC-01: Tool checks for all 18 required column headers after alias normalisation.
- AC-02: Missing required columns are displayed as individual cards showing field name and description.
- AC-03: Missing conditional columns (Serial Number, BladeChamber, Chord(%), Recommendation) are shown as informational — they do not block the export.
- AC-04: Column name matching is case-sensitive.
- AC-05: Missing column cards appear before the row-level issues table.
US-04 — See which rows have field errors
US-04 — See which rows have field errors
| Field | Detail |
| Persona | Data Coordinator |
| Priority | Must Have |
| Status | Done |
| Version | v1.0 |
User Story:
As a Data Coordinator, I want to see exactly which rows have missing or incorrectly formatted required fields, so that I know what needs to be fixed before the dataset can be uploaded.
Acceptance Criteria
- AC-01: Every data row is validated against all required field rules after normalisation and conversion.
- AC-02: Each issue is shown with: Row number, Anomaly ID, Field name, Status badge, and detail message.
- AC-03: Severity must be an integer between 1 and 5 inclusive.
- AC-04: Critical must be "Yes" or "No" (case-insensitive).
- AC-05: Inspection Date must match YYYY-MM-DD format exactly.
- AC-06: "Damage Location" must be "Internal" or "External" (case-insensitive).
- AC-07: Distance (m), Length (m), Width (m) must be numeric values.
- AC-08: Coordinates must contain at least three [x,y] bracketed pairs.
- AC-09: Empty required fields raise an Error, except for Asset and Coordinates (see US-06).
US-05 — Validate Blade Side using full descriptive names
US-05 — Validate Blade Side using full descriptive names
| Field | Detail |
| Persona | Data Coordinator |
| Priority | Must Have |
| Status | Done |
| Version | v1.2 |
User Story:
As a Data Coordinator, I want the tool to accept both abbreviated codes and full descriptive names for Blade Side values, so that datasets using either naming convention pass validation without manual editing.
Acceptance Criteria
- AC-01: "PS" and "Pressure Side" are both accepted.
- AC-02: "SS" and "Suction Side" are both accepted.
- AC-03: "LE" and "Leading Edge" are both accepted.
- AC-04: "TE" and "Trailing Edge" are both accepted.
- AC-05: Matching is case-insensitive.
- AC-06: Any value not in the above list raises an Error.
Note: Expanded in v1.2. Original v1.0 accepted two-character codes only.
US-06 — See conditional field warnings separately from hard errors
US-06 — See conditional field warnings separately from hard errors
| Field | Detail |
| Persona | Engineering / Data Lead |
| Priority | Must Have |
| Status | Done |
| Version | v1.2 |
User Story:
As a Engineering / Data Lead, I want conditional field format issues to appear as Warnings rather than Errors, so that they don't inflate the error count or block the export.
Acceptance Criteria
- AC-01: Conditional fields are validated for format only when present and populated.
- AC-02: Format violations in conditional fields raise a Warning — not an Error.
- AC-03: Warning rows are included in the issues table but excluded from the Error count.
- AC-04: Serial Number is fully optional — no flag raised whether absent, empty, or populated.
- AC-05: Warnings do not block the Export Converted XLSX button.
Note: Serial Number demoted from Required to Conditional in v1.2.
EP-03 — Status & Compliance
Understanding dataset health at a glance.
US-07 — See an overall compliance score
US-07 — See an overall compliance score
| Field | Detail |
| Persona | Operations Manager |
| Priority | Must Have |
| Status | Done |
| Version | v1.1 |
User Story:
As an Operations Manager, I want to see a single compliance score for the dataset, so that I can quickly understand its overall readiness for upload without reviewing every row.
Acceptance Criteria
- AC-01: Compliance score is displayed as a percentage.
- AC-02: Score = clean rows / (total rows − check-internally rows) × 100.
- AC-03: Check Internally rows are excluded from the denominator.
- AC-04: Score bar is green ≥80%, amber 50–79%, red <50%.
- AC-05: Score updates automatically after each Manual Review resolution.
US-08 — Distinguish between hard errors and check-internally flags
US-08 — Distinguish between hard errors and check-internally flags
| Field | Detail |
| Persona | Data Coordinator |
| Priority | Must Have |
| Status | Done |
| Version | v1.1 |
User Story:
As a Data Coordinator, I want empty Asset and Coordinates fields to be flagged differently from hard errors, so that I'm not penalised for information that may already exist in our internal records.
Acceptance Criteria
- AC-01: When Asset field is empty, the row is flagged as "Check Internally" — not as an Error.
- AC-02: When Coordinates field is empty, the row is flagged as "Check Internally" — not as an Error.
- AC-03: Check Internally rows are counted in a dedicated summary card.
- AC-04: Check Internally rows are excluded from the compliance score denominator.
- AC-05: The issues table includes a "Check Internally" filter tab.
- AC-06: Check Internally rows do not block the Export Converted XLSX button.
US-09 — Filter the issues table by status type
US-09 — Filter the issues table by status type
| Field | Detail |
| Persona | Data Coordinator |
| Priority | Must Have |
| Status | Done |
| Version | v1.0 |
User Story:
As a Data Coordinator, I want to filter the issues table by status type, so that I can focus on one category of issue at a time.
Acceptance Criteria
- AC-01: Issues table includes five filter tabs: All, Errors, Manual Review, Check Internally, Warnings.
- AC-02: "All" tab is selected by default on load.
- AC-03: Selecting a tab hides rows that do not match that status.
- AC-04: "Manual Review" filter shows both unresolved and Resolved rows.
- AC-05: Active tab is visually highlighted.
- AC-06: Filter state does not affect the compliance score or export.
EP-04 — Conversion Engine
Transforming the Source Platform field values across three nomenclature systems.
US-10 — Have Element values derived and converted automatically
US-10 — Have Element values derived and converted automatically
| Field | Detail |
| Persona | Data Coordinator |
| Priority | Must Have |
| Status | Done |
| Version | v2.0 / v2.1 |
User Story:
As a Data Coordinator, I want the tool to automatically build the Input Component value from the raw data columns and look up its the organization and the OEM equivalents, so that I don't have to manually apply conversion formulas.
Acceptance Criteria
- AC-01: If Material column is present and non-empty: Input Component = Component + " - " + Material.
- AC-02: If Material is absent/empty but Element column is present: Input Component = Component + " - " + Element.
- AC-03: If neither suffix column is present/populated: Input Component = Component alone.
- AC-04: Concatenation uses a LEN()=0 guard — not ISBLANK() — to correctly handle empty-string cells.
- AC-05: If found in conversion table, the organization Element and the OEM Element are populated from columns B and C.
- AC-06: If not found, both columns show "MANUAL REVIEW: [original value]" and the row is flagged.
Note: Multi-format support (Material vs Element fallback) and ISBLANK→LEN fix added in v2.1.
US-11 — Have Anomaly Type values derived and converted automatically
US-11 — Have Anomaly Type values derived and converted automatically
| Field | Detail |
| Persona | Data Coordinator |
| Priority | Must Have |
| Status | Done |
| Version | v2.0 / v2.1 |
User Story:
As a Data Coordinator, I want the tool to automatically build the Input Damage Type value and look up its the organization and the OEM equivalents, so that damage type conversion happens without any manual steps.
Acceptance Criteria
- AC-01: If Type column is present, it is used as the base value.
- AC-02: If Type is absent but Anomaly Type column is present, it is used as the base value.
- AC-03: If Subtype is present and non-empty: Input Damage Type = base + " - " + Subtype.
- AC-04: If Subtype is absent or empty: Input Damage Type = base value alone (no trailing " - ").
- AC-05: Concatenation uses a LEN()=0 guard — not ISBLANK().
- AC-06: If found in conversion table, the organization Anomaly Type and the OEM Anomaly Type are populated.
- AC-07: If not found, both columns show "MANUAL REVIEW: [original value]".
Note: Type vs Anomaly Type column fallback added in v2.1. Fixes "Crack - " trailing dash bug.
US-12 — Have Blade Side values translated automatically
US-12 — Have Blade Side values translated automatically
| Field | Detail |
| Persona | Data Coordinator |
| Priority | Must Have |
| Status | Done |
| Version | v2.0 |
User Story:
As a Data Coordinator, I want Blade Side values to be translated to the organization and the OEM equivalents automatically, so that source values are correctly mapped without manual intervention.
Acceptance Criteria
- AC-01: "Suction Side" maps to the organization "Suction Side" and the OEM equivalent.
- AC-02: "Pressure Side" maps to the organization "Pressure Side" and the OEM equivalent.
- AC-03: "Leading Edge" maps to "Leading Edge" for both platforms.
- AC-04: "Trailing Edge" maps to "Trailing Edge" for both platforms.
- AC-05: Values not found in the Blade Side conversion table are flagged as Manual Review.
US-13 — Process datasets from multiple source platform export formats
US-13 — Process datasets from multiple source platform export formats
| Field | Detail |
| Persona | Data Coordinator |
| Priority | Must Have |
| Status | Done |
| Version | v2.1 |
User Story:
As a Data Coordinator, I want the tool to correctly process datasets from different clients even when the column structure varies, so that I don't have to manually reformat files before uploading.
Acceptance Criteria
- AC-01: Dataset A format (Component + Material columns) is processed correctly.
- AC-02: Dataset B format (Component + Element columns) is processed correctly.
- AC-03: Dataset A format (Type + Subtype columns) is processed correctly.
- AC-04: Dataset B format (Anomaly Type + Subtype columns) is processed correctly.
- AC-05: Dataset B full Blade label (e.g. "Blade A") is normalized to just the letter.
- AC-06: Blade letter is extracted from Asset column when Blade column is empty.
- AC-07: Format detection is automatic — no user configuration required.
Note: Added in v2.1 following Dataset B dataset testing.
EP-05 — Manual Review Resolution
Human-in-the-loop handling of unmatched conversion values.
US-14 — Resolve unmatched conversion values inline
US-14 — Resolve unmatched conversion values inline
| Field | Detail |
| Persona | Data Coordinator |
| Priority | Must Have |
| Status | Done |
| Version | v2.0 |
User Story:
As a Data Coordinator, I want to resolve Manual Review flags directly in the tool using a dropdown, so that I can correct unmatched values without leaving the browser or editing the source file.
Acceptance Criteria
- AC-01: Each Manual Review row displays the original unmatched value.
- AC-02: A dropdown presents all valid the organization platform values for the affected field.
- AC-03: On selection, the row status immediately updates to "Resolved" with a green badge.
- AC-04: The resolved value is applied to the converted dataset in memory.
- AC-05: A progress counter shows "X / Y manual reviews resolved".
- AC-06: Resolved rows remain visible under the Manual Review filter tab.
US-15 — Be prevented from exporting until all Manual Reviews are resolved
US-15 — Be prevented from exporting until all Manual Reviews are resolved
| Field | Detail |
| Persona | Data Coordinator |
| Priority | Must Have |
| Status | Done |
| Version | v2.0 |
User Story:
As a Data Coordinator, I want the Export Converted XLSX button to be locked until all Manual Review flags are resolved, so that I can't accidentally export a file with unresolved values.
Acceptance Criteria
- AC-01: Export Converted XLSX button is disabled on initial load.
- AC-02: Button remains disabled while any Manual Review rows are unresolved.
- AC-03: Button enables automatically when all Manual Reviews are resolved.
- AC-04: When all resolved, counter shows "All X resolved — ready to export" in green.
- AC-05: If zero Manual Review rows, button is enabled immediately after validation.
- AC-06: Export Validation Report CSV is always available after validation — not blocked by Manual Reviews.
EP-06 — Results Dashboard
Operational visibility into dataset health and content.
US-16 — See a summary of dataset statistics
US-16 — See a summary of dataset statistics
| Field | Detail |
| Persona | Operations Manager |
| Priority | Must Have |
| Status | Done |
| Version | v1.0 |
User Story:
As an Operations Manager, I want to see a summary of the dataset's content alongside validation results, so that I can confirm the scope of data being processed without opening the source file.
Acceptance Criteria
- AC-01: Total anomaly count (data rows excluding header) is displayed.
- AC-02: Unique turbine count is displayed.
- AC-03: Total site count is displayed.
- AC-04: A per-site breakdown table shows: Site name, Anomaly count, Unique turbine count.
- AC-05: Site breakdown table is sorted by anomaly count descending.
- AC-06: Stats are derived from raw source data before conversion.
US-17 — See conversion statistics alongside validation results
US-17 — See conversion statistics alongside validation results
| Field | Detail |
| Persona | Data Coordinator |
| Priority | Must Have |
| Status | Done |
| Version | v2.0 |
User Story:
As a Data Coordinator, I want to see how many fields were auto-converted and how many need manual review at a glance, so that I know immediately how much work is required before I can export.
Acceptance Criteria
- AC-01: A "Fields Auto-Converted" card shows the total count of fields successfully matched.
- AC-02: A "Rows Need Manual Review" card shows count of rows with at least one unresolved flag.
- AC-03: Both cards are displayed immediately after validation completes.
- AC-04: Auto-conversion count reflects only automatic matches — not dropdown resolutions.
EP-07 — Export
Producing outputs for upload and internal records.
US-18 — Export a validation issues report
US-18 — Export a validation issues report
| Field | Detail |
| Persona | Data Coordinator |
| Priority | Must Have |
| Status | Done |
| Version | v1.0 |
User Story:
As a Data Coordinator, I want to download a CSV report of all validation issues, so that I can share it with the data team or keep it as a record.
Acceptance Criteria
- AC-01: Export Validation Report button is available after validation has run.
- AC-02: Report is a CSV with columns: Row Number, Anomaly ID, Field, Status, Detail.
- AC-03: Status column uses: Error, Manual Review, Check Internally, Warning.
- AC-04: File is named "validation_report_YYYY-MM-DD.csv".
- AC-05: Report includes all issues regardless of current filter tab.
- AC-06: Rows with no issues are not included.
US-19 — Export a converted XLSX working document
US-19 — Export a converted XLSX working document
| Field | Detail |
| Persona | Data Coordinator |
| Priority | Must Have |
| Status | Done |
| Version | v2.0 |
User Story:
As a Data Coordinator, I want to download a formatted XLSX file with all three nomenclature columns populated, so that I have a working document ready for the Internal Platform upload and the Output Platform submission.
Acceptance Criteria
- AC-01: Exported XLSX contains two tabs: "Damages Report" and "Conversions".
- AC-02: "Damages Report" tab matches the column order of the approved reference file exactly.
- AC-03: Derived columns use live VLOOKUP formulas referencing the Conversions tab.
- AC-04: VLOOKUP formulas use LEN()=0 guards to handle empty-string cells correctly.
- AC-05: Resolved Manual Review values are written as static values in the output.
- AC-06: Output filename incorporates source filename and export date.
- AC-07: Exported file header row is frozen at row 1.
US-20 — Have the Conversions tab be editable and extensible
US-20 — Have the Conversions tab be editable and extensible
| Field | Detail |
| Persona | Engineering / Data Lead |
| Priority | Should Have |
| Status | Done |
| Version | v2.0 |
User Story:
As a Engineering / Data Lead, I want the Conversions tab in the exported XLSX to be structured and editable, so that I can add new mapping rows when new damage types or component combinations appear.
Acceptance Criteria
- AC-01: Conversions tab contains three clearly labeled sections: Element / Component, Anomaly Type, Blade Side.
- AC-02: Each section has column headers: the Source Platform, the organization, the OEM.
- AC-03: A note instructs Engineering how to add new rows.
- AC-04: VLOOKUP formulas reference defined row ranges in the Conversions tab.
- AC-05: Adding a row within the existing range causes VLOOKUPs to pick it up automatically.
- AC-06: Known limitation: adding rows beyond the current range requires manual formula range updates.
Anomaly Upload Validator · the organization · Internal Use Only · May 2026 · 20 Stories across 7 Epics