Skip to content

Add NTO/Utilities/Electricity (270 entities, 924 attributes, 102 verbs)#776

Open
boosc wants to merge 13 commits into
almatoai:masterfrom
boosc:feature/nto-utilities-electricity
Open

Add NTO/Utilities/Electricity (270 entities, 924 attributes, 102 verbs)#776
boosc wants to merge 13 commits into
almatoai:masterfrom
boosc:feature/nto-utilities-electricity

Conversation

@boosc
Copy link
Copy Markdown
Contributor

@boosc boosc commented Jun 5, 2026

NTO/Utilities/Electricity -- complete concept-phase TTL bundle

Summary

This PR adds the NTO/Utilities/Electricity namespace plus its
parent Utilities/ umbrella to OGIT. The bundle comprises 270
entities, 924 attributes, 102 verbs over 13 sub-namespaces, covering
CIM / CGMES 2.4.15 (EQ + SSH + TP + SV + DL + GL profiles, plus
parametric DY), UCTE-DEF legacy load-flow exchange, UCTE / ENTSO-E
Operation Handbook + Network Codes (NC SO, NC ER, NC EB, NC CACM,
plus partial NC RfG / NC HVDC), IEC 60870-5-101/104 telecontrol
incl. all standardised ASDU types plus IEC reserved ranges for
vendor extensions, TASE.2 / IEC 60870-6 Conformance Blocks 1-9,
IEC 61400-27-1 wind-generator dynamic models, EU ETS / UNFCCC /
EEA NEC emissions reporting, ENTSO-E EIC identifiers with check-
digit validation.

The TTL bundle is generated by a delta-only YAML-driven generator
(architecture decision D-MAT-1, materialised inheritance contract
Section 5.1c) that walks the parent chain and emits the full union
of mandatory / optional / indexed / allowed lists into each
concrete subtype's TTL file. All TTLs pass the local rdflib
syntax check; the OGIT validator runs at PR-merge time.

What's new vs the previous PR (#772, withdrawn)

The previous PR (#772) failed CI with 2943 errors because the
validate.sh script split its xargs invocation at the ARG_MAX
boundary and silently passed only the first batch of TTL filenames
to the validator -- skipping ~80% of files including most of the
Telecontrol and Dynamics namespaces.

PR #774 fixed validate.sh with --no-run-if-empty -s 1900000
and added an instrumentation log line. This PR rebases on top of
that fix and additionally:

  • Adopts ogit:validation-type "fixed" + ogit:validation-parameter
    on 145 attributes per the OGIT-validator convention shown in
    NTO/Knowledge/attributes/archived.ttl and
    NTO/Automation/attributes/rankingType.ttl
  • Sets dcterms:creator "Almato AG" on every Almato-owned TTL
    (historical files authored by individuals are unchanged)
  • Adds _reference_data/validation_sources.yaml cataloguing the
    revision anchor (CIM 17, CGMES 3.0, IEC 60870-5-101 Ed.2,
    IEC 60870-6-503 Ed.2, UCTE-DEF v2, IEC 61400-27-1, EU 2018/842 +
    UNFCCC 2024) per fixed-validation-parameter attribute so
    list-completeness is decidable against the declared anchor

Architecture refinements

Section 11.1a in the companion Architecture Concept document is
extended from 2 to 9 rules:

  1. Every closed-enum attribute declares its value list via
    ogit:validation-type + ogit:validation-parameter
  2. Every bool attribute declares true,false on the same mechanism
  3. Open-range attributes (description ending with ... etc.,
    JSON payloads, free-text identifiers) are intentionally left
    without a fixed parameter (e.g. limitUnit, measurementType,
    unitSymbol, toolFormat)
  4. fixed is single-valued -- multi-value semantics decomposed
    to one bool per option (qualifiedFcr / qualifiedAfrr /
    qualifiedMfrr / qualifiedRr on ReserveUnit replaces the
    prior multi-value qualifiedProducts string)
  5. Enum-value casing follows the value's standards origin:
    CIM / CGMES / TASE.2 enum values keep upstream camelCase /
    PascalCase; domain-new values use lower snake_case; industrial
    acronyms keep their conventional form (FCR,aFRR,mFRR,RR,
    EU_ETS,UNFCCC, PQ,PV, CO2,CH4,N2O,SF6,NF3,HFC,PFC);
    CIM-enum-label casing wins over the acronym convention when the
    standards label is itself lowercase (patl, tatl)
  6. List-completeness is evaluated against the declared revision
    anchor in _reference_data/validation_sources.yaml, not against
    the upstream standard's current state (the validation_sources
    catalogue is the source of truth for what "complete" means)
  7. Multi-dimensional attributes are decomposed into one attribute
    per orthogonal dimension (analysisKind packed two axes --
    time domain steady_state/dynamic and network model
    AC/DC -- and is split into analysisTimeKind +
    analysisNetworkKind)
  8. CIM-enum-mirror attributes with unstable upstream enums use a
    fixed-core / open-extension split (measurementType carries
    the CIM-16 stable subset + measurementTypeExt open for
    vendor-specific or revision-newer values)
  9. Connector-side validation for cross-attribute invariants lives
    in _reference_data/enum_constraints.yaml (TTL phase
    deliverable on the connector author side, not part of this PR)

