Skip to content

Releases: urpx-org/urpx

v0.5.1

Choose a tag to compare

@github-actions github-actions released this 06 Oct 21:42
78e6a93

URPX v0.5.1 Release Notes

Released: 2026-10-06.
Type: Working Group Draft patch release.
Previous release: v0.5.0


Overview

URPX (Utility Rate Plan Exchange) is an open standard for representing and exchanging utility rate plan data between utilities, regulators, vendors, and researchers. URPX is built on the semantic web standards RDF, OWL, and SHACL.

URPX data is exchanged as JSON-LD (JavaScript Object Notation for Linked Data), a lightweight, human-readable format. The URPX API specification is under development and is not part of this release.

URPX is at the Working Group Draft stage. The URPX Working Group, under LF Energy Standards and Specifications (LFESS), accepted the standard as a Draft on 2026-07-17. Draft is the middle of the three LFESS stages (Sandbox, Draft, Approved): the vocabulary is published for implementation and review, and terms can still change between releases. Every change will be recorded in the release notes and the changelog.

What v0.5.1 offers

  • The ontology and the SHACL shapes, in Turtle, at their permanent urpx.org namespace (https://urpx.org/ns/ontology/, https://urpx.org/ns/shacl/core/).
  • A JSON-LD context (https://urpx.org/ns/context) to reference from instance data.
  • A curated corpus of four test cases (twelve data files) across two utilities (Pacific Gas & Electric, Consolidated Edison) and two jurisdictions (California, New York), covering time-of-use pricing, tariff filings, market-supply pricing, and resolved rate plan snapshots.
  • Clear licensing: specification text under the W3C Software Notice and Document License, example datasets under CDLA-Permissive-2.0, source and tooling under Apache-2.0.
  • Comprehensive documentation: a full data dictionary, per-section class diagrams, a tutorial, an FAQ, and quality-assurance guidance.

What changed since v0.5.0

  • Three additive vocabulary changes, each with its shape constraint: urpx:publicationPlatform, a string property on urpx:URPXPackage naming the software platform that produced or assembled the package; urpx:vendorOrganization, a new member of urpx:OrganizationTypeValue for an organization that operates such a platform without itself being an energy-market participant; and urpx:url, now also allowed on urpx:Organization. All three are optional. No existing identifier changes.
  • Two ontology domain corrections and one mapping correction bring the ontology in line with constraints the shapes and the test cases already carry: urpx:description may now be stated on urpx:Evaluation, and urpx:effectiveDate on urpx:RatePlanVersion, matching shapes that already allowed them; and the URPX to Schema.org SKOS mapping now maps the declared urpx:timezoneIdentifier. These add no constraint and change no identifier.
  • Licensing by file category, completing the transition recorded in TRANSITION.md: specification files (ontology, shapes, SKOS mappings, JSON-LD context, documentation pages, diagrams) under W3C-20150513; dataset files (test-case data, generated catalogs, per-test-case diagrams) under CDLA-Permissive-2.0; source, tooling, and repository metadata under Apache-2.0. The dcterms:license statement inside the ontology and the shapes agrees with each file's SPDX header, and the repository is REUSE-compliant.
  • The copyright holder on project files is The URPX Authors. Third-party source assets in the test cases (utility tariff documents and pricing data) keep their own holders and the LicenseRef-PublicRecord notice.
  • All four test cases, and the test-case catalog, declare v0.5.1. Eleven of the twelve data files name the organization and the platform that assembled their package.
  • The development record (tasks, specifications, working reports, roadmaps and worked sample instances), the five design-decision logs and the two draft mapping profiles move to urpx-org/urpx-dev. This repository holds the standard, its documentation and the curated test cases.

The full license texts are in LICENSES/; the per-category assignment is recorded in TRANSITION.md.


Migration

  • No existing identifier changes. Existing bindings and queries continue to work unchanged, and the two new terms and the widened property are optional. One new constraint: an urpx:Organization may carry at most one urpx:url value.
  • Point targetURPXVersion at https://github.com/urpx-org/urpx/raw/v0.5.1/ontology/urpx-ontology.ttl.
  • Repository and document paths changed: the files that were under dev-docs/, the design-decision logs, and the two draft mapping profiles are now in urpx-org/urpx-dev. Links into those paths need updating.

What's next

  • The access API specification: discovery, version retrieval, and eligibility checks over published rate plan data. In development; see the API specification for the current sketch.
  • Mapping profiles: Green Button and LF Energy Connected Data Specifications (CDS) profiles are drafts under working group review. See Interoperability.
  • Highly dynamic pricing: an interchange payload for streams of resolved price values, with settlement status per observation; machine-readable value expressions for price calculation; discovery metadata for dynamic price endpoints; and a transform to the California Energy Commission's MIDAS rate server. Draft specifications are in urpx-dev, planned as the first additive bundle after this release.
  • Energy resource specifications for clean energy purchasing: how a rate plan states the emissions profile and energy sources of the supply and delivery it prices, so a buyer can choose by them. In early design; the open question is whether that profile sits inside the rate plan or in a companion vocabulary the plan points at.
  • The working group continues to refine the ontology and the validation rules. Open specifications and the roadmap are in urpx-org/urpx-dev; meeting agendas and notes are in urpx-org/urpx-wg.

References

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 08 Sep 23:53
7719340

URPX v0.5.0 Release Notes

Released: 2026-09-08.
Type: Pre-draft minor release.
Previous release: v0.4.0

← Back to Release Notes


Overview

URPX v0.5.0 moves the vocabulary to its permanent namespace at urpx.org. The terms, the shapes and the semantics are unchanged from v0.4.0. This release changes identifiers only.

The ontology namespace moves from https://urpx-org.github.io/urpx/ontology/ to https://urpx.org/ns/ontology/, and the shapes namespace moves to https://urpx.org/ns/shacl/core/. Every term keeps its local name and changes only its host and path.

This release is not backward-compatible with v0.4.0 at the identifier level. Data or tooling that binds the previous namespace resolves no term until it rebinds.


What changed

  • The ontology base IRI is https://urpx.org/ns/ontology/.
  • The shapes base IRI is https://urpx.org/ns/shacl/core/.
  • The ontology and the shapes identify themselves as version 0.5.0. owl:versionIRI, dcterms:hasVersion, the release node, its distribution and both download URLs name v0.5.0. The ontology states the version literal on owl:versionInfo and the shapes file states it on dcat:version.
  • No term is added, removed or redefined. The vocabulary is identical to v0.4.0 apart from the namespace and the version metadata.

Breaking Changes

  1. The vocabulary namespace changes host and path.
    A document that binds urpx to https://urpx-org.github.io/urpx/ontology/ resolves no term after this release. Rebind it to https://urpx.org/ns/ontology/.

  2. The shapes namespace changes likewise.
    Rebind urpx-shacl to https://urpx.org/ns/shacl/core/.


Migration

  • Rebind the urpx prefix to https://urpx.org/ns/ontology/, and, where it is used, rebind urpx-shacl to https://urpx.org/ns/shacl/core/.
  • Point targetURPXVersion at https://github.com/urpx-org/urpx/raw/v0.5.0/ontology/urpx-ontology.ttl.
  • The local names are unchanged, so no term is renamed. A rebind of the prefix is the whole of the migration.

Notes

  • The example data files under test-cases/ and the published JSON-LD context still reference the previous host. They move to the new namespace in a following release.

References

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 08 Sep 19:02
2eaba82

URPX v0.4.0 Release Notes

Released: 2026-09-08.
Type: Pre-draft minor release.
Previous release: v0.3.0

← Back to Release Notes


Overview

URPX v0.4.0 gives every identifier one pattern and the exchange package one containment property.

An identifier states its register on scheme and its value on skos:notation. This holds for organization, rate plan and rate plan modifier identifiers alike. The register set is an open class rather than a fixed enumeration.

A URPXPackage reaches every exchangeable unit through packages. A package that carries no content unit no longer conforms.

Every shipped test-case data file declares the URPX version its contents were authored against. Both the ontology and the shapes identify themselves as v0.4.0.

This release is not backward-compatible with v0.3.0. Organization identifiers, packages that carried a source publication, and packages that carried only a version declaration each need rework before the data is treated as v0.4.0-conformant.


Highlights

  • scheme carries the register for every identifier. Its domain is the union of OrganizationIdentifier, RatePlanIdentifier and RatePlanModifierIdentifier. Its range is IdentifierScheme.
  • IdentifierScheme is the class of registers and naming authorities that issue identifiers. It is an open class. Eleven members ship with the vocabulary: nine organization registers, plus caMidasRinScheme and utilityTariffCodeScheme. An implementer operating a register outside those eleven mints its own IRI as an IdentifierScheme instance.
  • caMidasRinScheme and utilityTariffCodeScheme are defined terms. Each carries a label, a definition and a preferred label.
  • identifierJurisdiction applies to all three identifier classes. It is optional and at most one on each.
  • OrganizationIdentifierShape, RatePlanIdentifierShape and RatePlanModifierIdentifierShape take one surface: scheme required, skos:notation required, identifierJurisdiction optional. All three are closed.
  • packages is the containment property of the exchange envelope. Its domain is URPXPackage. Its range is the union of RatePlan, RatePlanModifier, RatePlanVersion, RatePlanModifierVersion, PricingModel, TariffFiling and SourcePublication.
  • URPXPackageShape requires at least one of packages, hasRatePlan or hasRatePlanModifier on every package. Each of the three paths stays optional on its own. hasRatePlan and hasRatePlanModifier remain valid, so a consumer reading package contents reads all three paths.
  • All twelve shipped test-case data files carry a URPXPackage with targetURPXVersion, which URPXPackageShape requires; eleven declare v0.4.0 and pge-e-elec declares v0.3.0, which is the version it validates against. The version a file was written for is a fact in the file rather than a property of where it is stored.
  • The ontology and the shapes identify themselves as version 0.4.0. In each document, owl:versionIRI, dcterms:hasVersion, the release node, its distribution and both download URLs name v0.4.0. The ontology states the version literal on owl:versionInfo and the shapes file states it on dcat:version. A consumer resolving a package's targetURPXVersion reaches a document that names the same version.
  • The PG&E E-TOU-C test case carries a worked organization identifier: Organization to hasIdentity to OrganizationIdentity to hasIdentifier to OrganizationIdentifier, with scheme naming eiaScheme, skos:notation carrying the EIA value and identifierJurisdiction naming the jurisdiction.

Breaking Changes

If you maintain datasets or downstream tooling, pay particular attention to these changes:

  1. identifierScheme is removed.
    scheme carries the register for all three identifier classes. OrganizationIdentifierShape is closed, so an organization identifier still asserting identifierScheme fails validation.

  2. utilityId is removed.
    skos:notation carries the literal for every identifier, including the EIA, DUNS and LEI values that property held. The same closure applies: an organization identifier still asserting utilityId fails validation.

  3. IdentifierSchemeValue becomes the class IdentifierScheme.
    The nine registers keep their IRIs, labels and definitions, and are typed to the new class. The owl:oneOf enumeration on the ontology side and the sh:in list on the shape side are both dropped, and IdentifierSchemeValueShape is removed. scheme takes sh:nodeKind sh:IRI, which is the constraint that makes a register outside the published members legal.

  4. The identifier shapes require a register and a value.
    scheme and skos:notation are each required on OrganizationIdentifierShape. The two properties they replace were both optional, so an organization identifier that named neither register nor value validated before and does not now. RatePlanIdentifierShape and RatePlanModifierIdentifierShape already required both. They gain optional identifierJurisdiction and are otherwise unchanged.

  5. hasTariffPublication is removed.
    packages carries a source publication, as it carries every other unit a package holds. URPXPackageShape is closed, so a package still asserting hasTariffPublication fails validation.

  6. A URPXPackage states at least one content unit.
    URPXPackageShape requires at least one of packages, hasRatePlan or hasRatePlanModifier. A package carrying only metadata and a version declaration no longer conforms.


Migration

Datasets built against v0.3.0 need term-level rework, not a version bump alone:

  • On organization identifiers, rename identifierScheme to scheme and utilityId to skos:notation. Both are required.

  • An organization's registry identifier belongs on an OrganizationIdentifier, not on the organization node. OrganizationShape is open by design, so a value asserted directly on the organization keeps validating while carrying no identifier a consumer can read; urpx:eiaId is not a defined term in the vocabulary at any version. OrganizationIdentityShape is closed and requires hasName, so the identity node names the organization alongside the identifier.

  • Move an organization's EIA, DUNS or LEI value onto an OrganizationIdentifier reached through the identity chain:

    "urpx:hasIdentity": {
      "@type": "urpx:OrganizationIdentity",
      "urpx:hasName": {
        "@type": "urpx:OrganizationName",
        "urpx:name": "Pacific Gas & Electric Company"
      },
      "urpx:hasIdentifier": {
        "@type": "urpx:OrganizationIdentifier",
        "urpx:scheme": { "@id": "urpx:eiaScheme" },
        "skos:notation": "14328",
        "urpx:identifierJurisdiction": "US"
      }
    }
  • Retype nodes declared urpx:IdentifierSchemeValue to urpx:IdentifierScheme. The register IRIs are unchanged.

  • Rewrite scheme object IRIs that carry a hyphenated register name. urpx:utility-tariff-code becomes urpx:utilityTariffCodeScheme, and urpx:ca-midas-rin becomes urpx:caMidasRinScheme. Neither hyphenated form was ever a defined term.

  • A register outside the eleven published members is an IRI of your own, typed urpx:IdentifierScheme. scheme no longer constrains its value to a fixed list.

  • JSON-LD data that does not already bind the skos prefix adds "skos": "http://www.w3.org/2004/02/skos/core#" to its @context. Without the binding, skos:notation does not expand and the required value is not asserted.

  • On a URPXPackage, hasTariffPublication becomes packages. hasRatePlan and hasRatePlanModifier remain valid, so a package may carry a rate plan or a modifier through either those properties or packages.

  • Give every URPXPackage at least one content unit. A package that exists only to declare a version states the unit it carries as well.

  • Point targetURPXVersion at this release: https://github.com/urpx-org/urpx/raw/v0.4.0/ontology/urpx-ontology.ttl.

  • Re-run SHACL validation against urpx-shacl.ttl. The closed identifier and package shapes surface any retired property still asserted in the data.


References

v0.3.0

Choose a tag to compare

@KlaarDeSchepper KlaarDeSchepper released this 03 Aug 19:16
b1fa8e9

URPX v0.3.0 Release Notes (Draft)

Status: Draft, pending Working Group review. Dates and version metadata are finalized when this draft is tagged.
Type: Pre-draft minor release
Previous release: v0.2.1

← Back to Release Notes


Overview

URPX v0.3.0 reframes how published pricing material relates to the rate plan. Pricing content now lives in PricingModel nodes carried by publication-level containers (TariffFiling, SourcePublication); rate plans and modifiers are sharpened to pure identity records; and versions become consolidation artifacts that declare their own coverage through a required CoverageClaim, which states completeness; self-containment and an explaining Evaluation are optional.

This release is not backward-compatible with v0.2.x. Existing URPX datasets should be reviewed and migrated before being treated as v0.3.0-conformant.


Highlights

  • Introduced the pricing-model architecture: PricingModel carries pricing content, filed publicly through a TariffFiling or, for filing-less material (competitive supply, contract, market-indexed, scenario, partial ingest), standing on its own with its own validity dates.
  • Retired the tariff document class family (TariffPublication and its subclasses) in favor of a single SourcePublication class with a publicationType enumeration.
  • Renamed URPXDocument → URPXPackage.
  • Added first-class identity classes, RatePlanIdentifier and RatePlanModifierIdentifier, linked from RatePlan / RatePlanModifier via hasIdentifier.
  • Made RatePlanVersion and RatePlanModifierVersion consolidation artifacts: each now requires a CoverageClaim stating completeness (completenessResult); self-containment (selfContained) and an explaining Evaluation are optional.
  • Separated the two axes a coverage claim reports. completenessResult states how much of the plan the snapshot covers, drawn from a six-member CompletenessResultValue. Two conditions that are properties of how the snapshot was assembled rather than of how complete it is now sit beside selfContained as booleans on CoverageClaim: stale, for a snapshot whose sources are known to have moved on, and fallbackSourced, for one that had to fall back to a secondary source. A claim can now say "complete, but fallback-sourced" without either fact displacing the other.
  • Added a filing-lifecycle vocabulary: supersedes, replaces / replacedBy, cancelledBy, cancelledOn, cancelsPriceDefinition, and sunsetOn for intentional terminal discontinuation (as distinct from a data gap).
  • Added scenario cost modeling (ScenarioCostModel, ScenarioCostResult) and temporal scoping (TemporalScope, TemporalPeriod).
  • Renamed the plan-to-organization link publishedBy to offeredBy, and its inverse publishes to offers, so the property names the organization that offers the plan rather than asserting that the plan is a published artifact. offeredBy and offers are declared owl:inverseOf each other and align with schema.org offeredBy / offers by reference. Both are optional in either direction. publishedBy is re-homed onto SourcePublication and URPXPackage, where publication is a property of the artifact.
  • Extended commodity, offeredBy, and serviceRole to RatePlan and RatePlanModifier; commodity is now multi-valued at the plan/modifier level (a plan or modifier may span commodities, e.g. a combined water/sewer modifier) and single-valued at the price and metric level.
  • Added element-level consolidation lineage: contributedBy records the pricing model via which each snapshot element entered, and consolidatedFrom lists every contributing model on the version, so a resolved snapshot carries its own derivation and a consumer can trace each element back to its source filing and rate case. A ModelExclusion record on the claim's Evaluation (hasModelExclusion, pairing excludedModel with an exclusionReason) states machine-readably why a listed model contributed nothing, so the lineage completeness cross-check can be re-run by any consumer.
  • Completed the temporal vocabulary: hasTemporalPeriod links a TemporalScope to the named interval its span denotes, startDateTime and endDateTime now apply to TemporalScope for intraday windows, and cancelledOnDateTime and sunsetOnDateTime add dateTime-precise twins of the two lifecycle dates. dateModified and dateTimeModified now apply to PricingModel and TariffFiling, giving overlapping, unlinked publication units a vocabulary-carried ordering signal.
  • Documented three enumerations that previously shipped as bare member IRIs. CompletenessResultValue (6 members), ConfidenceValue (verified, estimated, projected) and EvaluationKindValue (consolidation, coverageEvaluation, validation, comparison, benchmark) now carry a label and a definition on every member, so all three appear in the generated data dictionary and each value has a stated meaning to exchange rather than only a name to match on.
  • Grouped the phase codes under four categories. PhaseCategoryValue introduces singlePhaseCategory, splitPhaseCategory, threePhaseCategory and measurementCategory, and each PhaseCodeKindValue member declares its category with skos:broader, so a consumer can select "any three-phase code" without enumerating the individual codes.
  • Made the plan-to-version and plan-to-model navigation links assertable. hasRatePlanVersion and hasRatePlanModifierVersion may be stated on a rate plan or modifier alongside the version-side forRatePlan / forRatePlanModifier, and isReferencedByPricingModel now applies to both RatePlan and RatePlanModifier. All three are optional: a data set may carry either direction or both, so a JSON-LD consumer can traverse without a reverse-path query, and a producer that prefers a single direction is not obliged to duplicate it.
  • Closed every operational SHACL shape against its full declared property surface, with three deliberate, documented open exceptions for subclass-family reasons (OrganizationShape, PriceSetShape, PriceSetAlternativeShape).
  • Completed the vocabulary's internal referential integrity: every urpx: term the ontology references is now defined in it, including the phase categories above, the enumeration members, and the charge-type members' bill-portion pointers.
  • Added a Consolidated Edison SC1 Rate I test case set, including a self-contained resolved snapshot that carries element-level consolidation lineage, a five-statement supersession chain, and a supply-snapshot variant that resolves a market supply charge from an external feed through a retrievedElsewhere reference against a ModelCollection thread, alongside the PG&E test cases carried forward to the v0.3.0 model.
  • Rewrote the tutorial's Terminology section ("Rate Plan vs Tariff vs Price") and the documentation set to consistently use "rate plan," "price," or "rate group" in place of the ambiguous bare word "rate."

Breaking Changes

If you maintain datasets or downstream tooling, pay particular attention to these changes:

  1. The tariff document class family is retired.
    TariffPublication, TariffBookDocument, TariffStatementDocument, TariffSupplementDocument, TariffAddendumDocument, SupplyChargesDocument, DERExportsDocument, and HighlyDynamicPricesDocument are removed. Use SourcePublication with the publicationType enumeration (SourcePublicationTypeValue) instead. The unused parallel PublicationTypeValue enumeration is also removed; the documented member individuals now live on SourcePublicationTypeValue.

  2. URPXDocument is renamed to URPXPackage.
    All property domains, ranges, and shapes follow the rename.

  3. RatePlanVersion and RatePlanModifierVersion now require a coverage claim.
    Every version must carry exactly one CoverageClaim (via hasCoverageClaim). Only completenessResult is required; selfContained and an explaining Evaluation are optional. Versions without a coverage claim will fail validation.

  4. ReferenceInclusionValue members are renamed.
    included → includedHere; shopFor → retrievedElsewhere.

  5. RateGroup no longer subclasses ServiceClass.
    A rate group is a named grouping inside a service class, not a kind of service class. Containment is now expressed via parentServiceClass.

  6. Version shapes no longer allow supersedes.
    Lifecycle now lives on the filing; a version's timeline position derives from the filing chain rather than from a direct supersedes link on the version itself.

  7. The nested tariff reference classes are removed.
    TariffBookReference and TariffStatementReference, and their linking properties hasTariffBookReference and hasTariffStatementReference, are removed. Page and leaf locators, statement type, and receipt dates sit directly on DataSourceReference; the tariff book versus statement distinction is carried by the referenced SourcePublication's publicationType.

  8. CompletenessResultValue is narrowed to six members.
    complete, partial, pending, unsupported, unknown, noCoverage. stale and fallbackSourced are no longer completeness verdicts; they are booleans on CoverageClaim. A claim that previously carried completenessResult of stale or fallbackSourced states its completeness on the six-member scale and sets the matching boolean. SourcePublicationTypeValue likewise carries the documented publication-type members; the parallel PublicationTypeValue enumeration is removed.

  9. SourceReference is renamed DataSourceReference.
    The class now matches the hasDataSourceReference property that reaches it. SourceReferenceShape becomes DataSourceReferenceShape.


Migration

Datasets buil...

Read more

URPX v0.2.1 pre-draft release

Pre-release

Choose a tag to compare

@KlaarDeSchepper KlaarDeSchepper released this 22 May 16:36
f93a77d

Changed

  • SHACL: urpx:summaryAmount is now optional (sh:minCount relaxed from 1 to 0).
    Rate plan instances that omit a summary amount are now schema-valid.

Added

  • Test case: PGE E-TOU-C 2026-03-01 — demonstrates ServiceBracket separation pattern.

v0.0.0-release-action-test

Pre-release

Choose a tag to compare

@github-actions github-actions released this 22 May 18:35
6986608

Release workflow smoke test.

Delete after verification.

URPX v0.2.0 Pre-Draft Release

Pre-release

Choose a tag to compare

@KlaarDeSchepper KlaarDeSchepper released this 14 May 15:20
3436d4a

Overview

URPX v0.2.0 is a substantial pre-draft update focused on clearer price modeling, a fully reworked structured condition architecture, stronger SHACL validation, and better documentation for implementers and reviewers.

Compared with v0.1.2, this release is not backward-compatible. Existing URPX datasets should be reviewed and migrated before being treated as v0.2.0-conformant.


Highlights

  • Reworked the billing model so PriceDefinition is owned by BillingModel and linked to its ledger with urpx:referencesLedger.
  • Replaced the legacy condition model with the rooted ConditionExpression architecture used across eligibility, applicability, and profile-alternative contexts.
  • Tightened eligibility modeling so each EligibilityRule uses a single ConditionExpression, and direct profile links on rules are no longer valid.
  • Retired direct ApplicabilityGroup selector properties in favor of ConditionExpression over profile-based properties.
  • Added ServiceBracket so tier bounds move off ServiceTier and can vary by context.
  • Added GeneralRule for reusable tariff-book-level shared rules.
  • Added RateCase and datetime provenance properties to improve regulatory and source traceability.
  • Renamed identifier properties to make uniqueness explicit and added required urpx:targetURPXVersion on URPXDocument.
  • Added customerChoice and isDefault semantics for rate plan versions.
  • Renamed numberOfMeters to meterCount, renamed numberOfOccupants to occupancyCount, and removed demandThreshold.
  • Expanded the documentation set with condition modeling, quality assurance, and test-data review guidance.

Breaking Changes

If you maintain datasets or downstream tooling, pay particular attention to these changes:

  1. PriceDefinition ownership moved from Ledger to BillingModel.
    Existing data must move definitions to the billing model layer and add urpx:referencesLedger.

  2. The applicability condition model was replaced.
    Legacy constructs such as hasCondition, hasConditionLogic, legacy terminal-node patterns, earlier applicability/dimension-value structures, and direct ApplicabilityGroup selector properties were removed in favor of ConditionExpression, rootNode, ComparisonNode, BooleanOperationNode, typed operand nodes, and profile-based condition properties.

  3. Eligibility rules now require a single ConditionExpression.
    EligibilityRule must use urpx:hasConditionExpression, and direct hasCustomerProfile / hasServicePointProfile links on EligibilityRule are no longer valid.

  4. Tier bounds moved to ServiceBracket.
    lowerBound, lowerBoundOperator, upperBound, and upperBoundOperator no longer belong on ServiceTier. Bound data must move to one or more ServiceBracket nodes, with referencesServiceBracket used where exact bracket linkage is needed.

  5. Identifier properties were renamed.
    ratePlanIdentifier became ratePlanUniqueIdentifier, and modifierIdentifier became modifierUniqueIdentifier.

  6. URPXDocument now requires targetURPXVersion.
    Documents should point to the ontology version they were authored against using the raw tagged ontology URL, for example:
    https://github.com/urpx-org/urpx/raw/v0.2.0/ontology/urpx-ontology.ttl

  7. Enrollment/default semantics changed.
    isOptional was removed in favor of customerChoice and isDefault on RatePlanVersion.

  8. Profile count terminology and threshold handling changed.
    numberOfMeters became meterCount, numberOfOccupants became occupancyCount, and demandThreshold was removed.

  9. Eligibility profile inputs moved to Scenario for eligibility evaluation for an individual customer or scenario. hasCustomerProfile and hasServicePointProfile no longer belong directly on EligibilityRule, eligibility conditions are expressed on EligibilityRule using hasConditionExpression.


Migration Guidance

To migrate a v0.1.2 dataset to v0.2.0:

  • move PriceDefinition instances under BillingModel
  • add urpx:referencesLedger to every PriceDefinition
  • replace legacy rule condition structures with a single urpx:hasConditionExpression on each EligibilityRule
  • migrate retired ApplicabilityGroup selector properties to ConditionExpression over CustomerProfile / ServicePointProfile properties
  • move tier bounds from ServiceTier to ServiceBracket and add urpx:hasServiceBracket where tier bounds are authored
  • rename legacy identifier properties
  • replace isOptional with customerChoice and isDefault
  • rename numberOfMeters to meterCount and numberOfOccupants to occupancyCount
  • remove demandThreshold and express threshold logic through rules / metric patterns
  • add urpx:targetURPXVersion to URPXDocument using:
    https://github.com/urpx-org/urpx/raw/v0.2.0/ontology/urpx-ontology.ttl
  • rerun SHACL validation against shacl/urpx-shacl.ttl

The updated PG&E E-ELEC example under test-cases/ can be used as a current-model reference.


Validation and Documentation

v0.2.0 strengthens validation and reviewer support:


Repository and Governance Updates

This release also adds project-level governance and licensing metadata:

  • REUSE licensing metadata and public-record handling for third-party tariff-book source material
  • TRANSITION.md documenting the planned post-Draft license transition
  • updated CONTRIBUTING.md, SECURITY.md, and AGENTS.md

These changes do not alter the URPX data model, but they do affect repository hygiene, review workflow, and release readiness.


References

v0.1.2Pre-Draft release

Pre-release

Choose a tag to compare

@KlaarDeSchepper KlaarDeSchepper released this 13 Apr 17:27
618dc6f

What's Changed

New Contributors

Full Changelog: v0.1.1...v0.1.2

Initial v0.1.1 Pre-draft URPX Release

Pre-release

Choose a tag to compare

@KlaarDeSchepper KlaarDeSchepper released this 17 Mar 16:28
24b60b3

Core ontology, shacl, and draft documentation