s3dgraphy 1.6.0.dev17__tar.gz → 1.6.0.dev19__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 (419) hide show
  1. {s3dgraphy-1.6.0.dev17/src/s3dgraphy.egg-info → s3dgraphy-1.6.0.dev19}/PKG-INFO +2 -1
  2. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/pyproject.toml +7 -1
  3. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/datamodel_translations.json +18 -2
  4. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/em.ttl +99 -16
  5. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/em_document_types.json +2 -1
  6. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/em_extractor_types.json +2 -1
  7. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/em_qualia_types.json +2 -1
  8. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/em_visual_rules.json +141 -21
  9. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/node_registry.generated.json +12 -2
  10. s3dgraphy-1.6.0.dev19/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json +1528 -0
  11. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/s3Dgraphy_node_datamodel.json +79 -22
  12. s3dgraphy-1.6.0.dev19/src/s3dgraphy/JSON_config/src/2D/dtc/11_device.svg +18 -0
  13. s3dgraphy-1.6.0.dev19/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_computer.svg +20 -0
  14. s3dgraphy-1.6.0.dev19/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_drone.svg +23 -0
  15. s3dgraphy-1.6.0.dev19/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_gnss.svg +20 -0
  16. s3dgraphy-1.6.0.dev19/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_optical.svg +19 -0
  17. s3dgraphy-1.6.0.dev19/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_scanner.svg +20 -0
  18. s3dgraphy-1.6.0.dev19/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_sensor.svg +20 -0
  19. s3dgraphy-1.6.0.dev19/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_station.svg +20 -0
  20. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/__init__.py +2 -1
  21. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/api.py +129 -8
  22. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/authorities/__init__.py +2 -0
  23. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/authorities/resolver.py +132 -11
  24. s3dgraphy-1.6.0.dev19/src/s3dgraphy/authorities/snapshots/LICENSE +54 -0
  25. s3dgraphy-1.6.0.dev19/src/s3dgraphy/authorities/snapshots/chronontology.jsonld +37 -0
  26. s3dgraphy-1.6.0.dev19/src/s3dgraphy/authorities/snapshots/provenance.json +63 -0
  27. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/container.py +19 -0
  28. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/dtc/__init__.py +15 -1
  29. s3dgraphy-1.6.0.dev19/src/s3dgraphy/dtc/devices.py +185 -0
  30. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/dtc/ingest.py +36 -4
  31. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/json_exporter.py +35 -21
  32. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/rdf_exporter.py +128 -9
  33. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/graph.py +41 -0
  34. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/importer/base_importer.py +135 -11
  35. s3dgraphy-1.6.0.dev19/src/s3dgraphy/importer/fmpxml_importer.py +150 -0
  36. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/importer/pyarchinit_importer.py +6 -0
  37. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/importer/rdf_importer.py +44 -7
  38. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/mappings/authoring.py +227 -12
  39. s3dgraphy-1.6.0.dev19/src/s3dgraphy/mappings/emdb/generic_specialfind_mapping.json +62 -0
  40. s3dgraphy-1.6.0.dev19/src/s3dgraphy/mappings/emdb/site_properties_mapping.json +181 -0
  41. s3dgraphy-1.6.0.dev19/src/s3dgraphy/mappings/emdb/usm_mapping.json +76 -0
  42. s3dgraphy-1.6.0.dev19/src/s3dgraphy/mappings/generic/excel_to_graphml_mapping.json +277 -0
  43. s3dgraphy-1.6.0.dev19/src/s3dgraphy/mappings/pyarchinit/pyarchinit_us_mapping.json +259 -0
  44. s3dgraphy-1.6.0.dev19/src/s3dgraphy/mappings/source_list/source_list_mapping.json +49 -0
  45. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/mappings/template_emdb_mapping.json +8 -9
  46. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/mappings/template_pyarchinit_mapping.json +8 -11
  47. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/__init__.py +7 -0
  48. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/dtc_acquisition_node.py +1 -1
  49. s3dgraphy-1.6.0.dev19/src/s3dgraphy/nodes/dtc_device_node.py +108 -0
  50. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/dtc_node.py +25 -10
  51. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/dtc_process_node.py +1 -1
  52. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/group_node.py +74 -1
  53. s3dgraphy-1.6.0.dev19/src/s3dgraphy/nodes/resource_node.py +494 -0
  54. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/publication.py +61 -8
  55. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/resources/resolver.py +80 -4
  56. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/rights.py +57 -3
  57. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/shelf/core.py +8 -0
  58. s3dgraphy-1.6.0.dev19/src/s3dgraphy/stamp/__init__.py +70 -0
  59. s3dgraphy-1.6.0.dev19/src/s3dgraphy/stamp/absorb.py +484 -0
  60. s3dgraphy-1.6.0.dev19/src/s3dgraphy/stamp/emit.py +847 -0
  61. s3dgraphy-1.6.0.dev19/src/s3dgraphy/stamp/hints.py +30 -0
  62. s3dgraphy-1.6.0.dev19/src/s3dgraphy/stamp/identity.py +25 -0
  63. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/study.py +9 -1
  64. s3dgraphy-1.6.0.dev19/src/s3dgraphy/tools/deliverable_report.py +402 -0
  65. s3dgraphy-1.6.0.dev19/src/s3dgraphy/zero_hour.py +397 -0
  66. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19/src/s3dgraphy.egg-info}/PKG-INFO +2 -1
  67. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy.egg-info/SOURCES.txt +31 -1
  68. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy.egg-info/requires.txt +1 -0
  69. s3dgraphy-1.6.0.dev19/tests/test_attach_only.py +223 -0
  70. s3dgraphy-1.6.0.dev19/tests/test_authority_resolver.py +355 -0
  71. s3dgraphy-1.6.0.dev19/tests/test_blend_locator.py +171 -0
  72. s3dgraphy-1.6.0.dev19/tests/test_devices.py +383 -0
  73. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_dtc_projection.py +15 -1
  74. s3dgraphy-1.6.0.dev19/tests/test_fmpxml_importer.py +140 -0
  75. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_mapping_authoring.py +11 -8
  76. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_mapping_csv_and_relations.py +52 -10
  77. s3dgraphy-1.6.0.dev19/tests/test_rdf_reverse_edges.py +218 -0
  78. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_rdf_roundtrip.py +23 -5
  79. s3dgraphy-1.6.0.dev19/tests/test_resource_tier.py +346 -0
  80. s3dgraphy-1.6.0.dev19/tests/test_reverse_edges.py +276 -0
  81. s3dgraphy-1.6.0.dev19/tests/test_rm_container_node_group.py +521 -0
  82. s3dgraphy-1.6.0.dev19/tests/test_shipped_mappings.py +185 -0
  83. s3dgraphy-1.6.0.dev19/tests/test_stamp.py +1024 -0
  84. s3dgraphy-1.6.0.dev19/tests/test_stamp_hints.py +273 -0
  85. s3dgraphy-1.6.0.dev19/tests/test_visual_assets.py +211 -0
  86. s3dgraphy-1.6.0.dev19/tests/test_zero_hour.py +403 -0
  87. s3dgraphy-1.6.0.dev17/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json +0 -1461
  88. s3dgraphy-1.6.0.dev17/src/s3dgraphy/authorities/snapshots/LICENSE +0 -22
  89. s3dgraphy-1.6.0.dev17/src/s3dgraphy/authorities/snapshots/chronontology.jsonld +0 -23
  90. s3dgraphy-1.6.0.dev17/src/s3dgraphy/authorities/snapshots/provenance.json +0 -41
  91. s3dgraphy-1.6.0.dev17/src/s3dgraphy/mappings/emdb/generic_specialfind_mapping.json +0 -60
  92. s3dgraphy-1.6.0.dev17/src/s3dgraphy/mappings/emdb/site_properties_mapping.json +0 -118
  93. s3dgraphy-1.6.0.dev17/src/s3dgraphy/mappings/emdb/usm_mapping.json +0 -67
  94. s3dgraphy-1.6.0.dev17/src/s3dgraphy/mappings/generic/excel_to_graphml_mapping.json +0 -197
  95. s3dgraphy-1.6.0.dev17/src/s3dgraphy/mappings/pyarchinit/pyarchinit_us_mapping.json +0 -102
  96. s3dgraphy-1.6.0.dev17/src/s3dgraphy/mappings/source_list/source_list_mapping.json +0 -34
  97. s3dgraphy-1.6.0.dev17/src/s3dgraphy/nodes/resource_node.py +0 -254
  98. s3dgraphy-1.6.0.dev17/tests/test_authority_resolver.py +0 -81
  99. s3dgraphy-1.6.0.dev17/tests/test_visual_assets.py +0 -104
  100. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/LICENSE +0 -0
  101. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/MANIFEST.in +0 -0
  102. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/README.md +0 -0
  103. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/setup.cfg +0 -0
  104. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/acquisition_descriptor.schema.json +0 -0
  105. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/acquisition_mappings/ercolano.json +0 -0
  106. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/acquisition_mappings/fs.json +0 -0
  107. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/acquisition_mappings/uri.json +0 -0
  108. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/em_palette_icons.json +0 -0
  109. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/em_qualia_types_additions.json +0 -0
  110. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/hdto_extension.ttl +0 -0
  111. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/new_qualia_template.json +0 -0
  112. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/outdated_s3dgraphy.ttl +0 -0
  113. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/outdated_s3dgraphy_nomapping.ttl +0 -0
  114. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json.v155.bak +0 -0
  115. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/ActivityNodeGroup.svg +0 -0
  116. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.png +0 -0
  117. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.svg +0 -0
  118. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/EpochNode.svg +0 -0
  119. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/ParadataNodeGroup.svg +0 -0
  120. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/RSF.png +0 -0
  121. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/RSF.svg +0 -0
  122. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/SE.svg +0 -0
  123. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/SE_old.png +0 -0
  124. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/SE_old.svg +0 -0
  125. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/SF.png +0 -0
  126. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/SF.svg +0 -0
  127. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/TSU.png +0 -0
  128. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/US.png +0 -0
  129. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/US.svg +0 -0
  130. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/USD.png +0 -0
  131. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/USD.svg +0 -0
  132. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/USVn.png +0 -0
  133. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/USVn.svg +0 -0
  134. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/USVs.png +0 -0
  135. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/USVs.svg +0 -0
  136. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/UTR.svg +0 -0
  137. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/VSF.png +0 -0
  138. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/VSF.svg +0 -0
  139. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/author.png +0 -0
  140. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/author.svg +0 -0
  141. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/author_ai.png +0 -0
  142. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/combiner.png +0 -0
  143. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/combiner.svg +0 -0
  144. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/continuity.png +0 -0
  145. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/continuity.svg +0 -0
  146. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/document.png +0 -0
  147. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/document.svg +0 -0
  148. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/dtc/00_transformation.svg +0 -0
  149. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/dtc/01_topographicnetwork.svg +0 -0
  150. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/dtc/02_pointcloud.svg +0 -0
  151. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/dtc/03_mesh.svg +0 -0
  152. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/dtc/04_points.svg +0 -0
  153. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/dtc/05_lines.svg +0 -0
  154. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/dtc/06_polygons.svg +0 -0
  155. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/dtc/07_DEM.svg +0 -0
  156. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/dtc/08_ortophoto.svg +0 -0
  157. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/dtc/09_photos.svg +0 -0
  158. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/dtc/10_laserscanner.svg +0 -0
  159. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/embargo.png +0 -0
  160. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/extractor.png +0 -0
  161. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/extractor.svg +0 -0
  162. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/gcp_set.svg +0 -0
  163. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/generic_node.svg +0 -0
  164. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/geo_position.svg +0 -0
  165. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/graph.svg +0 -0
  166. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/license.png +0 -0
  167. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/link.svg +0 -0
  168. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/narrative.png +0 -0
  169. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/play.svg +0 -0
  170. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/property.png +0 -0
  171. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/property.svg +0 -0
  172. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/registration_transform.svg +0 -0
  173. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/representation_model.svg +0 -0
  174. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/representation_model_doc.svg +0 -0
  175. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/representation_model_sf.svg +0 -0
  176. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/semantic_shape.svg +0 -0
  177. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/serSU.png +0 -0
  178. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/serSU.svg +0 -0
  179. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/serUSD.png +0 -0
  180. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/serUSV.png +0 -0
  181. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/serUSVn.svg +0 -0
  182. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/2D/serUSVs.svg +0 -0
  183. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/3D/RSF.glb +0 -0
  184. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/3D/SF.glb +0 -0
  185. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/3D/TSU.glb +0 -0
  186. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/3D/US.glb +0 -0
  187. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/3D/USD.glb +0 -0
  188. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/3D/USVn.glb +0 -0
  189. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/3D/USVs.glb +0 -0
  190. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/3D/VSF.glb +0 -0
  191. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/3D/combiner.glb +0 -0
  192. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/3D/continuity.glb +0 -0
  193. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/3D/document.glb +0 -0
  194. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/3D/extractor.glb +0 -0
  195. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/3D/property.glb +0 -0
  196. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/3D/serSU.glb +0 -0
  197. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/3D/serUSD.glb +0 -0
  198. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/JSON_config/src/3D/serUSV.glb +0 -0
  199. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/acquisition/__init__.py +0 -0
  200. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/acquisition/acquire.py +0 -0
  201. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/acquisition/descriptor.py +0 -0
  202. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/acquisition/mapping.py +0 -0
  203. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/annotation/__init__.py +0 -0
  204. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/annotation/paradata.py +0 -0
  205. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/authorities/snapshots/getty_aat.jsonld +0 -0
  206. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/authorities/snapshots/getty_tgn.jsonld +0 -0
  207. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/authorities/snapshots/periodo.jsonld +0 -0
  208. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/classification.py +0 -0
  209. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/contract/__init__.py +0 -0
  210. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/contract/connector.py +0 -0
  211. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/contract/consumer.py +0 -0
  212. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/contract/core.py +0 -0
  213. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/contract/reference.py +0 -0
  214. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/crdt.py +0 -0
  215. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/data/StratiMiner_Extraction_Prompt.md +0 -0
  216. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/diagnostics.py +0 -0
  217. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/dissemination.py +0 -0
  218. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/dtc/corpus.py +0 -0
  219. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/dtc/neighbourhood.py +0 -0
  220. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/dtc/residency.py +0 -0
  221. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/edges/__init__.py +0 -0
  222. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/edges/connection_resolver.py +0 -0
  223. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/edges/connections_loader.py +0 -0
  224. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/edges/edge.py +0 -0
  225. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/editorial.py +0 -0
  226. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/__init__.py +0 -0
  227. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/docx_exporter.py +0 -0
  228. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/emjson_exporter.py +0 -0
  229. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/graphml/__init__.py +0 -0
  230. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/graphml/canvas_generator.py +0 -0
  231. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/graphml/edge_generator.py +0 -0
  232. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/graphml/epoch_generator.py +0 -0
  233. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/graphml/graphml_exporter.py +0 -0
  234. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/graphml/graphml_patcher.py +0 -0
  235. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/graphml/group_node_generator.py +0 -0
  236. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/graphml/node_generator.py +0 -0
  237. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/graphml/node_registry.py +0 -0
  238. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/graphml/palette_resources.py +0 -0
  239. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/graphml/paradata_generator.py +0 -0
  240. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/graphml/paradata_image_generator.py +0 -0
  241. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/graphml/paradata_node_generators.py +0 -0
  242. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/graphml/table_node_generator.py +0 -0
  243. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/graphml/utils.py +0 -0
  244. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/html_exporter.py +0 -0
  245. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/ipynb_exporter.py +0 -0
  246. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/latex_exporter.py +0 -0
  247. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/exporter/unified_xlsx_exporter.py +0 -0
  248. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/geometry/__init__.py +0 -0
  249. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/geometry/migrate.py +0 -0
  250. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/geometry/proxy.py +0 -0
  251. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/geometry/store_backed.py +0 -0
  252. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/iiif.py +0 -0
  253. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/importer/__init__.py +0 -0
  254. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/importer/csv_importer.py +0 -0
  255. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/importer/emjson_importer.py +0 -0
  256. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/importer/import_graphml.py +0 -0
  257. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/importer/mapped_xlsx_importer.py +0 -0
  258. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/importer/qualia_importer.py +0 -0
  259. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/importer/source_text.py +0 -0
  260. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/importer/unified_xlsx_importer.py +0 -0
  261. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/importer/xlsx_importer.py +0 -0
  262. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/importer/xml_importer.py +0 -0
  263. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/indices.py +0 -0
  264. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/mappings/__init__.py +0 -0
  265. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/mappings/registry.py +0 -0
  266. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/merge/__init__.py +0 -0
  267. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/merge/graph_merger.py +0 -0
  268. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/multigraph/__init__.py +0 -0
  269. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/multigraph/multigraph.py +0 -0
  270. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/narrative/__init__.py +0 -0
  271. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/narrative/bake.py +0 -0
  272. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/narrative/generation.py +0 -0
  273. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/narrative/query.py +0 -0
  274. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/narrative/registry.py +0 -0
  275. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/narrative/site_story.py +0 -0
  276. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/annotation_region_node.py +0 -0
  277. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/author_node.py +0 -0
  278. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/base_node.py +0 -0
  279. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/combiner_node.py +0 -0
  280. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/document_node.py +0 -0
  281. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/embargo_node.py +0 -0
  282. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/epoch_node.py +0 -0
  283. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/extractor_node.py +0 -0
  284. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/geo_position_node.py +0 -0
  285. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/georeferencing_node.py +0 -0
  286. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/graph_node.py +0 -0
  287. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/hdt_node.py +0 -0
  288. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/heritage_entity_node.py +0 -0
  289. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/license_node.py +0 -0
  290. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/narrative_node.py +0 -0
  291. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/paradata_node.py +0 -0
  292. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/project_node.py +0 -0
  293. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/property_node.py +0 -0
  294. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/representation_node.py +0 -0
  295. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/semantic_shape_node.py +0 -0
  296. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/stratigraphic_node.py +0 -0
  297. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/nodes/study_node.py +0 -0
  298. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/photogrammetry/__init__.py +0 -0
  299. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/photogrammetry/delta.py +0 -0
  300. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/resolvers/__init__.py +0 -0
  301. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/resolvers/builtin_rules.py +0 -0
  302. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/resolvers/property_resolver.py +0 -0
  303. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/resources/__init__.py +0 -0
  304. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/resources/fs_backend.py +0 -0
  305. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/resources/minio_backend.py +0 -0
  306. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/shelf/__init__.py +0 -0
  307. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/__init__.py +0 -0
  308. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/_db_handle.py +0 -0
  309. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/_legacy_paradata_svgs.py +0 -0
  310. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/_workspace.py +0 -0
  311. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/conflict_resolver.py +0 -0
  312. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/edge_registry.py +0 -0
  313. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/graph_ingestor.py +0 -0
  314. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/graph_projector.py +0 -0
  315. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/graphml_writer.py +0 -0
  316. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/group_projector.py +0 -0
  317. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/group_store.py +0 -0
  318. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/ingest_result.py +0 -0
  319. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/paradata_store.py +0 -0
  320. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/pyarchinit_pg_importer.py +0 -0
  321. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/rapporti.py +0 -0
  322. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/uuid7.py +0 -0
  323. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/vocab_provider_core.py +0 -0
  324. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/vocab_types.py +0 -0
  325. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/yed_classifier.py +0 -0
  326. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/yed_detector.py +0 -0
  327. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/yed_group_walker.py +0 -0
  328. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/yed_import_pipeline.py +0 -0
  329. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/yed_rapporti_policy.py +0 -0
  330. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/sync/yed_table_parser.py +0 -0
  331. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/templates/em_data_template.xlsx +0 -0
  332. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/templates/em_palette_template.graphml +0 -0
  333. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/temporal/__init__.py +0 -0
  334. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/temporal/inference_engine.py +0 -0
  335. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/tools/__init__.py +0 -0
  336. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/tools/consumer_drift.py +0 -0
  337. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/tools/datamodel_i18n.py +0 -0
  338. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/tools/sync_node_datamodel.py +0 -0
  339. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/tools/wheel_drift.py +0 -0
  340. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/transforms/__init__.py +0 -0
  341. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/transforms/aux_tracking.py +0 -0
  342. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/transforms/compact.py +0 -0
  343. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/transforms/materialize_continuity.py +0 -0
  344. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/utils/__init__.py +0 -0
  345. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/utils/utils.py +0 -0
  346. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy/utils/visual_layout.py +0 -0
  347. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy.egg-info/dependency_links.txt +0 -0
  348. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/src/s3dgraphy.egg-info/top_level.txt +0 -0
  349. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_acquisition.py +0 -0
  350. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_acquisition_fs.py +0 -0
  351. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_api_surface.py +0 -0
  352. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_asset_dtc_protocol.py +0 -0
  353. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_authority_projection.py +0 -0
  354. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_canonical_document_rename.py +0 -0
  355. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_canvas_metadata_import.py +0 -0
  356. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_composite_node_name.py +0 -0
  357. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_connection_resolver.py +0 -0
  358. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_consumer_drift.py +0 -0
  359. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_container.py +0 -0
  360. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_contract.py +0 -0
  361. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_contract_consumer.py +0 -0
  362. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_convert_command.py +0 -0
  363. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_crdt.py +0 -0
  364. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_datamodel_i18n.py +0 -0
  365. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_deterministic_ids.py +0 -0
  366. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_dissemination_tombstones.py +0 -0
  367. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_dtc_corpus.py +0 -0
  368. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_dtc_ingest.py +0 -0
  369. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_dtc_neighbourhood.py +0 -0
  370. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_dtc_residency.py +0 -0
  371. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_editorial.py +0 -0
  372. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_emjson_roundtrip.py +0 -0
  373. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_emjson_schema_version.py +0 -0
  374. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_epoch_undated_import.py +0 -0
  375. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_explicit_node_type_marker.py +0 -0
  376. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_filtered_import.py +0 -0
  377. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_fs_backend.py +0 -0
  378. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_functional_units.py +0 -0
  379. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_georeference_scene.py +0 -0
  380. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_graph_scope_migration.py +0 -0
  381. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_hdto_projection.py +0 -0
  382. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_header_key_aliases.py +0 -0
  383. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_iiif.py +0 -0
  384. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_importer_edge_hygiene.py +0 -0
  385. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_ipynb_exporter.py +0 -0
  386. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_latex_exporter.py +0 -0
  387. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_lossless_roundtrip.py +0 -0
  388. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_material_color.py +0 -0
  389. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_merge_conflicts.py +0 -0
  390. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_migrate_legacy_proxy.py +0 -0
  391. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_minio_backend.py +0 -0
  392. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_narrative_authorship.py +0 -0
  393. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_narrative_bake_docx.py +0 -0
  394. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_narrative_figures.py +0 -0
  395. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_narrative_generation.py +0 -0
  396. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_narrative_node.py +0 -0
  397. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_narrative_query.py +0 -0
  398. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_narrative_scaffolder.py +0 -0
  399. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_node_datamodel_registry.py +0 -0
  400. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_pg_importer.py +0 -0
  401. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_photogrammetry_delta.py +0 -0
  402. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_promotion.py +0 -0
  403. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_pyarchinit_tier2.py +0 -0
  404. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_recompute_warnings.py +0 -0
  405. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_reproject.py +0 -0
  406. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_resource_layer.py +0 -0
  407. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_semantic_purity.py +0 -0
  408. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_shelf.py +0 -0
  409. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_shelf_facets.py +0 -0
  410. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_shelf_hatting.py +0 -0
  411. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_shelf_role_uri_table.py +0 -0
  412. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_source_list_mapping.py +0 -0
  413. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_source_text.py +0 -0
  414. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_store_backed_geometry.py +0 -0
  415. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_stratiminer_api.py +0 -0
  416. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_study_metadata.py +0 -0
  417. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_ttl_roundtrip.py +0 -0
  418. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_wheel_drift.py +0 -0
  419. {s3dgraphy-1.6.0.dev17 → s3dgraphy-1.6.0.dev19}/tests/test_xlsx_importer_graph_init.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: s3dgraphy