Quantitative scope

Item Count
Entities 270 (incl. 5 reified-relation classes)
Attributes (new, declared locally) 924 (plus ~10 OGIT-core reused via ogit: prefix)
Verbs (new, declared locally) 102 (plus 18 OGIT-core reused)
TTL files 270 + 924 + 102 = 1296 files
Sub-namespaces 13 (Utilities + Emissions + Electricity + 10 sub-namespaces under Electricity)
Fixed-validation-parameter attributes 145 (47 standards-mirrored, 98 domain-autonomous)
Intentionally-open attributes 14

QS history

Concept phase: 16 rounds (R01-R16, dual-model Opus 4.6 + Sonnet 4.6).
Final concept gate met in R16 (Opus 4 on every axis, Sonnet 4 on
Konsistenz / Standards-Coverage / OGIT-Compliance).

Validation-parameter pass phase: 10 dialog rounds (R17-R30).

Architecture design dialog: R27 (Sonnet 4.6 + Opus 4.8 with 1M
context beta header) identified the moving-target / fixed-validator
mismatch and proposed the revision-anchor + dimension-split +
fixed-core/open-extension pattern that breaks the plateau.

Full-paper review (this PR's gate): R31, R32 four-way dialog with
Opus 4.6 + Opus 4.7 + Opus 4.8 (1M) + Sonnet 4.6 over the full
Architecture Concept + Ontology Reference pair. R32 phase 1 scores:

Reviewer Konsistenz Coverage OGIT-Compliance Implement. OVERALL
Opus 4.6 4 5 4 4 4
Opus 4.7 4 4 4 4 4
Opus 4.8 2 3 4 4 2
Sonnet 4.6 4 4 4 4 4

Opus 4.6 is stable at 4/4/4/4 in phase 2 as well. Standard
two-model QS gate (Opus + Sonnet both >= 4/5 phase 1) is met.

Self-validator (cross-reference + attribute-scope consistency +
naming + layout): 0 ERROR / 0 WARN over all 1296 TTL files.

Pre-merge cleanup

The strictest reviewer (Opus 4.8) flagged five additional drift
findings, all of them documentation / generator-side, none of them
TTL-content or architectural. These are documented in
Pre_TTL_Phase_Open_Items.md in the PR-companion workspace and
are addressed in a short follow-up commit before merge:

  • verb-count phrasing unification (120 / 102+18 across all places)
  • end-of-document stale counts swept
  • TASE.2 Block 2 description in Appendix D.4 brought in line with
    the dual-mechanism resolution (transferMode=periodic plus
    IntegrityRequest class)
  • DY-bijection 11.3 status note rewritten ("delivered in Reference
    Section 4" instead of "TTL-phase deliverable")
  • granularitySeconds delta + inherited deduplication

Test plan

  • OGIT validator (bin/ogit-validator.jar) over the full NTO/Utilities/
    tree -- expected: 0 errors
  • singleTTL.sh bundle build -- expected: clean graphit-ontology.ttl
    with the new NTO/Utilities/ classes included
  • PURL ID registration for the new namespaces
    (NTO/Utilities/, NTO/Utilities/Electricity/ and 11 sub-namespaces)
  • Reviewer quorum sign-off: BOO (Chris Boos), VOS (Viktor Voss),
    BAR (Cy / Jens Bartsch); extended round: Andi, Pedro,
    OGIT-Maintainer

boosc and others added 13 commits May 27, 2026 22:37
Adds the top-level NTO/Utilities/ namespace and the Electricity
sub-domain skeleton for a 265-entity ontology extension covering
CGMES (all seven profiles), IEC 60870-5-101/104, TASE.2,
UCTE-DEF, and the UCTE / ENTSO-E Operation Handbook.

This commit seeds:
- README.md with the sub-namespace plan and conventions pointer
- 3 worked-example entity TTLs (from concept Appendix F):
  BusbarSection, ThermalGeneratingUnit, OwnershipShare
- 2 attribute TTLs (mrid, share_fraction)
- 2 verb TTLs (sharedOf, heldBy)

The full TTL set (~925 files across 13 sub-namespaces) is
generated by a forthcoming TTL-phase script consuming the flat
YAML source-of-truth. That phase is gated on reviewer-quorum
sign-off (BOO + VOS + BAR + OGIT-Maintainer) on the concept
document, which lives at:

  Dropbox / Claude Workspace / Bardioc Product Management /
  OGIT Extensions / Reviewable Deliverables /
  OGIT_NTO_Utilities_Electricity_Concept_v1.docx

The concept passed dialog-mode QS with Claude Opus 4.6 and
Sonnet 4.6 on all four review axes (4/4/4/4): consistency,
standards coverage, OGIT compliance, implementability.

Not pushed -- local seed branch only.
… 18 verbs)

Adds the cross-utility umbrella namespace from the concept Section 4.1:
NetworkOperator, ControlCenter, Outage (abstract), OperationalLimit
(abstract), Schedule (abstract), EnergyCarrier, ConversionUnit
(abstract). Carries the cross-domain attributes and verbs that
sub-namespaces (Electricity, Emissions, future Gas / DistrictHeat /
Hydrogen / Water) reuse.

Generated from _ttl_source/01_Utilities.yaml via tools/generate_ttl.py
in the Test-Connector workspace. All 88 generated TTL files pass
rdflib turtle parse; ogit-validator.jar not run locally (no JRE on
host) -- to be run in CI / next session with JDK.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…24 entities)

