Or, Why Engineers Should Have What Software Developers Already Take for Granted
The Problem With Regulations
Marine engineering runs on regulations. MARPOL Annex I, IV, VI. SOLAS II-1, II-2. IACS Unified Requirements. Class rules. Flag state interpretations. EU MRV. CII ratings. The list is long and the list changes. A ship designed under this year’s regulations may be non-compliant before it leaves the builder’s yard.
Engineers know this. The problem is that compliance is not a moment — it’s a state. It has to be maintained across every drawing revision, every equipment substitution, every retrofitted scrubber, every re-route of a vent line.
And yet, the tools engineers use to manage this are largely the same ones they used twenty years ago: PDFs, spreadsheets, checklists, and a lot of institutional memory held in the heads of senior reviewers.
What Developers Have That Marine Engineers Don’t
Software engineers have linters. Before code is committed, tools like ESLint, Ruff, or Checkstyle scan it against a defined rule set and flag violations. The developer sees the finding immediately, while the context is fresh. They fix it. The code moves forward clean.
┌──────────────────────────────────────┐
│ Developer writes code │
└──────────────────┬───────────────────┘
│
▼
┌──────────────────────────────────────┐
│ Pre-commit hook: linter runs │
└──────────────────┬───────────────────┘
│
▼
┌──────────────────────────────────────┐
│ ✗ Missing type annotation │
│ ✗ Unused import │
│ ✗ Cyclomatic complexity exceeded │
└──────────────────┬───────────────────┘
│
▼
┌──────────────────────────────────────┐
│ Developer fixes, commits, merges │
└──────────────────────────────────────┘
Marine engineers have none of this. Every rule review is a manual review. Every revision check is a checklist someone has to remember to run. Every “does this still comply?” is a question that requires an expert — or at minimum, a long PDF search.
The Idea: A Rule Checker for Marine Engineering
What if we built the engineering equivalent of a linter?
A rule engine — a piece of software that understands marine engineering objects, knows the regulations, and can evaluate a design against them automatically.
┌────────────────────────────────────────────────────────┐ │ │ │ ┌─────────────┐ rules ┌─────────────┐ │ │ │ Design │──────────────────▶│ Rule │ │ │ │ Input │ │ Engine │ │ │ │ (YAML/ │◀──────────────────│ │ │ │ │ P&ID) │ findings └──────┬──────┘ │ │ └─────────────┘ │ │ │ ▼ │ │ ┌─────────────┐ │ │ │ Findings │ │ │ │ Report │ │ │ └─────────────┘ │ │ │ └────────────────────────────────────────────────────────┘
An executable rule set that catches problems before they become plan approval issues.
Edit: An early version of the rule checker is alive at https://hermes.ingeniat.eu showcasing the foundations, input parser and rule checker.
*Disclaimer: Proof of concept, scope of rules is known to be incomplete and may contain errors.
What We’ve Built So Far
The core exists. A working rule engine in Python with:- 15 rules covering MARPOL Annex IV (sewage), MEPC 227(64) effluent standards, retention time, and pump material requirements
- 5 object types: Ship, STP, HoldingTank, Pump, DischargeValve
- AND/OR formula logic — rules like “capacity >= crew_days × crew × waste_per_person” work
- Rule inheritance — define a constraint on “Tank”, it applies to HoldingTank, SludgeTank, FuelTank
- CLI and JSON output —
hermes check design.yaml -f json - Severity filtering —
--severity MAJORto suppress informational findings
$ hermes check design_baltic.yaml
Findings (11 total — 8 critical, 3 major, 0 warning):
[CRITICAL] HoldingTank: Holding tank capacity insufficient.
Required: 2.88 m³, Found: 2.50 m³.
Ref: MARPOL Annex IV Reg. 11
[CRITICAL] STP: STP must be type-approved.
Ref: MARPOL Annex IV Reg. 10
[MAJOR] Pump: Pump material must be corrosion-resistant.
Required: bronze or stainless steel, Found: carbon_steel.
Ref: IACS U-11
The engine is real. The rules are real. The findings are actionable.
The Path Forward
This is a foundation, not a product. The next twelve months could look like this:Phase 1 — Complete the Sewage Domain
Add the remaining Annex IV and MEPC rules. Cover passenger ship variants, Baltic/North Sea special area requirements, and the sewage pump sizing rules. The goal: an engineering team working on a sewage system can runhermes check on their design and get a full compliance report before the first review meeting.
Phase 2 — Design File Interpretation
The current input is YAML — human-writable but not how engineers actually work. They work with P&IDs, equipment line lists, and 3D models.┌──────────────┐
│ P&ID │───┐
│ (.dwg/.dxf) │ │
└──────────────┘ │
┌──────────────┐ │ ┌──────────────┐ ┌──────────────┐
│ Line List │───┼──▶│ Interpreter │──────▶│ Design │
└──────────────┘ │ │ (domain- │ │ Object │
┌──────────────┐ │ │ specific) │ │ Graph │
│ Excel │───┘ └──────────────┘ └──────┬───────┘
└──────────────┘ │
▼
┌──────────────┐
│ Rule │
│ Engine │
└──────────────┘
The interpreter doesn’t need to understand every symbol. It needs to extract equipment, connections, and specifications from domain-specific documents — and that is a solvable problem with targeted parsing and, where necessary, LLM-assisted extraction.
Phase 3 — A Second Vertical Pack
Sewage is the starting point. The second domain should be oily water systems under MARPOL Annex I — bilge pumps, OWS units, 15ppm monitors, sludge tanks. These are heavily regulated, frequently designed, and the rules are well-defined. It also shares conceptual overlap with sewage (pumps, tanks, discharge arrangements) so the ontology can be reused and extended.Phase 4 — The Knowledge Graph
Once you have two domains, the real structure emerges. Equipment in one system connects to equipment in another. A pump in the bilge system might supply both the OWS and the fire main. The rule engine starts to see conflicts across system boundaries.┌──────────────────────────────────────┐ │ Engineering Graph │ │ │ │ ┌──────┐ ┌──────┐ ┌────────┐ │ │ │ Bilge│───▶│ OWS │───▶│ 15ppm │ │ │ │ Tank │ └──┬───┘ └────┬───┘ │ │ └──┬───┘ │ │ │ │ │ │ │ │ │ │ ┌─────┴─────┐ │ │ │ └────▶│ Discharge │◀──────┘ │ │ │ Valve │ │ │ └─────▲─────┘ │ │ │ │ │ ┌───────────┴─────────────┐ │ │ │ │ │ │ ┌──┴───┐ ┌──────┐ ┌────┴───┐ │ │ │Sewage│───▶│ STP │───▶│Holding │ │ │ │ Tank │ └──────┘ │ Tank │ │ │ └──────┘ └────────┘ │ │ │ │ Rules apply to objects AND edges │ │ Cross-system constraints emerge │ └──────────────────────────────────────┘At this point, you’re not just checking a design — you’re validating an engineering model of the ship.
Phase 5 — LLM-Assisted Rule Authoring
Regulatory text is written for humans, not machines. Extracting executable rules from regulation text is skilled work. LLMs can do the first pass — reading a regulation paragraph and suggesting a rule structure — with a domain expert validating the output.┌────────────────────────────────────────────────────────┐
│ Regulatory Text │
│ "Every holding tank shall have sufficient capacity │
│ to retain all sewage from the crew for at least │
│ 3 days..." │
└──────────────────────────┬─────────────────────────────┘
│
▼
┌────────────────────┐
│ LLM Rule Extraction │
└─────────┬──────────┘
│
▼
┌────────────────────────────┐
│ Suggested Rule (YAML) │
│ rule_id: ANNEX-IV-11a │
│ formula: capacity >= 3 * │
│ crew * 0.04 │
└─────────────┬──────────────┘
│
▼
┌────────────────────┐
│ Domain Expert │
│ validates/fixes │
└────────────────────┘
This doesn’t replace the expert, but multiplies them.
A rule-aware design tool:
- Catches violations before the review meeting
- Runs on every revision automatically
- Generates an audit trail of compliance findings
- Reduces expert reviewer hours on checklist items a machine can check