3
- Version: 1.6.0.dev17
3
+ Version: 1.6.0.dev19
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>
@@ -35,6 +35,7 @@ Requires-Dist: pandas>=2.0.0
35
35
  Requires-Dist: lxml>=4.9.0
36
36
  Requires-Dist: openpyxl>=3.0.0
37
37
  Requires-Dist: networkx>=3.0
38
+ Requires-Dist: dtcstamp>=0.1.0
38
39
  Provides-Extra: rdf
39
40
  Requires-Dist: rdflib>=7.0; extra == "rdf"
40
41
  Provides-Extra: rdf-embedded
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "s3dgraphy"
7
- version = "1.6.0.dev17"
7
+ version = "1.6.0.dev19"
8
8
  description = "3D Stratigraphic Graph Management Library for archaeological and heritage applications"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -51,6 +51,12 @@ dependencies = [
51
51
  "lxml>=4.9.0", # used by graphml importer/exporter
52
52
  "openpyxl>=3.0.0", # used by xlsx_importer
53
53
  "networkx>=3.0", # used by temporal/inference_engine.py
54
+ # The stamp FORMAT — read, write, compare, walk — extracted so that a
55
+ # Blender add-on or a Metashape script can use it without installing any of
56
+ # the four above. It has zero dependencies of its own and is one module, so
57
+ # it can also simply be copied; s3dgraphy depends on it rather than
58
+ # vendoring it, because two copies of a format rule drift.
59
+ "dtcstamp>=0.1.0",
54
60
  ]
