s3dgraphy 1.6.0.dev12__tar.gz → 1.6.0.dev13__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. {s3dgraphy-1.6.0.dev12/src/s3dgraphy.egg-info → s3dgraphy-1.6.0.dev13}/PKG-INFO +5 -1
  2. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/pyproject.toml +28 -1
  3. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/em.ttl +2 -2
  4. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/em_visual_rules.json +87 -29
  5. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/node_registry.generated.json +6 -1
  6. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json +30 -10
  7. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/s3Dgraphy_node_datamodel.json +43 -4
  8. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/ActivityNodeGroup.svg +1 -0
  9. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/EMNarrative.png +0 -0
  10. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/EMNarrative.svg +64 -0
  11. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/EpochNode.svg +1 -0
  12. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/ParadataNodeGroup.svg +1 -0
  13. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/SE.svg +46 -0
  14. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/SE_old.png +0 -0
  15. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/SE_old.svg +65 -0
  16. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/SF.svg +32 -0
  17. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/US.svg +32 -0
  18. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/USD.svg +32 -0
  19. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/USVn.svg +32 -0
  20. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/USVs.svg +32 -0
  21. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/UTR.svg +24 -0
  22. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/VSF.svg +32 -0
  23. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/author.svg +1 -0
  24. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/combiner.svg +95 -0
  25. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/continuity.svg +19 -0
  26. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/document.svg +27 -0
  27. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/dtc/00_transformation.svg +76 -0
  28. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/dtc/01_topographicnetwork.svg +78 -0
  29. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/dtc/02_pointcloud.svg +68 -0
  30. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/dtc/03_mesh.svg +130 -0
  31. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/dtc/04_points.svg +119 -0
  32. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/dtc/05_lines.svg +67 -0
  33. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/dtc/06_polygons.svg +71 -0
  34. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/dtc/07_DEM.svg +77 -0
  35. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/dtc/08_ortophoto.svg +136 -0
  36. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/dtc/09_photos.svg +89 -0
  37. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/dtc/10_laserscanner.svg +99 -0
  38. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/extractor.svg +35 -0
  39. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/generic_node.svg +38 -0
  40. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/geo_position.svg +1 -0
  41. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/link.svg +1 -0
  42. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/play.svg +1 -0
  43. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/property.svg +42 -0
  44. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/representation_model.svg +1 -0
  45. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/representation_model_doc.svg +1 -0
  46. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/representation_model_sf.svg +1 -0
  47. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/semantic_shape.svg +1 -0
  48. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/serSU.svg +32 -0
  49. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/serUSVn.svg +32 -0
  50. s3dgraphy-1.6.0.dev13/src/s3dgraphy/JSON_config/src/2D/serUSVs.svg +32 -0
  51. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/__init__.py +1 -1
  52. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/api.py +376 -16
  53. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/classification.py +3 -2
  54. s3dgraphy-1.6.0.dev13/src/s3dgraphy/exporter/docx_exporter.py +186 -0
  55. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/json_exporter.py +3 -3
  56. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/rdf_exporter.py +17 -8
  57. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/importer/base_importer.py +27 -8
  58. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/importer/import_graphml.py +65 -22
  59. s3dgraphy-1.6.0.dev13/src/s3dgraphy/importer/source_text.py +171 -0
  60. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/importer/unified_xlsx_importer.py +87 -9
  61. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/importer/xlsx_importer.py +3 -2
  62. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/mappings/registry.py +8 -2
  63. s3dgraphy-1.6.0.dev13/src/s3dgraphy/mappings/source_list/source_list_mapping.json +34 -0
  64. s3dgraphy-1.6.0.dev13/src/s3dgraphy/narrative/bake.py +486 -0
  65. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/stratigraphic_node.py +72 -14
  66. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/shelf/__init__.py +2 -0
  67. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/shelf/core.py +55 -12
  68. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/graphml_writer.py +7 -0
  69. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/rapporti.py +5 -1
  70. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/utils/utils.py +7 -0
  71. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13/src/s3dgraphy.egg-info}/PKG-INFO +5 -1
  72. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy.egg-info/SOURCES.txt +55 -1
  73. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy.egg-info/requires.txt +6 -0
  74. s3dgraphy-1.6.0.dev13/tests/test_canvas_metadata_import.py +47 -0
  75. s3dgraphy-1.6.0.dev13/tests/test_epoch_undated_import.py +54 -0
  76. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_importer_edge_hygiene.py +21 -4
  77. s3dgraphy-1.6.0.dev13/tests/test_narrative_bake_docx.py +448 -0
  78. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_recompute_warnings.py +10 -8
  79. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_shelf_facets.py +58 -0
  80. s3dgraphy-1.6.0.dev13/tests/test_source_list_mapping.py +29 -0
  81. s3dgraphy-1.6.0.dev13/tests/test_source_text.py +222 -0
  82. s3dgraphy-1.6.0.dev13/tests/test_stratiminer_api.py +317 -0
  83. s3dgraphy-1.6.0.dev13/tests/test_xlsx_importer_graph_init.py +48 -0
  84. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/LICENSE +0 -0
  85. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/MANIFEST.in +0 -0
  86. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/README.md +0 -0
  87. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/setup.cfg +0 -0
  88. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/acquisition_descriptor.schema.json +0 -0
  89. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/acquisition_mappings/ercolano.json +0 -0
  90. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/acquisition_mappings/fs.json +0 -0
  91. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/em_document_types.json +0 -0
  92. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/em_extractor_types.json +0 -0
  93. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/em_palette_icons.json +0 -0
  94. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/em_qualia_types.json +0 -0
  95. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/em_qualia_types_additions.json +0 -0
  96. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/hdto_extension.ttl +0 -0
  97. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/new_qualia_template.json +0 -0
  98. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/outdated_s3dgraphy.ttl +0 -0
  99. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/outdated_s3dgraphy_nomapping.ttl +0 -0
  100. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json.v155.bak +0 -0
  101. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/RSF.png +0 -0
  102. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/RSF.svg +0 -0
  103. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/SF.png +0 -0
  104. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/TSU.png +0 -0
  105. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/US.png +0 -0
  106. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/USD.png +0 -0
  107. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/USVn.png +0 -0
  108. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/USVs.png +0 -0
  109. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/VSF.png +0 -0
  110. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/author.png +0 -0
  111. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/author_ai.png +0 -0
  112. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/combiner.png +0 -0
  113. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/continuity.png +0 -0
  114. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/document.png +0 -0
  115. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/embargo.png +0 -0
  116. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/extractor.png +0 -0
  117. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/license.png +0 -0
  118. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/narrative.png +0 -0
  119. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/property.png +0 -0
  120. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/serSU.png +0 -0
  121. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/serUSD.png +0 -0
  122. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/2D/serUSV.png +0 -0
  123. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/3D/RSF.glb +0 -0
  124. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/3D/SF.glb +0 -0
  125. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/3D/TSU.glb +0 -0
  126. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/3D/US.glb +0 -0
  127. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/3D/USD.glb +0 -0
  128. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/3D/USVn.glb +0 -0
  129. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/3D/USVs.glb +0 -0
  130. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/3D/VSF.glb +0 -0
  131. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/3D/combiner.glb +0 -0
  132. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/3D/continuity.glb +0 -0
  133. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/3D/document.glb +0 -0
  134. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/3D/extractor.glb +0 -0
  135. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/3D/property.glb +0 -0
  136. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/3D/serSU.glb +0 -0
  137. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/3D/serUSD.glb +0 -0
  138. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/JSON_config/src/3D/serUSV.glb +0 -0
  139. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/acquisition/__init__.py +0 -0
  140. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/acquisition/acquire.py +0 -0
  141. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/acquisition/descriptor.py +0 -0
  142. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/acquisition/mapping.py +0 -0
  143. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/authorities/__init__.py +0 -0
  144. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/authorities/resolver.py +0 -0
  145. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/authorities/snapshots/LICENSE +0 -0
  146. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/authorities/snapshots/chronontology.jsonld +0 -0
  147. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/authorities/snapshots/getty_aat.jsonld +0 -0
  148. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/authorities/snapshots/getty_tgn.jsonld +0 -0
  149. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/authorities/snapshots/periodo.jsonld +0 -0
  150. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/authorities/snapshots/provenance.json +0 -0
  151. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/data/StratiMiner_Extraction_Prompt.md +0 -0
  152. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/diagnostics.py +0 -0
  153. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/dtc/__init__.py +0 -0
  154. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/dtc/residency.py +0 -0
  155. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/edges/__init__.py +0 -0
  156. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/edges/connection_resolver.py +0 -0
  157. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/edges/connections_loader.py +0 -0
  158. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/edges/edge.py +0 -0
  159. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/__init__.py +0 -0
  160. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/emjson_exporter.py +0 -0
  161. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/graphml/__init__.py +0 -0
  162. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/graphml/canvas_generator.py +0 -0
  163. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/graphml/edge_generator.py +0 -0
  164. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/graphml/epoch_generator.py +0 -0
  165. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/graphml/graphml_exporter.py +0 -0
  166. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/graphml/graphml_patcher.py +0 -0
  167. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/graphml/group_node_generator.py +0 -0
  168. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/graphml/node_generator.py +0 -0
  169. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/graphml/node_registry.py +0 -0
  170. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/graphml/palette_resources.py +0 -0
  171. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/graphml/paradata_generator.py +0 -0
  172. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/graphml/paradata_image_generator.py +0 -0
  173. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/graphml/paradata_node_generators.py +0 -0
  174. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/graphml/table_node_generator.py +0 -0
  175. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/graphml/utils.py +0 -0
  176. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/latex_exporter.py +0 -0
  177. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/exporter/unified_xlsx_exporter.py +0 -0
  178. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/graph.py +0 -0
  179. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/importer/__init__.py +0 -0
  180. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/importer/emjson_importer.py +0 -0
  181. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/importer/mapped_xlsx_importer.py +0 -0
  182. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/importer/pyarchinit_importer.py +0 -0
  183. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/importer/qualia_importer.py +0 -0
  184. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/indices.py +0 -0
  185. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/mappings/__init__.py +0 -0
  186. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/mappings/emdb/generic_specialfind_mapping.json +0 -0
  187. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/mappings/emdb/site_properties_mapping.json +0 -0
  188. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/mappings/emdb/usm_mapping.json +0 -0
  189. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/mappings/generic/excel_to_graphml_mapping.json +0 -0
  190. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/mappings/pyarchinit/pyarchinit_us_mapping.json +0 -0
  191. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/mappings/template_emdb_mapping.json +0 -0
  192. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/mappings/template_pyarchinit_mapping.json +0 -0
  193. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/merge/__init__.py +0 -0
  194. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/merge/graph_merger.py +0 -0
  195. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/multigraph/__init__.py +0 -0
  196. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/multigraph/multigraph.py +0 -0
  197. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/narrative/__init__.py +0 -0
  198. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/narrative/generation.py +0 -0
  199. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/narrative/registry.py +0 -0
  200. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/narrative/site_story.py +0 -0
  201. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/__init__.py +0 -0
  202. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/author_node.py +0 -0
  203. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/base_node.py +0 -0
  204. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/combiner_node.py +0 -0
  205. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/document_node.py +0 -0
  206. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/dtc_acquisition_node.py +0 -0
  207. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/dtc_node.py +0 -0
  208. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/dtc_process_node.py +0 -0
  209. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/embargo_node.py +0 -0
  210. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/epoch_node.py +0 -0
  211. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/extractor_node.py +0 -0
  212. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/geo_position_node.py +0 -0
  213. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/graph_node.py +0 -0
  214. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/group_node.py +0 -0
  215. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/hdt_node.py +0 -0
  216. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/heritage_entity_node.py +0 -0
  217. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/license_node.py +0 -0
  218. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/link_node.py +0 -0
  219. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/narrative_node.py +0 -0
  220. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/paradata_node.py +0 -0
  221. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/project_node.py +0 -0
  222. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/property_node.py +0 -0
  223. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/representation_node.py +0 -0
  224. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/semantic_shape_node.py +0 -0
  225. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/nodes/study_node.py +0 -0
  226. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/resolvers/__init__.py +0 -0
  227. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/resolvers/builtin_rules.py +0 -0
  228. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/resolvers/property_resolver.py +0 -0
  229. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/resources/__init__.py +0 -0
  230. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/resources/fs_backend.py +0 -0
  231. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/resources/minio_backend.py +0 -0
  232. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/resources/resolver.py +0 -0
  233. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/__init__.py +0 -0
  234. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/_db_handle.py +0 -0
  235. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/_legacy_paradata_svgs.py +0 -0
  236. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/_workspace.py +0 -0
  237. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/conflict_resolver.py +0 -0
  238. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/edge_registry.py +0 -0
  239. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/graph_ingestor.py +0 -0
  240. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/graph_projector.py +0 -0
  241. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/group_projector.py +0 -0
  242. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/group_store.py +0 -0
  243. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/ingest_result.py +0 -0
  244. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/paradata_store.py +0 -0
  245. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/pyarchinit_pg_importer.py +0 -0
  246. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/uuid7.py +0 -0
  247. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/vocab_provider_core.py +0 -0
  248. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/vocab_types.py +0 -0
  249. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/yed_classifier.py +0 -0
  250. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/yed_detector.py +0 -0
  251. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/yed_group_walker.py +0 -0
  252. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/yed_import_pipeline.py +0 -0
  253. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/yed_rapporti_policy.py +0 -0
  254. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/sync/yed_table_parser.py +0 -0
  255. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/templates/em_data_template.xlsx +0 -0
  256. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/templates/em_palette_template.graphml +0 -0
  257. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/temporal/__init__.py +0 -0
  258. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/temporal/inference_engine.py +0 -0
  259. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/tools/__init__.py +0 -0
  260. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/tools/sync_node_datamodel.py +0 -0
  261. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/transforms/__init__.py +0 -0
  262. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/transforms/aux_tracking.py +0 -0
  263. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/transforms/compact.py +0 -0
  264. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/transforms/materialize_continuity.py +0 -0
  265. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/utils/__init__.py +0 -0
  266. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy/utils/visual_layout.py +0 -0
  267. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy.egg-info/dependency_links.txt +0 -0
  268. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/src/s3dgraphy.egg-info/top_level.txt +0 -0
  269. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_acquisition.py +0 -0
  270. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_acquisition_fs.py +0 -0
  271. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_api_surface.py +0 -0
  272. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_authority_projection.py +0 -0
  273. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_authority_resolver.py +0 -0
  274. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_canonical_document_rename.py +0 -0
  275. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_composite_node_name.py +0 -0
  276. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_connection_resolver.py +0 -0
  277. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_convert_command.py +0 -0
  278. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_deterministic_ids.py +0 -0
  279. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_dtc_projection.py +0 -0
  280. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_dtc_residency.py +0 -0
  281. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_emjson_roundtrip.py +0 -0
  282. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_emjson_schema_version.py +0 -0
  283. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_explicit_node_type_marker.py +0 -0
  284. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_filtered_import.py +0 -0
  285. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_fs_backend.py +0 -0
  286. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_functional_units.py +0 -0
  287. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_georeference_scene.py +0 -0
  288. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_hdto_projection.py +0 -0
  289. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_latex_exporter.py +0 -0
  290. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_lossless_roundtrip.py +0 -0
  291. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_material_color.py +0 -0
  292. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_minio_backend.py +0 -0
  293. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_narrative_authorship.py +0 -0
  294. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_narrative_generation.py +0 -0
  295. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_narrative_node.py +0 -0
  296. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_narrative_scaffolder.py +0 -0
  297. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_node_datamodel_registry.py +0 -0
  298. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_pg_importer.py +0 -0
  299. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_pyarchinit_tier2.py +0 -0
  300. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_reproject.py +0 -0
  301. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_resource_layer.py +0 -0
  302. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_shelf.py +0 -0
  303. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_shelf_hatting.py +0 -0
  304. {s3dgraphy-1.6.0.dev12 → s3dgraphy-1.6.0.dev13}/tests/test_ttl_roundtrip.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: s3dgraphy
