digitalmodel-orcawave-orcaflex-workflow
Current-state workflow for navigating and extending digitalmodel OrcaWave/OrcaFlex capabilities across code, tests, issues, queue tooling, and licensed-machine boundaries.
Best use case
digitalmodel-orcawave-orcaflex-workflow is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Current-state workflow for navigating and extending digitalmodel OrcaWave/OrcaFlex capabilities across code, tests, issues, queue tooling, and licensed-machine boundaries.
Teams using digitalmodel-orcawave-orcaflex-workflow should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/digitalmodel-orcawave-orcaflex-workflow/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How digitalmodel-orcawave-orcaflex-workflow Compares
| Feature / Agent | digitalmodel-orcawave-orcaflex-workflow | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Current-state workflow for navigating and extending digitalmodel OrcaWave/OrcaFlex capabilities across code, tests, issues, queue tooling, and licensed-machine boundaries.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# 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
1. `digitalmodel/src/digitalmodel/orcawave/`
- public package API
- RAO processing, wave spectra, hydro coefficients, panel mesh, motion statistics, drift forces, vessel database
2. `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
3. `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
1. `digitalmodel/src/digitalmodel/orcaflex/`
- public package API and reporting layer
- model_builder, mooring_design, riser_config, weather window, postprocessor, VIV screening
2. `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:
1. **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
2. **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:
1. `RAOData` (hydrodynamics/models.py) — simple: frequencies, directions, amplitudes (n_freq, n_dir, 6), phases, vessel_name
2. `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:
```python
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
1. `digitalmodel/README.md` historically referenced `specs/module-registry.yaml`, but that reference is stale unless the file is restored.
2. `digitalmodel/docs/domains/README.md` previously described outdated layout (`src/modules`, `tests/domains`). Use `src/digitalmodel/` and `tests/`.
3. Older roadmap text may describe queue scripts as missing even though they now exist.
4. The large implementation surface in `src/digitalmodel/solvers/orcaflex/` is easy to miss if you only inspect `src/digitalmodel/orcaflex/`.
5. The large implementation surface in `src/digitalmodel/hydrodynamics/diffraction/` is easy to miss if you only inspect `src/digitalmodel/orcawave/`.
6. Always use `uv run` for Python commands.
7. `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.
8. `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.
9. 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.
10. **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.
11. **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:
1. update the operator map if navigation changed
2. update or reconcile the related GitHub issue(s)
3. note whether the change is local-only or requires licensed-machine validation
4. 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:
1. create GitHub issues for traceability if the work is substantial enough to matter later
2. comment on the parent roadmap/tracking issue with the new artifact paths
3. include issue numbers back in the operator map or roadmap note so future readers can follow provenance
4. 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:
1. Can position now — capabilities already backed by real code, tests, docs, or queue tooling
2. Needs evidence — capabilities that exist architecturally but still need real fixtures, end-to-end validation, or benchmark-quality proof
3. 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.Related Skills
OrcaFlex Specialist Skill
```yaml
orcaflex-reporting-fixture-proof-pattern
Build and extend fixture-backed OrcaFlex reporting proof paths in digitalmodel using stable metadata baselines, normalized HTML snapshots, and reusable reporting test helpers.
digitalmodel-worktree-test-execution-with-shared-venv
Run digitalmodel tests from isolated worktrees without uv editable-dependency failures by using the main repo's existing virtualenv and PYTHONPATH.
digitalmodel-orcawave-orcaflex-proof-workflows
Class-level digitalmodel OrcaWave/OrcaFlex readiness, semantic-proof, fixture-proof, and closeout workflows.
digitalmodel-code-explorer
Fast orientation guide for the digitalmodel codebase, with module lookup, source-to-test mapping, and targeted inspection patterns to avoid repeated bulk-reading of digitalmodel/src and tests.
orcawave-orcaflex-readiness-audit
Audit the real readiness of digitalmodel OrcaWave/OrcaFlex spec-driven workflows by reconciling workspace-hub issues, source/tests, semantic-equivalence boundaries, and wiki synthesis gaps.
portable-pattern-verification-workflow
Multi-package implementation with verification strategy for cross-platform configuration hardening
plan-gated-issue-validation-workflow
Systematic validation pattern for plan-approved GitHub issues with pre-existing deliverables
multi-year-tax-filing-verification-workflow
Verify and reconcile complex multi-form tax filings by cross-referencing source documents, identifying data dependencies, and validating line-by-line against authoritative records.
multi-file-tax-reconciliation-workflow
Systematic parallel review and reconciliation of multi-document tax filings with cross-reference validation
metadata-only-wiki-sweep-workflow
Disciplined inventory process for cataloging documents by filename/path without content claims, using parent-centric grouping to prevent stub proliferation
freetaxusa-efiling-workflow
Navigate FreeTaxUSA e-filing process through final steps, handling session timeouts and identifying required manual signature steps