55
61
 
56
62
  [project.urls]
@@ -124,7 +124,7 @@
124
124
  },
125
125
  "DTCAcquisitionNode": {
126
126
  "description": {
127
- "en": "A DTC ACQUISITION chunk: the digital event by which an asset ENTERS this study from an (opaque, Tier-0) external source — a data-transfer / ingestion event, DISTINCT from the genesis DTCProcessNode. Projected as crmdig:D12_Data_Transfer_Event (a subclass of D7_Digital_Machine_Event, ⊂ prov:Activity): 'events that transfer a digital object from one digital carrier to another; normally the digital object remains the same' — the object arrives opaque, no genesis is asserted. Tier 0: single-ring chain — the acquisition event --dtc_had_output[prov:generated]--> the acquired Resource (ResourceNode); the upstream root is an opaque external entity recorded as literals on data (repo/record/agent/retrieved_at/rights), not a genesis sub-graph. data.dtc_kind from the `acquisition` axis (download / ingest / local_import). Keeps genesis != acquisition as distinct TYPES inside the one DTC substrate.",
127
+ "en": "A DTC ACQUISITION step: the digital event by which an asset ENTERS this study from an (opaque, Tier-0) external source — a data-transfer / ingestion event, DISTINCT from the genesis DTCProcessNode. Projected as crmdig:D12_Data_Transfer_Event (a subclass of D7_Digital_Machine_Event, ⊂ prov:Activity): 'events that transfer a digital object from one digital carrier to another; normally the digital object remains the same' — the object arrives opaque, no genesis is asserted. Tier 0: single-ring chain — the acquisition event --dtc_had_output[prov:generated]--> the acquired Resource (ResourceNode); the upstream root is an opaque external entity recorded as literals on data (repo/record/agent/retrieved_at/rights), not a genesis sub-graph. data.dtc_kind from the `acquisition` axis (download / ingest / local_import). Keeps genesis != acquisition as distinct TYPES inside the one DTC substrate.",
128
128
  "validated_it": false,
129
129
  "validated_el": false,
130
130
  "validated_he": false,
@@ -146,7 +146,7 @@
146
146
  },
147
147
  "DTCProcessNode": {
148
148
  "description": {
149
- "en": "A DTC PROCESS chunk: the transformation/processing event that turns inputs into produced digital objects (data.dtc_kind from the `process` axis, e.g. transformation). Projected as a crmdig:D7_Digital_Machine_Event / prov:Activity; its inputs and outputs are the dtc_had_input (prov:used) and dtc_had_output (prov:generated) edges.",
149
+ "en": "A DTC PROCESS step: the transformation/processing event that turns inputs into produced digital objects (data.dtc_kind from the `process` axis, e.g. transformation). Projected as a crmdig:D7_Digital_Machine_Event / prov:Activity; its inputs and outputs are the dtc_had_input (prov:used) and dtc_had_output (prov:generated) edges.",
150
150
  "validated_it": false,
151
151
  "validated_el": false,
152
152
  "validated_he": false,
@@ -1097,6 +1097,22 @@
1097
1097
  "label": {
1098
1098
  "en": "Registration transform"
1099
1099
  }
1100
+ },
1101
+ "RepresentationModelNodeGroup": {
1102
+ "description": {
1103
+ "en": "Typed aggregation of the representation models that form ONE named set published under a single Document — «Survey 2015» under D.01, «Reconstruction» under D.09 (EM16-RMNG, meeting of 2026-09-10). Until then the RM container lived only as EM Tools' `scene.rm_containers` PropertyGroup, so the grouping that gives the set its meaning was invisible to anyone reading the graph. IT SITS BESIDE, IT DOES NOT REPLACE: every member keeps its own epoch edges (has_first_epoch / survive_in_epoch) and the Document keeps its DIRECT has_representation_model edges to each model — the group is added on top and never put in between, so a consumer that ignores it reads exactly what it read before. Membership is the TAG axis 'is_in_representation_model_group', like is_in_functional_unit and is_in_location, but 1:1 and not m:n: a mesh belongs to exactly one container, the rule already in force on the Blender side where `mesh_names` is authoritative. A group may legally be EMPTY and may legally have NO Document: both are states the RM Manager UI already shows. NOT a FunctionalUnitNodeGroup (that aggregates stratigraphic units into a building component; these members are models, not units); NOT an ActivityNodeGroup (nothing happened here and the set has no formation event of its own); NOT the Document, which stays the documentary anchor — deleting the container removes the group and not the Document."
1104
+ },
1105
+ "label": {
1106
+ "en": "RM Container"
1107
+ }
1108
+ },
1109
+ "DTCDeviceNode": {
1110
+ "description": {
1111
+ "en": "The APPARATUS a DTC step happened on — camera, sensor, drone, computer, scanner, total station, GNSS receiver. Projected as crmdig:D8_Digital_Device and attached to the EVENT by dtc_happened_on_device (crmdig:L12_happened_on_device), never to the input or the output: the three dtc_kinds flow axes are what went in, what happened and what came out, and a device is what it happened ON. Until 2026-09-16 it was a STRING inside how.acquisition, and a string cannot be asked «what did this machine produce» or «that lens was distorted, which models are affected». NOT a DTCNode: a DTC node is a STEP (an event in the chain) and a device is a thing in the world — it has no inputs, no outputs, and a provenance walk has no business entering it; subclassing would have put it in the chain by inheritance and set the class hierarchy arguing with dtc_role. data.dtc_kind comes from the `device` axis of dtc_kinds (em_visual_rules.json), so adding an apparatus is a JSON entry plus a sign. THE ID IS DERIVED FROM THE DESCRIPTOR (make | model | serial) by uuid5 — the same mechanism bucket_acquisition uses for a campaign name, but WITHOUT the graph_id in the key, because a campaign is an event of one study while the same camera in two studies is one camera. WHAT THAT COSTS, DECLARED: without a serial number two identical bodies derive the same id and MERGE, and the graph then cannot say which body took a given file. data.distinguishes records which happened ('serial' = one body, 'make+model' = a model). A declared merge is better than an invented distinction: salting the id with a graph or a timestamp would make two records of the SAME camera look like two cameras, and that failure is silent. Gated out of the stratigrapher palette, like every DTC node."
1112
+ },
1113
+ "label": {
1114
+ "en": "DTC Device"
1115
+ }
1100
1116
  }
1101
1117
  }
1102
1118
  }
