# Validation record

September 2026. Verification used a temporary Python 3.12 environment; no model retraining or deployment was performed.

## Completed

- All twelve raw files checked: finite numeric values, no missing cells, unique engine/cycle pairs, contiguous cycles, and matching test-engine/RUL counts.
- Saved HDF5 model loads with `compile=False`; input `(None, 50, 14)`, output `(None, 1)`, 124,275 parameters.
- Explicit training-only scaler reconstruction and full eligible-test inference: RMSE 13.8725686550 and MAE 10.2374445187 cycles on 93 engines. Evidence includes IDs, predictions, software versions and artifact hashes.
- `python -m pytest -q`: **3 passed**. Checks cover FD001 eligibility and ground-truth joins, original one-cycle-ahead labels, and API 400/422/503/success behavior including last-50-row selection. Two dependency deprecation warnings were emitted by the current Starlette test client; tests passed.
- The original repository had no automated test suite; `api/test-api.py` is an HTTP client that requires a running API.
- Python source syntax, JavaScript syntax, static HTML tag/ID structure, English fallback, translation key parity, local assets, links and evidence consistency checked through the included verification scripts.
- Real FastAPI lifespan loaded the saved model. Missing scaler correctly returned 503; supplying a training-only reconstructed scaler in memory produced engine 3 RUL **61.72 cycles**, matching the exported prediction after rounding. No scaler file was saved.
- HTTP check: **22/22 report, asset and document URLs returned 200** under `/Turbofan-RUL-Prediction-LSTM/` on a local static server.
- Actual language-switch code exercised in a Node DOM-contract harness: English → German → English updates all translated text, image alt text, generated-figure paths, title, document language and button state.
- Static report check passed: 30 unique IDs, 165 paired translation keys and 21 distinct local targets. `git diff --check` passed. All four original model/log/plot hashes remained unchanged.
- Both NASA figure crops and generated English/German plots visually inspected as image files. Historical plot and training CSV copied byte-for-byte.

## Browser limitation

The Browser skill was loaded and its documented setup/recovery steps were attempted. Browser discovery returned **no available browser connections**. Consequently, a rendered desktop/mobile browser inspection, interactive keyboard check and full accessibility audit were **not completed**. The DOM-contract test is a programmatic language-switch test, not a browser-rendering test.

The CSS follows the existing Airfoil report: 880px maximum page width, 14px system typography, fluid images, horizontal table/preformatted overflow, visible focus outlines and a narrow-screen media query. HTML uses landmarks, labeled headings, scoped table headers, language attributes, a skip link and native buttons. Those source checks do not establish full WCAG conformance. A final visual/keyboard/mobile check is recommended after Pages activation.

## Re-run

```sh
python -m pytest -q
python scripts/check_report.py
node --check docs/script.js
node --check docs/assets/lang-data.js
node scripts/check_i18n.cjs
python evaluate.py --reconstruct-scaler --output-dir docs/evidence
MPLCONFIGDIR=/tmp/turbofan-mpl python scripts/generate_report_figures.py
git diff --check
```

For package versions and immutable model/data hashes, see `evidence/metrics.json`. Test dependencies (`pytest`, `httpx`) are separate from inference requirements. Default evaluation intentionally fails with an explanatory missing-scaler error; reconstruction must be requested explicitly. Do not run `train.py` merely to verify the report, because training replaces historical outputs.