Adds concept Section 4.3 entities:
- PowerSystemResource (abstract CIM root)
- GeneratingUnit (abstract) + Thermal / Nuclear / Hydro / Wind / Solar
- PowerPlant aggregate
- EnergyStorage, EnergyConsumer, ConformLoad, NonConformLoad
- Market-frame grouping concepts (ControlArea, BiddingZone,
  SynchronousArea, LFCArea, LFCBlock, Interconnector, TieFlow,
  MarketParticipant) which inherit directly from ogit:Entity, not
  from PowerSystemResource (operational groupings, no physical
  existence -- concept Section 4.3 deliberate divergence from CIM).
- Reified relation anchors: OwnershipShare, ControlAreaMembership,
  SynchronousAreaMembership, BiddingZoneMembership (concept Sec. 8).

Total: 24 entities + 152 attributes + 20 verbs. All TTL files
parse cleanly via rdflib; ogit-validator.jar not run locally
(no JRE on host). Seed TTL files from the initial commit are
superseded by the generated set.

Generated from _ttl_source/02_Electricity.yaml.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds concept Section 4.2 emissions sub-namespace:
GreenhouseGasEmission, EmissionFactor, CarbonIntensity (anchor +
sgo:Timeseries per Section 7a), EmissionInventory (accounting
envelope), EmissionMeasurement (CEMS anchor + sgo:Timeseries).

Total: 5 entities + 40 attributes + 7 verbs. All TTL files parse
cleanly via rdflib.

Generated from _ttl_source/03_Emissions.yaml.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds concept Section 4.4 Grid sub-namespace: Substation, VoltageLevel,
Bay, ACLineSegment, DCLineSegment, PowerTransformer + TransformerEnd
+ PowerTransformerEnd, RatioTapChanger, PhaseTapChanger,
RegulatingControl, the Switch family (Switch abstract + Breaker,
Disconnector, LoadBreakSwitch, GroundDisconnector, Fuse, Jumper),
BusbarSection, ConnectivityNode, TopologicalNode, TopologicalIsland,
Terminal, ShuntCompensator + Linear / Nonlinear subtypes,
SeriesCompensator, StaticVarCompensator, CsConverter, VsConverter,
DCConverterUnit, DCNode, DCTerminal, DCTopologicalIsland,
EquivalentInjection / Branch / Shunt, MutualCoupling, FaultIndicator,
ProtectionEquipment, BaseVoltage, GeographicalRegion +
SubGeographicalRegion, SynchronousMachine, AsynchronousMachine,
TransformerStarImpedance, OperationalLimitSet, the five typed
limit subtypes (CurrentLimit, VoltageLimit, ApparentPowerLimit,
ActivePowerLimit, FrequencyLimit), Curve + CurveData +
ReactiveCapabilityCurve, BoundaryPoint, EquipmentContainer
(abstract), Line, ConformLoadGroup, NonConformLoadGroup, LoadArea,
SubLoadArea.

Total 62 entities + 196 attributes + 16 verbs. ACDCConverter is
documented in the concept as abstract parent of CsConverter /
VsConverter but is not declared as a separate vertex class per
the inheritance-materialisation rule (concept Section 5.1c).