@@ -13,7 +13,7 @@
13
13
  @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
14
14
 
15
15
  # ============================================================================
16
- # Extended Matrix (EM) Ontology — v1.6.0
16
+ # Extended Matrix (EM) Ontology — v1.6.2
17
17
  # ============================================================================
18
18
  # Formal extension of the CIDOC-CRM family + HDT-O for the Extended Matrix
19
19
  # stratigraphic + paradata + virtual-reconstruction modeling. Companion to
@@ -31,7 +31,7 @@
31
31
  # Python inheritance (e.g. AuthorAINode → AuthorNode) is for code reuse.
32
32
  # * "Maps to: Python ClassName" comments anchor each class to its
33
33
  # s3dgraphy Python counterpart for round-trip verification.
34
- # * AP11_has_physical_relation discrimination uses subproperties (em:abuts,
34
+ # * AP11_has_physical_relation_to discrimination uses subproperties (em:abuts,
35
35
  # em:cuts, em:fills, em:overlies, em:bondedTo, em:physicallyEquals)
36
36
  # rather than reified relations with E55_Type tags — this is the
37
37
  # SPARQL-friendly pattern.
@@ -44,8 +44,8 @@
44
44
  dcterms:creator "Emanuele Demetrescu" ;
45
45
  dcterms:license <https://creativecommons.org/licenses/by/4.0/> ;
46
46
  dcterms:issued "2026-05-23"^^xsd:date ;
47
- owl:versionInfo "1.6.0" ;
48
- rdfs:comment "Formal ontology for Extended Matrix (EM): a human-readable layout for knowledge graphs of archaeological stratigraphy and virtual reconstruction. Extends CIDOC-CRM, CRMarchaeo, CRMinf, CRMdig, CRMgeo, with PROV-O for agent provenance and HDT-O for digital-twin granularity. This file declares the em: classes and properties introduced in s3dgraphy v1.6.0."@en ;
47
+ owl:versionInfo "1.6.2" ;
48
+ rdfs:comment "Formal ontology for Extended Matrix (EM): a human-readable layout for knowledge graphs of archaeological stratigraphy and virtual reconstruction. Extends CIDOC-CRM, CRMarchaeo, CRMinf, CRMdig, CRMgeo, with PROV-O for agent provenance and HDT-O for digital-twin granularity. This file declares the em: classes and properties introduced in s3dgraphy v1.6.0. v1.6.2 (2026-09-21, CIDOC repair pass): the eight terms the datamodels cited and this file never defined are declared in section 12; em:NodeGroup and em:ParadataNodeGroup leave the undeclared crm:E78_Collection for crm:E73_Information_Object and crm:E89_Propositional_Object; em:SemanticShape leaves crmgeo:SP5 for crm:E73_Information_Object, provisionally; crmarchaeo:AP11_has_physical_relation becomes AP11_has_physical_relation_to, the name CRMarchaeo has used since 2.0; and em:RepresentationModel says what a representation model IS."@en ;
49
49
  owl:imports <http://www.cidoc-crm.org/cidoc-crm/> ,
50
50
  <http://www.cidoc-crm.org/extensions/crminf/> ,
51
51
  <http://www.cidoc-crm.org/extensions/crmarchaeo/> ,
@@ -305,7 +305,7 @@ em:RepresentationModel
305
305
  a owl:Class ;
306
306
  rdfs:label "Representation Model"@en ;
307
307
  rdfs:subClassOf crmdig:D1_Digital_Object ;
308
- rdfs:comment "A 3D model or spatialized image representing some node in the graph. Abstract base. Specialized into em:StratigraphicRepresentation, em:DocumentaryRepresentation, em:SpecialFindRepresentation. Always linked to what it represents via crm:P138_represents."@en .
308
+ rdfs:comment "A 3D model or spatialized image representing some node in the graph. Abstract base. Specialized into em:StratigraphicRepresentation, em:DocumentaryRepresentation, em:SpecialFindRepresentation. Always linked to what it represents via crm:P138_represents. WHAT IT IS (E.D., 21 September 2026). A representation model is a DOCUMENT WITH A DATE: it was made on a day, by somebody, from something, and it is naturally anchored to an EPOCH rather than to a unit. It is also potentially PARTIAL — a photogrammetric survey can come back with an incomplete mesh, a facade recorded from one side only, a room whose ceiling nobody could reach. Both of those together have one consequence worth stating so nobody reasons past it: the ABSENCE of a link between a model and a stratigraphic unit IS NOT INFORMATIVE. It does not mean the unit was not represented, and it does not mean the unit is not there; it means this document does not reach that far. Queries must not read a missing link as a negative claim. The PROXY has a different statute and is not the same kind of thing: em:SemanticShape is CUMULATIVE and ARGUED — a quale synthesised from several sources, inheriting the extractor/combiner chain, so it can be more COMPLETE than any single model while being far less detailed. A model is one look at the thing; a proxy is what we have concluded the thing occupies. DATING AND PROVENANCE HAVE NO FIELD OF THEIR OWN ON THIS CLASS, and that is deliberate: they travel through has_linked_resource to a ResourceNode and back up through dtc_had_output to the DTC event that produced it, where the date, the device and the author already live and are already paradata. A `date` field MUST NOT be added to RepresentationModelNode: it would duplicate the DTC chain, drift from it, and turn a documented provenance into a typed-in string."@en .
309
309
 
310
310
  em:StratigraphicRepresentation
311
311
  a owl:Class ;
@@ -328,7 +328,12 @@ em:SpecialFindRepresentation
328
328
  em:SemanticShape
329
329
  a owl:Class ;
330
330
  rdfs:label "Semantic Shape (proxy geometry)"@en ;
331
- rdfs:subClassOf crmgeo:SP5_Geometric_Place_Expression ;
331
+ # PROVVISORIO — crmgeo:SP6_Declarative_Place è il candidato migliore,
332
+ # decisione rinviata da E.D. (21 set 2026). Era crmgeo:SP5_Geometric_Place_Expression,
333
+ # che NON è dichiarata nel documento servito a http://www.cidoc-crm.org/extensions/crmgeo/
334
+ # (CRMgeo 2.0 draft: SP1,2,3,4,6,7,10,11,12,13,14,15 — SP5 sopravvive solo nella scope
335
+ # note di SP6). crm:E73_Information_Object è la mossa sicura che non impegna.
336
+ rdfs:subClassOf crm:E73_Information_Object ;
332
337
  rdfs:comment "3D proxy geometry (convex shapes or spheres, or a .glb via rdfs:seeAlso) representing the spatial extent of a node. Lighter weight than a full RepresentationModel: intended for spatial indexing and rough containment, not for visual rendering. SINCE 2026-08-11 IT IS A PAYLOAD: the proxy of a unit is a quale — a property of type 'geometry' — and this class is what that property points at through P138i (has_semantic_shape). The reason is paradata: a lone shape cannot say where it came from, while a property inherits the extractor/combiner chain, so one proxy can be synthesised from several sources (a photogrammetric mesh and a historical photograph). The class itself did not change; who points at it did. Maps to: Python SemanticShapeNode (node_type='semantic_shape')."@en .
333
338
 
334
339
  em:convexShape
@@ -483,7 +488,7 @@ em:confidenceLevel
483
488
  # ============================================================================
484
489
  # 11. STRATIGRAPHIC PHYSICAL RELATIONS (AP11 subproperties)
485
490
  # ============================================================================
486
- # CRMarchaeo's AP11_has_physical_relation is the generic relation between
491
+ # CRMarchaeo's AP11_has_physical_relation_to is the generic relation between
487
492
  # two stratigraphic units. We discriminate the specific type with named
488
493
  # subproperties — the SPARQL-friendly pattern (queries can be specific
489
494
  # OR fall back to the generic AP11 via subproperty inference).
@@ -491,7 +496,7 @@ em:confidenceLevel
491
496
  em:abuts
492
497
  a owl:ObjectProperty ;
493
498
  rdfs:label "abuts"@en ;