3
- Version: 1.6.0.dev12
3
+ Version: 1.6.0.dev13
4
4
  Summary: 3D Stratigraphic Graph Management Library for archaeological and heritage applications
5
5
  Author-email: Emanuel Demetrescu <emanuel.demetrescu@cnr.it>
6
6
  Maintainer-email: Emanuel Demetrescu <emanuel.demetrescu@cnr.it>
@@ -51,6 +51,10 @@ Provides-Extra: minio
51
51
  Requires-Dist: minio>=7.0; extra == "minio"
52
52
  Provides-Extra: geo
53
53
  Requires-Dist: pyproj>=3.4; extra == "geo"
54
+ Provides-Extra: pdf
55
+ Requires-Dist: pypdf>=4.0; extra == "pdf"
56
+ Provides-Extra: docx
57
+ Requires-Dist: python-docx>=1.1; extra == "docx"
54
58
  Provides-Extra: dev
55
59
  Requires-Dist: pytest>=7.0; extra == "dev"
56
60
  Requires-Dist: pytest-cov; extra == "dev"
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "s3dgraphy"
7
- version = "1.6.0.dev12"
7
+ version = "1.6.0.dev13"
8
8
  description = "3D Stratigraphic Graph Management Library for archaeological and heritage applications"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -126,6 +126,33 @@ geo = [
126
126
  # the library imports, the graph loads, only the conversion is unavailable.
127
127
  "pyproj>=3.4",
128
128
  ]