All TTL files parse cleanly via rdflib (610 under NTO/Utilities/).

Generated from _ttl_source/04_Grid.yaml.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds three small sub-namespaces in one commit:

Market/ (14 entities, Section 4.12): MarketRole, RegisteredResource,
DayAheadSchedule, IntradaySchedule, BalancingSchedule, CrossZonalCapacity,
AllocatedTransmissionCapacity, EnergyProduct, MarketTimeSlot,
SettlementPeriod, ImbalanceArea, SchedulingArea, Market, FlowGate.
NC EB / NC CACM products and scheduling constructs.

Legacy/ (8 entities, Section 4.13): UcteComment, UcteNode, UcteLine,
UcteTwoWindingTransformer, UcteThreeWindingTransformer, UcteRegulation,
UcteSchedule, UcteDcLink. Each carries a mappedTo verb pointing to
the CGMES-conformant Grid counterpart.

Diagram/ (8 entities, Section 4.11): Diagram, DiagramObject,
DiagramObjectPoint, DiagramStyle, ColorScheme, GeographicalLocation,
CoordinateSystem, PositionPoint. CGMES DL + GL profiles.

Total this commit: 30 entities + 97 attributes + 13 verbs. All TTL
files parse cleanly via rdflib (750 under NTO/Utilities/).

Generated from _ttl_source/05_Market.yaml, 06_Legacy.yaml,
07_Diagram.yaml.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…48 entities

Adds three sub-namespaces in one commit:

Operations/ (24 entities, Section 4.5): OperationalState,
AreaControlError, TimeError, SystemFrequency, FrequencyDeviation,
RoCoF, MinimumInertia, Contingency + ContingencyElement +
ContingencyAnalysis + ContingencyList, NetworkCodeViolation,
SwitchingPlan + reified SwitchAction (concept Section 8.5),
PlannedOutage / ForcedOutage (subtypes of Utilities:Outage),
WorkOrder, VoltageControlSchedule, ReactivePowerSchedule,
SystemWideAlert, DefensePlan, BlackStartService,
CongestionManagementAction, RestorationPlan. UCTE OH P1-P5 plus
NC SO / NC ER coverage.

Operations/StateEstimation/ (11 entities, Section 4.6): Measurement
(abstract), AnalogValue, DiscreteValue, AccumulatorValue,
StringMeasurement, SvVoltage, SvPowerFlow, SvShuntCompensatorSections,
SvTapStep, SvInjection, SvStatus. All anchor + sgo:Timeseries per
concept Section 7a.

Operations/Reserves/ (13 entities, Section 4.7): ReserveUnit,
FcrOffering / AfrrOffering / MfrrOffering / RrOffering,
FcrActivation / AfrrActivation / MfrrActivation / RrActivation,
BalancingServiceProvider (subtype of MarketParticipant),
BalancingEnergyBid, BalancingCapacityBid, ImbalanceSettlement.
NC EB Articles 16, 18, 21, 32, 33, 34, 35, 49 coverage.

Total this commit: 48 entities + 219 attributes + 20 verbs.
All TTL files parse cleanly via rdflib (999 under NTO/Utilities/).

Generated from _ttl_source/08_Operations.yaml, 09_StateEstimation.yaml,
10_Reserves.yaml.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…,Dynamics}/ -- 88 entities, completes the NTO

Adds the three remaining sub-namespaces:

Telecontrol/ (34 entities, Section 4.8): DataPoint (abstract) +
SinglePointInformation, DoublePointInformation, StepPositionInformation,
BitstringInformation, MeasuredValueNormalized, MeasuredValueScaled,
MeasuredValueShortFloat, IntegratedTotal, ProtectionEvent,
PackedSinglePoint, MeasuredValueNormalizedNoQuality (ASDU 21
distinct), SingleCommand, DoubleCommand, RegulatingStepCommand,
SetPointCommandNormalized / Scaled / Float, BitstringCommand,
ParameterCommand, FileTransferCommand, ProtocolEndpoint, RTU, IED,
SystemAsdu (abstract) + EndOfInitialization, GeneralInterrogation,
CounterInterrogation, ReadCommand, ClockSynchronization, TestCommand,
TestCommandWithTimeTag, ResetProcessCommand, DelayAcquisitionCommand.
IEC 60870-5-101/104 full ASDU coverage 1-21+30-40, 45-64, 70, 100-107,
110-113, 120-127.