494
- rdfs:subPropertyOf crmarchaeo:AP11_has_physical_relation ;
499
+ rdfs:subPropertyOf crmarchaeo:AP11_has_physical_relation_to ;
495
500
  rdfs:domain crmarchaeo:A8_Stratigraphic_Unit ;
496
501
  rdfs:range crmarchaeo:A8_Stratigraphic_Unit ;
497
502
  rdfs:comment "Source stratigraphic unit abuts against the target. Non-symmetric: A abuts B does NOT imply B abuts A (B is_abutted_by A). Maps to: connections_datamodel edge 'abuts'."@en .
@@ -499,7 +504,7 @@ em:abuts
499
504
  em:cuts
500
505
  a owl:ObjectProperty ;
501
506
  rdfs:label "cuts"@en ;
502
- rdfs:subPropertyOf crmarchaeo:AP11_has_physical_relation ;
507
+ rdfs:subPropertyOf crmarchaeo:AP11_has_physical_relation_to ;
503
508
  rdfs:domain crmarchaeo:A8_Stratigraphic_Unit ;
504
509
  rdfs:range crmarchaeo:A8_Stratigraphic_Unit ;
505
510
  rdfs:comment "Source stratigraphic unit cuts (is incised into) the target. Non-symmetric. Maps to: connections_datamodel edge 'cuts'."@en .
@@ -507,7 +512,7 @@ em:cuts
507
512
  em:fills
508
513
  a owl:ObjectProperty ;
509
514
  rdfs:label "fills"@en ;
510
- rdfs:subPropertyOf crmarchaeo:AP11_has_physical_relation ;
515
+ rdfs:subPropertyOf crmarchaeo:AP11_has_physical_relation_to ;
511
516
  rdfs:domain crmarchaeo:A8_Stratigraphic_Unit ;
512
517
  rdfs:range crmarchaeo:A8_Stratigraphic_Unit ;
513
518
  rdfs:comment "Source stratigraphic unit fills the target (typically a deposit filling a cut). Non-symmetric. Maps to: connections_datamodel edge 'fills'."@en .
@@ -515,7 +520,7 @@ em:fills
515
520
  em:overlies
516
521
  a owl:ObjectProperty ;
517
522
  rdfs:label "overlies"@en ;
518
- rdfs:subPropertyOf crmarchaeo:AP11_has_physical_relation ;
523
+ rdfs:subPropertyOf crmarchaeo:AP11_has_physical_relation_to ;
519
524
  rdfs:domain crmarchaeo:A8_Stratigraphic_Unit ;
520
525
  rdfs:range crmarchaeo:A8_Stratigraphic_Unit ;
521
526
  rdfs:comment "Source stratigraphic unit overlies (covers) the target. Non-symmetric. Maps to: connections_datamodel edge 'overlies'."@en .
@@ -523,7 +528,7 @@ em:overlies
523
528
  em:bondedTo
524
529
  a owl:ObjectProperty , owl:SymmetricProperty ;
525
530
  rdfs:label "bonded to"@en ;
526
- rdfs:subPropertyOf crmarchaeo:AP11_has_physical_relation ;
531
+ rdfs:subPropertyOf crmarchaeo:AP11_has_physical_relation_to ;
527
532
  rdfs:domain crmarchaeo:A8_Stratigraphic_Unit ;
528
533
  rdfs:range crmarchaeo:A8_Stratigraphic_Unit ;
529
534
  rdfs:comment "Two stratigraphic units are physically bonded (e.g. masonry bonding). Symmetric. Maps to: connections_datamodel edges 'bonded_to' / 'is_bonded_to'."@en .
@@ -531,7 +536,7 @@ em:bondedTo
531
536
  em:physicallyEquals
532
537
  a owl:ObjectProperty , owl:SymmetricProperty ;
533
538
  rdfs:label "physically equals"@en ;
534
- rdfs:subPropertyOf crmarchaeo:AP11_has_physical_relation ;
539
+ rdfs:subPropertyOf crmarchaeo:AP11_has_physical_relation_to ;
535
540
  rdfs:domain crmarchaeo:A8_Stratigraphic_Unit ;
536
541
  rdfs:range crmarchaeo:A8_Stratigraphic_Unit ;
537
542
  rdfs:comment "Two distinct stratigraphic-unit ids refer to the same physical entity (e.g. across campaigns or archives). Symmetric. Maps to: connections_datamodel edges 'equals' / 'is_physically_equal_to'."@en .
@@ -612,13 +617,13 @@ em:UnknownNode
612
617
  em:NodeGroup
613
618
  a owl:Class ;
614
619
  rdfs:label "Node Group (abstract)"@en ;
615
- rdfs:subClassOf crm:E78_Collection ;
620
+ rdfs:subClassOf crm:E73_Information_Object ;
616
621
  rdfs:comment "Abstract superclass of the EM grouping axes — activity (intention), paradata (justification), timebranch (alternative time), location (place), functional unit (architectural composition). A group is a Collection of nodes and never changes what its members ARE. Maps to: Python GroupNode (node_type='Group')."@en .
617
622
 
618
623
  em:ParadataNodeGroup
619
624
  a owl:Class ;
620
625
  rdfs:label "Paradata Node Group"@en ;
621
- rdfs:subClassOf em:NodeGroup , crm:E78_Collection ;
626
+ rdfs:subClassOf em:NodeGroup , crm:E89_Propositional_Object ;
622
627
  rdfs:comment "All the paradata of one stratigraphic unit gathered as a unit, by EM convention named '[US_name]_PD'. Distinct class so the paradata groups are findable by type rather than by naming convention. Maps to: Python ParadataNodeGroup (node_type='ParadataNodeGroup')."@en .
623
628
 
624
629
  em:LocationNodeGroup
@@ -635,5 +640,83 @@ em:GeoPositionNode
635
640
 
636
641
 
637
642
  # ============================================================================
