Extended Matrix

Extended Matrix Development Projects

← Back to Roadmap
DP-67

Neutral Stratigraphic Unit (USNV) class + empty-volume / surface rendering for negative units

Core Language v1.7 StratiGraph ↗ s3DgraphyEMtoolsyEd palettes3D config (rules)Heriverse

Description

Extended Matrix has been authoring rooms, doorways, and evacuated spaces for years through a workaround: the modeller creates a regular US (or even a USN) for the surrounding wall structure and lets the room exist implicitly as ‘what’s not the wall’. The graph then carries the wall as a stratigraphic unit with chronology and paradata, while the room — which an archaeologist often cares about as much as the wall, sometimes more — has no representation. This wasn’t a deliberate omission but a structural gap: CRMarchaeo’s A2_Stratigraphic_Volume_Unit explicitly models a volume of soil deposit, with matter inside. The CIDOC-CRM extension family has no native class for ‘volume of stratigraphic relevance defined by the absence of material’. The current NegativeStratigraphicUnit (USN, crmarchaeo:A3_Stratigraphic_Interface) models the surface case — a cut, an erosion line, the boundary between two units — which is genuinely a different concept from the empty volume case. Conflating them in colloquial language was easy; conflating them in the data model loses the distinction that an archaeologist routinely makes during reasoning.

DP-67 closes the gap by introducing em:NeutralStratigraphicUnit (node_type USNV) as a new EM-specific class in em.ttl, subclassing crmarchaeo:A2_Stratigraphic_Volume_Unit so it inherits volume semantics from the CRMarchaeo hierarchy while declaring an EM-specific extension for the void-fill case. The existing NegativeStratigraphicUnit (USN, A3 Interface) stays exactly as it is. The split is clean and additive: existing graphs that authored rooms-as-walls don’t change behavior; new authoring on EM 1.7 can pick USNV from the Add-US dialog to record the void volume as a first-class entity with its own chronology, its own paradata chain, and its own RM (whose mesh is a proper closed volume representing the room’s spatial extent).

Why this is more than a rendering trick. A naive reading of the problem (“we just need to render USN differently”) would miss the architectural point: rooms and doorways aren’t the same concept as cut surfaces. A room has volume, a chronology of construction-and-use-and-decommissioning, paradata about its function and inhabitants, and proxies that fill space differently from a wall fragment. A cut surface has no volume, no use-chronology, paradata about the moment of cutting, and proxies that represent a 2D boundary. Putting both under one class because they share a ‘negative’ character would be like putting Doric and Ionic capitals under one class because both top columns. The EM language layer benefits from the discrimination, and CRMarchaeo’s existing parent class structure (A2 for volumes, A3 for surfaces) already separates them at the level the EM extension piggybacks on.

The rendering side, which the language change enables. Once the class distinction is in place, the Visual Manager (DP-35) gains a class-aware render-mode dispatcher: USN → flat single-sided surface (no thickness implied), USNV → empty-volume render (wireframe edges by default, with low-alpha transparent fill as an optional toggle), other US-family → filled as today. The dispatcher reads the node_uuid linkage on each Blender object back to the s3dgraphy node, resolves the class once at material-build time, caches the mode on the object’s PROPERTIES, and the per-frame draw is unchanged. The crucial detail: the epoch / chronology / author / license colour carrier that the propagative resolver (DP-32) flows through every visible mesh today carries through to the wireframe edges of USNV and the surface colour of USN. A modeller looking at a 3rd-century-BC void volume sees a wireframe room whose edges are the same chronological green as the surrounding 3rd-century-BC filled walls — the spatial-temporal reading at a glance survives the empty rendering. Property-based colouring (toggleable in the Visual Manager) propagates uniformly too.

