Repository navigation
v0.4.0
URPX v0.4.0 Release Notes
Released: 2026-09-08.
Type: Pre-draft minor release.
Previous release: v0.3.0
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
schemecarries the register for every identifier. Its domain is the union ofOrganizationIdentifier,RatePlanIdentifierandRatePlanModifierIdentifier. Its range isIdentifierScheme.IdentifierSchemeis the class of registers and naming authorities that issue identifiers. It is an open class. Eleven members ship with the vocabulary: nine organization registers, pluscaMidasRinSchemeandutilityTariffCodeScheme. An implementer operating a register outside those eleven mints its own IRI as anIdentifierSchemeinstance.caMidasRinSchemeandutilityTariffCodeSchemeare defined terms. Each carries a label, a definition and a preferred label.identifierJurisdictionapplies to all three identifier classes. It is optional and at most one on each.OrganizationIdentifierShape,RatePlanIdentifierShapeandRatePlanModifierIdentifierShapetake one surface:schemerequired,skos:notationrequired,identifierJurisdictionoptional. All three are closed.packagesis the containment property of the exchange envelope. Its domain isURPXPackage. Its range is the union ofRatePlan,RatePlanModifier,RatePlanVersion,RatePlanModifierVersion,PricingModel,TariffFilingandSourcePublication.URPXPackageShaperequires at least one ofpackages,hasRatePlanorhasRatePlanModifieron every package. Each of the three paths stays optional on its own.hasRatePlanandhasRatePlanModifierremain valid, so a consumer reading package contents reads all three paths.- All twelve shipped test-case data files carry a
URPXPackagewithtargetURPXVersion, whichURPXPackageShaperequires; eleven declare v0.4.0 andpge-e-elecdeclares 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 onowl:versionInfoand the shapes file states it ondcat:version. A consumer resolving a package'stargetURPXVersionreaches a document that names the same version. - The PG&E E-TOU-C test case carries a worked organization identifier:
OrganizationtohasIdentitytoOrganizationIdentitytohasIdentifiertoOrganizationIdentifier, withschemenamingeiaScheme,skos:notationcarrying the EIA value andidentifierJurisdictionnaming the jurisdiction.
Breaking Changes
If you maintain datasets or downstream tooling, pay particular attention to these changes:
-
identifierSchemeis removed.
schemecarries the register for all three identifier classes.OrganizationIdentifierShapeis closed, so an organization identifier still assertingidentifierSchemefails validation. -
utilityIdis removed.
skos:notationcarries the literal for every identifier, including the EIA, DUNS and LEI values that property held. The same closure applies: an organization identifier still assertingutilityIdfails validation. -
IdentifierSchemeValuebecomes the classIdentifierScheme.
The nine registers keep their IRIs, labels and definitions, and are typed to the new class. Theowl:oneOfenumeration on the ontology side and thesh:inlist on the shape side are both dropped, andIdentifierSchemeValueShapeis removed.schemetakessh:nodeKind sh:IRI, which is the constraint that makes a register outside the published members legal. -
The identifier shapes require a register and a value.
schemeandskos:notationare each required onOrganizationIdentifierShape. The two properties they replace were both optional, so an organization identifier that named neither register nor value validated before and does not now.RatePlanIdentifierShapeandRatePlanModifierIdentifierShapealready required both. They gain optionalidentifierJurisdictionand are otherwise unchanged. -
hasTariffPublicationis removed.
packagescarries a source publication, as it carries every other unit a package holds.URPXPackageShapeis closed, so a package still assertinghasTariffPublicationfails validation. -
A
URPXPackagestates at least one content unit.
URPXPackageShaperequires at least one ofpackages,hasRatePlanorhasRatePlanModifier. 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
identifierSchemetoschemeandutilityIdtoskos:notation. Both are required. -
An organization's registry identifier belongs on an
OrganizationIdentifier, not on the organization node.OrganizationShapeis open by design, so a value asserted directly on the organization keeps validating while carrying no identifier a consumer can read;urpx:eiaIdis not a defined term in the vocabulary at any version.OrganizationIdentityShapeis closed and requireshasName, so the identity node names the organization alongside the identifier. -
Move an organization's EIA, DUNS or LEI value onto an
OrganizationIdentifierreached 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:IdentifierSchemeValuetourpx:IdentifierScheme. The register IRIs are unchanged. -
Rewrite
schemeobject IRIs that carry a hyphenated register name.urpx:utility-tariff-codebecomesurpx:utilityTariffCodeScheme, andurpx:ca-midas-rinbecomesurpx: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.schemeno longer constrains its value to a fixed list. -
JSON-LD data that does not already bind the
skosprefix adds"skos": "http://www.w3.org/2004/02/skos/core#"to its@context. Without the binding,skos:notationdoes not expand and the required value is not asserted. -
On a
URPXPackage,hasTariffPublicationbecomespackages.hasRatePlanandhasRatePlanModifierremain valid, so a package may carry a rate plan or a modifier through either those properties orpackages. -
Give every
URPXPackageat least one content unit. A package that exists only to declare a version states the unit it carries as well. -
Point
targetURPXVersionat 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.