638
- # End of em.ttl v1.6.1
643
+ # 12. TERMS THE DATAMODELS CITE — declared here for the first time
644
+ # (added 2026-09-21, repair pass on the CIDOC mapping)
645
+ # ============================================================================
646
+ #
647
+ # These eight em: terms were named by s3Dgraphy_node_datamodel.json and
648
+ # s3Dgraphy_connections_datamodel.json and never defined here. An undefined
649
+ # term is not an error anywhere: it serialises as a perfectly well-formed IRI
650
+ # that no reasoner can place and no query can reach through its superclass.
651
+ # Domain, range and superclass below are READ OFF the datamodels
652
+ # (em_extension.subclass_of, mapping.cidoc, allowed_connections) — nothing is
653
+ # invented. Where the datamodel did not say, the field is absent and the
654
+ # comment says so.
655
+
656
+ em:FunctionalUnit
657
+ a owl:Class ;
658
+ rdfs:label "Functional Unit"@en ;
659
+ rdfs:subClassOf crm:E24_Physical_Human-Made_Thing ;
660
+ rdfs:comment "The stratigraphic units that together make up one recognisable functional or architectural component — the column made of its US, the wall made of its US (DP-72). Physical, not curatorial: it takes E24 rather than the collection class its em:NodeGroup parent carries, because a component is a whole made of parts and not a set somebody assembled. It is likewise not an em:WorkingUnit (an activity axis: why something was done) — this answers what a set of units IS. Since 2026-09-21 it is also a bearer of the temporal index: has_first_epoch and survive_in_epoch both accept it, and the asymmetry with ActivityNodeGroup (which takes has_first_epoch and never survive_in_epoch) is the point — an activity is an event and does not survive, a thing persists. Maps to: Python FunctionalUnitNodeGroup (node_type=\'FunctionalUnitNodeGroup\')."@en .
661
+
662
+ em:RepresentationModelNodeGroup
663
+ a owl:Class ;
664
+ rdfs:label "Representation Model Container"@en ;
665
+ rdfs:subClassOf em:NodeGroup , crm:E73_Information_Object ;
666
+ rdfs:comment "The representation models that form ONE named set published under a single Document — «Survey 2015» under D.01, «Reconstruction» under D.09 (EM16-RMNG, 2026-09-10). The one group subtype that does not override its parent class: a container of models is a conceptual set, not a physical thing and not an event. Membership is 1:1 — a mesh belongs to exactly one container — and the container sits BESIDE the direct Document→model edges, never in between. Maps to: Python RepresentationModelNodeGroup (node_type=\'RepresentationModelNodeGroup\')."@en .
667
+
668
+ em:GCPSet
669
+ a owl:Class ;
670
+ rdfs:label "Ground Control Point Set"@en ;
671
+ rdfs:subClassOf crm:E73_Information_Object ;
672
+ rdfs:comment "The set of ground control points a registration was (or will be) solved from: a documented list of measured places and, for each, where it was observed. An information object that CARRIES places and measurements without being either — it is not an E53 Place and not a crmsci:S21 Measurement. Named in the EM extension because «the control points behind this registration» is the unit archaeologists actually hand each other, and CIDOC has nothing above E73 for it. The individual observations stay payload literals in this version; exploding each point into an S21 Measurement of an E53 Place is declared as a refinement, not implied. Maps to: Python GCPSetNode (node_type=\'gcp_set\')."@en .
673
+
674
+ em:RegistrationTransform
675
+ a owl:Class ;
676
+ rdfs:label "Registration Transform"@en ;
677
+ rdfs:subClassOf crm:E73_Information_Object ;
678
+ rdfs:comment "The 7-parameter similarity (rotation, translation, positive scale) that places a produced model in a frame, carrying its own error bar (rms, residuals) beside the claim rather than in a log nobody keeps. It DESCRIBES a mapping between two crmgeo:SP4 spatial coordinate reference systems, which CIDOC and CRMgeo model individually but never as a parameterised map between two of them — hence E73 as the honest superclass. Deliberately NOT an event: the alternative, leaving the parameters as literals on the D7 acquisition, loses the ability to point at «the placement» as a thing that gets superseded, and being superseded is the whole reason the transform is a node. The three modes are the SHAPE of the graph, never a flag: a transform with a CRS that has_gcp_set points at = absolute; a transform with crs=null and no control set = a site-local frame; no transform at all = nobody placed it. Maps to: Python RegistrationTransformNode (node_type=\'registration_transform\')."@en .
679
+
680
+ em:Narrative
681
+ a owl:Class ;
682
+ rdfs:label "Narrative"@en ;
683
+ rdfs:subClassOf crm:E33_Linguistic_Object ;
684
+ rdfs:comment "A narrative over the EM graph: an ordered sequence of chapters, each anchored to a lane (epoch, activity, area) or standing outside the stratigraphy (introduction, geographic placement), composed of prose blocks and embed blocks. E33 because the narrative IS linguistic content about the heritage entity — and an E33 is already an E73 Information Object in CRM, so it is versionable, licensable and embargoable like the graph itself without a second assertion. The embeds are not content but references, and project as P67_refers_to. Endorsement is a separate act and a separate edge: see em:validatedBy. Maps to: Python NarrativeNode (node_type=\'narrative\')."@en .
685
+
686
+ em:NeutralSU
687
+ a owl:Class ;
688
+ rdfs:label "Neutral Stratigraphic Unit (USNt)"@en ;
689
+ rdfs:subClassOf crmarchaeo:A3_Stratigraphic_Interface ;
690
+ rdfs:comment "PROVISIONAL (datamodel extension_status: proposed_provisional — the class is declared so the IRI stops being undefined, NOT because the CIDOC placement is settled). 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 — which is what separates it from the negative unit, whose void is what a destructive act left behind. A3 Stratigraphic Interface is the better-informed placeholder; the genesis it wants is CONSTRUCTIVE (A4-flavoured), not the A5 destructive modification the negative unit takes. Consequence already enforced in the connections datamodel: USNt takes is_after / is_before and nothing else — a void cannot cut, fill, abut or bond. Maps to: Python NeutralStratigraphicUnit (stratigraphic subtype token \'USNt\' since POL6, 2026-08-04)."@en .
691
+
692
+ em:hasSubEpoch
693
+ a owl:ObjectProperty ;
694
+ rdfs:label "has sub-epoch"@en ;
695
+ rdfs:domain crm:E4_Period ;
696
+ rdfs:range crm:E4_Period ;
697
+ rdfs:comment "Splits an epoch into ordered sub-epochs (phases): the SUBJECT is the parent epoch, the OBJECT a phase, which is itself an epoch. Direction taken from the connections datamodel, which states it in words — «Source is the parent epoch, target a phase» — and from the edge\'s own name; the reverse edge is is_in_epoch. Phases partition the parent\'s time-span: when hidden the parent holds all the units, when shown the units are distributed across the phases. NO rdfs:subPropertyOf IS ASSERTED, deliberately. The edge\'s mapping.cidoc is crm:P10_falls_within, whose containment runs the other way (a phase falls within its parent, as that mapping\'s own _comment says) — so the CRM projection of this edge is currently written source-first on the wrong end, and the superproperty here would bake that in. crm:P10i_contains is the candidate; the decision is E.D.\'s and is recorded in the repair report of 2026-09-21. Maps to: connections_datamodel edge \'has_sub_epoch\'."@en .
698
+
699
+ em:validatedBy
700
+ a owl:ObjectProperty ;
701
+ rdfs:label "validated by"@en ;
702
+ rdfs:subPropertyOf prov:wasInfluencedBy ;
703
+ rdfs:domain em:Narrative ;
704
+ rdfs:range em:HumanAuthor ;
705
+ rdfs:comment "A HUMAN author endorses a piece of content: they have read it and put their name to it (EM Narrative N4, «Who Made This?»). Distinct from em:hasAuthor, and the distinction is the point: hasAuthor says who WROTE it, human or AI; validatedBy says who accepted RESPONSIBILITY for it. The range is em:HumanAuthor and never em:AIAuthor — a model endorsing a model would be a signature with nobody behind it. It is not a quality judgement and not a peer review. The absence of the property IS the unendorsed state, so a machine draft cannot claim an endorsement it never received. Superproperty and domain/range read off the connections datamodel (mapping.cidoc prov:wasInfluencedBy; source NarrativeNode, target AuthorNode). prov:wasInfluencedBy is the domain-neutral anchor because it is true and claims nothing more: endorsement has no exact term in CIDOC-CRM or PROV-O, and the datamodel records that an E13 Attribute Assignment reification is where this would change. Maps to: connections_datamodel edge \'validated_by\'."@en .
706
+
707
+
708
+ # ============================================================================
709
+ # CRMem v1.6.3 (2026-09-21) — the first of the four surviving CRMem properties
710
+ # Decided by E.D. in the CIDOC-EM branch chat, 21 September 2026.
711
+ # ============================================================================
712
+
713
+ em:isInActivity
714
+ a owl:ObjectProperty ;
715
+ rdfs:label "is in activity"@en ;
716
+ rdfs:domain crm:E1_CRM_Entity ;
717
+ rdfs:range crm:E7_Activity ;
718
+ rdfs:comment "An entity of any kind — a stratigraphic unit, a quale, a document, an extractor, a whole paradata group — is CLASSIFIED UNDER an activity-shaped grouping. This is the axis of INTENTION in the Extended Matrix, orthogonal to space (is_in_location) and to time (the epoch edges), and it is a curatorial grouping and not an event anyone attended. NO SUPERPROPERTY, deliberately, and the reason is the whole justification for the term: CIDOC can say that an actor PARTICIPATED in an event (P11i), that a thing WAS PRESENT (P12i), that an object WAS USED (P16i) — but it cannot say that an arbitrary entity is classified under an activity. P12i would even pass the type check, because E28 Conceptual Object reaches E77 through E71/E70, but it would be false: a PropertyNode attended nothing. P9i needs an E4 Period in the subject and the sources here are not periods; P129i needs an E89 in the object and E7 Activity is not one. Verified against CIDOC CRM 7.1.3 and CRMarchaeo 2.1.1: CRMarchaeo has specific archaeological activities (A9, A1, A6) but no generic activity class and none of its 32 AP properties expresses membership in one. The CLASS is not ours — crm:E7_Activity is CIDOC core and ActivityNodeGroup stays mapped to it — only the property is. NAMED isInActivity and NOT participatedInActivity (the dead CIDOC-S3D desideratum it replaces), because participation is a claim this model does not make. Maps to: connections_datamodel edge 'is_in_activity' (sources StratigraphicNode/ParadataNode/ParadataNodeGroup/DocumentNode/ExtractorNode/CombinerNode/PropertyNode, target ActivityNodeGroup); mapping.cidoc stays EMPTY on purpose, and the exporter emits this property on its own."@en .
719
+
720
+ # ============================================================================
721
+ # End of em.ttl v1.6.3
639
722
  # ============================================================================
@@ -3,7 +3,8 @@
3
3
  "version": "2.0",
4
4
  "last_updated": "2025-01-29",
5
5
  "maintainers": ["Emanuel Demetrescu"],
6
- "license": "CC-BY-4.0",
6
+ "license": "CC-BY-SA-4.0",
7
+ "license_note": "Share-alike per allinearsi agli strumenti terminologici da cui questo datamodel prende gli ancoraggi (ICCD CC BY-SA 3.0 IT) e perche' una derivazione resti aperta. Gli identificatori AAT/CIDOC citati nei `mappings` sono RIFERIMENTI, non contenuto incorporato: lo share-alike non si propaga ai vocabolari altrui, che mantengono i propri termini.",
7
8
  "description": "Comprehensive document types definition for Extended Matrix"
8
9
  },
9
10
  "vocabulary_versions": {
@@ -3,7 +3,8 @@
3
3
  "version": "2.0",
4
4
  "last_updated": "2025-01-29",
5
5
  "maintainers": ["Emanuel Demetrescu"],
6
- "license": "CC-BY-4.0",
6
+ "license": "CC-BY-SA-4.0",
7
+ "license_note": "Share-alike per allinearsi agli strumenti terminologici da cui questo datamodel prende gli ancoraggi (ICCD CC BY-SA 3.0 IT) e perche' una derivazione resti aperta. Gli identificatori AAT/CIDOC citati nei `mappings` sono RIFERIMENTI, non contenuto incorporato: lo share-alike non si propaga ai vocabolari altrui, che mantengono i propri termini.",
7
8
  "description": "Extractors for deriving qualia from source documents"
8
9
  },
9
10
  "vocabulary_versions": {
@@ -3,7 +3,8 @@
3
3
  "version": "1.6.1",
4
4
  "last_updated": "2026-08-11",
5
5
  "maintainers": ["Emanuel Demetrescu"],
6
- "license": "CC-BY-4.0",
6
+ "license": "CC-BY-SA-4.0",
7
+ "license_note": "Share-alike per allinearsi agli strumenti terminologici da cui questo datamodel prende gli ancoraggi (ICCD CC BY-SA 3.0 IT) e perche' una derivazione resti aperta. Gli identificatori AAT/CIDOC citati nei `mappings` sono RIFERIMENTI, non contenuto incorporato: lo share-alike non si propaga ai vocabolari altrui, che mantengono i propri termini.",
7
8
  "changelog": "v1.6.1: added the spatial qualia `geometry` — the PROXY as a quale. The geometry-without-material of a unit becomes a PropertyNode whose payload is a SemanticShapeNode (has_semantic_shape), so the proxy inherits the paradata chain a lone node could not have, and one proxy can be synthesised from several sources. CIDOC default crmgeo:SP5_Geometric_Place_Expression, flagged `confirm_with: Felicetti` (E36 is the alternative, to be decided together with em:AnnotationRegion). v1.6.0: version realigned to the EM language version (EM 1.6) — supersedes the standalone 4.x line (last was 4.2), so all EM JSON config files now share the 1.6.x scheme. Added optional `rationale` + `example` fields to qualia entries (a plain-language why + a concrete case), shown by the EMStudio vocabulary picker when creating a PropertyNode. Seeded for the temporal qualia (absolute_time_start / absolute_time_end / dating_method); to be filled in for the rest incrementally. Prior (4.x) history: v4.2 added rationale/example scaffolding; v4.1: expanded spatial elevation qualia for pyArchInit us_table quote (all E54_Dimension): elevation_relative, elevation_min_absolute, elevation_max_absolute, elevation_min_relative, elevation_max_relative, elevation_min_usm, elevation_max_usm (the generic 'elevation' = absolute MASL, used by quota_abs). Each pyArchInit quota column maps to its own qualia id so they don't collide on the single-PropertyNode-per-property_name rule. v4.0: verified all v3.0 CIDOC-CRM mappings (correct). Expanded with: volume, area, circumference in dimensional; color, texture, finish, patina, hardness, porosity in material; damage_type, fragility, completeness in state; tool_marks, joining_technique in technical; bounding_box, footprint_area in spatial; duration, terminus_post_quem, terminus_ante_quem, relative_chronology in temporal; ceremonial_function, ritual_function, defensive_function, domestic_function, symbolic_function in telic; school, workshop, period_attribution in stylistic. NEW subcategories: iconographic + semantic under cultural_interpretive (iconographic_subject, narrative_content, iconographic_program, aesthetic_value, religious_significance, monumental_status, attribution). Added provenance_history, exhibition_history, publication_history under administrative; NEW ownership subcategory (current_custodian, ownership_chain). NEW CATEGORY epistemic — meta-qualia central to EM paradata model (confidence_level, certainty_level, uncertainty_factors, methodology_used, validation_method, source_quality, primary_contributor, review_status, last_modified)."
8
9
  },