The override / escape hatch. Not every render is an authoring view. For publication cover renders, traditional EM diagrams, or legacy-style figures where the room should appear filled (to look like a continuous architectural block), the modeller flips Scene.em_tools.usn_render_mode from auto to force_filled. The dispatcher then renders USN/USNV like regular US — temporarily, just for that render. The opposite is also available: force_wireframe treats every USN/USNV as wireframe even if the project default is the transparent fill mode, useful for archival sketch-style outputs. The override scopes only to the two negative-type classes; it doesn’t become a global wireframe mode (that would be a separate, larger concept). The Heriverse export panel mirrors the same dropdown, so the published model in the browser can use a different render mode than the authoring viewport — a project might author in wireframe (clearer at design time) but publish in transparent-fill (more inviting for non-specialist viewers).

The pyArchInit ↔ EM round-trip discipline that DP-62 and PR #22/#23 already established carries over. The new USNV node_type lives in attributes['unita_tipo'] verbatim like every other type code, so the value survives the GraphML d13 packed-string ↔ pyArchInit rapporti ↔ s3dgraphy canonical-edges chain without mutation. The multilingual recognition table in sync.rapporti.UNITA_TIPO_CANONICAL needs an entry for USNV’s localized variants (Italian convention is the canonical USNV; English / German / Spanish / etc. will need a per-locale convention call with pyArchInit i18n table contributors before 1.7 cuts). Once added, the multilingual story for USNV is complete from day one — same path PR #22 traced for US/USM in 2026-06.

Heriverse coherence in MVP scope. The Heriverse exporter (DP-11) consumes the same class-aware dispatcher and emits GLTF that reflects the project’s usn_render_mode. Wireframe USNV exports as GLTF line primitives (Heriverse’s web viewer renders them efficiently — no per-pixel raster cost like for transparent surfaces); transparent USNV exports as low-alpha triangle fills (more expensive but visually richer). The browser viewer doesn’t need to know about USN/USNV semantics — the export bakes the right geometry. A small toggleable legend overlay in the viewer can be added to explain the visual convention to non-specialist visitors (“wireframe rooms are empty stratigraphic volumes — doorways, internal spaces”), turned off by default so the cover view stays uncluttered.

Scope discipline for 1.7. The MVP is exactly what’s described above: new class declaration + Add-US dialog support + Visual Manager dispatcher + Heriverse coherence + the project-level override. What’s explicitly not in MVP scope but worth naming as future arcs: (i) a migration assistant that scans legacy graphs for box-shaped US proxies suggestive of empty volumes and offers reclassification — useful but post-1.7; (ii) a new edge type ‘bounds’ that explicitly links a USNV to its bounding US/USM units (rooms-bounded-by-walls relationship made queryable) — interesting but deserves its own design call, possibly DP-68; (iii) extension of the same render-mode pattern to other EM language extensions that might want non-filled visualization (TimeBranch group nodes? activity envelopes?) — deferred until the 1.7 USNV/USN rendering is stress-tested on a real reconstruction. The StratiGraph excavations active during the 1.7 cycle are again the natural beta testers: any project with interior spaces (Roman house, fortified architecture, multi-room shrine) will exercise USNV authoring + rendering + Heriverse coherence in a single workflow pass.

Status

Concept — 1.7

Target EM Version

1.7

Impacts

s3DgraphyEMtoolsyEd palettes3D config (rules)Heriverse

