Object-nature model, Identifier value object, identity→core merge, site fixes
Summary
This branch refactors how UNSCRO models identity, merges the identity domain into core, and fixes a range of publishing and documentation-site issues. The vocabulary's term, property, code and concept URIs are unchanged throughout; the changes are to modelling metadata, generated outputs, and the two sites. All eight validation gates pass.
Object nature: entities vs value objects
Every class now declares exactly one unece:objectNature (on:entity or on:value) from a new object-nature code list, so the distinction between an identity-bearing entity (a Consignment, a Party) and an anonymous value bundle (a Measure, a Dimension) is explicit rather than inferred. Value objects align to schema:StructuredValue. A new closed-world validation gate (gate 8) fails the build if any class is untagged, so an omission can never masquerade as an entity. The 90-class split (52 entity, 38 value) is worksheeted in methodology/source-analysis/identifier-class-triage.csv, and the reasoning is recorded in methodology/identifier-strategy.md.
Identifier model
Scheme-qualified identifiers are now modelled as an Identifier value object (registeredId + idScheme to IdentifierScheme + optional name), aligned to schema:PropertyValue, and unece:identifier becomes a repeatable object property. An entity's own identity remains its node URI, so nothing extra is needed to identify it. This reconciles the three source patterns (BSP's per-scheme property explosion, UNTP's single flat scheme+value pair, and schema.org's PropertyValue), and deliberately keeps cardinality out of the vocabulary so downstream schemas decide one-or-many. CCTS Identifier.Type was reviewed and its scheme-metadata components declined, because a registered scheme URI (per the UNTP/GRID approach) normalises that metadata behind the scheme rather than copying it onto every identifier.
Identity domain merged into core
The former identity domain (parties, places, identifiers) is merged into core, so there are now seven domains including a shared Core. Only rdfs:isDefinedBy moved; every URI and definition is unchanged. The detailed clickable SVG relabels its Identity region to Core, and the home-page domain map is redesigned into six equal coloured boxes over a full-depth Core peer.
Publishing and rendering
The identity set (identifier, name, description) now renders on entity class pages (identifier pinned first, then alphabetical) and never on value objects. Domain diagrams are colour-coded by object nature (blue entity, green value, grey other-domain) with a legend and colour-blind-safe stereotype labels, and the diagram auto-balancer now compares both orientations and keeps the more page-friendly one instead of blindly flipping. The resolvable-vocab output is cleaned up: the unece prefix is correct (no ns1 or doubled path segment), the JSON-LD @context is a tight curated set rather than rdflib's ~30 default namespaces, and unused untp/rdf prefixes are dropped. The local server now serves JSON-LD as text/plain to browsers so the representation link renders raw instead of the browser's JSON tree viewer, with the production CloudFront equivalent documented.
Documentation site
Broken cross-page navigation links (missing the /docs prefix) are fixed site-wide, Pagefind search-index generation is wired into the build so the search box works instead of returning "failed to load search index", and a GitLab repository icon is added to the navbar. The getting-started page gains a new JSON-LD linking concept diagram explaining how documents connect structure (JSON Schema) to meaning (shared vocabularies via a JSON-LD context), plus copy edits and typo fixes. All domain-count text is corrected to "seven domains including core".
Validation
python3 scripts/validate-vocab.py passes all eight gates (90 classes, 745 properties). Both the resolvable vocabulary (dist/) and the docs site (out/) rebuild cleanly, and a full crawl of the docs site reports no broken internal links.