9
10
  "qualia_categories": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "formal_language": "EM",
3
- "version": "1.6.16",
3
+ "version": "1.6.17",
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,7 +9,7 @@
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.16": "Asset declarations made TRUE. Four styles named a 2D file that is not there — SE.png, TSU.svg, serUSD.svg and unknown.png (which never existed) — and GRAPH named two, so it drew no icon at all. icons.ts returns null for a missing file and the canvas quietly draws the shape, so all five failed silently. Now: graph.svg authored (neutral gray, three nodes and their edges, the meta-container), unknown points at the generic_node.svg that exists, the three stale halves name the file that is there. Enforced by tests/test_visual_assets.py; the 16 unmodelled .glb are REPORTED (there and in sync-datamodels.sh), not asserted \u2014 a placeholder that looks official is harder to notice than an absence.",
12
+ "1.6.16": "Asset declarations made TRUE. Four styles named a 2D file that is not there — SE.png, TSU.svg, serUSD.svg and unknown.png (which never existed) — and GRAPH named two, so it drew no icon at all. icons.ts returns null for a missing file and the canvas quietly draws the shape, so all five failed silently. Now: graph.svg authored (neutral gray, three nodes and their edges, the meta-container), unknown points at the generic_node.svg that exists, the three stale halves name the file that is there. Enforced by tests/test_visual_assets.py; the 16 unmodelled .glb are REPORTED (there and in sync-datamodels.sh), not asserted — a placeholder that looks official is harder to notice than an absence.",
13
13
  "1.6.15": "Georeferencing gets its symbol on the canvas: node_styles GCP (GCPSetNode, crosshair) and RGT (RegistrationTransformNode, axes + rotation arc), in the same #FF6600 reference family as GEO/SS/LINK, each with its own 2D icon. ADDITIVE. Also 1.6.14-era: dtc_kinds.process.photogrammetry. Note the limit of a per-TYPE rule: whether a transform is georeferenced or a site-local frame is an INSTANCE fact (data.crs) and is read from the has_gcp_set edge, not from the style.",
14
14
  "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).",
15
15
  "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).",
@@ -29,7 +29,8 @@
29
29
  "1.5.3": "Fix USD / serUSD material colour: RGB was (0.549, 0.103, 0.0) = #8C1A00 (red), should be #D86400 (orange) to match the canonical USD documentary colour used in the GraphML palette template, node_registry defaults and document_variant_styles.observable. USD border_color also corrected from #8C1A00 to #D86400 (serUSD border was already correct).",
30
30
  "1.5.2": "Added RSF (Reused Special Find / spolia) node style — octagon, red border (#9B3333), white fill. Sibling of SF/VSF, distinguished by border colour. Originating DP: DP-26.",
31
31
  "1.5.1": "Added LocationNodeGroup node style (dashed roundrectangle, kind-based border colour) and is_in_location edge style with primary_modifier override.",
32
- "1.5.0": "Initial EM 1.5 visual rules."
32
+ "1.5.0": "Initial EM 1.5 visual rules.",
33
+ "1.6.17": "Added RepresentationModelNodeGroup node style (EM16-RMNG): the group family's dashed roundrectangle with the RM family's #FF6600 title-tab, and the is_in_representation_model_group edge style. Additive only — no existing style touched, and the epoch↔RM / Document→RM edges keep the rendering they had."
33
34
  },
34
35
  "2d_render_glyph_types": {
35
36
  "_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.",
@@ -790,6 +791,18 @@
790
791
  "description": "Interpretive / semantic identity (basilica, room A, courtyard)."
791
792
  }
792
793
  }
794
+ },
795
+ "RepresentationModelNodeGroup": {
796
+ "_comment": "Group-folder rendering for an RM container (EM16-RMNG): the named set of representation models a Document publishes — «Survey 2015» under D.01. Shape and frame are the GROUP family's, unchanged and deliberately not reinvented (roundrectangle, neutral grey fill, dashed black border) — what identifies the family is the group title-tab colour, exactly as cyan identifies ActivityNodeGroup, peach ParadataNodeGroup, green TimeBranchNodeGroup and grey LocationNodeGroup. The tab here carries #FF6600, which is the RM family's OWN border colour (see the RM / RMDoc / RMSF styles): the box reads as «a group of representation models» without a new shape and without a new colour being invented. Verified free before use: #FF6600 was not in use as a label_background by any other style, and is not among the colours the GraphML importer keys on.",
797
+ "style": {
798
+ "shape": "roundrectangle",
799
+ "fill_color": "#F5F5F5",
800
+ "border_color": "#000000",
801
+ "border_style": "dashed",
802
+ "border_width": 1.0,
803
+ "label_background": "#FF6600",
804
+ "label_position": "top"
805
+ }
793
806
  }
794
807
  },
795
808
  "document_roles": {
@@ -811,7 +824,7 @@
811
824
  }
812
825
  },
