digitalmodel OrcaWave / OrcaFlex Workflow
Use this skill when working on OrcaWave or OrcaFlex in the workspace-hub + digitalmodel ecosystem.
Why this skill exists
The domain is large and split across multiple layers:
- package-level APIs (
src/digitalmodel/orcawave, src/digitalmodel/orcaflex)
- deeper solver implementations (
src/digitalmodel/hydrodynamics/diffraction, src/digitalmodel/solvers/orcaflex)
- queue tooling in workspace-hub (
scripts/solver/)
- issue tracking in workspace-hub GitHub
Older docs often under-describe the true implementation surface. This skill gives the current operating map.
First file to read
Start with:
docs/maps/digitalmodel-orcawave-orcaflex-operator-map.md
That file is the canonical navigation document for code, tests, issue clusters, and machine boundaries.
Canonical code surface
OrcaWave
digitalmodel/src/digitalmodel/orcawave/
- public package API
- RAO processing, wave spectra, hydro coefficients, panel mesh, motion statistics, drift forces, vessel database
digitalmodel/src/digitalmodel/hydrodynamics/diffraction/
- main diffraction implementation
input_schemas.py → DiffractionSpec
orcawave_backend.py → spec to native OrcaWave YAML
reverse_parsers.py → native AQWA/OrcaWave input back to spec
- runners, comparators, benchmark tooling
digitalmodel/src/digitalmodel/hydrodynamics/hull_library/
- hull lookup, mesh generation, RAO database, catalog support
rao_extractor.py — xlsx → RAOData → RAODatabase pipeline (NEW April 2026)
rao_database.py — Parquet-backed RAODatabaseEntry store with query-by-parameter-range
OrcaFlex
digitalmodel/src/digitalmodel/orcaflex/
- public package API and reporting layer
- model_builder, mooring_design, riser_config, weather window, postprocessor, VIV screening
digitalmodel/src/digitalmodel/solvers/orcaflex/
- large solver-side implementation surface
- modular generation, conversion, post-processing, browser, batch/parallel execution, mooring iteration, deeper integration helpers
Licensed-machine fixture inventory (digitalmodel/tests/fixtures/solver/)
test01_unit_box.owr + .xlsx — L00 case 2.1, 50 freqs, 2 headings (pipeline format)
ellipsoid.owr + .xlsx — L00 case 2.8, 1 freq, 18 headings (pipeline format)
L00_test01.owr + .xlsx — same as test01 but native OrcaWave export format
L01_001_ship_raos.owr + .xlsx — ship RAOs, full QTF data (native format)
minimal_test.sim + .dat — minimal OrcaFlex model (vessel + 1 mooring, 10s sim)
mooring_with_raos.sim — OrcaFlex mooring model with RAO vessel (13.8 MB)
L02_OC4_semi_sub.owr + .xlsx — OC4 semi-sub, 32 freqs, 9 headings (pipeline format, 546 KB)
- hemisphere.owr PERMANENTLY BLOCKED — HemisphereAndLid0814.gdf not found on licensed-win-1 (full-disk search confirmed absent; needs original WAMIT validation distribution)
Queue / machine bridge
scripts/solver/process-queue.py
scripts/solver/submit-job.sh
scripts/solver/submit-batch.sh
scripts/solver/watch-results.sh
scripts/solver/post-process-hook.py
Issue clusters to inspect first
Foundation
#1572 capability roadmap
#1628 phase plan
OrcaWave maturity
#1638 reverse parser — CLOSED (implemented)
#1639 package coverage uplift — reporting tests done, diffraction benchmark gap remains
#1636 reporting section tests
#1606 damping sweep tests — CLOSED (stale issue, non-existent classes)
Pipeline / handoff
#1588 parametric spec generator
#1592 OrcaWave to OrcaFlex handoff
#1597 RAO extractor to database
#1605 handoff integration test
OrcaFlex maturity
#1652 real .sim integration test — needs licensed-win-1 fixture first
#1656 package maturity promotion — CLOSED (TESTED verdict, 1158 tests, 98% docstrings)
#1694 fatigue post-processing chain
Engineering expansion
#1264 static frame analysis
#1292 dynamic parachute deployment
#1594 DLC matrix generator
How to work the domain
1. Reconcile docs against source before planning
Do not trust narrow package docs alone. Inspect actual source directories and test directories.
2. Decide package-level vs solver-level change
- If the task is report API or reusable high-level utility → check
src/digitalmodel/orcawave or src/digitalmodel/orcaflex
- If the task is solver conversion, full workflow, queue, or model generation → check
hydrodynamics/diffraction or solvers/orcaflex
3. Use the smallest local test slice first
Examples:
uv run pytest digitalmodel/tests/orcawave/ -q
uv run pytest digitalmodel/tests/hydrodynamics/diffraction/ -q
uv run pytest digitalmodel/tests/orcaflex/ -q
uv run pytest digitalmodel/tests/solvers/orcaflex/ -q
Prefer focused test files before wider suites.
4. Respect the machine split
Can do locally on dev-primary:
- code changes
- schema changes
- generator logic
- mock-driven tests
- queue submission
- doc and issue alignment
Needs licensed validation when API/solver run is real:
- actual OrcaWave
.owr generation
- actual OrcaFlex
.sim generation
- live OrcFxAPI extraction against solver artifacts
5. Use the queue as the bridge
If real solver execution is needed, structure work so local code prepares inputs and post-processing while the licensed machine performs execution.
The xlsx sidecar strategy (critical for dev-primary work)
.owr files are Orcina's proprietary binary format — they can ONLY be opened by OrcFxAPI
(requires commercial license on licensed-win-1). There is NO Python reader for .owr without OrcFxAPI.
The workaround: use .xlsx sidecar files as the license-free data bridge.
process-queue.py on licensed-win-1 exports .xlsx alongside .owr at solve time
- dev-primary reads the .xlsx via
hull_library/rao_extractor.py (openpyxl only)
Two xlsx formats exist — the extractor auto-detects:
Pipeline format (from process-queue.py _export_orcawave_xlsx()):
- Sheets: Summary, RAOs, AddedMass, Damping, Discretization
- RAOs columns:
{DOF}_Mag_H{heading}, {DOF}_Phase_H{heading} — clean flat table
- AddedMass/Damping columns:
{DOFi}_{DOFj} for full 6x6 matrix
Native format (from OrcaWave GUI "Export to Spreadsheet"):
- Sheets: Displacement RAOs, Added mass, Damping, Hydrostatics, Panel geometry, etc.
- Displacement RAOs: heading value in column 0, frequency (rad/s) in column 1,
then 12 data columns (amp, phase for each of 6 DOFs)
- Added mass/Damping: per-frequency blocks with "frequency X.X rad/s" in column 1,
then numbered row header (1-6), then 6x6 values
TRAP: The native format does NOT use "Heading = X deg" text markers — headings are
just numeric values in column 0 that change between blocks (e.g., 0.0 → 27.0).
Two RAO data models (must bridge explicitly)
There are TWO different RAO representations in the codebase:
RAOData (hydrodynamics/models.py) — simple: frequencies, directions, amplitudes (n_freq, n_dir, 6), phases, vessel_name
DiffractionResults (diffraction/output_schemas.py) — complex: per-DOF RAOComponent + AddedMassSet + DampingSet + metadata
The RAO extractor produces RAOData. The OrcaFlexExporter consumes DiffractionResults.
Use rao_data_to_diffraction_results() from diffraction/orcawave_to_orcaflex.py to bridge.
(This was promoted from test code to production in the April 2026 session.)
TRAP: DiffractionResults requires non-None added_mass and damping fields (they're not Optional).
If you only have RAO data, you must zero-fill the matrix sets.
TRAP: DiffractionResults uses source_files (plural, List[str]) not source_file (singular).
RAOSet uses source_file (singular). Don't confuse them.
Canonical handoff pipeline (April 2026)
The single-command automated pipeline:
from digitalmodel.hydrodynamics.diffraction.orcawave_to_orcaflex import (
convert_orcawave_xlsx_to_orcaflex,
)
outputs = convert_orcawave_xlsx_to_orcaflex("input.xlsx", "output/orcaflex")
CLI: uv run python -m digitalmodel.hydrodynamics.diffraction.orcawave_to_orcaflex input.xlsx -o output/
No OrcFxAPI needed. The post-process-hook.py auto-calls this for completed OrcaWave queue jobs.
Pipeline: rao_extractor → rao_data_to_diffraction_results → OrcaFlexExporter
Known traps
digitalmodel/README.md historically referenced specs/module-registry.yaml, but that reference is stale unless the file is restored.
digitalmodel/docs/domains/README.md previously described outdated layout (src/modules, tests/domains). Use src/digitalmodel/ and tests/.
- Older roadmap text may describe queue scripts as missing even though they now exist.
- The large implementation surface in
src/digitalmodel/solvers/orcaflex/ is easy to miss if you only inspect src/digitalmodel/orcaflex/.
- The large implementation surface in
src/digitalmodel/hydrodynamics/diffraction/ is easy to miss if you only inspect src/digitalmodel/orcawave/.
- Always use
uv run for Python commands.
solvers/orcawave/diffraction/scripts/convert_to_orcaflex.py is a COMPLETELY SEPARATE pipeline from diffraction/orcaflex_exporter.py + bemrosetta/converters/to_orcaflex.py. It has its own VesselData model and never touches DiffractionResults. Don't confuse the two.
solver/orcawave_converter.py and solver/orcawave_data_extraction.py do hard import OrcFxAPI at module level — the entire solver/ subpackage fails to import without a license. Use try/except or mock for tests.
- Hydrodynamic added mass/damping matrices are NOT symmetric — surge-pitch and sway-roll coupling terms differ by ~1-3%. Do not assert symmetry in tests.
- Rotational RAO unit mismatch: OrcFxAPI and the pipeline-format xlsx store rotational DOFs (Roll, Pitch, Yaw) in radians/m. The benchmark hydro_data.yml and OrcaWave native xlsx store them in degrees/m. When comparing extracted vs benchmark data, multiply rotational DOFs by
180/π before comparison. Without this, you get ~98% "error" that is purely a unit convention difference, not a data problem. Translational DOFs (Surge, Sway, Heave) are in m/m in both formats.
- OrcaFlex .dat and .sim files are BOTH binary on this version (OrcaFlex 11.6). Neither is text-parseable without OrcFxAPI. Any dev-primary work involving .sim/.dat content must use the xlsx sidecar strategy or a licensed machine.
Key metrics (April 2026 snapshot, updated 2026-04-04)
OrcaFlex public API package:
- TESTED maturity confirmed
- 22/22 modules have tests, 1158 test functions, 98% docstring coverage
OrcaWave + diffraction pipeline:
- ~85% file-level coverage after April 2026 uplift
- 1500+ test functions (incl. 506 new tests from April 3-4 sessions)
- Reporting subsystem fully covered (10 files, 166 tests)
- Report data models + computations covered (138 tests)
- Benchmark subsystem fully covered (11 files, 266 tests — #1784 CLOSED)
- CLI/exporter/batch/geometry now covered (#1785 CLOSED — 84 tests)
- Remaining gap: CLI entry points (cli.py, diffraction_cli.py), orcawave_test_utilities
xlsx-vs-owr validation (licensed-win-1 April 2026):
- Pipeline xlsx sidecar data is BIT-EXACT with OrcFxAPI .owr output
- test01_unit_box: freq diff 4.44e-16 rad/s, amplitude diff 0.0000%
- ellipsoid: all diffs exactly 0.00
- This means dev-primary pipeline work needs NO precision caveats — it matches the licensed solver
RAO extractor pipeline (#1765, #1597):
- IMPLEMENTED:
hull_library/rao_extractor.py — 45 tests
- Reads .xlsx sidecars (no OrcFxAPI needed on dev-primary)
- Auto-detects pipeline vs native OrcaWave xlsx format
- Populates RAODatabase with Parquet persistence
- Bridge:
rao_data_to_diffraction_results() converts RAOData → DiffractionResults
OrcaWave→OrcaFlex handoff validation (#1766, #1605):
- IMPLEMENTED:
test_orcawave_to_orcaflex_integration.py — 33 tests
- Full round-trip: xlsx → RAOData → DiffractionResults → OrcaFlex export
- DOF-level validation: 1% amplitude, 5° phase tolerance
- Cross-format consistency: pipeline vs native xlsx agree
Parametric spec bridge (#1588):
- IMPLEMENTED: parametric_spec_generator.py (~310 lines) + 20 tests
Issue status (April 2026):
- #1656 CLOSED (TESTED maturity)
- #1638 CLOSED (already implemented with 33 round-trip tests)
- #1606 CLOSED (stale — referenced non-existent classes)
- #1597 CLOSED (full RAO extractor pipeline + database + comparison plots)
- #1592 CLOSED (automated handoff pipeline)
- #1605 CLOSED (handoff integration test)
- #1765 CLOSED (RAO extractor)
- #1766 CLOSED (handoff validation suite)
- #1768 CLOSED (automated pipeline + CLI)
- #1784 CLOSED (benchmark tests, 266 tests)
- #1785 CLOSED (CLI/exporter tests, 84 tests)
- #1786 CLOSED (RAO comparison plots)
- #1787 CLOSED (RAODatabase auto-population)
- #1572 CLOSED (domain capability roadmaps)
- #1652 OPEN (blocked on licensed-win-1 for .sim metadata extraction → #1827)
- #1788 OPEN (blocked on licensed-win-1 → #1827)
- #1789 OPEN (hemisphere .gdf blocked/backlog — file not found anywhere)
- #1768 DONE (automated handoff pipeline + CLI + post-process-hook integration, commit 23275916)
- #1786 CLOSED (RAO comparison plots — <0.06% on all significant DOFs, rad→deg fix for rotational)
- #1787 CLOSED (RAODatabase auto-population from queue, query CLI)
- #1597 CLOSED (all deliverables: extractor, plots, auto-population, validation)
- Licensed-machine prompts: docs/plans/licensed-win-1-session-3-prompts.md
- Session 1: licensed-win-1 completed prompts 1-4; hemisphere.owr failed (missing .gdf)
- Session 2: Prompt 2 (xlsx-vs-owr validation) completed — ALL PASS at machine-epsilon.
- Session 3: L02 fixture committed, pipeline validated on OrcaFlex, validation extended to 3 geometries. Hemisphere confirmed permanently blocked.
- #1785 CLOSED (CLI/exporter tests — 84 tests, commit bfaf228b)
- validate_xlsx_against_owr.py committed to scripts/solver/ for future re-runs
Good completion criteria
A good OrcaWave/OrcaFlex task is not complete until you also:
- update the operator map if navigation changed
- update or reconcile the related GitHub issue(s)
- note whether the change is local-only or requires licensed-machine validation
- align stale docs if you discovered drift
Traceability loop for documentation and mapping work
When you create or materially improve a domain map, workflow doc, or reusable skill for this area:
- create GitHub issues for traceability if the work is substantial enough to matter later
- comment on the parent roadmap/tracking issue with the new artifact paths
- include issue numbers back in the operator map or roadmap note so future readers can follow provenance
- commit and push the map/roadmap changes immediately to avoid losing the navigation improvements
This is especially useful when the work is documentation-heavy rather than feature-code-heavy; otherwise the repo gains knowledge but loses auditability.
Recommended output artifacts after significant work
- doc update:
docs/maps/digitalmodel-orcawave-orcaflex-operator-map.md
- detailed reconciliation report when backlog reality is unclear:
docs/reports/digitalmodel-orcawave-orcaflex-issue-reconciliation.md
- issue reconciliation notes inside the operator map
- linked GH issue(s) for traceability
- comments on partially stale issues to re-scope them from greenfield build to validation / hardening when appropriate
- if solver-facing: explicit note on local vs licensed validation status
GTM-oriented framing rule
When the user is building future GTM positioning from this domain, classify findings into three buckets:
- Can position now — capabilities already backed by real code, tests, docs, or queue tooling
- Needs evidence — capabilities that exist architecturally but still need real fixtures, end-to-end validation, or benchmark-quality proof
- Real future gap — capabilities that still require substantive engineering implementation
Do not let GTM planning inherit stale issue language. Reconcile issue text against current repo state first, then produce a sharper narrative around already-built capability vs validation debt vs true future work.
1---2name: digitalmodel-orcawave-orcaflex-workflow3description: Current-state workflow for navigating and extending digitalmodel OrcaWave/OrcaFlex capabilities across code, tests, issues, queue tooling, and licensed-machine boundaries.4license: MIT5---67# digitalmodel OrcaWave / OrcaFlex Workflow89Use this skill when working on OrcaWave or OrcaFlex in the workspace-hub + digitalmodel ecosystem.1011## Why this skill exists1213The domain is large and split across multiple layers:14- package-level APIs (`src/digitalmodel/orcawave`, `src/digitalmodel/orcaflex`)15- deeper solver implementations (`src/digitalmodel/hydrodynamics/diffraction`, `src/digitalmodel/solvers/orcaflex`)16- queue tooling in workspace-hub (`scripts/solver/`)17- issue tracking in workspace-hub GitHub1819Older docs often under-describe the true implementation surface. This skill gives the current operating map.2021## First file to read2223Start with:24- `docs/maps/digitalmodel-orcawave-orcaflex-operator-map.md`2526That file is the canonical navigation document for code, tests, issue clusters, and machine boundaries.2728## Canonical code surface2930### OrcaWave311. `digitalmodel/src/digitalmodel/orcawave/`32 - public package API33 - RAO processing, wave spectra, hydro coefficients, panel mesh, motion statistics, drift forces, vessel database342. `digitalmodel/src/digitalmodel/hydrodynamics/diffraction/`35 - main diffraction implementation36 - `input_schemas.py` → `DiffractionSpec`37 - `orcawave_backend.py` → spec to native OrcaWave YAML38 - `reverse_parsers.py` → native AQWA/OrcaWave input back to spec39 - runners, comparators, benchmark tooling403. `digitalmodel/src/digitalmodel/hydrodynamics/hull_library/`41 - hull lookup, mesh generation, RAO database, catalog support42 - `rao_extractor.py` — xlsx → RAOData → RAODatabase pipeline (NEW April 2026)43 - `rao_database.py` — Parquet-backed RAODatabaseEntry store with query-by-parameter-range4445### OrcaFlex461. `digitalmodel/src/digitalmodel/orcaflex/`47 - public package API and reporting layer48 - model_builder, mooring_design, riser_config, weather window, postprocessor, VIV screening492. `digitalmodel/src/digitalmodel/solvers/orcaflex/`50 - large solver-side implementation surface51 - modular generation, conversion, post-processing, browser, batch/parallel execution, mooring iteration, deeper integration helpers5253### Licensed-machine fixture inventory (digitalmodel/tests/fixtures/solver/)54- `test01_unit_box.owr` + `.xlsx` — L00 case 2.1, 50 freqs, 2 headings (pipeline format)55- `ellipsoid.owr` + `.xlsx` — L00 case 2.8, 1 freq, 18 headings (pipeline format)56- `L00_test01.owr` + `.xlsx` — same as test01 but native OrcaWave export format57- `L01_001_ship_raos.owr` + `.xlsx` — ship RAOs, full QTF data (native format)58- `minimal_test.sim` + `.dat` — minimal OrcaFlex model (vessel + 1 mooring, 10s sim)59- `mooring_with_raos.sim` — OrcaFlex mooring model with RAO vessel (13.8 MB)60- `L02_OC4_semi_sub.owr` + `.xlsx` — OC4 semi-sub, 32 freqs, 9 headings (pipeline format, 546 KB)61- hemisphere.owr PERMANENTLY BLOCKED — HemisphereAndLid0814.gdf not found on licensed-win-1 (full-disk search confirmed absent; needs original WAMIT validation distribution)6263### Queue / machine bridge64- `scripts/solver/process-queue.py`65- `scripts/solver/submit-job.sh`66- `scripts/solver/submit-batch.sh`67- `scripts/solver/watch-results.sh`68- `scripts/solver/post-process-hook.py`6970## Issue clusters to inspect first7172### Foundation73- `#1572` capability roadmap74- `#1628` phase plan7576### OrcaWave maturity77- `#1638` reverse parser — CLOSED (implemented)78- `#1639` package coverage uplift — reporting tests done, diffraction benchmark gap remains79- `#1636` reporting section tests80- `#1606` damping sweep tests — CLOSED (stale issue, non-existent classes)8182### Pipeline / handoff83- `#1588` parametric spec generator84- `#1592` OrcaWave to OrcaFlex handoff85- `#1597` RAO extractor to database86- `#1605` handoff integration test8788### OrcaFlex maturity89- `#1652` real `.sim` integration test — needs licensed-win-1 fixture first90- `#1656` package maturity promotion — CLOSED (TESTED verdict, 1158 tests, 98% docstrings)91- `#1694` fatigue post-processing chain9293### Engineering expansion94- `#1264` static frame analysis95- `#1292` dynamic parachute deployment96- `#1594` DLC matrix generator9798## How to work the domain99100### 1. Reconcile docs against source before planning101Do not trust narrow package docs alone. Inspect actual source directories and test directories.102103### 2. Decide package-level vs solver-level change104- If the task is report API or reusable high-level utility → check `src/digitalmodel/orcawave` or `src/digitalmodel/orcaflex`105- If the task is solver conversion, full workflow, queue, or model generation → check `hydrodynamics/diffraction` or `solvers/orcaflex`106107### 3. Use the smallest local test slice first108Examples:109- `uv run pytest digitalmodel/tests/orcawave/ -q`110- `uv run pytest digitalmodel/tests/hydrodynamics/diffraction/ -q`111- `uv run pytest digitalmodel/tests/orcaflex/ -q`112- `uv run pytest digitalmodel/tests/solvers/orcaflex/ -q`113114Prefer focused test files before wider suites.115116### 4. Respect the machine split117118Can do locally on dev-primary:119- code changes120- schema changes121- generator logic122- mock-driven tests123- queue submission124- doc and issue alignment125126Needs licensed validation when API/solver run is real:127- actual OrcaWave `.owr` generation128- actual OrcaFlex `.sim` generation129- live OrcFxAPI extraction against solver artifacts130131### 5. Use the queue as the bridge132If real solver execution is needed, structure work so local code prepares inputs and post-processing while the licensed machine performs execution.133134## The xlsx sidecar strategy (critical for dev-primary work)135136.owr files are Orcina's proprietary binary format — they can ONLY be opened by OrcFxAPI137(requires commercial license on licensed-win-1). There is NO Python reader for .owr without OrcFxAPI.138139The workaround: use .xlsx sidecar files as the license-free data bridge.140- `process-queue.py` on licensed-win-1 exports .xlsx alongside .owr at solve time141- dev-primary reads the .xlsx via `hull_library/rao_extractor.py` (openpyxl only)142143Two xlsx formats exist — the extractor auto-detects:1441. **Pipeline format** (from process-queue.py `_export_orcawave_xlsx()`):145 - Sheets: Summary, RAOs, AddedMass, Damping, Discretization146 - RAOs columns: `{DOF}_Mag_H{heading}`, `{DOF}_Phase_H{heading}` — clean flat table147 - AddedMass/Damping columns: `{DOFi}_{DOFj}` for full 6x6 matrix1481492. **Native format** (from OrcaWave GUI "Export to Spreadsheet"):150 - Sheets: Displacement RAOs, Added mass, Damping, Hydrostatics, Panel geometry, etc.151 - Displacement RAOs: heading value in **column 0**, frequency (rad/s) in **column 1**,152 then 12 data columns (amp, phase for each of 6 DOFs)153 - Added mass/Damping: per-frequency blocks with "frequency X.X rad/s" in column 1,154 then numbered row header (1-6), then 6x6 values155156TRAP: The native format does NOT use "Heading = X deg" text markers — headings are157just numeric values in column 0 that change between blocks (e.g., 0.0 → 27.0).158159## Two RAO data models (must bridge explicitly)160161There are TWO different RAO representations in the codebase:1621. `RAOData` (hydrodynamics/models.py) — simple: frequencies, directions, amplitudes (n_freq, n_dir, 6), phases, vessel_name1632. `DiffractionResults` (diffraction/output_schemas.py) — complex: per-DOF RAOComponent + AddedMassSet + DampingSet + metadata164165The RAO extractor produces RAOData. The OrcaFlexExporter consumes DiffractionResults.166Use `rao_data_to_diffraction_results()` from `diffraction/orcawave_to_orcaflex.py` to bridge.167(This was promoted from test code to production in the April 2026 session.)168169TRAP: `DiffractionResults` requires non-None `added_mass` and `damping` fields (they're not Optional).170If you only have RAO data, you must zero-fill the matrix sets.171172TRAP: `DiffractionResults` uses `source_files` (plural, List[str]) not `source_file` (singular).173`RAOSet` uses `source_file` (singular). Don't confuse them.174175## Canonical handoff pipeline (April 2026)176177The single-command automated pipeline:178```python179from digitalmodel.hydrodynamics.diffraction.orcawave_to_orcaflex import (180 convert_orcawave_xlsx_to_orcaflex,181)182outputs = convert_orcawave_xlsx_to_orcaflex("input.xlsx", "output/orcaflex")183```184185CLI: `uv run python -m digitalmodel.hydrodynamics.diffraction.orcawave_to_orcaflex input.xlsx -o output/`186187No OrcFxAPI needed. The post-process-hook.py auto-calls this for completed OrcaWave queue jobs.188189Pipeline: rao_extractor → rao_data_to_diffraction_results → OrcaFlexExporter190191## Known traps1921931. `digitalmodel/README.md` historically referenced `specs/module-registry.yaml`, but that reference is stale unless the file is restored.1942. `digitalmodel/docs/domains/README.md` previously described outdated layout (`src/modules`, `tests/domains`). Use `src/digitalmodel/` and `tests/`.1953. Older roadmap text may describe queue scripts as missing even though they now exist.1964. The large implementation surface in `src/digitalmodel/solvers/orcaflex/` is easy to miss if you only inspect `src/digitalmodel/orcaflex/`.1975. The large implementation surface in `src/digitalmodel/hydrodynamics/diffraction/` is easy to miss if you only inspect `src/digitalmodel/orcawave/`.1986. Always use `uv run` for Python commands.1997. `solvers/orcawave/diffraction/scripts/convert_to_orcaflex.py` is a COMPLETELY SEPARATE pipeline from `diffraction/orcaflex_exporter.py` + `bemrosetta/converters/to_orcaflex.py`. It has its own VesselData model and never touches DiffractionResults. Don't confuse the two.2008. `solver/orcawave_converter.py` and `solver/orcawave_data_extraction.py` do hard `import OrcFxAPI` at module level — the entire solver/ subpackage fails to import without a license. Use try/except or mock for tests.2019. Hydrodynamic added mass/damping matrices are NOT symmetric — surge-pitch and sway-roll coupling terms differ by ~1-3%. Do not assert symmetry in tests.20210. **Rotational RAO unit mismatch**: OrcFxAPI and the pipeline-format xlsx store rotational DOFs (Roll, Pitch, Yaw) in **radians/m**. The benchmark hydro_data.yml and OrcaWave native xlsx store them in **degrees/m**. When comparing extracted vs benchmark data, multiply rotational DOFs by `180/π` before comparison. Without this, you get ~98% "error" that is purely a unit convention difference, not a data problem. Translational DOFs (Surge, Sway, Heave) are in m/m in both formats.20311. **OrcaFlex .dat and .sim files are BOTH binary** on this version (OrcaFlex 11.6). Neither is text-parseable without OrcFxAPI. Any dev-primary work involving .sim/.dat content must use the xlsx sidecar strategy or a licensed machine.204205## Key metrics (April 2026 snapshot, updated 2026-04-04)206207OrcaFlex public API package:208- TESTED maturity confirmed209- 22/22 modules have tests, 1158 test functions, 98% docstring coverage210211OrcaWave + diffraction pipeline:212- ~85% file-level coverage after April 2026 uplift213- 1500+ test functions (incl. 506 new tests from April 3-4 sessions)214- Reporting subsystem fully covered (10 files, 166 tests)215- Report data models + computations covered (138 tests)216- Benchmark subsystem fully covered (11 files, 266 tests — #1784 CLOSED)217- CLI/exporter/batch/geometry now covered (#1785 CLOSED — 84 tests)218- Remaining gap: CLI entry points (cli.py, diffraction_cli.py), orcawave_test_utilities219220xlsx-vs-owr validation (licensed-win-1 April 2026):221- Pipeline xlsx sidecar data is BIT-EXACT with OrcFxAPI .owr output222- test01_unit_box: freq diff 4.44e-16 rad/s, amplitude diff 0.0000%223- ellipsoid: all diffs exactly 0.00224- This means dev-primary pipeline work needs NO precision caveats — it matches the licensed solver225226RAO extractor pipeline (#1765, #1597):227- IMPLEMENTED: `hull_library/rao_extractor.py` — 45 tests228- Reads .xlsx sidecars (no OrcFxAPI needed on dev-primary)229- Auto-detects pipeline vs native OrcaWave xlsx format230- Populates RAODatabase with Parquet persistence231- Bridge: `rao_data_to_diffraction_results()` converts RAOData → DiffractionResults232233OrcaWave→OrcaFlex handoff validation (#1766, #1605):234- IMPLEMENTED: `test_orcawave_to_orcaflex_integration.py` — 33 tests235- Full round-trip: xlsx → RAOData → DiffractionResults → OrcaFlex export236- DOF-level validation: 1% amplitude, 5° phase tolerance237- Cross-format consistency: pipeline vs native xlsx agree238239Parametric spec bridge (#1588):240- IMPLEMENTED: parametric_spec_generator.py (~310 lines) + 20 tests241242Issue status (April 2026):243- #1656 CLOSED (TESTED maturity)244- #1638 CLOSED (already implemented with 33 round-trip tests)245- #1606 CLOSED (stale — referenced non-existent classes)246- #1597 CLOSED (full RAO extractor pipeline + database + comparison plots)247- #1592 CLOSED (automated handoff pipeline)248- #1605 CLOSED (handoff integration test)249- #1765 CLOSED (RAO extractor)250- #1766 CLOSED (handoff validation suite)251- #1768 CLOSED (automated pipeline + CLI)252- #1784 CLOSED (benchmark tests, 266 tests)253- #1785 CLOSED (CLI/exporter tests, 84 tests)254- #1786 CLOSED (RAO comparison plots)255- #1787 CLOSED (RAODatabase auto-population)256- #1572 CLOSED (domain capability roadmaps)257- #1652 OPEN (blocked on licensed-win-1 for .sim metadata extraction → #1827)258- #1788 OPEN (blocked on licensed-win-1 → #1827)259- #1789 OPEN (hemisphere .gdf blocked/backlog — file not found anywhere)260- #1768 DONE (automated handoff pipeline + CLI + post-process-hook integration, commit 23275916)261- #1786 CLOSED (RAO comparison plots — <0.06% on all significant DOFs, rad→deg fix for rotational)262- #1787 CLOSED (RAODatabase auto-population from queue, query CLI)263- #1597 CLOSED (all deliverables: extractor, plots, auto-population, validation)264- Licensed-machine prompts: docs/plans/licensed-win-1-session-3-prompts.md265- Session 1: licensed-win-1 completed prompts 1-4; hemisphere.owr failed (missing .gdf)266- Session 2: Prompt 2 (xlsx-vs-owr validation) completed — ALL PASS at machine-epsilon.267- Session 3: L02 fixture committed, pipeline validated on OrcaFlex, validation extended to 3 geometries. Hemisphere confirmed permanently blocked.268- #1785 CLOSED (CLI/exporter tests — 84 tests, commit bfaf228b)269- validate_xlsx_against_owr.py committed to scripts/solver/ for future re-runs270271## Good completion criteria272273A good OrcaWave/OrcaFlex task is not complete until you also:2741. update the operator map if navigation changed2752. update or reconcile the related GitHub issue(s)2763. note whether the change is local-only or requires licensed-machine validation2774. align stale docs if you discovered drift278279## Traceability loop for documentation and mapping work280281When you create or materially improve a domain map, workflow doc, or reusable skill for this area:2821. create GitHub issues for traceability if the work is substantial enough to matter later2832. comment on the parent roadmap/tracking issue with the new artifact paths2843. include issue numbers back in the operator map or roadmap note so future readers can follow provenance2854. commit and push the map/roadmap changes immediately to avoid losing the navigation improvements286287This is especially useful when the work is documentation-heavy rather than feature-code-heavy; otherwise the repo gains knowledge but loses auditability.288289## Recommended output artifacts after significant work290291- doc update: `docs/maps/digitalmodel-orcawave-orcaflex-operator-map.md`292- detailed reconciliation report when backlog reality is unclear: `docs/reports/digitalmodel-orcawave-orcaflex-issue-reconciliation.md`293- issue reconciliation notes inside the operator map294- linked GH issue(s) for traceability295- comments on partially stale issues to re-scope them from greenfield build to validation / hardening when appropriate296- if solver-facing: explicit note on local vs licensed validation status297298## GTM-oriented framing rule299300When the user is building future GTM positioning from this domain, classify findings into three buckets:3011. Can position now — capabilities already backed by real code, tests, docs, or queue tooling3022. Needs evidence — capabilities that exist architecturally but still need real fixtures, end-to-end validation, or benchmark-quality proof3033. Real future gap — capabilities that still require substantive engineering implementation304305Do not let GTM planning inherit stale issue language. Reconcile issue text against current repo state first, then produce a sharper narrative around already-built capability vs validation debt vs true future work.