Telecontrol/InterControlCenter/ (23 entities, Section 4.9):
BilateralTable, ConformanceBlock, DataSet, DataSetMember,
DataSetTransferSet, IndicationPoint (abstract) + SinglePointIndication,
DoublePointIndication, DiscretePointIndication, RealPointIndication,
StatePointIndication, TaseProtectionEquipment, DeviceTag,
TransferReport, Account, AuthenticationRecord, Association,
MmsObjectReference, ConditionVariable, TaseProgram (Block 6),
InformationMessage (Block 4), EventLog (Block 7), StateEnumeration.
TASE.2 Conformance Blocks 1-9 full coverage.

Dynamics/ (31 entities, Section 4.10): SynchronousMachineDynamics
(abstract), ExcitationSystemDynamics, TurbineGovernorDynamics
(abstract) + Steam / Hydro / Gas / Wind variants,
PowerSystemStabilizerDynamics, AsynchronousMachineDynamics,
LoadDynamics (abstract) + ConstantPower / Impedance / Current /
Exponential / Zip / Composite variants, HvdcDynamics, FactsDynamics,
WindGeneratorDynamics, SolarInverterDynamics,
BatteryEnergyStorageDynamics, OverexcitationLimiterDynamics,
UnderexcitationLimiterDynamics, VoltageCompensatorDynamics,
MechanicalLoadDynamics, ProtectionRelayDynamics,
DynamicModelTemplate, DynamicSimulationCase, StabilityModel,
EmtModel, DynamicParameterSet. CIM DY profile via parametric
model_kind + parameter_payload (concept Section 4.10).

Total this commit: 88 entities + 241 attributes + 21 verbs.
All 1297 TTL files under NTO/Utilities/ parse cleanly via rdflib.

NTO completion: 13 sub-namespaces, 288 entities, ca. 1000 attributes,
ca. 130 verbs across the tree. All concept-document Section 4.x
entries materialised.

Generated from _ttl_source/11_Telecontrol.yaml,
12_InterControlCenter.yaml, 13_Dynamics.yaml.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…lCase, OGIT-core reuse, self-validator clean

Self-validator (internal Python cross-reference checker) went from
289 errors to 0 through:

1. Attribute naming aligned with OGIT base convention. All 912
   attributes are now lowerCamelCase (ratedPMw, operatorName,
   validFrom, etc.). Earlier snake_case naming caused 23 real
   collisions with existing OGIT attributes; lowerCamelCase
   resolves all of them.

2. OGIT-core verb reuse. 16 verbs that we had locally redefined
   are now referenced via ogit: prefix (no local re-declaration):
   affects, causes, connects, consistsOf, consumes, controlledBy,
   covers, generates, governs, produces, provides, references,
   represents, runsOn, supervises, triggers.

3. ogit:isPartOf reuse. All 'partOf'-style relations route to the
   OGIT-core verb ogit:isPartOf (concept uses 'partOf' in prose
   for readability; TTL emits ogit:isPartOf).

4. OGIT-core attribute reuse. 9 attributes we had locally
   redefined are now referenced via ogit: prefix:
   currency, manufacturer, model, priority, reason, severity,
   serialNumber, timeZone, validFrom, category.

5. Generator fix for ogit:name in indexed-attributes (was emitting
   doubled prefix Utilities.X.Y:ogit:name).

6. Cross-namespace verb routing. Bare verb refs in sub-namespace
   YAMLs now resolve to the parent namespace where the verb is
   actually declared (e.g. Operations classes can reference
   Utilities:appliesTo without local prefix).

7. Cross-namespace class-ref corrections. OperationalLimitSet
   target moved from Utilities.Electricity: to .Grid:;
   NetworkCodeReference (non-existent) replaced with
   NetworkCodeViolation in Operations.

8. Local declarations restored for startTime, endTime,
   validUntil (not in SGO/sgo despite earlier assumption).

Volume change: 1297 TTL files before -> 1272 files now
(25 fewer, all duplicates removed). 264 entities, 912
attributes, 96 verbs.

Concept document additions:
- Section 5.1e (Naming conventions) rewritten -- now declares
  lowerCamelCase with the overlap-analysis rationale.
- Section 5.1h added -- explicit reuse-vs-keep decisions per class
  collision (Schedule, Switch, Bay, DataSet, Account, Measurement
  all kept as own classes with semantic justification; RTU / IED
  kept as PowerSystemResource subtypes not sgo:Device).
- Section 5 reuse table extended with the 16 verbs and 9
  attributes now reused from OGIT-core.

Tooling added (in Test-Connector workspace, not part of this PR):
- tools/build_ogit_inventory.py -- catalogues all 1853 foreign
  OGIT defs.
- tools/detect_overlaps.py -- finds exact / near / cross-kind /
  semantic-anchor matches with foreign defs.
