Expand description
EU-methodology compliance calculators for Odal Node.
Pure, stateless calculation of regulatory metrics from typed inputs. No I/O, no infrastructure — every function is deterministic and side-effect free.
Placement: these compute EU methodology (cradle-to-gate CO₂e, battery
CFB stub) plus a non-regulatory repairability heuristic, so they change when a
regulation changes and therefore live in dpp-core under Apache-2.0 — not in
the platform.
The licensing split: the methodology is open; licensed LCI datasets are
never bundled here and are injected at runtime via factor::FactorProvider.
§Architecture
┌──────────────────────────────────────────────────────────────────────┐
│ dpp-calc (Apache-2.0, open) │
│ │
│ co2e::calculate() — cradle-to-gate, operator-supplied EFs │
│ repairability::calculate() — non-regulatory heuristic → A–E band │
│ co2e::cfb::calculate_cfb() — STUB → CalcError::NotImplemented │
│ │
│ ruleset_registry — date-based ruleset resolution │
│ Ruleset / RegulatoryBasis — legal citation in every ruleset │
│ FactorProvider — runtime injection point for LCI data │
│ CalculationReceipt — proof-of-calculation envelope │
└──────────────────────────────────────────────────────────────────────┘Every calculator emits a receipt::CalculationReceipt that records the
input hash, ruleset id + version, factor dataset version and table hash —
ready to be stored in the proof-bound store for notified-body audit.
§Adding a new sector calculator
§New methodology (algorithm not yet in dpp-calc)
- Add
src/{methodology}/with four files (seeco2e/orrepairability/):mod.rs—pub fn calculate(inputs, ruleset) -> Result<...>+ output typesparameters.rs— typed input struct (derivesSerializefor receipt hashing)thresholds.rs—pub trait {Methodology}Ruleset: Ruleset { ... }+ concrete implsgolden_vectors.rs—#[cfg(test)]regression tests
- Every
impl RepairabilityRuleset / Co2eRuleset / CfbRulesetmust alsoimpl Rulesetand fillregulatory_basis()with the EU citation. - Add a
resolve_{methodology}()function toruleset_registry/resolve.rsand a&NewRulesetrow toall_rulesets(). - Write golden vectors, including the
all_concrete_rulesets_have_non_empty_regulatory_basispattern. - Register the module in
lib.rs.
§New product category on an existing methodology
- Add
impl Ruleset + impl {Methodology}Rulesetfor the new struct inthresholds.rs. Fillregulatory_basisfrom the product-specific delegated act. - Add a row to the resolver table in
ruleset_registry/resolve.rsand toall_rulesets()(one-liner each). - Add golden vectors. Run
cargo test -p dpp-calc.
§Effective dates
How a governing ruleset is selected, why Pending has no date, and the
conditional max(floor, entry-into-force + N months) arithmetic that is
deliberately not built yet:
see docs/architecture/EFFECTIVE-DATES.md.
§Pending delegated act (stub)
Use Effectivity::pending(empowerment, adoption_deadline) and
regulatory_basis.regulation = "pending — {PEFCR title}".
There is no date sentinel. A pending ruleset has no application date, so
it resolves for no date at all and ensure_active_on returns
CalcError::RulesetUndetermined naming the instrument being waited on. The
type stays compile-visible for future wiring. A far-future from date would
assert something the regulation does not say — EU staged obligations are
written as “from <date> or N months after entry into force, whichever
is the latest”, so until the act lands the date is unknown, not distant.
§Superseded ruleset
- Set the ruleset’s
Effectivitytoclosed(from, last_valid_day). - Set
regulatory_basis.superseded_byto the new ruleset’s ID string. - Keep the row in
ruleset_registry— receipts reference rulesets by ID + version, so removing a row makes old receipts unverifiable.
Modules§
- assessability
- Why a metric has a value, or why it does not.
- clock
- The two dates a compliance computation needs.
- co2e
- Cradle-to-gate CO₂e calculator and Battery CFB stub.
- error
- Error type for all calculator operations in
dpp-calc. - factor
FactorProvidertrait for injecting licensed LCI emission factor datasets at runtime.- receipt
- Proof-of-calculation receipt — auditable envelope for every calculator result.
- repairability
- Simplified repairability heuristic — six-parameter, 0–2 each, A–E band.
- repairability_
index - The enacted EU repairability index — Regulation (EU) 2023/1669.
- ruleset
- Ruleset identity and validity period types used across all
dpp-calccalculators. - ruleset_
registry - Date-based ruleset resolution for all registered methodologies.