813
826
  "document_variant_styles": {
814
- "_comment": "Axis 3 of the three-axis Canonical-Document classification (EM 1.6). Declares how the document's Representation Model (RM) is spatialized in the 3D scene. Q-C (EM 1.6): the axis is a scale of METRIC AUTHORITY OF PLACEMENT, and it is authoritative on the **RMDoc** — the spatial instance — not on the Document. The Document's existence is certain; what has degrees is its spatialisation, which is what the RMDoc IS (proxy:US :: RMSF:SF :: RM:state :: RMDoc:Document). The position itself (X,Y,Z + rotation) lives on the RMDoc and nowhere else; the Document may mirror the value on its yEd border for diagram convenience, but it carries no position. The ladder, from most to least metric authority: reality_based \u2192 observable \u2192 asserted \u2192 symbolic. `em_based` is not a rung of that ladder but a provenance statement (the asset IS an EM-derived reconstruction). Temporality is a separate matter: it is an attribution, certain or argued through a paradata chain, never a grade on this axis. The 'geometry' property drives both the GraphML DocumentNode border colour (in yEd) and the RM contour colour in the 3D viewport (per the v1.6 toggle). Documents without an RM (e.g. PDF articles, bibliographies) omit the geometry property entirely — no node, no colour. Border WIDTH carries the canonical/instance distinction: width >= 3.0 is the canonical document, anything thinner is a use-instance. The COLOUR classifies the canonical document's geometry-axis category. A black thick border means 'canonical without geometry classification' (canonical_unknown). Renamed from 'master' in schema 2: every digital document is a copy, so 'master' misread as 'original vs copies'; what the flag marks is the document drawn at its own creation, vs the instances that re-use it. Kept in sync with the reference nodes in templates/em_palette_template.graphml.",
827
+ "_comment": "Axis 3 of the three-axis Canonical-Document classification (EM 1.6). Declares how the document's Representation Model (RM) is spatialized in the 3D scene. Q-C (EM 1.6): the axis is a scale of METRIC AUTHORITY OF PLACEMENT, and it is authoritative on the **RMDoc** — the spatial instance — not on the Document. The Document's existence is certain; what has degrees is its spatialisation, which is what the RMDoc IS (proxy:US :: RMSF:SF :: RM:state :: RMDoc:Document). The position itself (X,Y,Z + rotation) lives on the RMDoc and nowhere else; the Document may mirror the value on its yEd border for diagram convenience, but it carries no position. The ladder, from most to least metric authority: reality_based → observable → asserted → symbolic. `em_based` is not a rung of that ladder but a provenance statement (the asset IS an EM-derived reconstruction). Temporality is a separate matter: it is an attribution, certain or argued through a paradata chain, never a grade on this axis. The 'geometry' property drives both the GraphML DocumentNode border colour (in yEd) and the RM contour colour in the 3D viewport (per the v1.6 toggle). Documents without an RM (e.g. PDF articles, bibliographies) omit the geometry property entirely — no node, no colour. Border WIDTH carries the canonical/instance distinction: width >= 3.0 is the canonical document, anything thinner is a use-instance. The COLOUR classifies the canonical document's geometry-axis category. A black thick border means 'canonical without geometry classification' (canonical_unknown). Renamed from 'master' in schema 2: every digital document is a copy, so 'master' misread as 'original vs copies'; what the flag marks is the document drawn at its own creation, vs the instances that re-use it. Kept in sync with the reference nodes in templates/em_palette_template.graphml.",
815
828
  "default": {
816
829
  "border_color": "#000000",
817
830
  "border_style": "solid",
@@ -858,32 +871,130 @@
858
871
  "dtc_kinds": {
859
872
  "_comment": "DATA-DRIVEN, EXPANDABLE per-kind vocabulary for the DTC substrate profile (ECHOES). Mirrors the Master-Document axis vocabularies above (document_roles/content_natures): the three base kinds (input/process/output) each list specific kinds seeded from the 2017 DTC palette. Adding a new kind (e.g. audio, spectroscopy) is a JSON entry here (+ a glyph) — NOT a code change; the DTC node classes validate against these keys via s3dgraphy.utils.get_dtc_kinds(). `glyph` names the 2017 DTC SVG (wired in the later glyph/visual-manager slice; recorded here as data only).",
860
873
  "input": {
861
- "photo": { "label": "Photograph", "glyph": "09_photos", "description": "Photographic acquisition (single image or set)." },
862
- "laserscanner": { "label": "Laser scan", "glyph": "10_laserscanner", "description": "Terrestrial/close-range laser scanning acquisition." },
863
- "topographic": { "label": "Topographic survey", "glyph": "01_topographicnetwork", "description": "Total-station / topographic-network acquisition." }
874
+ "photo": {
875
+ "label": "Photograph",
876
+ "glyph": "09_photos",
877
+ "description": "Photographic acquisition (single image or set)."
878
+ },
879
+ "laserscanner": {
880
+ "label": "Laser scan",
881
+ "glyph": "10_laserscanner",
882
+ "description": "Terrestrial/close-range laser scanning acquisition."
883
+ },
884
+ "topographic": {
885
+ "label": "Topographic survey",
886
+ "glyph": "01_topographicnetwork",
887
+ "description": "Total-station / topographic-network acquisition."
888
+ }
864
889
  },
865
890
  "process": {
866
891
  "photogrammetry": {
867
892
  "label": "Photogrammetry",
868
893
  "glyph": "03_mesh",
869
- "description": "Structure-from-motion reconstruction: a cluster of photographs becomes a 3D model. A specific kind of transformation, named because what a reader needs to know about a mesh is which family of process made it \u2014 and because the placement (RegistrationTransform) only means something for this one."
894
+ "description": "Structure-from-motion reconstruction: a cluster of photographs becomes a 3D model. A specific kind of transformation, named because what a reader needs to know about a mesh is which family of process made it — and because the placement (RegistrationTransform) only means something for this one."
870
895
  },
871
- "transformation": { "label": "Transformation", "glyph": "00_transformation", "description": "A processing/transformation step turning inputs into produced digital objects." }
896
+ "transformation": {
897
+ "label": "Transformation",
898
+ "glyph": "00_transformation",
899
+ "description": "A processing/transformation step turning inputs into produced digital objects."
900
+ }
872
901
  },
873
902
  "acquisition": {
874
- "download": { "label": "Download", "glyph": null, "description": "Retrieval of a digital object from a remote (opaque, Tier-0) repository." },
875
- "ingest": { "label": "Ingest", "glyph": null, "description": "Generic ingestion of a digital object into the study." },
876
- "local_import": { "label": "Local import", "glyph": null, "description": "Acquisition from the local file system (project-folder search) — the local analog of remote acquisition." },
877
- "uri_reference": { "label": "URI reference", "glyph": null, "description": "The URI was acquired, not the object: the resource stays where it is and is reached through its own access protocol (an open link, or one you subscribe to). No bytes were copied — calling this a download would record a retrieval that never happened." }
903
+ "download": {
904
+ "label": "Download",
905
+ "glyph": null,
906
+ "description": "Retrieval of a digital object from a remote (opaque, Tier-0) repository."
907
+ },
908
+ "ingest": {
909
+ "label": "Ingest",
910
+ "glyph": null,
911
+ "description": "Generic ingestion of a digital object into the study."
912
+ },
913
+ "local_import": {
914
+ "label": "Local import",
915
+ "glyph": null,
916
+ "description": "Acquisition from the local file system (project-folder search) — the local analog of remote acquisition."
917
+ },
918
+ "uri_reference": {
919
+ "label": "URI reference",
920
+ "glyph": null,
921
+ "description": "The URI was acquired, not the object: the resource stays where it is and is reached through its own access protocol (an open link, or one you subscribe to). No bytes were copied — calling this a download would record a retrieval that never happened."
922
+ }
878
923
  },
879
924
  "output": {
880
- "pointcloud": { "label": "Point cloud", "glyph": "02_pointcloud", "description": "Produced point cloud." },
881
- "mesh": { "label": "Mesh", "glyph": "03_mesh", "description": "Produced 3D mesh model." },
882
- "dem": { "label": "DEM", "glyph": "07_DEM", "description": "Digital Elevation Model." },
883
- "orthophoto": { "label": "Orthophoto", "glyph": "08_ortophoto", "description": "Produced orthophoto / orthomosaic." },
884
- "points": { "label": "Points", "glyph": "04_points", "description": "Vector point features." },
885
- "lines": { "label": "Lines", "glyph": "05_lines", "description": "Vector line features." },
886
- "polygons": { "label": "Polygons", "glyph": "06_polygons", "description": "Vector polygon features." }
925
+ "pointcloud": {
926
+ "label": "Point cloud",
927
+ "glyph": "02_pointcloud",
928
+ "description": "Produced point cloud."
929
+ },
930
+ "mesh": {
931
+ "label": "Mesh",
932
+ "glyph": "03_mesh",
933
+ "description": "Produced 3D mesh model."
934
+ },
935
+ "dem": {
936
+ "label": "DEM",
937
+ "glyph": "07_DEM",
938
+ "description": "Digital Elevation Model."
939
+ },
940
+ "orthophoto": {
941
+ "label": "Orthophoto",
942
+ "glyph": "08_ortophoto",
943
+ "description": "Produced orthophoto / orthomosaic."
944
+ },
945
+ "points": {
946
+ "label": "Points",
947
+ "glyph": "04_points",
948
+ "description": "Vector point features."
949
+ },
950
+ "lines": {
951
+ "label": "Lines",
952
+ "glyph": "05_lines",
953
+ "description": "Vector line features."
954
+ },
955
+ "polygons": {
956
+ "label": "Polygons",
957
+ "glyph": "06_polygons",
958
+ "description": "Vector polygon features."
959
+ }
960
+ },
961
+ "device": {
962
+ "_comment": "THE APPARATUS AXIS — what a step happened ON, not what went in or came out. crmdig:L12_happened_on_device, deliberately NOT L10_had_input: the photographs are the input and the camera is not, and flattening the two makes «which files did this body take» unanswerable, which is the only reason the node exists. One class (DTCDeviceNode, crmdig:D8_Digital_Device) and the genus from here, so adding an apparatus stays a JSON entry plus a sign — the same rule the flow axes follow. | THE GLYPHS ARE ONE FAMILY: 11_device is a rounded box with a connector on one side, the poorest shape that still says «apparatus» and free of any optical cue because a computer has no lens. Two boxes whose connectors touch read as a RIG — a computer with a sensor on it, a camera on a drone — which is how an assembly is said without inventing a second symbol. Every genus keeps that outline IDENTICAL and changes one inner mark, so the family reads from far away and the genus from close up. The SVGs live in JSON_config/src/2D/dtc/ beside 00–10; these names are declared here first and drawn separately. | NOTE FOR WHOEVER EXTENDS THIS: `laserscanner` sits on the `input` axis above, and now that this axis exists it is in the wrong box — a scanner is an apparatus, not an input. It is NOT moved: stamps already emitted carry that kind on that axis, and moving it would invalidate them in silence, which is the defect this whole substrate is built against. Left to E.D.",
963
+ "camera": {
964
+ "label": "Camera",
965
+ "glyph": "11_device_optical",
966
+ "description": "A photographic or video body. The circle is the GENUS mark and sits inside the family outline: the outline itself stays free of optics so a computer can wear it."
967
+ },
968
+ "sensor": {
969
+ "label": "Sensor",
970
+ "glyph": "11_device_sensor",
971
+ "description": "A measuring instrument that is not a camera — multispectral, thermal, a lidar head, a magnetometer. The wave mark says «it records a quantity»."
972
+ },
973
+ "drone": {
974
+ "label": "Drone",
975
+ "glyph": "11_device_drone",
976
+ "description": "The airframe that carried the apparatus. Its own device because it is the thing that flew, and a rig is drawn as its connector touching the payload's."
977
+ },
978
+ "computer": {
979
+ "label": "Computer",
980
+ "glyph": "11_device_computer",
981
+ "description": "The machine a processing step ran on. Here because «the reconstruction produced different numbers on the two workstations» is a question somebody will ask, and it is the reason the family outline had to stay free of optics."
982
+ },
983
+ "scanner": {
984
+ "label": "Scanner",
985
+ "glyph": "11_device_scanner",
986
+ "description": "A range or structured-light scanner — the APPARATUS. Distinct from the `laserscanner` entry on the `input` axis, which is a kind of input and is left where it is on purpose (see the note above)."
987
+ },
988
+ "total_station": {
989
+ "label": "Total station",
990
+ "glyph": "11_device_station",
991
+ "description": "A theodolite with a rangefinder — the instrument behind a `topographic` input."
992
+ },
993
+ "gnss": {
994
+ "label": "GNSS receiver",
995
+ "glyph": "11_device_gnss",
996
+ "description": "A satellite positioning receiver: the apparatus that produces a how.acquisition.location whose `source` is a measurement and not a person's word."
997
+ }
887
998
  }
888
999
  },
889
1000
  "edge_style": {
@@ -1069,6 +1180,15 @@
1069
1180
  "width": 1.5
1070
1181
  },
1071
1182
  "label": "Included in Timebranch"
1183
+ },
1184
+ "is_in_representation_model_group": {
1185
+ "_comment": "Membership of a representation model in an RM container (EM16-RMNG). Dashed like the other membership edges that are TAGS rather than structure (has_representation_model, has_property), and carrying the RM family's #FF6600 so the line reads as part of the same family as the group's title-tab. NOTE: is_in_functional_unit has no entry in this block — a pre-existing gap, reported and not fixed here.",
1186
+ "style": {
1187
+ "color": "#FF6600",
1188
+ "line_style": "dashed",
1189
+ "width": 1.5
1190
+ },
1191
+ "label": "Is in Representation Model Group"
1072
1192
  }
1073
1193
  }
1074
- }
1194
+ }