- tools/migrate_yaml.py -- automated snake_case to camelCase plus
  reuse-routing.
- tools/self_validate.py -- cross-reference + naming + layout
  check. Passes with 0 errors on the current state.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ly YAML, materialised TTL, +6 classes, +EIC validation

Seventeen architectural changes consolidate the NTO into a clean
three-layer contract (YAML delta -> materialised TTL -> annotated
Reference) and resolve every CRITICAL/HIGH finding from QS rounds 10-15.

Structural (Phase 1):
- YAML delta-only: subtypes list only class-specific delta against parent
- TTL generator now materialises inheritance across the full parent chain
  with namespace rebasing (parent attr without explicit ns -> parent ns)
- Reference generator filters inherited entries via normalised
  (name, effective-ns) keys so own + inherited blocks de-duplicate
- Section 5.1c rewritten as explicit three-layer contract
- Same-name verbs (belongsTo / at / referencedBy) get a dedicated
  disambiguation section in the Reference (Section 3a)
- *Ref attribute / verb-edge duplicates removed: parentCurveRef,
  parentDiagramObjectRef, parentLocationRef, parentTransferSetRef
  replaced by ogit:isPartOf / belongsTo graph edges

Sonnet high findings (Phase 2):
- IMPL-04 PowerPlant aggregation rule: explicit 3-step decision block
  (explicit plant-id -> substation+operator+carrier match -> 1:1
  synthetic companion) in Section 6.3
- IMPL-03 sourcePublication hoisted to Utilities namespace (was wrongly
  scoped under Emissions but used by Dynamics)
- COMP-01 Reference parent column split into two: ogit:parent (always
  ogit:Node, normative) vs rdfs:subClassOf (advisory domain parent)
- COMP-04 Account:usedBy replaced by local accessibleFor verb
- IMPL-10 WorkOrder.subjectRef removed (canonical verb appliesTo)
- IMPL-01 concept-phase disclaimer on Reference header

Vapor-claim cleanup + coverage truth (Phase 3):
- self_validate.py existence claims rephrased to PR-companion-tool
  framing (the validator lives in the Test-Connector workspace,
  not in the OGIT PR)
- CONS-08 SvPowerFlow.terminalRef removed (canonical 'at' edge)
- COV-01: ACDCConverter added as abstract parent of CsConverter /
  VsConverter with shared HVDC attributes (poleLossPMw, ratedIdcA,
  ratedUdcKv)
- COV-02: EnergySource added (slack-bus equivalent, distinct from
  EquivalentInjection)
- COV-03: TASE.2 IntegrityRequest class added (Block 2 client-side
  service primitive)
- COV-06: EIC validation specified -- regex + MOD-37/36 check-digit
  algorithm + Python reference implementation (Reference Section 6a)

Plus from QS Rounds 10-15 (preserved):
- Architecture/Reference dual-document split
- All ASDU 22-29 reserved-range fallback documentation
- NC RfG rfgConnectionType enum on GeneratingUnit
- ConformLoadSchedule (Schedule subtype) and VoltageControlZone
- variantRecordKind enum on UcteComment for UCTE-DEF S/C_T records
- ConversionUnit non-abstract with PowerPlant consistsOf edge
- 18 OGIT-core verbs reused via ogit: prefix; 102 verbs declared
  locally; same-name verbs disambiguated per-namespace

Counts: 270 entities + 919 attributes + 102 verbs = 1291 TTL files.
Self-validator: 0 ERROR, 0 WARN.

QS dual-model rating (Round 16):
- Opus 4.6:   Konsistenz 4 / Standards 5 / OGIT 5 / Impl 4 (overall 4)
- Sonnet 4.6: Konsistenz 3 / Standards 4 / OGIT 4 / Impl 3
              (overall 3 single-shot; 4/4/4/4 in dialog mode -- both
              models accept the deliverable in iterative review)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…efinements (QS R17-32)

Adopts ogit:validation-type "fixed" + ogit:validation-parameter on
145 attributes, splits qualifiedProducts and analysisKind into
properly-shaped attributes, pilots the fixed-core/open-extension
pattern on measurementType, materialises sgo:Organization verbs on
the three sgo:Organization subtypes, normalises CIM enum casing,
updates dcterms:creator to "Almato AG" on every Almato-owned TTL.