129
+ pdf = [
130
+ # Text extraction from PDF sources, for StratiMiner's Path A
131
+ # (api.source_text). Without it a PDF is listed by name and its text is not
132
+ # read — the honest degradation, not an error.
133
+ #
134
+ # pypdf and NOT PyMuPDF (E.D., 2026-08-03): PyMuPDF renders beautifully and
135
+ # weighs 21 MB, all of which the FROZEN em-bridge sidecar would carry in order
136
+ # to read some paragraphs. pypdf is ~350 KB, pure Python, no dependencies and
137
+ # no compiled extension — so it also installs next to Blender's interpreter
138
+ # without a build step. It reads the text LAYER; it does not do OCR, so a
139
+ # scanned PDF reports "no text layer" instead of returning an empty string
140
+ # that would read as an empty document.
141
+ "pypdf>=4.0",
142
+ ]
143
+ docx = [
144
+ # .docx rendering of a baked narrative (BK1, api.export_narrative_docx).
145
+ # DocX is the format for the reader who will never see the graph — LaTeX
146
+ # serves the apparatus and Jupyter the analysis — so it is a first-class
147
+ # output, but not every consumer publishes: a Blender addon and the GraphML
148
+ # chain must not carry a Word writer.
149
+ #
150
+ # The PyPI package is `python-docx`; the import is `docx`. There is an
151
+ # unrelated `docx` on PyPI, which is why the MissingDependency message names
152
+ # both. Without the extra, api.bake_narrative still works — the bake is
153
+ # independent of every renderer — and only export_narrative_docx raises.
154
+ "python-docx>=1.1",
155
+ ]
129
156
  dev = [
130
157
  "pytest>=7.0",
131
158
  "pytest-cov",
@@ -447,9 +447,9 @@ em:hasVisualReference
447
447
  a owl:ObjectProperty ;
448
448
  rdfs:label "has visual reference"@en ;
449
449
  rdfs:subPropertyOf crm:P138i_has_representation ;
450
- rdfs:domain em:Paradata ;
450
+ rdfs:domain em:Qualia ;
451
451
  rdfs:range crm:E36_Visual_Item ;
452
- rdfs:comment "The paradata node (property / extractor / combiner) is visually illustrated or anchored by a visual document (plate, photograph, annotated image). Distinct from em: extraction sourcing (P67/J7): a visual reference shows, an extraction source justifies. The RDF exporter co-types the target document as E36_Visual_Item. Maps to: connections_datamodel edge 'has_visual_reference'."@en .
452
+ rdfs:comment "A property (em:Qualia, an asserted quale) is visually illustrated or anchored by a VISUAL RESOURCE — the resource-layer image node (a LinkNode, E73 Information Object), not a source document. Revised 2026-08-05 (BUGFIX-CONN2): source narrowed to em:Qualia (was em:Paradata; only a property is illustrated), target moved from an E31 Document to the resource-layer image. The RDF exporter co-types the target LinkNode as E36_Visual_Item, which is range-consistent because E36 is a subclass of E73 (the LinkNode's base class). Distinct from em: extraction sourcing (P67/J7): a visual reference shows, an extraction source justifies. Maps to: connections_datamodel edge 'has_visual_reference' (source PropertyNode, target LinkNode)."@en .
453
453
 
454
454
  em:survivesInEpoch
455
455
  a owl:ObjectProperty ;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "formal_language": "EM",
3
- "version": "1.6.7",
3
+ "version": "1.6.14",
4
4
  "_note_material_vs_qualia_color": [
5
5
  "DUE COSE DIVERSE CHE SI CHIAMANO ENTRAMBE color. Non confonderle: e gia successo.",
6
6
  "1) QUI, in node_styles.<tipo>.style.material.rgba_color — il COLORE DEL MATERIALE BLENDER del proxy 3D, in float LINEARI. UNA sola chiave: `rgba_color`. Fino a S8 il file ne usava due (`color` sui 13 tipi stratigrafici, `rgba_color` sugli altri) e get_material_color() ne leggeva una sola, restituendo None per 21 tipi su 38; ora sono unificate e la vecchia `color` e letta solo come tolleranza verso file scritti prima. Un tipo che non diventa mai una mesh NON ha material affatto (i contenitori di gruppo, e da S7 i dieci nodi che rendono per icona): per loro get_material_color() torna None, ed e corretto.",
@@ -9,6 +9,13 @@
9
9
  "In breve: qui si decide di che colore DISEGNARE una US; li si registra di che colore ERA."
10
10
  ],
11
11
  "_changelog": {
12
+ "1.6.14": "BUGFIX-GLYPH follow-up (2026-08-05, E.D.): SE now renders its GLYPH in the scene (the new SE.svg, a stratigraphic-section box with a writable middle band) instead of a bare triangle, so a name can be written inside it. Added SE to 2d_render_glyph_types (aspect 1.331 from the SVG viewBox) and switched SE 2d_icon_prefer to vector (the raster SE.png is the stale stipple; the new symbol is the SVG). Dropped the interim shape_bbox=square. The shape:triangle stays declared for other consumers but the 2D scene draws the glyph. NOTE: verify the SVG carries a light background for dark-canvas legibility (like combiner.svg).",
13
+ "1.6.13": "BUGFIX-GLYPH (2026-08-05): SE (StratigraphicEvent) gains shape_bbox=\"square\" on its style, like BR. Its triangle was drawn in the wide default 90x32 box, leaving the connect handle far from the glyph; a square bbox (side = min(w,h)) makes the triangle sit in a ~32x32 box with the handle adjacent, matching BR (diamond, square) and the glyph types. No shape_scale: unlike BR (a 0.7 marker) the SE triangle stays full-size. The SCENE representation of SE remains the triangle shape, not the raster icon (S10/POL5 decision unchanged).",
14
+ "1.6.12": "EM3 - `2d_render_glyph_types` guadagna una tabella `aspect`: la larghezza del box di un nodo-glifo e la sua ALTEZZA per l'aspect del disegno, quindi tutti i glifi hanno la stessa altezza e differiscono solo in larghezza (regola E.D.). Default 1.0 = quadrato, che e cio che sono gli undici glifi DTC dopo l'autocrop di POL4 ed extractor/combiner per costruzione; l'unico davvero non quadrato oggi e `author` (0.875 = 448/512). I numeri sono STATICI e misurati una volta dai file: un aspect letto da naturalWidth a runtime farebbe dipendere il layout da quando un bitmap finisce di decodificare (box che salta, due run diversi sullo stesso documento). Il prezzo di un numero statico e che puo diventare stantio se un asset viene ridisegnato: da questa versione sync-datamodels.sh ri-misura ogni file vendorato e AVVISA se una dichiarazione sbaglia di oltre il 2%.",
15
+ "1.6.11": "EM2 — aggiunto `2d_render_glyph_types`: l'elenco dei node_type che il renderer 2D disegna come GLIFO quadrato centrato invece che come forma. Nessuno stile modificato: e un fatto che esisteva gia, ma scritto a mano dentro icons.ts di EMStudio (il set ICON_NODE_TYPES), e quindi invisibile al motore di layout. Serve al motore perche un glifo quadrato dentro un box 90x32 lascia margini vuoti ai lati, e la maniglia di connessione — ancorata al bordo destro del box — finisce lontana dal glifo: con questo elenco il box diventa quadrato e la maniglia lo tocca. Chiave = node_type di runtime e non l'abbreviazione di node_styles, cosi il motore Rust lo legge senza tabella di alias. Esclusi di proposito document e property (geometria custom non quadrata: foglio con angolo piegato, annotazione con parentesi) e i nodi DTC, il cui glifo si decide per NODO da data.dtc_kind.",
16
+ "1.6.10": "POL6 — RINOMINA di due token, nessuna classe nuova e nessuno stile nuovo: gli stili si scambiano di chiave. `USN` torna a essere l'unita NEGATIVA (rettangolo grigio a contorno pieno, label di display US-) e la NEUTRA diventa `USNt` (contorno ai soli quattro angoli). POL5 aveva fatto il contrario per qualche ora: e una convenzione sbagliata, perche USN si legge 'US Negativa' — e cosi lo scrive la linea storica di s3dgraphy e cosi lo vendorizza pyArchInit, che con questo ritorno NON e piu in disaccordo con noi. Nessun colore, nessuna forma e nessun numero modificati: le chiavi sono scambiate e i due `_comment` aggiornati.",
17
+ "1.6.9": "POL5 — correzioni di POL4 su indicazione di E.D. (1) BR torna ROMBO (era diventato quadrato): fill nero e altezza 0.7x restano, e il bounding box e quadrato via il nuovo `shape_bbox: square`, cosi il rombo e equilatero invece di essere schiacciato nel box 90x32. Il token di forma `square` non serve piu ed e stato ritirato: quadrato = `rectangle` + `shape_bbox: square`, un meccanismo solo. (2) DUE tipi dove ce n'era uno: `USN` e ora l'unita NEUTRA (i risparmi della muratura: finestre, porte, il volume di una stanza — vuoti VOLUTI) con i quattro angoli, e l'unita NEGATIVA/distruttiva e `USNeg`, etichetta di display `US-`, resa come una US grigia a contorno pieno. Il grigio di entrambe passa a #8C8C8C (grigio gia in uso nel linguaggio, la scala `symbolic`) perche #C4C4C4 su fill #F0F0F0 era illeggibile, tanto piu con soli quattro tick di inchiostro. (3) NARR e SE dichiarano il RASTER come icona (256 px, reso dall'SVG) tramite il nuovo flag `2d_icon_prefer: raster`: i vettori restano DICHIARATI perche esistono — questo file e dove un consumatore chiede cosa esiste — e il flag dice quale dei due disegnare. Sono illustrazioni da 617 e 284 KB per un glifo che nessun renderer disegna oltre i 30 px, e un consumatore che inlinea gli asset lo pagava tutto. NB il flag e anche cio che dice al vendor di EMStudio quale dei due file copiare: senza, la regola 'un raster oscurato dal proprio vettore e irraggiungibile' teneva il vettore e buttava il raster, cioe l'esatto contrario di questa decisione.",
18
+ "1.6.8": "POL4 — tre forme e un'icona, tutte decise da E.D. (1) BR passa da diamante bianco a QUADRATO NERO al 70% dell'altezza di una US: nuovo token di forma `square` piu il nuovo campo `style.shape_scale`, che rimpicciolisce il DISEGNO dentro il box senza toccare il box (le dimensioni per tipo stanno in em-core, invariante 7 di EMStudio). Coerentemente src/2D/continuity.svg perde la rotazione di 45 gradi: era lo stesso quadrato, ruotato. (2) USN passa da rettangolo tratteggiato a `corner_brackets`, contorno ai soli quattro angoli — un bordo continuo afferma un margine che lo scavo non osserva. (3) NARR punta finalmente alle EMNarrative.svg/.png di E.D. al posto del segnaposto narrative.png. Nessun colore cambiato tranne il fill di BR (#FFFFFF -> #000000). NB i due nuovi token di forma richiedono un consumatore che li conosca: chi non li conosce cade sul proprio default (in EMStudio il rounded_rectangle), quindi il peggio che accade e una forma generica, non un errore.",
12
19
  "1.6.7": "S10 — curato il colore di SE (StratigraphicEventNode), l'ultimo segnaposto rimasto fra i tipi che qualcuno disegna davvero. Era #BC0000, un rosso mai scelto che contraddiceva il proprio border_color nero, e il node datamodel dichiarava il simbolo 'to be defined': non c'era una decisione da rispettare, c'era un buco. Ora TEAL #2A8C8C, material lineare (0.023, 0.262, 0.262), con border_color coerente — la famiglia cromatica delle attivita, l'unica del linguaggio che significa 'e successo qualcosa' invece di 'qualcosa c'e'. Aggiornato di conseguenza il campo symbol nel node datamodel.",
13
20
  "1.6.6": "S8 — unificata la chiave del colore-materiale su `rgba_color`. Rinominate le 14 voci che usavano `style.material.color` (i 13 tipi stratigrafici piu UL): valori invariati, nessun altro campo toccato. Ora tutte le 24 voci con un material parlano la stessa chiave. get_material_color() legge `rgba_color` come autoritativa e mantiene `color` solo come tolleranza per file scritti prima della rinomina. Gli hex 2D border_color/fill_color NON sono stati toccati: sono un'altra cosa (sRGB per il canvas) e hanno un altro consumatore (EMStudio). Verificato che i 14 materiali Blender di EMtools producono rgb identici a prima.",
14
21
  "1.6.5": "S7 — applicate le decisioni E.D. sull'inventario dei material segnaposto. TOLTO il blocco `material` a 10 tipi che non diventano mai una mesh e rendono per icona o forma (PROP, COMB, EXT, DOC, EP, AUTH, LINK, GEO, SS, unknown): il loro colore 2D resta in border_color/fill_color, e get_material_color ora restituisce None come per i 4 contenitori di gruppo. RIMOSSA del tutto la voce `ANG`, duplicato legacy di ActivityNodeGroup senza alcun consumatore in s3Dgraphy, EM-blender-tools o EMStudio (GRAPH, citato nella stessa nota della 1.6.0, resta perche e usato). AGGIUNTO `UL` (Working Unit), unico tipo stratigrafico che ne era privo: 2D dal simbolo del datamodel (rettangolo bianco, bordo arancio #D86400), material 3D uguale al rosso US per decisione E.D. RM/RMDoc/RMSF e SE lasciati invariati per decisione E.D. Nessuno dei 13 colori stratigrafici esistenti e stato modificato.",
@@ -22,6 +29,30 @@
22
29
  "1.5.1": "Added LocationNodeGroup node style (dashed roundrectangle, kind-based border colour) and is_in_location edge style with primary_modifier override.",
23
30
  "1.5.0": "Initial EM 1.5 visual rules."
24
31
  },
32
+ "2d_render_glyph_types": {
33
+ "_comment": "Node types the 2D renderer draws as a CENTRED GLYPH (their official icon) instead of a shape. Their box is HEIGHT-DRIVEN: the height is the engine node height and the width is that height times the `aspect` below (EM2 made them square; EM3 generalised the square to a per-glyph aspect). Keyed by RUNTIME node_type, deliberately: this block is read both by EMStudio's icons.ts and by its Rust layout engine, and a list keyed by node_type needs no alias table on either side (`node_styles` is keyed by the short abbreviation, EXT/COMB/..., which the engine does not know). Added in 1.6.11 (EM2) because the fact had been living as a hand-written set inside icons.ts, and the layout engine needs the same fact to give those nodes a height-driven box: a glyph drawn 32 wide inside a 90x32 box leaves empty margins, and the connect handle — anchored to the right edge of the box — ends up floating away from the glyph. NB two things this does NOT include. (1) `document` and `property`: they are drawn with custom geometry (a sheet with a folded corner, a bracketed text annotation) that is NOT square, and squaring their box would crush the text. (2) DTC nodes: their glyph is chosen per NODE from `data.dtc_kind` and not from the type, so a consumer decides that node by node — a plain `link` is not a glyph, a `link` with a dtc_kind is.",
34
+ "types": [
35
+ "extractor",
36
+ "combiner",
37
+ "author",
38
+ "author_ai",
39
+ "license",
40
+ "embargo",
41
+ "narrative",
42
+ "SE"
43
+ ],
44
+ "_aspect_comment": "EM3 - width of a glyph box = its HEIGHT x this aspect (natural width / natural height of the drawing). The height is the engine's node height, so every glyph keeps the same height and only the width differs (E.D.'s rule). Default 1.0 (square) when a type or kind is absent, which is what the eleven DTC glyphs are after the POL4 autocrop and what extractor/combiner are by construction. STATIC ON PURPOSE: these numbers are measured from the assets ONCE, here, and never read from the loaded image at runtime. An aspect taken from naturalWidth would make the layout depend on when a bitmap finishes decoding - the box would jump under the user and two runs of the same document could differ, which is the determinism contract (EMStudio invariant 7). The cost of a static number is that it can go stale if an asset is redrawn: frontend/scripts/sync-datamodels.sh re-measures every vendored file and WARNS when a declaration is more than 2% off, so the staleness is caught where the assets are copied. Values below measured 2026-08-05 from the files each type actually renders (SVG viewBox, PNG header; narrative uses EMNarrative.png because of its 2d_icon_prefer raster).",
45
+ "aspect": {
46
+ "extractor": 1.0,
47
+ "combiner": 1.0,
48
+ "author": 0.875,
49
+ "author_ai": 0.984,
50
+ "license": 0.977,
51
+ "embargo": 0.992,
52
+ "narrative": 0.981,
53
+ "SE": 1.331
54
+ }
55
+ },
25
56
  "node_styles": {
26
57
  "US": {
27
58
  "file_3d": "src/3D/US.glb",
@@ -214,7 +245,7 @@
214
245
  "serUSVn": {
215
246
  "3d_file": "src/3D/serUSV.glb",
216
247
  "2d_file_rast": "src/2D/serUSV.png",
217
- "2d_file_vect": "src/2D/serUSV.svg",
248
+ "2d_file_vect": "src/2D/serUSVn.svg",
218
249
  "style": {
219
250
  "material": {
220
251
  "rgba_color": {
@@ -234,8 +265,8 @@
234
265
  },
235
266
  "serUSVs": {
236
267
  "file_3d": "src/3D/serUSVs.glb",
237
- "2d_file_rast": "src/2D/serUSVs.png",
238
- "2d_file_vect": "src/2D/serUSV.svg",
268
+ "2d_file_rast": "src/2D/serUSVs.svg",
269
+ "2d_file_vect": "src/2D/serUSVs.svg",
239
270
  "style": {
240
271
  "material": {
241
272
  "rgba_color": {
@@ -275,6 +306,7 @@
275
306
  "label_position": "over"
276
307
  },
277
308
  "BR": {
309
+ "_comment": "Continuity node (BR): the marker that BOUNDS a life span — 'this unit stops surviving here'. POL5 (2026-08-04, correzione di POL4): a black RHOMBUS — a diamond, not a square — inscribed in a SQUARE bounding box (`shape_bbox: square`, so height = width) and 0.7x the height of a stratigraphic unit. POL4 had made it a square, which lost the diamond silhouette EM has always used for continuity (and which the GraphML exporter emits as `<Shape type=\"diamond\"/>`, so a square here would have contradicted the round-trip). What POL4 got right and stays: the FILL is black (it was white, and a white diamond read as a claim about matter like every other outlined glyph) and the height is 0.7x, because a boundary marker is punctuation, not a unit. Both numbers live here and not in a renderer: a constant hardcoded in one consumer would be a second source.",
278
310
  "3d_file": "src/3D/BR.glb",
279
311
  "2d_file_rast": "src/2D/continuity.png",
280
312
  "2d_file_vect": "src/2D/continuity.svg",
@@ -288,18 +320,21 @@
288
320
  }
289
321
  },
290
322
  "border_color": "#000000",
291
- "fill_color": "#FFFFFF",
323
+ "fill_color": "#000000",
292
324
  "border_style": "solid",
293
325
  "shape": "diamond",
326
+ "shape_bbox": "square",
327
+ "shape_scale": 0.7,
294
328
  "border_width": 4
295
329
  },
296
330
  "label_position": "center"
297
331
  },
298
332
  "SE": {
299
- "_comment": "Stratigraphic Event: l'ATTO che crea, modifica o distrugge un'unita — un terremoto che fa cadere l'intonaco, una demolizione, l'inizio di un cantiere. Non e materia, e un processo, e per questo non appartiene a nessuna delle famiglie cromatiche della materia (rosso reale, verde/blu virtuale, arancio documentario, giallo special find, grigio negativo). Prende il TEAL della famiglia attivita: un ActivityNodeGroup e un fascio di atti e porta gia la linguetta ciano #CCFFFF, quindi il ciano e l'unico colore del linguaggio che dice gia 'e successo qualcosa' invece di 'qualcosa c'e'. Curato in S10 (2026-08-02): fino ad allora SE portava il segnaposto #BC0000 mai scelto, che per giunta contraddiceva il proprio bordo nero, e il node datamodel dichiarava il simbolo 'to be defined'. Il nero di BR e stato scartato di proposito: un material nero rende un proxy illeggibile in viewport, e i proxy SE si vedono (Heriverse li disegna fra i suoi stratigraphicTypes).",
333
+ "_comment": "Stratigraphic Event: l'ATTO che crea, modifica o distrugge un'unita — un terremoto che fa cadere l'intonaco, una demolizione, l'inizio di un cantiere. Non e materia, e un processo, e per questo non appartiene a nessuna delle famiglie cromatiche della materia (rosso reale, verde/blu virtuale, arancio documentario, giallo special find, grigio negativo). Prende il TEAL della famiglia attivita: un ActivityNodeGroup e un fascio di atti e porta gia la linguetta ciano #CCFFFF, quindi il ciano e l'unico colore del linguaggio che dice gia 'e successo qualcosa' invece di 'qualcosa c'e'. Curato in S10 (2026-08-02): fino ad allora SE portava il segnaposto #BC0000 mai scelto, che per giunta contraddiceva il proprio bordo nero, e il node datamodel dichiarava il simbolo 'to be defined'. Il nero di BR e stato scartato di proposito: un material nero rende un proxy illeggibile in viewport, e i proxy SE si vedono (Heriverse li disegna fra i suoi stratigraphicTypes). POL5 (2026-08-04): l'ICONA e il raster (`2d_icon_prefer: raster`), come per NARR e per la stessa ragione — SE.svg e un tratteggio vettorializzato da 284 KB per un glifo che nessun renderer disegna oltre i 30 px. Il vettore resta dichiarato perche esiste; il flag dice quale dei due DISEGNARE. Il PNG a 256 px e reso DA quell'SVG, quindi i due non possono divergere. Nel grafo SE resta comunque un TRIANGOLO disegnato (shape), non l'icona: il raster serve a palette ed elenchi.",
300
334
  "3d_file": "src/3D/SE.glb",
301
- "2d_file_rast": "src/3D/SE.png",
302
- "2d_file_vect": "src/3D/SE.svg",
335
+ "2d_file_rast": "src/2D/SE.png",
336
+ "2d_file_vect": "src/2D/SE.svg",
337
+ "2d_icon_prefer": "vector",
303
338
  "style": {
304
339
  "material": {
305
340
  "rgba_color": {
@@ -367,8 +402,8 @@
367
402
  },
368
403
  "EP": {
369
404
  "3d_file": "src/3D/epoch.glb",
370
- "2d_file_rast": "src/2D/epoch.png",
371
- "2d_file_vect": "src/2D/epoch.svg",
405
+ "2d_file_rast": "src/2D/EpochNode.svg",
406
+ "2d_file_vect": "src/2D/EpochNode.svg",
372
407
  "style": {
373
408
  "border_color": "#009933",
374
409
  "fill_color": "#FFFFFF",
@@ -393,7 +428,7 @@
393
428
  "_comment": "AI-assisted author. Same star shape as AUTH for visual family unity, but cyan/blue tones to distinguish at a glance from human author (red/orange). The graphml palette identifies it via the 'AI.' label prefix (em_palette_icons).",
394
429
  "file_3d": "src/3D/author_ai.glb",
395
430
  "2d_file_rast": "src/2D/author_ai.png",
396
- "2d_file_vect": "src/2D/author_ai.svg",
431
+ "2d_file_vect": "src/2D/author_ai.png",
397
432
  "style": {
398
433
  "material": {
399
434
  "rgba_color": {
@@ -414,7 +449,7 @@
414
449
  "_comment": "License node. Shield shape carrying a gold border to read clearly as a rights / legal artifact. Connected via has_license to any Node or to the GraphNode for graph-wide licensing. Graphml palette prefix: 'LI.'.",
415
450
  "file_3d": "src/3D/license.glb",
416
451
  "2d_file_rast": "src/2D/license.png",
417
- "2d_file_vect": "src/2D/license.svg",
452
+ "2d_file_vect": "src/2D/license.png",
418
453
  "style": {
419
454
  "material": {
420
455
  "rgba_color": {
@@ -435,7 +470,7 @@
435
470
  "_comment": "Embargo node. Octagon with red dashed border to read as a temporal restriction (the dashed border encodes 'temporary'). Connected via has_embargo to a Node, LicenseNode or GraphNode. Graphml palette prefix: 'EB.'.",
436
471
  "file_3d": "src/3D/embargo.glb",
437
472
  "2d_file_rast": "src/2D/embargo.png",
438
- "2d_file_vect": "src/2D/embargo.svg",
473
+ "2d_file_vect": "src/2D/embargo.png",
439
474
  "style": {
440
475
  "material": {
441
476
  "rgba_color": {
@@ -474,10 +509,11 @@
474
509
  "label_position": "over"
475
510
  },
476
511
  "NARR": {
477
- "_comment": "EM Narrative (DP-79). A NarrativeNode is a crm:E33 Linguistic Object over the graph — chapters of prose and embeds — not an assertion about the site, which is why it stays neutral grey and must not read as stratigraphy or paradata. Solid border, unlike GRAPH's dashed: a narrative is a real authored object, not an anchor for metadata propagation. The .svg does not exist yet; the renderer takes the raster (see step I).",
512
+ "_comment": "EM Narrative (DP-79). A NarrativeNode is a crm:E33 Linguistic Object over the graph — chapters of prose and embeds — not an assertion about the site, which is why it stays neutral grey and must not read as stratigraphy or paradata. Solid border, unlike GRAPH's dashed: a narrative is a real authored object, not an anchor for metadata propagation. POL4 (2026-08-04): the drawing now EXISTS — E.D.'s hourglass-over-open-book — and replaces the old narrative.png placeholder. POL5 (E.D.'s decision): the ICON is the RASTER — `2d_icon_prefer: raster`. The vector is still declared, because it exists and this file is where a consumer asks what exists; the flag says which of the two to DRAW. It is an ILLUSTRATION, not a glyph (8 paths, 114k coordinates of stipple trace, 617 KB even after the precision pass), and a consumer that inlines its assets paid 604 KB of bundle for something no renderer draws taller than 30 px. The 256 px PNG is rendered FROM that SVG, so the two cannot drift.",
478
513
  "file_3d": "src/3D/narrative.glb",
479
- "2d_file_rast": "src/2D/narrative.png",
480
- "2d_file_vect": "src/2D/narrative.svg",
514
+ "2d_file_rast": "src/2D/EMNarrative.png",
515
+ "2d_file_vect": "src/2D/EMNarrative.svg",
516
+ "2d_icon_prefer": "raster",
481
517
  "style": {
482
518
  "material": {
483
519
  "rgba_color": {
@@ -496,7 +532,7 @@
496
532
  },
497
533
  "LINK": {
498
534
  "file_3d": "src/3D/link.glb",
499
- "2d_file_rast": "src/2D/link.png",
535
+ "2d_file_rast": "src/2D/link.svg",
500
536
  "2d_file_vect": "src/2D/link.svg",
501
537
  "style": {
502
538
  "border_color": "#FF6600",
@@ -508,8 +544,8 @@
508
544
  },
509
545
  "GEO": {
510
546
  "file_3d": "src/3D/geo.glb",
511
- "2d_file_rast": "src/2D/geo.png",
512
- "2d_file_vect": "src/2D/geo.svg",
547
+ "2d_file_rast": "src/2D/geo_position.svg",
548
+ "2d_file_vect": "src/2D/geo_position.svg",
513
549
  "style": {
514
550
  "border_color": "#FF6600",
515
551
  "fill_color": "#FFFFFF",
@@ -520,8 +556,8 @@
520
556
  },
521
557
  "RM": {
522
558
  "file_3d": "src/3D/rm.glb",
523
- "2d_file_rast": "src/2D/rm.png",
524
- "2d_file_vect": "src/2D/rm.svg",
559
+ "2d_file_rast": "src/2D/representation_model.svg",
560
+ "2d_file_vect": "src/2D/representation_model.svg",
525
561
  "style": {
526
562
  "material": {
527
563
  "rgba_color": {
@@ -540,8 +576,8 @@
540
576
  },
541
577
  "RMDoc": {
542
578
  "file_3d": "src/3D/rmdoc.glb",
543
- "2d_file_rast": "src/2D/rmdoc.png",
544
- "2d_file_vect": "src/2D/rmdoc.svg",
579
+ "2d_file_rast": "src/2D/representation_model_doc.svg",
580
+ "2d_file_vect": "src/2D/representation_model_doc.svg",
545
581
  "style": {
546
582
  "material": {
547
583
  "rgba_color": {
@@ -560,8 +596,8 @@
560
596
  },
561
597
  "RMSF": {
562
598
  "file_3d": "src/3D/rmsf.glb",
563
- "2d_file_rast": "src/2D/rmsf.png",
564
- "2d_file_vect": "src/2D/rmsf.svg",
599
+ "2d_file_rast": "src/2D/representation_model_sf.svg",
600
+ "2d_file_vect": "src/2D/representation_model_sf.svg",
565
601
  "style": {
566
602
  "material": {
567
603
  "rgba_color": {
@@ -580,8 +616,8 @@
580
616
  },
581
617
  "SS": {
582
618
  "file_3d": "src/3D/ss.glb",
583
- "2d_file_rast": "src/2D/ss.png",
584
- "2d_file_vect": "src/2D/ss.svg",
619
+ "2d_file_rast": "src/2D/semantic_shape.svg",
620
+ "2d_file_vect": "src/2D/semantic_shape.svg",
585
621
  "style": {
586
622
  "border_color": "#FF6600",
587
623
  "fill_color": "#FFFFFF",
@@ -622,7 +658,29 @@
622
658
  },
623
659
  "label_position": "over"
624
660
  },
661
+ "USNt": {
662
+ "_comment": "NEUTRAL stratigraphic unit (POL5, token USNt since POL6): a void that is part of the DESIGN — the `risparmi` of masonry, a window or door opening, the volume of a room. NOT the negative unit, which is USN (displayed US-) below: nothing was removed here, so there is no interface produced by a removal. Drawn with the outline only at the FOUR CORNERS (`corner_brackets`), and the reason is semantic: a continuous border states a surface, and a risparmio has none — what is observed is the EXTENT of the void, which is what a crop mark says. Grey #8C8C8C, one of the language's existing greys (it is the `symbolic` rung of document_variant_styles): the #C4C4C4 this entry carried before POL4 was already faint against the #F0F0F0 fill, and with only four ticks of ink left there was nothing to see. Same grey as USN on purpose — the SHAPE tells the two voids apart, which is how EM distinguishes types everywhere else.",
663
+ "file_3d": "src/3D/US.glb",
664
+ "file_2d": "src/2D/US.png",
665
+ "style": {
666
+ "material": {
667
+ "rgba_color": {
668
+ "r": 0.55,
669
+ "g": 0.55,
670
+ "b": 0.55,
671
+ "a": 1.0
672
+ }
673
+ },
674
+ "border_color": "#8C8C8C",
675
+ "fill_color": "#F0F0F0",
676
+ "border_style": "solid",
677
+ "shape": "corner_brackets",
678
+ "border_width": 4
679
+ },
680
+ "label_position": "over"
681
+ },
625
682
  "USN": {
683
+ "_comment": "NEGATIVE / destructive stratigraphic unit, displayed US- (POL5; token USN again since POL6). A lacuna produced by a REMOVAL: a pit cut, an erosion surface, a demolition void. Rendered like a US — same rectangle, same thick frame — because it IS a unit of the sequence and behaves like one; only the colour changes, to the neutral grey of the absence family. E.D.: 'una US grigia a contorno pieno', explicitly NOT the orange roundrectangle of USD (which is the DOCUMENTARY unit and unrelated). This type answers to the node_type `USN`, as it always did: POL5 moved it to `USNeg` for a few hours and POL6 put it back, because the spelling says negativa and because pyArchInit vendors the same token with the same meaning.",
626
684
  "file_3d": "src/3D/US.glb",
627
685
  "file_2d": "src/2D/US.png",
628
686
  "style": {
@@ -634,9 +692,9 @@
634
692
  "a": 1.0
635
693
  }
636
694
  },
637
- "border_color": "#C4C4C4",
695
+ "border_color": "#8C8C8C",
638
696
  "fill_color": "#F0F0F0",
639
- "border_style": "dashed",
697
+ "border_style": "solid",
640
698
  "shape": "rectangle",
641
699
  "border_width": 4
642
700
  },
@@ -120,7 +120,12 @@
120
120
  "NegativeStratigraphicUnit": {
121
121
  "parent": "StratigraphicNode",
122
122
  "node_type": "USN",
123
- "description": "Negative Stratigraphic Unit (US negativa / USN)."
123
+ "description": "Negative Stratigraphic Unit, displayed ``US-`` (US negativa)."
124
+ },
125
+ "NeutralStratigraphicUnit": {
126
+ "parent": "StratigraphicNode",
127
+ "node_type": "USNt",
128
+ "description": "Neutral Stratigraphic Unit (``USNt``, Unità Stratigrafica Neutra)."
124
129
  },
125
130
  "Node": {
126
131
  "parent": null,
@@ -1,6 +1,6 @@
1
1
  {
2
- "s3Dgraphy_connections_model_version": "1.6.2",
3
- "description": "s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.1: has_paradata_nodegroup source extended to include EpochNode — an epoch can now own a ParadataNodeGroup holding its temporal-definition properties (e.g. absolute_time_start/end as PropertyNodes with paradata provenance), mirroring how a StratigraphicNode carries its paradata group. v1.6.0 (paired with node datamodel v1.6.0) introduces: bug fix on is_in_paradata_nodegroup (typo 'ProperrtyNOde' → 'PropertyNode'); semantic fix on has_documentation (P104_is_subject_to → P70i_is_documented_in — P104 means 'subject to a legal right', not 'has documentation'); deprecation of has_timebranch as duplicate of is_in_timebranch (the latter is the canonical one — used by import_graphml.py and graphml_patcher.py; the former exists only in config JSON); component list aligned with node datamodel (HDT-O, PROV-O added). HDT-O containment properties (hdto:contains_HDT, hdto:contains_SU, hdto:isPrimary) and physical-relation discriminator subproperties (em:abuts, em:cuts, em:fills, em:overlies, em:bonded_to, em:equals as rdfs:subPropertyOf crmarchaeo:AP11_has_physical_relation) to be added in v1.6.1. v1.5.3 introduced canonical/reverse directionality with verb-based labels for clear socket identification in node editors. v1.5.4 added 'has_visual_reference' edge type. v1.5.5 added 'is_in_location' edge type with context-sensitive CIDOC mapping (P53 for node→location, P89 for the recursive location→location hierarchy) and an optional 'is_primary' boolean attribute (s3d:isPrimary, proposed).",
2
+ "s3Dgraphy_connections_model_version": "1.6.7",
3
+ "description": "s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.7 (BUGFIX-CONN3): closes the two silent follow-ups of CONN2. has_documentation.source gains PropertyNode (judicious widening): the honest reading of a legacy yEd dashed PropertyNode→Document connector is P70i_is_documented_in ('the property is documented in this source'), NOT has_visual_reference (which CONN2 moved to PropertyNode→LinkNode). The import heuristic (import_graphml.enhance_edge_type) now routes PropertyNode→Document to has_documentation and the rarer CombinerNode/ParadataNode→Document to generic_connection+warning (a combiner aggregates extractors and cites no document; the DTC chain is NOT synthesised at import). Shelf: hat_as_document no longer offers has_visual_reference (a Document attaches via has_documentation/extracted_from); a new hat_as_visual_resource attaches a LinkNode image via has_visual_reference from a PropertyNode — the correct home after CONN2. No illegal edge is produced or expected. v1.6.6 (BUGFIX-CONN2): closes the two open domain questions on has_visual_reference (E.D. 2026-08-05). SOURCE narrowed to exactly [PropertyNode]: only a property (an asserted quale) is what a visual reference illustrates; the generic ParadataNode entry is dropped, which — because ExtractorNode, CombinerNode and DocumentNode are all subclasses of ParadataNode — now excludes them by class hierarchy (a PropertyNode is neither a sibling nor a parent of the others). The extractor/combiner denied_edges from v1.6.5 are therefore REDUNDANT for this edge but are KEPT as a defensive guard (they still bite if the source is ever broadened back to ParadataNode). TARGET changed from [DocumentNode] to [LinkNode]: the oddity was that a visual reference pointed at a source-document (E31) rather than at a visual resource. It now points at the resource-layer image node (LinkNode = E73 Information Object / ExternalResourceReference — the same P67 hinge RM/RMDoc use via has_linked_resource), keeping DocumentNode = fonte. CIDOC stays P138i_has_representation with the target co-typed E36 Visual Item: E36 is a subclass of E73, so co-typing a LinkNode as E36 is range-consistent (it was NOT, strictly, for an E31 Document). FOLLOW-UPS flagged for E.D. (see end-of report): (a) import_graphml.enhance_edge_type still hardcodes PropertyNode/Combiner/Paradata→DocumentNode ⇒ has_visual_reference (legacy yEd heuristic, now produces an edge this datamodel refuses) — needs a domain decision on what legacy paradata→document edges become; (b) shelf.hat_as_document lists has_visual_reference among the Document-attach edges — it can no longer validate (target is LinkNode), so a paradata attach silently no longer attaches; a hat_as_visual_resource(LinkNode)+has_visual_reference path is the proper home. v1.6.5 (BUGFIX-CONN): has_visual_reference is no longer offered FROM an ExtractorNode or a CombinerNode. An extractor toward a document expresses ONLY extracted_from (its relation to the source is the extraction, not an illustration); a combiner aggregates extractors and illustrates nothing. Because ExtractorNode, CombinerNode and PropertyNode are all subclasses of ParadataNode, and has_visual_reference.source lists ParadataNode, simply dropping the two subtypes from the source list would not exclude them (they still match via the parent class). So this is expressed with node_type_restrictions (keyed by RUNTIME node_type, like USNt) using a new denied_edges blacklist (the mirror of allowed_edges): extractor/combiner deny has_visual_reference. PropertyNode and any other legitimate ParadataNode source keep it unchanged. OPEN domain question for E.D.: which paradata node-types may legitimately have a visual reference (today source = PropertyNode/ExtractorNode/CombinerNode/ParadataNode) — extractor/combiner removed; the rest left as-is, not invented. v1.6.1: has_paradata_nodegroup source extended to include EpochNode — an epoch can now own a ParadataNodeGroup holding its temporal-definition properties (e.g. absolute_time_start/end as PropertyNodes with paradata provenance), mirroring how a StratigraphicNode carries its paradata group. v1.6.0 (paired with node datamodel v1.6.0) introduces: bug fix on is_in_paradata_nodegroup (typo 'ProperrtyNOde' → 'PropertyNode'); semantic fix on has_documentation (P104_is_subject_to → P70i_is_documented_in — P104 means 'subject to a legal right', not 'has documentation'); deprecation of has_timebranch as duplicate of is_in_timebranch (the latter is the canonical one — used by import_graphml.py and graphml_patcher.py; the former exists only in config JSON); component list aligned with node datamodel (HDT-O, PROV-O added). HDT-O containment properties (hdto:contains_HDT, hdto:contains_SU, hdto:isPrimary) and physical-relation discriminator subproperties (em:abuts, em:cuts, em:fills, em:overlies, em:bonded_to, em:equals as rdfs:subPropertyOf crmarchaeo:AP11_has_physical_relation) to be added in v1.6.1. v1.5.3 introduced canonical/reverse directionality with verb-based labels for clear socket identification in node editors. v1.5.4 added 'has_visual_reference' edge type. v1.5.5 added 'is_in_location' edge type with context-sensitive CIDOC mapping (P53 for node→location, P89 for the recursive location→location hierarchy) and an optional 'is_primary' boolean attribute (s3d:isPrimary, proposed). v1.6.3: added node_type_restrictions — a per-node-type narrowing of the class-level edge rules (POL5): USN (the NEUTRAL stratigraphic unit, a risparmio) takes is_after/is_before and nothing else, because a void cannot cut, fill, abut or bond. v1.6.4 (POL6): the same restriction, moved to USNt — the tokens went back to their conventional meanings, USN = US negativa (all relations, it is a unit of the sequence) and USNt = US neutra (sequence only).",
4
4
  "components": [
5
5
  "CIDOC-CRM",
6
6
  "CRMarchaeo",
@@ -52,6 +52,28 @@
52
52
  "source": "internal em.ttl / hdto_extension.ttl companion ontologies"
53
53
  }
54
54
  },
55
+ "node_type_restrictions": {
56
+ "_comment": "PER-NODE-TYPE narrowing of what the edge_types below already allow. The edge rules are stated by CLASS, so a subtype inherits everything its parent may connect; this block is how a subtype says LESS than its parent without leaving the class hierarchy. A consumer that ignores it simply offers more, so it degrades to today's behaviour instead of breaking. Added in v1.6.3 (POL5, 2026-08-04) for the neutral stratigraphic unit.",
57
+ "extractor": {
58
+ "denied_edges": [
59
+ "has_visual_reference"
60
+ ],
61
+ "_comment": "BUGFIX-CONN (v1.6.5): an ExtractorNode toward a DocumentNode expresses ONLY extracted_from. has_visual_reference (P138i, 'the paradata node is illustrated/anchored by a document') does not apply to an extraction. Because ExtractorNode is a subclass of ParadataNode and has_visual_reference.source lists ParadataNode, removing the subtype from that list would not exclude it (still matched via the parent); denied_edges is the surgical, class-hierarchy-safe way to say LESS than the parent for this ONE edge. denied_edges is the blacklist mirror of allowed_edges and is NOT scope-gated (it names exact edges to withhold)."
62
+ },
63
+ "combiner": {
64
+ "denied_edges": [
65
+ "has_visual_reference"
66
+ ],
67
+ "_comment": "BUGFIX-CONN (v1.6.5): a CombinerNode aggregates ExtractorNodes (combines); it illustrates nothing, so it is not a source of has_visual_reference either. Same class-hierarchy reasoning as ExtractorNode."
68
+ },
69
+ "USNt": {
70
+ "allowed_edges": [
71
+ "is_after"
72
+ ],
73
+ "scope": "stratigraphic",
74
+ "_comment": "E.D.: the ONLY stratigraphic relations of the NEUTRAL unit (USNt — a risparmio: a window or door opening, a niche, the volume of a room) are is_after / is_before, and `is_before` is not an edge type of its own: it is the declared `reverse` of is_after, so naming is_after covers both readings. The reason is physical, not editorial: nothing was removed and nothing touches the void, so it cannot cut, fill, abut or bond, and sequence is the only stratigraphic statement left. NB the restriction is on USNt ALONE: the NEGATIVE unit (USN, displayed US-) is a unit of the sequence — it cuts and is filled — and keeps every relation. POL6 moved this block from USN to USNt when the two tokens went back to their conventional meanings. `scope` says which family of edges this narrows: PARADATA and membership edges (has_property, has_data_provenance, is_in_paradata_nodegroup, has_first_epoch, survive_in_epoch, is_in_activity, is_part_of, ...) are NOT restricted — a risparmio is documented, measured and dated like any other unit."
75
+ }
76
+ },
55
77
  "edge_types": {
56
78
  "is_after": {
57
79
  "name": "is_after",
@@ -955,13 +977,14 @@
955
977
  "cidoc_extension": "CIDOC-CRM",
956
978
  "extension_mapping": null,
957
979
  "extension_name": null,
958
- "rationale": "P70i_is_documented_in (inverse of P70_documents) is the canonical CRM predicate to link an entity to a document about it. Earlier v1.5.5 used P104_is_subject_to which is semantically wrong (P104 means 'subject to a legal right or rule', not 'has documentation about it')."
980
+ "rationale": "P70i_is_documented_in (inverse of P70_documents) is the canonical CRM predicate to link an entity to a document about it. Earlier v1.5.5 used P104_is_subject_to which is semantically wrong (P104 means 'subject to a legal right or rule', not 'has documentation about it'). v1.6.7 (BUGFIX-CONN3): PropertyNode added to source — a property (an asserted quale) may be documented in a source-document (P70i reads true). This is the honest reading of a legacy yEd dashed connector PropertyNode→Document, now that has_visual_reference (CONN2) points at a LinkNode image and no longer at a Document. Widening is deliberately limited to PropertyNode: a CombinerNode aggregates extractors and a bare ParadataNode carry no documentation relation, so those legacy endpoints are left as generic_connection with a warning at import rather than asserting P70i (the DTC evidence chain property<-combiner<-extractor->document is NOT synthesised at import)."
959
981
  },
960
982
  "allowed_connections": {
961
983
  "source": [
962
984
  "StratigraphicNode",
963
985
  "SpecialFindUnit",
964
- "VirtualStratigraphicUnit"
986
+ "VirtualStratigraphicUnit",
987
+ "PropertyNode"
965
988
  ],
966
989
  "target": [
967
990
  "DocumentNode"
@@ -981,17 +1004,14 @@
981
1004
  "cidoc_extension": "CIDOC-CRM",
982
1005
  "extension_mapping": "em:hasVisualReference",
983
1006
  "extension_name": "EM",
984
- "_comment": "Mapped 2026-07-10 (was NOTyetMAPPED): the paradata node is visually illustrated/anchored by a document. E36 Visual Item P138 represents E1; edge direction node->document matches P138i, consistent with the has_representation_model family. The exporter co-types the target document as E36. Distinct from extracted_from (P67/J7): a visual reference shows, an extraction source justifies. See WP3 coverage analysis Appendix B.1."
1007
+ "_comment": "Mapped 2026-07-10; source/target revised 2026-08-05 (BUGFIX-CONN2). A PropertyNode (an asserted quale) is visually illustrated/anchored by a VISUAL RESOURCE — the resource-layer image node (LinkNode), NOT a source-document. E36 Visual Item P138 represents E1; edge direction property->resource matches P138i, consistent with the has_representation_model family. The exporter co-types the target (the LinkNode) as E36 Visual Item; because E36 is a subclass of E73 Information Object (the LinkNode's base class) this co-typing is range-consistent — it was strained for the former E31 Document target. Distinct from has_linked_resource (P67, a bare resource reference) and from extracted_from (P67/J7, an extraction source): a visual reference SHOWS a property, an extraction source JUSTIFIES an inference. DocumentNode stays a source (fonte). See WP3 coverage analysis Appendix B.1 and the CIDOC note for Felicetti in the end-of report."
985
1008
  },
986
1009
  "allowed_connections": {
987
1010
  "source": [
988
- "PropertyNode",
989
- "ExtractorNode",
990
- "CombinerNode",
991
- "ParadataNode"
1011
+ "PropertyNode"
992
1012
  ],
993
1013
  "target": [
994
- "DocumentNode"
1014
+ "LinkNode"
995
1015
  ]
996
1016
  }
997
1017
  },
@@ -518,15 +518,16 @@
518
518
  "class": "NegativeStratigraphicUnit",
519
519
  "parent": "StratigraphicNode",
520
520
  "abbreviation": "USN",
521
- "label": "Negative SU",
522
- "symbol": "white dashed rectangle",
523
- "description": "Negative Stratigraphic Unit — a lacuna, removal, or interface that marks the absence of matter rather than its presence (e.g., a pit cut, an erosion surface, a demolition void). Distinct from a plain StratigraphicUnit (which is positive by default), but equally observable on the ground — hence classified in the `real` family.",
521
+ "label": "US-",
522
+ "symbol": "grey rectangle, solid border",
523
+ "description": "Negative Stratigraphic Unit (US negativa, displayed 'US-') — a lacuna produced by a SUBTRACTION of matter: a pit cut, an opening broken through a wall, an erosion surface, a levelling. What defines it is the destructive act, which is what separates it from the NEUTRAL unit (USNt), a void that was never filled because it was never meant to be. Equally observable on the ground as a positive unit, hence the `real` family. POL6 (2026-08-04): the token is USN again — the historical spelling of this library and of what pyArchInit vendors, and the one that reads as the Italian 'US Negativa'. POL5 had briefly moved it to 'USNeg' to free USN for the neutral unit; that made a token spell one thing and mean another, and put the two projects in disagreement about a three-letter word.",
524
+ "scope_note": "USE when matter that WAS there has been taken away, and you can name the act: a cut, a pit, an opening broken through masonry, an erosion surface, a levelling or shaving of a structure. The relation to the unit it removes is a stratigraphic one and all of them are available (`cuts`, `fills`, `abuts`, sequence, …) — this is a unit of the sequence and behaves like one. DO NOT USE for a void left deliberately by the act of building (a window opening, a niche, a room): that is USNt, the neutral unit, and calling it negative dates it to a removal that never happened.",
524
525
  "s3Dgraphy_file": "stratigraphic_node.py",
525
526
  "mapping": {
526
527
  "cidoc": "A3 Stratigraphic Interface",
527
528
  "cidoc_s3d": null,
528
529
  "alternative": "A3 Stratigraphic Interface + A5 Stratigraphic Modification (the producing removal event)",
529
- "rationale": "A USN is an INTERFACE (A3) produced by removal of matter, not a positive volumetric SU (A2). The legacy 'A8 Stratigraphic Unit (Negative)' was not a real CRMarchaeo class. The removal action is a separate A5 event linked via P108i_was_produced_by."
530
+ "rationale": "A negative SU is an INTERFACE (A3) produced by removal of matter, not a positive volumetric SU (A2) — a REAL CRMarchaeo class, not a placeholder: the surface left by a cut is exactly what A3 models. The legacy 'A8 Stratigraphic Unit (Negative)' was not a real CRMarchaeo class. The removal action is a separate A5 event linked via P108i_was_produced_by."
530
531
  },
531
532
  "em_extension": {
532
533
  "uri": "em:NegativeSU",
@@ -542,6 +543,44 @@
542
543
  },
543
544
  "family": "real",
544
545
  "is_series": false
546
+ },
547
+ "USNt": {
548
+ "class": "NeutralStratigraphicUnit",
549
+ "parent": "StratigraphicNode",
550
+ "abbreviation": "USNt",
551
+ "label": "USNt",
552
+ "symbol": "grey outline at the four corners only (no continuous border)",
553
+ "description": "Neutral Stratigraphic Unit (Unità Stratigrafica Neutra, USNt) — a void that is part of the DESIGN and not the product of a destruction: the `risparmi` of masonry, a window or door opening, a niche, the empty volume of a room. The wall was built around it, so nothing was ever removed. The distinction from the negative unit (USN, displayed 'US-') is stratigraphic and not cosmetic: a demolition void is evidence of an ACT, a risparmio is evidence of an INTENTION, and reading one as the other dates the void to a removal that never happened. Added in POL5 (2026-08-04) on E.D.'s explicit authorisation; the token became USNt in POL6, when USN went back to the negativa.",
554
+ "scope_note": "USE for a void produced BY the act of building: window and door openings, niches, the volume enclosed by walls, any gap left deliberately in a masonry face — an absence that was WANTED. DO NOT USE for a cut, an opening broken through an existing wall, an erosion surface or a levelling: those are USN (US-), because matter was removed. DO NOT USE for a gap in the DOCUMENTATION (something not observed): that is not a stratigraphic unit at all. Test: if you can name the action that removed the matter, it is USN; if the matter was never there, it is USNt.",
555
+ "attach_rules": {
556
+ "allowed_stratigraphic_edges": [
557
+ "is_after"
558
+ ],
559
+ "_comment": "E.D.'s constraint, and the reason for it: a risparmio cannot cut, fill, abut or be bonded to anything — nothing was removed and nothing touches it — so the only stratigraphic statement it can carry is sequence. `is_after` covers both directions (its declared `reverse` is is_before). NB the constraint belongs to the NEUTRAL unit only: the negative one (USN) is a unit of the sequence and keeps every relation. The enforceable copy lives in s3Dgraphy_connections_datamodel.json -> node_type_restrictions.USNt, which is what consumers read; this field is the same fact stated where a reader of the node type will look for it.",
560
+ "paradata": "unrestricted — a risparmio is documented, measured and reasoned about like any other unit (has_property, has_data_provenance, is_in_paradata_nodegroup, epoch and group membership are all unaffected)."
561
+ },
562
+ "s3Dgraphy_file": "stratigraphic_node.py",
563
+ "mapping": {
564
+ "cidoc": "A3 Stratigraphic Interface",
565
+ "cidoc_s3d": null,
566
+ "alternative": "A3 Stratigraphic Interface + A4 Stratigraphic Genesis (a CONSTRUCTIVE genesis, not the A5 destructive modification the negative unit gets)",
567
+ "provisional": true,
568
+ "rationale": "TENTATIVE placeholder, better informed than POL5's E24 but still not a decision. TODO CIDOC: USNt (risparmio) — probabile A3_Stratigraphic_Interface con genesi COSTRUTTIVA (A4_Stratigraphic_Genesis), distinta dalla negativa che nasce da una A5 distruttiva. NON e detto sia una classe nuova: E.D. coordina con Achille Felicetti / CRMarchaeo. The reading behind the placeholder: what is observable is a SURFACE bounding an absence, which is what A3 models, and the difference from the negative unit is not the surface but its genesis — built, not cut. If that holds, the two share A3 and differ in the event that produced them, and no new class is needed; POL5's E24 said less and claimed more. MUST be confirmed before any RDF export claims to be CRMarchaeo-conformant."
569
+ },
570
+ "em_extension": {
571
+ "uri": "em:NeutralSU",
572
+ "rdf_type": "owl:Class",
573
+ "subclass_of": [
574
+ "crmarchaeo:A3_Stratigraphic_Interface"
575
+ ],
576
+ "extension_status": "proposed_provisional"
577
+ },
578
+ "properties": {
579
+ "name": "P1_is_identified_by",
580
+ "description": "P3_has_note"
581
+ },
582
+ "family": "real",
583
+ "is_series": false
545
584
  }
546
585
  }
547
586
  }
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path fill="#ffffff" d="M96 128a128 128 0 1 1 256 0A128 128 0 1 1 96 128zM0 482.3C0 383.8 79.8 304 178.3 304l91.4 0C368.2 304 448 383.8 448 482.3c0 16.4-13.3 29.7-29.7 29.7L29.7 512C13.3 512 0 498.7 0 482.3zM609.3 512l-137.8 0c5.4-9.4 8.6-20.3 8.6-32l0-8c0-60.7-27.1-115.2-69.8-151.8c2.4-.1 4.7-.2 7.1-.2l61.4 0C567.8 320 640 392.2 640 481.3c0 17-13.8 30.7-30.7 30.7zM432 256c-31 0-59-12.6-79.3-32.9C372.4 196.5 384 163.6 384 128c0-26.8-6.6-52.1-18.3-74.3C384.3 40.1 407.2 32 432 32c61.9 0 112 50.1 112 112s-50.1 112-112 112z"/></svg>