Anomaly Upload Validator · Specification artifact
Product Requirements Document
What the tool had to do and the constraints it worked inside.
the organization · Internal Tool · v2.1 · May 2026
Document Information
Document Information
| Property | Detail |
| Product Name | Anomaly Upload Validator |
| Version | v2.1 (current) |
| Document Status | Final — reflects delivered functionality |
| Author | Engineering |
| Last Updated | May 2026 |
| Distribution | data coordinators and engineering staff |
Executive Summary
The Anomaly Upload Validator is a browser-based internal tool that automates the pre-upload preparation of inspection datasets for the the Internal Platform. It accepts raw the source inspection platform exports in CSV or XLSX format, validates them against the platform upload specification, converts field values across three nomenclature systems (the source inspection platform → the Internal Platform → the Output Platform), enables human-in-the-loop resolution of unmatched values, and produces a formatted multi-tab XLSX working document ready for upload.
The tool is distributed as a single self-contained HTML file requiring no installation, no server, and no authentication. All data processing runs client-side — no inspection data is transmitted externally.
Problem Statement
Background
the OEM wind farm asset owners engage both the organization and third-party inspector the Source Platform for blade inspections. When third-party-sourced data needs to be ingested into the Internal Platform and submitted to the Output Platform, it must pass through two conversion layers and conform to the the Internal Platform upload specification.
Problems Identified
- Manual pre-upload checking was performed in spreadsheets with no standardized process, leading to inconsistent results and occasional failed uploads.
- Field value conversion across three nomenclature systems was performed manually using a reference spreadsheet, requiring significant coordinator time per dataset.
- Unrecognized field values had no structured resolution workflow — they were either missed or required escalation to Engineering via email.
- Multiple the source inspection platform export formats exist across different client datasets, causing conversion failures when the wrong template was applied.
Impact: Each failed upload or conversion error requires manual rework estimated at 30–90 minutes per dataset.
Goals & Success Metrics
Goals & Success Metrics
| Goal | Success Metric | Priority |
| Eliminate manual pre-upload field checking | 100% of required fields validated automatically | Must Have |
| Automate field value conversion | Zero manual conversion steps for known field values | Must Have |
| Structured resolution for unknown values | All unmatched values surfaced with dropdown resolution | Must Have |
| Support multiple source dataset formats | Handles all known the source inspection platform export structures | Must Have |
| Zero installation / zero IT dependency | Runs in any modern browser from a shared Drive link | Must Have |
| Keep data internal | No inspection data transmitted outside local machine | Must Have |
| Engineering can extend conversion mappings | New rows in Conversions tab update formulas automatically | Should Have |
| Operational visibility | Compliance score, anomaly count, turbine count, site breakdown per run | Should Have |
Users & Personas
Data Coordinator (Primary User)
Receives raw the source inspection platform exports from clients and prepares them for upload to the Internal Platform. Non-technical. Needs clear pass/fail feedback without reading code or formulas.
Engineering / Data Lead (Secondary User)
Owns the conversion mapping tables and is responsible for extending them when new damage types or component combinations appear. Comfortable with spreadsheets. Needs to update the Conversions tab without breaking the output.
Operations Manager (Stakeholder)
Needs confidence that data being uploaded to the Internal Platform and onward to the Output Platform is accurate and complete. Reviews compliance scores and flags for escalation.
Scope
In Scope — v2.1
- File ingestion: CSV and XLSX from the source inspection platform
- Column-level validation: presence and naming of all required and conditional fields
- Row-level validation: field format rules (date, severity, Yes/No, blade side, numerics, coordinate pairs)
- Four-tier status system: Error, Manual Review, Check Internally, Warning
- Conversion engine: the source inspection platform → the Internal Platform → the Output Platform
- Three converted field groups: Element/Component, Anomaly Type, Blade Side
- Human-in-the-loop Manual Review resolution with dropdown selectors
- Dataset summary: anomaly count, unique turbines, site breakdown
- Export: Validation Report CSV + Converted XLSX (Damages Report + Conversions tabs)
- Multi-format support: Dataset A (Component + Material) and Dataset B (Component + Element) structures
Out of Scope — v2.1
- Cross-field conditional validation (e.g. BladeChamber required when Damage Location = Internal)
- Duplicate anomaly ID detection
- Direct upload to either platform from the tool
- User authentication or access control
- Audit logging of validation runs (deferred — requires Apps Script or API access)
- Persistent storage of resolved manual review mappings across sessions
- Automated extension of VLOOKUP ranges when Engineering adds rows to Conversions tab
Functional Requirements
FR-01 File Ingestion
FR-01 File Ingestion
| # | Requirement | Priority |
| FR-01.1 | Accept CSV (UTF-8) and XLSX / XLS file formats | Must Have |
| FR-01.2 | Files may be submitted via drag-and-drop or file browser dialog | Must Have |
| FR-01.3 | First sheet of any XLSX file shall be used as the data source | Must Have |
| FR-01.4 | Filename and row count shall be displayed on successful load | Must Have |
| FR-01.5 | Error message shall be displayed if file is empty or unparseable | Must Have |
| FR-01.6 | No file data shall be transmitted to any external server | Must Have |
FR-02 Column Normalisation
FR-02 Column Normalisation
| # | Requirement | Priority |
| FR-02.1 | Apply a column alias map to normalize variant column names before validation | Must Have |
| FR-02.2 | Aliases shall include: Date→Inspection Date, Blade Chamber→BladeChamber, Chord (%)→Chord(%), Turbine Serial Number→Serial Number, Links→Source Images | Must Have |
| FR-02.3 | Unrecognized column names shall be passed through unchanged | Must Have |
FR-03 Column-Level Validation
FR-03 Column-Level Validation
| # | Requirement | Priority |
| FR-03.1 | Verify all 18 required field column headers are present (case-sensitive) | Must Have |
| FR-03.2 | Missing required columns shall be flagged with field name and description | Must Have |
| FR-03.3 | Missing conditional columns shall be reported as informational (non-blocking) | Must Have |
FR-04 Row-Level Validation
FR-04 Row-Level Validation
| # | Requirement | Priority |
| FR-04.1 | Every data row shall be validated against all required field rules | Must Have |
| FR-04.2 | Severity: integer value 1–5 only | Must Have |
| FR-04.3 | Critical: 'Yes' or 'No' (case-insensitive) | Must Have |
| FR-04.4 | Inspection Date: YYYY-MM-DD format strictly enforced | Must Have |
| FR-04.5 | Damage Location: 'Internal' or 'External' (case-insensitive) | Must Have |
| FR-04.6 | Blade Side: LE / Leading Edge / TE / Trailing Edge / PS / Pressure Side / SS / Suction Side | Must Have |
| FR-04.7 | Distance (m), Length (m), Width (m): numeric values | Must Have |
| FR-04.8 | Coordinates: must contain at least three [x,y] bracketed pairs | Must Have |
| FR-04.9 | Asset and Coordinates: when empty, flag as Check Internally rather than Error | Must Have |
| FR-04.10 | Serial Number: when empty or absent, raise no flag of any kind | Must Have |
FR-05 Conversion Engine
FR-05 Conversion Engine
| # | Requirement | Priority |
| FR-05.1 | Detect Component+Material vs Component+Element column structure and apply appropriate concatenation | Must Have |
| FR-05.2 | Detect Type+Subtype vs AnomalyType+Subtype column structure and apply appropriate concatenation | Must Have |
| FR-05.3 | Concatenation shall use LEN()=0 guard (not ISBLANK) to handle empty string cells correctly | Must Have |
| FR-05.4 | Element conversion: Input Component → the organization Element + the OEM Element via lookup | Must Have |
| FR-05.5 | Anomaly Type conversion: Input Damage Type → the organization Anomaly Type + the OEM Anomaly Type via lookup | Must Have |
| FR-05.6 | Blade Side conversion: Blade Side → the organization Blade Side + the OEM Blade Side via lookup | Must Have |
| FR-05.7 | Floating-point noise in numeric fields shall be cleaned to 4 decimal places on import | Should Have |
| FR-05.8 | Blade letter shall be extracted from Asset field when Blade column is empty or contains full label | Should Have |
FR-06 Status System
FR-06 Status System
| # | Requirement | Priority |
| FR-06.1 | Each row issue shall be assigned one of four statuses: Error, Manual Review, Check Internally, Warning | Must Have |
| FR-06.2 | Error: required field absent or format invalid | Must Have |
| FR-06.3 | Manual Review: concatenated value not found in conversion lookup table | Must Have |
| FR-06.4 | Check Internally: Asset or Coordinates empty — value may exist in internal records | Must Have |
| FR-06.5 | Warning: conditional field populated but format invalid | Must Have |
| FR-06.6 | Check Internally rows shall be excluded from compliance score denominator | Must Have |
FR-07 Manual Review Resolution
FR-07 Manual Review Resolution
| # | Requirement | Priority |
| FR-07.1 | Each Manual Review row shall display the original unmatched value | Must Have |
| FR-07.2 | A dropdown shall present all valid target-platform values for the affected field | Must Have |
| FR-07.3 | On selection, row status updates to Resolved and correct value written to converted dataset | Must Have |
| FR-07.4 | A progress counter shall show resolved / total Manual Review count | Must Have |
| FR-07.5 | Export Converted XLSX shall remain disabled until all Manual Reviews are resolved | Must Have |
FR-08 Results Dashboard
FR-08 Results Dashboard
| # | Requirement | Priority |
| FR-08.1 | Summary cards: Total Rows, Clean, Errors, Manual Review, Check Internally, Warnings | Must Have |
| FR-08.2 | Compliance score as percentage with green/amber/red threshold coloring | Must Have |
| FR-08.3 | Auto-conversion count and Manual Review count as secondary cards | Must Have |
| FR-08.4 | Dataset summary: total anomalies, unique turbine count, site count, per-site breakdown | Must Have |
| FR-08.5 | Issues table filter tabs: All / Errors / Manual Review / Check Internally / Warnings | Must Have |
FR-09 Exports
FR-09 Exports
| # | Requirement | Priority |
| FR-09.1 | Validation Report: dated CSV with columns Row, Anomaly ID, Field, Status, Detail | Must Have |
| FR-09.2 | Converted XLSX: two-tab workbook — Damages Report + Conversions | Must Have |
| FR-09.3 | Damages Report tab shall match column order of the amended Dataset A file exactly | Must Have |
| FR-09.4 | Derived columns shall use live VLOOKUP formulas referencing the Conversions tab | Must Have |
| FR-09.5 | Conversions tab structured in three editable sections: Element/Component, Anomaly Type, Blade Side | Must Have |
| FR-09.6 | Exported XLSX filename shall incorporate source filename and export date | Should Have |
Non-Functional Requirements
Non-Functional Requirements
| ID | Category | Requirement |
| NFR-01 | Deployment | Single self-contained HTML file. No server, no installation, no authentication. |
| NFR-02 | Compatibility | Chrome, Edge, Firefox, Safari — any version released in the last 3 years. |
| NFR-03 | Data Privacy | All processing client-side. No data transmitted to any external endpoint. |
| NFR-04 | Performance | Must handle up to 10,000 rows without browser freezing. |
| NFR-05 | Dependencies | SheetJS is the only runtime dependency. Loaded from CDN; cacheable for offline use. |
| NFR-06 | Portability | Distributable via shared Drive folder with no configuration required by recipients. |
| NFR-07 | Maintainability | Conversion tables, field definitions, and aliases defined as named constants at top of script. |
| NFR-08 | Output fidelity | Exported XLSX formulas must use LEN()=0 guards rather than ISBLANK() for empty-string cells. |
Conversion Mapping Summary
Element / Component
Source: Component + Material column (falls back to Component + Element if Material absent)
Derivation: IF(LEN(Material)>0, Component & " - " & Material, IF(LEN(Element)>0, Component & " - " & Element, Component))
Output: Input Component → the organization Element → the OEM Element
Element / Component
| Input Component | the organization Element | the OEM Element |
| Blade - Laminate | Laminate | Laminate |
| Blade - Structure | Core Material | Laminate |
| Blade - Surface | Coating | Coating |
| Blade - Through | Core Material | Laminate |
| Blade - Top Coat | Coating | Coating |
| Drainage System - Auxiliary Component | Accessory - Drain Hole | Drain Hole |
| Rain Collar - Auxiliary Component | Accessory - Rain/Blade Collar | Add-on - Rain/Blade Collar |
| Serrations - Auxiliary Component | Add-on - TE Serrations | Add-on - TE Serrations |
| (full table in Conversions tab) | | |
Anomaly Type
Source: Type + Subtype column (falls back to Anomaly Type + Subtype if Type absent)
Derivation: IF(LEN(Subtype)>0, Type & " - " & Subtype, Type)
Output: Input Damage Type → the organization Anomaly Type → the OEM Anomaly Type
Anomaly Type
| Input Damage Type | the organization Anomaly Type | the OEM Anomaly Type |
| Bondline | Disbond | Crack - Split |
| Crack | Crack - TLC | Crack - Longitudinal |
| Crack - Transverse | Crack - Transverse | Crack - Transverse |
| Delamination | Delamination | Damaged Laminate - Delamination |
| Erosion | Erosion | Erosion |
| (full table in Conversions tab) | | |
Blade Side
Source: Blade Side column (direct lookup — no concatenation)
Output: Blade Side → the organization Blade Side → the OEM Blade Side
Blade Side
| the Source Platform Blade Side | the organization Blade Side | the OEM Blade Side |
| Suction Side | Suction Side | Leeward |
| Pressure Side | Pressure Side | Windward |
| Leading Edge | Leading Edge | Leading Edge |
| Trailing Edge | Trailing Edge | Trailing Edge |
Supported Dataset Formats
Supported Dataset Formats
| Format | Known Source | Element Columns | Anomaly Type Columns | Blade Column |
| Format A | Dataset A (the Source Platform) | Component + Material | Type + Subtype | Empty — extracted from Asset |
| Format B | Dataset B (the Source Platform) | Component + Element | Anomaly Type + Subtype | "Blade A" — letter extracted |
Assumptions & Constraints
Assumptions
- All source files are the source inspection platform exports. Tool is not designed for other inspection platform formats.
- The first sheet of any XLSX file contains the inspection data.
- Column names are consistent within a given client's export format.
- Engineering is responsible for maintaining and extending the Conversions tab.
- the Internal Platform upload specification does not change between tool versions without a corresponding tool update.
Constraints
- No server infrastructure available — tool must run entirely client-side.
- Google Apps Script deployment is restricted by company IT policy for user-facing web apps. Distribution via shared Google Drive is the approved method.
- SheetJS is the only permitted third-party dependency.
- VLOOKUP row ranges in exported XLSX are calculated at export time. Engineering adding rows beyond the current range requires manual formula updates.
Future Considerations
Future Considerations
| Feature | Description | Priority |
| Persistent manual review mappings | Save resolved mappings to localStorage for reuse on future runs | High |
| Cross-field conditional validation | BladeChamber required when Damage Location = Internal | High |
| Duplicate anomaly ID detection | Flag rows where ID appears more than once | Medium |
| Dynamic VLOOKUP range expansion | Auto-extend formula ranges when Engineering adds rows | Medium |
| Audit logging | Write run summary to a shared Sheet — pending IT approval for API access | Medium |
| Direct platform upload | Submit directly to the Internal Platform upload endpoint | Low |
| Additional source platform support | Extend alias map and format detection beyond the source inspection platform | Low |
Sign-off
Sign-off
| Role | Name | Date | Status |
| Product Owner | | May 2026 | Pending |
| Engineering Lead | | May 2026 | Pending |
| Data Operations | | May 2026 | Pending |
Anomaly Upload Validator · the organization · Internal Use Only · May 2026