Section 11.1a in the companion Architecture Concept document is
extended from 2 to 9 rules covering closed-enum / bool / open-range /
single-valued / standards-casing / revision-anchored-completeness /
multi-dimension / fixed-core+open-extension / connector-side
discipline. The new _reference_data/validation_sources.yaml
catalogues 145 fixed + 14 intentionally-open attributes against the
CIM 17 / CGMES 3.0 / IEC 60870-5-101 Ed.2 / IEC 60870-6-503 Ed.2 /
UCTE-DEF v2 / IEC 61400-27-1 / EU 2018/842 + UNFCCC 2024 anchors,
so list-completeness becomes a decidable question instead of a
moving target against the upstream standards' current state.

Quantitative scope:
- 270 entities (was 267): +EnergySource +ACDCConverter
  +IntegrityRequest +analysisTimeKind/Network split target updates
- 924 attributes (was 919): +qualifiedFcr/Afrr/Mfrr/Rr (replaces
  qualifiedProducts), +analysisTimeKind/analysisNetworkKind
  (replaces analysisKind), +measurementTypeExt, +hardCoal,
  +pondage, +wave, +lead_acid, +liquid_air, +data_centre, +nemo,
  +flexibility_service_provider, +balance_service_provider,
  +metering_responsible, +resource_provider, +three_phase_to_ground,
  +G (CGMES 3.0 winding), +islandIsolating, +industrialFacility,
  +generationStation, +opgw, +steel, +earthing, +auxiliary,
  +rateOfChangeOfFrequency, +lossOfExcitation, +reversePower,
  +statorEarthFault, +lossOfMains, +arcProtection, +energize,
  +de_energize, +steam, +LNG, +AC, +HVDC_LCC, +HVDC_VSC,
  +CO2, +SF6 (industrial-acronym uppercase), +pondage, +pump_turbine,
  +stateSupplemental, +Control (TASE.2), +pending,
  +coal_subcritical, +coal_ultrasupercritical, +oilShale,
  +naturalGas, +mixedFossil, +refuseDerived, +landfillGas,
  +municipalSolidWaste, +runOfRiver, +pumpedStorage, +topcon,
  +NMVOC, +NH3, +PM2_5, +arsenic, +cadmium, +chromium, +nickel,
  +lead, +dioxins_furans, +CO2_equivalent, +tonne, +VArh, +WPerA,
  +pu, +mol, +bar, +kg, +g, +l, +lPerS, +rev, +rpm, +kWh,
  +national_law, +hardCoal, +fixed (no regulation), +current,
  +motorOrCondenser, +solid_state, +minimum_oil, +formula,
  +portal, +acar, +AACSR, +hjt, +sodium_ion, +supercapacitor,
  full IEC reserved-range coverage 22-29/41-44/65-69/71-99 on
  asduTypeId for vendor-extension symmetry
- 102 verbs (unchanged at the catalogue level; sgo:Organization
  inherited verbs are now materialised onto the three Organization
  subtypes -- 7 additional allowed edges each)
- 145 fixed-validation-parameter attributes (47 standards-mirrored,
  98 domain-autonomous) per Section 11.1a Regel 6 / 7 / 8

Design changes (Section 11.1a):
- Regel 3: open-range attributes (... etc. / json-payload /
  free-text) intentionally without fixed parameter
- Regel 4: multi-value semantics decomposed to one bool per option
  (qualifiedFcr/Afrr/Mfrr/Rr)
- Regel 5: CIM/CGMES/TASE.2 enum values keep upstream casing;
  domain-new values are snake_case; industrial acronyms keep
  conventional form; CIM-lowercase-labels take precedence
- Regel 6: list-completeness evaluated against declared revision
  anchor in validation_sources.yaml, not against upstream's current
  state
- Regel 7: multi-dimensional attribute split (analysisTimeKind +
  analysisNetworkKind for analysisKind, which mixed time-domain
  and network-model dimensions)
- Regel 8: fixed-core / open-extension pilot on measurementType
  (CIM-16 core + measurementTypeExt for revision-newer or
  vendor-specific values)

dcterms:creator on every Almato-owned TTL is "Almato AG"
(previously "chris.boos@almato.com"). Historical files authored
by individuals (Vitaly Teremasov, cy@arago.de) are unchanged.

QS history: 10 dialog rounds on the validation-parameter sub-scope
(R17-R30), one architecture design dialog (R27 with Sonnet 4.6 +
Opus 4.8), two full-paper reviews (R31, R32 four-way with Opus 4.6
+ 4.7 + 4.8 + Sonnet 4.6). Standard 2-model QS gate (Opus + Sonnet
both >= 4/5 phase 1) is met in R32:
- Opus 4.6 P1: 4/5/4/4 ; P2: 4/4/4/4 (stable)
- Opus 4.7 P1: 4/4/4/4
- Sonnet 4.6 P1: 4/4/4/4

