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.
§Pending delegated act (stub)
Use EffectiveDateBound::open(NaiveDate(2100, 1, 1)) as the sentinel and
regulatory_basis.regulation = "pending — {PEFCR title}".
The effective-date guard blocks runtime use; resolve_* returns None for
all real dates. Keeps the type compile-visible for future plugin wiring.
§Superseded ruleset
- Set
EffectiveDateBound.untilto the 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§
- 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.
- ruleset
- Ruleset identity and validity period types used across all
dpp-calccalculators. - ruleset_
registry - Date-based ruleset resolution for all registered methodologies.