Components

  • New EM class `em:NeutralStratigraphicUnit` declared in `em.ttl` as `rdfs:subClassOf crmarchaeo:A2_Stratigraphic_Volume_Unit` (volume parent — empty volumes ARE still volumes, semantically, just defined by absence of fill rather than presence). Adopted node_type `USNV` (Unità Stratigrafica Neutra Volumetrica). The class label and comment make the distinction with NegativeStratigraphicUnit explicit so future contributors don't conflate.
  • Multilingual label coverage on the new class from day 1 (DP-63 pattern): `rdfs:label "Neutral Stratigraphic Unit"@en, "Unità Stratigrafica Neutra"@it, …`. The other 8 UI languages pyArchInit ships (de/es/fr/ar/ca/ro/pt/el) follow the curated translation pass DP-63 schedules.
  • Datamodel entry in `s3Dgraphy_node_datamodel.json` with `em_extension` block (parallel to the existing 29 classes that already carry one in 1.6). Field-aware additions: `is_empty: true` flag for SPARQL convenience, `geometric_kind: "volume"` (the rendering dispatcher reads it as a sanity check against the mesh geometry attached to the linked RM).
  • yEd palette: new template node for `USNV`. Visual identity discriminates from USN: same dashed-border style (because both are non-filled in some sense), with a distinct hatch / dot fill pattern. Colour follows the EM palette convention (epoch-driven on the canvas).
  • GraphML parser handling for the new USNV node_type — same shape as the DP-55 tail did for USN. The parser already discriminates by `unita_tipo`; one extra family entry covers `USNV`.
  • Stratigraphy Manager Add-US dialog (DP-55): adds `USNV` to the type picker, with helper text *‘Empty volume — room, doorway opening, evacuated space’* to disambiguate from USN (*‘Cut surface or erosion interface’*). The Proxy Box Creator (DP-46) accepts `USNV` as the target type — the seven-point measurement system produces the box, and the box represents the void volume rather than the bounding material.
  • Visual Manager class-aware render-mode dispatcher (DP-35 extension). Maps node class → render mode at object draw time. USN → surface-only render (single-sided shaded mesh, no thickness implied, edge color = epoch). USNV → empty-volume render (default: wireframe with epoch-color edges; alternate: low-alpha transparent fill with epoch-color tint + edge highlights). Other US-family → unchanged filled rendering. The dispatch reads the `node_uuid` linkage on the Blender object back to s3dgraphy and resolves the class once at material-build time, caching the mode on the object's PROPERTIES so the per-frame draw doesn't pay the lookup.
  • Colour carrier preservation: the wireframe edge colour on USNV (and the surface colour on USN) consume the SAME Visual Manager colour ramp used by filled US-family meshes. When the user has *Property-based colouring* enabled (chronology / author / license / embargo via the DP-32 propagative resolver), USNV/USN inherit the colouring uniformly — the chronological reading at a glance survives the empty rendering. When the user has *EM-palette colouring* (the default per-class palette colours), USNV/USN wireframes adopt the per-class colour same as filled units would.
  • Render-mode override on `Scene.em_tools.usn_render_mode` (StringProperty enum). Values: `auto` (default — class-aware dispatch as above), `force_filled` (treat USN/USNV as regular filled volumes, useful for traditional cover renders and legacy-style publication figures), `force_wireframe` (treat USN/USNV as wireframe even when authored as filled — applies only to the two negative-type classes, NOT to all US-family). UI: a single dropdown in the Visual Manager header, mirrored as a setting in the Heriverse export panel so the published model can have a different mode than the authoring viewport if needed.
  • Heriverse exporter (DP-11) coherence: same class-aware dispatch in the GLTF generation step. USNV exports as wireframe geometry (line primitives, GLTF supports them) or as low-alpha transparent fill depending on the project-level `usn_render_mode`. USN exports as single-sided surface mesh. The browser viewer reads the GLTF as-is — no client-side switching needed, the rendering decision is baked at export time. A small legend overlay in the viewer optionally explains the convention (toggleable, off by default).
  • Round-trip discipline: USNV nodes round-trip pyArchInit ↔ s3dgraphy ↔ GraphML through the canonical-edges + multilingual-rapporti pipeline (DP-62 + DP-63 PR #22/#23). Since `unita_tipo` is preserved verbatim on `attributes['unita_tipo']` (DP-62), a `USNV` from an Italian site lands as `USNV`, an English site equivalent (`SVV`? — to be decided in the multilingual table extension) also round-trips. Multilingual code-mapping for USNV added to `UNITA_TIPO_CANONICAL` in `sync.rapporti` per the per-language convention pyArchInit uses (TBD with the pyArchInit i18n table maintainers — same flow as the US/USM extensions of PR #22).
  • Migration tooling (post-1.7 stretch, mentioned for completeness): a 'find-and-convert' assistant that scans a legacy graph for box-shaped US proxies whose contained geometry suggests an empty volume (room-like aspect ratios, contained inside a wall structure) and offers to reclassify them as USNV. Out of scope for the 1.7 cut; the manual reclassification path through the Stratigraphy Manager covers the day-one need.

Key Study

Needed — an architectural reconstruction with explicit interior spaces (rooms, doorways, internal partitions) where the empty volumes carry chronological weight equal to the surrounding walls. The TempluMare excavation has the right shape; a smaller test on a Roman house with three or four rooms across two phases would stress the rendering + colour-carrier path with realistic z-overlap between USNV instances.

Notes

Designed 2026-06-08 after the maintainer surfaced a real terminological tension: the current `NegativeStratigraphicUnit` (USN, mapped to `crmarchaeo:A3_Stratigraphic_Interface`) models the SURFACE case — a cut, an erosion line, the contact between two units. The maintainer was using ‘USN’ colloquially to also mean the VOLUMETRIC case — a room volume, a doorway opening, an evacuated conduit, where the absence of material IS the unit. These are two distinct stratigraphic concepts and CRMarchaeo does NOT collapse them — A3 is a surface, A2 is a volume, and the void-volume case has no native CRMarchaeo class because A2 implies *‘volume of soil deposit’* (i.e. matter, not absence). DP-67 introduces `em:NeutralStratigraphicUnit` as an EM-specific extension subclassing `A2` with the semantics ‘stratigraphic volume defined by absence of fill’. The existing USN stays unchanged (negative surface, A3); the new USNV captures the volumetric-void case. The split is therefore a language change, not just a rendering trick — which is why this is a 1.7 piece rather than a 1.6 tail on top of DP-55 (DP-55's 1.6 tail completes the visual operationalization of the existing surface-USN, which remains a prerequisite for DP-67's class addition not colliding with anything in the 1.6 cycle). The rendering work is conceptually separable from the language work — once the new class is declared and round-tripping, the Visual Manager dispatcher is a pure UI/render piece, no further data-layer dependency. Captured decisions 2026-06-08: (A) option (b) — new class, language change; (B) target 1.7; (C) render mode = wireframe OR low-alpha transparent toggle, default wireframe; (D) colour carrier = epoch colour on wireframe edges (option i); (E) NegativeSU = flat single-sided surface (no upward-projection visualization in MVP); (F) Heriverse coherence in MVP scope (one DP, both surfaces); (G) escape hatch override at scene-level. Open decisions still to thread at review: (1) USNV multilingual table — pyArchInit currently localizes US/USM only, not USNV. The DP-63 multilingual track should add USNV → its localized variants per language (Italian convention is established but English/German/Spanish/etc need a per-locale call). Voto mio for English: `SVV` (Stratigraphic Void Volume) or `NSU` (Neutral SU); will defer to pyArchInit i18n table contributors. (2) yEd palette visual: dashed-border + which fill pattern? Dotted (recalls the void), hatched, blank? Proposal: dotted fill on dashed border, but the EM-palette author has the final say. (3) Whether USNV proxies should auto-mark the surrounding US/USM as ‘bounds USNV’ via a new edge type, so the bounded-vs-bounding relationship is queryable. Sketch only; defer to a 1.8 design call. Cross-refs: DP-35 (Visual Manager — home of the new class-aware dispatcher); DP-46 (Proxy Box Creator — produces USNV proxies); DP-50 (Surface Areale System — adjacent surface-mesh work, kept distinct since USN/USNV are stratigraphic-unit classes, not surface-proxy strategies); DP-55 (Stratigraphic Unit Creation Workflow — Add-US dialog gains the USNV type); DP-43 (Group Nodes — Activity/Epoch context the new class inherits like every other US-family); DP-32 (Propagative Metadata Resolver — chronology/author/license colouring flows through to wireframe edges uniformly); DP-11 (Heriverse exporter — class-aware GLTF generation); DP-62 (canonical-edges — round-trip plumbing reused, `unita_tipo` preserved verbatim); DP-63 (multilingual labels — the new class gets `@en/@it` from day 1 and a USNV multilingual code table joins the unita_tipo aliasing in PR #22/#23); DP-66 (property inheritance — USNV properties can be reused/derived on container nodes via the same `@source` + `is_premise_of` plumbing); DP-26 (Spolia / RSF — adjacent special class).