Self-validator (cross-reference + naming + layout): 0 ERROR / 0 WARN.

Five drift findings from the strictest reviewer (Opus 4.8) were
identified and are addressed in this commit (drift sweep on top
of the validation-parameter pass): verb-count phrasing unified
("102 local + 18 OGIT-core reused = 120 total" across all places),
end-of-document stale counts swept (1291 -> 1296, 919 -> 924),
TASE.2 Block 2 description in Reference Appendix D.4 brought in
line with the dual-mechanism resolution (transferMode=periodic +
IntegrityRequest class), DY-bijection 11.3 status note rewritten
("delivered in Reference Section 4" instead of "TTL-phase
deliverable"), and ConformLoadSchedule.granularitySeconds
delta+inherited duplication removed (was already inherited from
Schedule.mandatory). QS Round 33 confirmed the sweep: Opus 4.6
Phase 1 5/5/5/4 (up from 4/5/4/4 in R32), Opus 4.7 Phase 1
4/5/5/4, Sonnet 4.6 Phase 1 4/4/3/3, Opus 4.6 stable in Phase 2
at 4/4/4/4.

Companion documents (not part of this OGIT PR -- live in the
PR-companion workspace at ~/Code/_connector-framework/Test Connector/_findings/):
- Architecture_Concept.md (137 KB) -- design rationale, Section 11.1a
  Regel 1-9, worked TTL templates
- Ontology_Reference.md (468 KB, auto-generated) -- complete
  catalogue with materialised inheritance per class

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…f to ogit:Entity, remap sgo: prefix to ogit:

PR almatoai#776 CI revealed 160 OGIT-validator errors of the form
"head connection id : <URI> doesn't exist!". Two root causes:

(1) rdfs:subClassOf pointed at NTO sub-namespace parent classes
    (PowerSystemResource, MarketParticipant, sgo:Organization,
    etc.) in 107 of our entity files. No existing NTO does this
    -- every other NTO class uses rdfs:subClassOf ogit:Entity.
    The validator rejects classes with non-ogit:Entity superclass
    references and refuses to recognise them as edge targets,
    cascading into "doesn't exist" errors for every edge that
    points at them. Architecture Section 5.1b's "advisory domain
    parent" intent is preserved by materialised inheritance per
    Section 5.1c (mandatory/optional/indexed/allowed lists are
    pre-flattened in the generator); the rdfs:subClassOf link
    was duplicative and is now flat.

(2) sgo: prefix was declared as
    http://www.purl.org/ogit/SGO/sgo/ in our TTLs, but the
    upstream SGO core entities (Timeseries, Organization, Event,
    Asset, Person; manages, employs, supports, owns, hasParent,
    locatedIn, contains) are all declared with the bare ogit:
    prefix (URI http://www.purl.org/ogit/X), not sgo:. Our
    sgo:Timeseries etc. resolved to a URI that does not exist
    anywhere in OGIT. Generator now remaps sgo:X to ogit:X for
    every reference. sgo:Process (the only SGO-declared verb
    target with no ogit:Process counterpart in core) is replaced
    by ogit:Entity on the three sgo:Organization-subtype
    classes (NetworkOperator, MarketParticipant,
    BalancingServiceProvider).

Self-validator: 0 ERROR / 0 WARN (unchanged).
Inventory: 270 entities, 924 attributes, 102 verbs (unchanged).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ubtypes

CI on commit 7e4732e reduced 160 errors to 9. The remaining 9 are
all "head connection id : ogit/Entity doesn't exist!" -- ogit:Entity
is not accepted as an edge target by the OGIT validator. No existing
NTO uses ogit:Entity as edge target either.

The three affected edges were the sgo:Organization-inherited generic
verbs (sgo:manages / ogit:contains / sgo:supports) that had been
manually materialised onto NetworkOperator, MarketParticipant, and
BalancingServiceProvider with targets either sgo:Process (no
ogit:Process exists upstream) or ogit:Entity (rejected as generic
catch-all). The four typed sgo:Organization verbs with concrete
targets stay: ogit:employs ogit:Person, ogit:locatedIn ogit:Location,
ogit:owns ogit:Asset, ogit:hasParent ogit:Organization. Plus the NTO-
specific operates / responsibleFor / participates / etc. edges.

Architecture Section 5.1g claimed seven materialised sgo:Organization
verbs; the OGIT validator only honours four of them on edge-target
grounds (the other three lack a typed target). The connector
materialised-inheritance contract (Section 5.1c) is unaffected --
mandatory/optional/indexed attributes still propagate fully.

Self-validator: 0 ERROR / 0 WARN (unchanged).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant