s3dgraphy 1.6.0.dev29__tar.gz → 1.6.0.dev30__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 (508) hide show
  1. {s3dgraphy-1.6.0.dev29/src/s3dgraphy.egg-info → s3dgraphy-1.6.0.dev30}/PKG-INFO +2 -2
  2. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/pyproject.toml +5 -2
  3. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/datamodel_translations.json +108 -1
  4. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/em.ttl +19 -3
  5. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/em_visual_rules.json +4 -3
  6. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/node_registry.generated.json +1 -1
  7. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/s3Dgraphy_node_datamodel.json +10 -8
  8. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/__init__.py +1 -1
  9. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/api.py +96 -2
  10. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/dtc/__init__.py +2 -0
  11. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/dtc/ingest.py +22 -0
  12. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/rdf_exporter.py +15 -0
  13. s3dgraphy-1.6.0.dev30/src/s3dgraphy/importer/metashape_project.py +1575 -0
  14. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/importer/rdf_importer.py +12 -0
  15. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/language.py +24 -0
  16. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/mappings/emdb/generic_specialfind_mapping.json +1 -1
  17. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/mappings/emdb/site_properties_mapping.json +1 -1
  18. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/mappings/emdb/usm_mapping.json +1 -1
  19. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/mappings/generic/excel_to_graphml_mapping.json +1 -1
  20. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/mappings/pyarchinit/pyarchinit_us_mapping.json +1 -1
  21. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/mappings/source_list/em_sourcelist_it.json +1 -1
  22. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/mappings/source_list/source_list_mapping.json +1 -1
  23. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/mappings/template_emdb_mapping.json +1 -1
  24. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/mappings/template_pyarchinit_mapping.json +1 -1
  25. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/georeferencing_node.py +39 -2
  26. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/license_node.py +13 -3
  27. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/resource_node.py +4 -2
  28. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/resources/__init__.py +2 -0
  29. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/resources/files.py +37 -2
  30. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/resources/fs_backend.py +12 -3
  31. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/resources/resolver.py +63 -2
  32. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/shelf/core.py +3 -2
  33. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/stamp/emit.py +8 -0
  34. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/tools/datamodel_i18n.py +33 -2
  35. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30/src/s3dgraphy.egg-info}/PKG-INFO +2 -2
  36. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy.egg-info/SOURCES.txt +4 -0
  37. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy.egg-info/requires.txt +1 -1
  38. s3dgraphy-1.6.0.dev30/tests/test_dev30_decisions.py +348 -0
  39. s3dgraphy-1.6.0.dev30/tests/test_metashape_project.py +437 -0
  40. s3dgraphy-1.6.0.dev30/tests/test_psx_locator.py +89 -0
  41. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_release.py +77 -3
  42. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_resource_file_node.py +2 -2
  43. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_semantic_purity.py +44 -0
  44. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/LICENSE +0 -0
  45. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/MANIFEST.in +0 -0
  46. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/README.md +0 -0
  47. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/setup.cfg +0 -0
  48. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/acquisition_descriptor.schema.json +0 -0
  49. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/acquisition_mappings/ercolano.json +0 -0
  50. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/acquisition_mappings/fs.json +0 -0
  51. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/acquisition_mappings/uri.json +0 -0
  52. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/em_document_types.json +0 -0
  53. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/em_extractor_types.json +0 -0
  54. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/em_palette_icons.json +0 -0
  55. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/em_qualia_types.json +0 -0
  56. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/em_qualia_types_additions.json +0 -0
  57. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/hdto_extension.ttl +0 -0
  58. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/new_qualia_template.json +0 -0
  59. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/outdated_s3dgraphy.ttl +0 -0
  60. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/outdated_s3dgraphy_nomapping.ttl +0 -0
  61. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json +0 -0
  62. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json.v155.bak +0 -0
  63. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/ActivityNodeGroup.svg +0 -0
  64. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.png +0 -0
  65. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.svg +0 -0
  66. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/EpochNode.svg +0 -0
  67. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/ParadataNodeGroup.svg +0 -0
  68. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/RSF.png +0 -0
  69. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/RSF.svg +0 -0
  70. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/SE.svg +0 -0
  71. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/SE_old.png +0 -0
  72. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/SE_old.svg +0 -0
  73. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/SF.png +0 -0
  74. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/SF.svg +0 -0
  75. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/TSU.png +0 -0
  76. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/US.png +0 -0
  77. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/US.svg +0 -0
  78. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/USD.png +0 -0
  79. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/USD.svg +0 -0
  80. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/USVn.png +0 -0
  81. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/USVn.svg +0 -0
  82. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/USVs.png +0 -0
  83. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/USVs.svg +0 -0
  84. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/UTR.svg +0 -0
  85. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/VSF.png +0 -0
  86. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/VSF.svg +0 -0
  87. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/author.png +0 -0
  88. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/author.svg +0 -0
  89. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/author_ai.png +0 -0
  90. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/author_ai.svg +0 -0
  91. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/combiner.png +0 -0
  92. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/combiner.svg +0 -0
  93. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/continuity.png +0 -0
  94. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/continuity.svg +0 -0
  95. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/document.png +0 -0
  96. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/document.svg +0 -0
  97. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/00_transformation.svg +0 -0
  98. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/01_topographicnetwork.svg +0 -0
  99. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/02_pointcloud.svg +0 -0
  100. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/03_mesh.svg +0 -0
  101. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/04_points.svg +0 -0
  102. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/05_lines.svg +0 -0
  103. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/06_polygons.svg +0 -0
  104. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/07_DEM.svg +0 -0
  105. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/08_ortophoto.svg +0 -0
  106. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/09_photos.svg +0 -0
  107. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/10_laserscanner.svg +0 -0
  108. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device.svg +0 -0
  109. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_computer.svg +0 -0
  110. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_drone.svg +0 -0
  111. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_gnss.svg +0 -0
  112. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_optical.svg +0 -0
  113. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_scanner.svg +0 -0
  114. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_sensor.svg +0 -0
  115. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_station.svg +0 -0
  116. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/12_gnss_survey.svg +0 -0
  117. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/13_field_drawing.svg +0 -0
  118. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/14_recording_sheet.svg +0 -0
  119. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/15_decimation.svg +0 -0
  120. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/16_georeferencing.svg +0 -0
  121. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/17_format_conversion.svg +0 -0
  122. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/18_classification.svg +0 -0
  123. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/dtc/19_vectorization.svg +0 -0
  124. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/embargo.png +0 -0
  125. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/embargo.svg +0 -0
  126. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/extractor.png +0 -0
  127. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/extractor.svg +0 -0
  128. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/gcp_set.svg +0 -0
  129. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/generic_node.svg +0 -0
  130. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/geo_position.svg +0 -0
  131. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/graph.svg +0 -0
  132. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/license.png +0 -0
  133. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/license.svg +0 -0
  134. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/link.svg +0 -0
  135. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/narrative.png +0 -0
  136. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/narrative.svg +0 -0
  137. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/play.svg +0 -0
  138. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/property.png +0 -0
  139. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/property.svg +0 -0
  140. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/registration_transform.svg +0 -0
  141. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/representation_model.svg +0 -0
  142. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/representation_model_doc.svg +0 -0
  143. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/representation_model_sf.svg +0 -0
  144. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/resource_file.svg +0 -0
  145. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/semantic_shape.svg +0 -0
  146. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/serSU.png +0 -0
  147. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/serSU.svg +0 -0
  148. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/serUSD.png +0 -0
  149. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/serUSV.png +0 -0
  150. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/serUSVn.svg +0 -0
  151. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/2D/serUSVs.svg +0 -0
  152. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/3D/RSF.glb +0 -0
  153. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/3D/SF.glb +0 -0
  154. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/3D/TSU.glb +0 -0
  155. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/3D/US.glb +0 -0
  156. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/3D/USD.glb +0 -0
  157. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/3D/USVn.glb +0 -0
  158. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/3D/USVs.glb +0 -0
  159. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/3D/VSF.glb +0 -0
  160. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/3D/combiner.glb +0 -0
  161. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/3D/continuity.glb +0 -0
  162. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/3D/document.glb +0 -0
  163. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/3D/extractor.glb +0 -0
  164. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/3D/property.glb +0 -0
  165. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/3D/serSU.glb +0 -0
  166. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/3D/serUSD.glb +0 -0
  167. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/JSON_config/src/3D/serUSV.glb +0 -0
  168. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/acquisition/__init__.py +0 -0
  169. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/acquisition/acquire.py +0 -0
  170. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/acquisition/descriptor.py +0 -0
  171. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/acquisition/mapping.py +0 -0
  172. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/ai_validation.py +0 -0
  173. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/annotation/__init__.py +0 -0
  174. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/annotation/migrate_reading.py +0 -0
  175. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/annotation/paradata.py +0 -0
  176. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/annotation/reading.py +0 -0
  177. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/authorities/__init__.py +0 -0
  178. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/authorities/resolver.py +0 -0
  179. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/authorities/snapshots/LICENSE +0 -0
  180. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/authorities/snapshots/chronontology.jsonld +0 -0
  181. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/authorities/snapshots/getty_aat.jsonld +0 -0
  182. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/authorities/snapshots/getty_tgn.jsonld +0 -0
  183. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/authorities/snapshots/periodo.jsonld +0 -0
  184. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/authorities/snapshots/provenance.json +0 -0
  185. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/classification.py +0 -0
  186. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/container.py +0 -0
  187. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/contract/__init__.py +0 -0
  188. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/contract/connector.py +0 -0
  189. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/contract/consumer.py +0 -0
  190. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/contract/core.py +0 -0
  191. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/contract/reference.py +0 -0
  192. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/crdt.py +0 -0
  193. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/data/StratiMiner_Extraction_Prompt.md +0 -0
  194. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/datamodel.py +0 -0
  195. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/diagnostics.py +0 -0
  196. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/dissemination.py +0 -0
  197. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/dtc/capture.py +0 -0
  198. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/dtc/corpus.py +0 -0
  199. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/dtc/devices.py +0 -0
  200. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/dtc/neighbourhood.py +0 -0
  201. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/dtc/residency.py +0 -0
  202. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/edges/__init__.py +0 -0
  203. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/edges/connection_resolver.py +0 -0
  204. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/edges/connections_loader.py +0 -0
  205. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/edges/edge.py +0 -0
  206. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/editorial.py +0 -0
  207. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/__init__.py +0 -0
  208. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/docx_exporter.py +0 -0
  209. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/emjson_exporter.py +0 -0
  210. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/graphml/__init__.py +0 -0
  211. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/graphml/canvas_generator.py +0 -0
  212. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/graphml/edge_generator.py +0 -0
  213. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/graphml/epoch_generator.py +0 -0
  214. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/graphml/graphml_exporter.py +0 -0
  215. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/graphml/graphml_patcher.py +0 -0
  216. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/graphml/group_node_generator.py +0 -0
  217. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/graphml/node_generator.py +0 -0
  218. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/graphml/node_registry.py +0 -0
  219. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/graphml/palette_resources.py +0 -0
  220. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/graphml/paradata_generator.py +0 -0
  221. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/graphml/paradata_image_generator.py +0 -0
  222. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/graphml/paradata_node_generators.py +0 -0
  223. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/graphml/table_node_generator.py +0 -0
  224. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/graphml/utils.py +0 -0
  225. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/html_exporter.py +0 -0
  226. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/ipynb_exporter.py +0 -0
  227. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/json_exporter.py +0 -0
  228. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/latex_exporter.py +0 -0
  229. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/exporter/unified_xlsx_exporter.py +0 -0
  230. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/geometry/__init__.py +0 -0
  231. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/geometry/aton.py +0 -0
  232. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/geometry/gltf.py +0 -0
  233. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/geometry/migrate.py +0 -0
  234. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/geometry/proxy.py +0 -0
  235. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/geometry/reading_glb.py +0 -0
  236. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/geometry/store_backed.py +0 -0
  237. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/geometry/wkt.py +0 -0
  238. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/graph.py +0 -0
  239. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/iiif.py +0 -0
  240. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/importer/__init__.py +0 -0
  241. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/importer/base_importer.py +0 -0
  242. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/importer/csv_importer.py +0 -0
  243. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/importer/emjson_importer.py +0 -0
  244. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/importer/fmpxml_importer.py +0 -0
  245. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/importer/import_graphml.py +0 -0
  246. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/importer/mapped_xlsx_importer.py +0 -0
  247. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/importer/pyarchinit_importer.py +0 -0
  248. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/importer/qualia_importer.py +0 -0
  249. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/importer/sheet_header.py +0 -0
  250. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/importer/source_text.py +0 -0
  251. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/importer/unified_xlsx_importer.py +0 -0
  252. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/importer/xlsx_importer.py +0 -0
  253. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/importer/xml_importer.py +0 -0
  254. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/indices.py +0 -0
  255. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/mappings/__init__.py +0 -0
  256. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/mappings/authoring.py +0 -0
  257. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/mappings/registry.py +0 -0
  258. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/merge/__init__.py +0 -0
  259. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/merge/graph_merger.py +0 -0
  260. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/multigraph/__init__.py +0 -0
  261. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/multigraph/multigraph.py +0 -0
  262. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/narrative/__init__.py +0 -0
  263. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/narrative/bake.py +0 -0
  264. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/narrative/generation.py +0 -0
  265. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/narrative/query.py +0 -0
  266. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/narrative/registry.py +0 -0
  267. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/narrative/site_story.py +0 -0
  268. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/__init__.py +0 -0
  269. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/annotation_region_node.py +0 -0
  270. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/author_node.py +0 -0
  271. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/base_node.py +0 -0
  272. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/combiner_node.py +0 -0
  273. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/document_node.py +0 -0
  274. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/dtc_acquisition_node.py +0 -0
  275. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/dtc_device_node.py +0 -0
  276. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/dtc_node.py +0 -0
  277. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/dtc_process_node.py +0 -0
  278. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/embargo_node.py +0 -0
  279. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/epoch_node.py +0 -0
  280. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/extractor_node.py +0 -0
  281. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/geo_position_node.py +0 -0
  282. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/graph_node.py +0 -0
  283. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/group_node.py +0 -0
  284. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/hdt_node.py +0 -0
  285. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/heritage_entity_node.py +0 -0
  286. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/narrative_node.py +0 -0
  287. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/paradata_node.py +0 -0
  288. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/project_node.py +0 -0
  289. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/property_node.py +0 -0
  290. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/representation_node.py +0 -0
  291. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/resource_file_node.py +0 -0
  292. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/semantic_shape_node.py +0 -0
  293. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/stratigraphic_node.py +0 -0
  294. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/study_node.py +0 -0
  295. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/nodes/translation_node.py +0 -0
  296. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/ownership.py +0 -0
  297. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/photogrammetry/__init__.py +0 -0
  298. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/photogrammetry/delta.py +0 -0
  299. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/publication.py +0 -0
  300. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/rapporti.py +0 -0
  301. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/resolvers/__init__.py +0 -0
  302. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/resolvers/builtin_rules.py +0 -0
  303. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/resolvers/property_resolver.py +0 -0
  304. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/resources/addresses.py +0 -0
  305. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/resources/minio_backend.py +0 -0
  306. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/resources/tiles3tz.py +0 -0
  307. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/rights.py +0 -0
  308. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/shelf/__init__.py +0 -0
  309. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/stamp/__init__.py +0 -0
  310. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/stamp/absorb.py +0 -0
  311. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/stamp/hints.py +0 -0
  312. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/stamp/identity.py +0 -0
  313. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/study.py +0 -0
  314. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/__init__.py +0 -0
  315. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/_db_handle.py +0 -0
  316. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/_legacy_paradata_svgs.py +0 -0
  317. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/_workspace.py +0 -0
  318. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/conflict_resolver.py +0 -0
  319. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/edge_registry.py +0 -0
  320. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/graph_ingestor.py +0 -0
  321. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/graph_projector.py +0 -0
  322. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/graphml_writer.py +0 -0
  323. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/group_projector.py +0 -0
  324. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/group_store.py +0 -0
  325. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/ingest_result.py +0 -0
  326. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/paradata_store.py +0 -0
  327. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/pyarchinit_pg_importer.py +0 -0
  328. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/rapporti.py +0 -0
  329. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/uuid7.py +0 -0
  330. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/vocab_provider_core.py +0 -0
  331. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/vocab_types.py +0 -0
  332. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/yed_classifier.py +0 -0
  333. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/yed_detector.py +0 -0
  334. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/yed_group_walker.py +0 -0
  335. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/yed_import_pipeline.py +0 -0
  336. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/yed_rapporti_policy.py +0 -0
  337. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/sync/yed_table_parser.py +0 -0
  338. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/templates/em_data_template.xlsx +0 -0
  339. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/templates/em_palette_template.graphml +0 -0
  340. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/temporal/__init__.py +0 -0
  341. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/temporal/inference_engine.py +0 -0
  342. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/tools/__init__.py +0 -0
  343. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/tools/consumer_drift.py +0 -0
  344. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/tools/deliverable_report.py +0 -0
  345. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/tools/glyph_sheet.py +0 -0
  346. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/tools/glyphs_from_svg.py +0 -0
  347. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/tools/sync_node_datamodel.py +0 -0
  348. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/tools/wheel_drift.py +0 -0
  349. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/transforms/__init__.py +0 -0
  350. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/transforms/aux_tracking.py +0 -0
  351. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/transforms/compact.py +0 -0
  352. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/transforms/materialize_continuity.py +0 -0
  353. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/translation.py +0 -0
  354. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/utils/__init__.py +0 -0
  355. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/utils/utils.py +0 -0
  356. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/utils/visual_layout.py +0 -0
  357. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy/zero_hour.py +0 -0
  358. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy.egg-info/dependency_links.txt +0 -0
  359. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/src/s3dgraphy.egg-info/top_level.txt +0 -0
  360. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_acquisition.py +0 -0
  361. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_acquisition_fs.py +0 -0
  362. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_add_resource.py +0 -0
  363. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_ai_validation_nodes.py +0 -0
  364. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_api_surface.py +0 -0
  365. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_asset_dtc_protocol.py +0 -0
  366. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_aton_shapes.py +0 -0
  367. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_attach_only.py +0 -0
  368. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_authority_projection.py +0 -0
  369. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_authority_resolver.py +0 -0
  370. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_blend_locator.py +0 -0
  371. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_canonical_document_rename.py +0 -0
  372. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_canvas_metadata_import.py +0 -0
  373. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_capture_acquisition.py +0 -0
  374. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_capture_rdf_class.py +0 -0
  375. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_chronology_on_request.py +0 -0
  376. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_coating_unit.py +0 -0
  377. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_composite_node_name.py +0 -0
  378. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_connection_resolver.py +0 -0
  379. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_consumer_drift.py +0 -0
  380. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_container.py +0 -0
  381. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_containment_tpq.py +0 -0
  382. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_contract.py +0 -0
  383. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_contract_consumer.py +0 -0
  384. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_convert_command.py +0 -0
  385. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_crdt.py +0 -0
  386. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_datamodel_fingerprint.py +0 -0
  387. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_datamodel_i18n.py +0 -0
  388. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_deterministic_ids.py +0 -0
  389. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_dev29_em_sourcelist.py +0 -0
  390. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_dev29_file_set_stamp.py +0 -0
  391. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_dev29_graphml_without_a_database.py +0 -0
  392. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_dev29_image_set_texturing.py +0 -0
  393. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_dev29_not_georeferenced.py +0 -0
  394. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_dev29_one_act_n_outputs.py +0 -0
  395. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_dev29_ttl_round_trip.py +0 -0
  396. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_devices.py +0 -0
  397. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_dissemination_tombstones.py +0 -0
  398. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_dove_sta_il_testo.py +0 -0
  399. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_dtc_corpus.py +0 -0
  400. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_dtc_ingest.py +0 -0
  401. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_dtc_neighbourhood.py +0 -0
  402. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_dtc_projection.py +0 -0
  403. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_dtc_residency.py +0 -0
  404. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_edge_ui_phrases.py +0 -0
  405. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_editorial.py +0 -0
  406. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_em_ttl_matches_the_datamodels.py +0 -0
  407. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_emjson_roundtrip.py +0 -0
  408. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_emjson_schema_version.py +0 -0
  409. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_epoch_properties_and_sub_epochs.py +0 -0
  410. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_epoch_undated_import.py +0 -0
  411. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_explicit_node_type_marker.py +0 -0
  412. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_extracted_from_unit.py +0 -0
  413. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_filtered_import.py +0 -0
  414. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_fmpxml_importer.py +0 -0
  415. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_fs_backend.py +0 -0
  416. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_functional_units.py +0 -0
  417. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_georeference_scene.py +0 -0
  418. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_gltf_stitch.py +0 -0
  419. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_glyph_paths.py +0 -0
  420. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_graph_indices_edges.py +0 -0
  421. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_graph_scope_migration.py +0 -0
  422. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_hdto_projection.py +0 -0
  423. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_header_key_aliases.py +0 -0
  424. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_i_generi_dei_passi.py +0 -0
  425. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_iiif.py +0 -0
  426. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_il_modo_d_accesso.py +0 -0
  427. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_il_modo_dal_relay.py +0 -0
  428. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_il_proprietario_si_legge.py +0 -0
  429. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_il_riallineamento.py +0 -0
  430. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_importer_edge_hygiene.py +0 -0
  431. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_ipynb_exporter.py +0 -0
  432. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_la_lingua_alla_nascita.py +0 -0
  433. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_la_lingua_dei_dati.py +0 -0
  434. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_la_lingua_nell_op.py +0 -0
  435. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_la_riga_d_intestazione.py +0 -0
  436. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_latex_exporter.py +0 -0
  437. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_le_traduzioni.py +0 -0
  438. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_lossless_roundtrip.py +0 -0
  439. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_mapping_authoring.py +0 -0
  440. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_mapping_csv_and_relations.py +0 -0
  441. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_masonry_unit.py +0 -0
  442. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_material_color.py +0 -0
  443. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_merge_conflicts.py +0 -0
  444. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_migrate_legacy_proxy.py +0 -0
  445. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_minio_backend.py +0 -0
  446. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_narrative_authorship.py +0 -0
  447. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_narrative_bake_docx.py +0 -0
  448. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_narrative_figures.py +0 -0
  449. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_narrative_generation.py +0 -0
  450. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_narrative_mentions.py +0 -0
  451. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_narrative_node.py +0 -0
  452. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_narrative_query.py +0 -0
  453. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_narrative_scaffolder.py +0 -0
  454. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_narrative_site_place.py +0 -0
  455. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_narrative_unvalidated_export.py +0 -0
  456. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_node_datamodel_registry.py +0 -0
  457. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_node_type_map_integrity.py +0 -0
  458. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_one_spelling_writers.py +0 -0
  459. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_pg_importer.py +0 -0
  460. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_photogrammetry_delta.py +0 -0
  461. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_physical_relation_spellings.py +0 -0
  462. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_piu_indirizzi.py +0 -0
  463. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_promotion.py +0 -0
  464. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_property_owners.py +0 -0
  465. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_proxy_resource.py +0 -0
  466. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_proxy_retype.py +0 -0
  467. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_pyarchinit_tier2.py +0 -0
  468. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_qualia_dai_d7_d8.py +0 -0
  469. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_rdf_embedding.py +0 -0
  470. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_rdf_reverse_edges.py +0 -0
  471. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_rdf_roundtrip.py +0 -0
  472. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_reading_coords.py +0 -0
  473. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_reading_glb.py +0 -0
  474. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_reading_migration.py +0 -0
  475. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_reading_place.py +0 -0
  476. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_reading_rdf.py +0 -0
  477. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_recompute_warnings.py +0 -0
  478. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_reproject.py +0 -0
  479. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_resource_files_implicit.py +0 -0
  480. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_resource_layer.py +0 -0
  481. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_resource_representations.py +0 -0
  482. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_resource_revision.py +0 -0
  483. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_resource_tier.py +0 -0
  484. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_reverse_edges.py +0 -0
  485. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_rm_container_node_group.py +0 -0
  486. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_shelf.py +0 -0
  487. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_shelf_facets.py +0 -0
  488. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_shelf_hatting.py +0 -0
  489. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_shelf_role_uri_table.py +0 -0
  490. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_shipped_mappings.py +0 -0
  491. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_source_list_mapping.py +0 -0
  492. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_source_text.py +0 -0
  493. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_stamp.py +0 -0
  494. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_stamp_hints.py +0 -0
  495. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_stamp_title_description.py +0 -0
  496. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_store_backed_geometry.py +0 -0
  497. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_stratiminer_api.py +0 -0
  498. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_study_metadata.py +0 -0
  499. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_tileset_resource.py +0 -0
  500. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_ttl_roundtrip.py +0 -0
  501. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_unit_definition.py +0 -0
  502. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_verifica_provenance.py +0 -0
  503. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_visual_assets.py +0 -0
  504. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_wheel_drift.py +0 -0
  505. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_xlsx_containment_and_unknown_bounds.py +0 -0
  506. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_xlsx_importer_graph_init.py +0 -0
  507. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_xlsx_source_column.py +0 -0
  508. {s3dgraphy-1.6.0.dev29 → s3dgraphy-1.6.0.dev30}/tests/test_zero_hour.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: s3dgraphy
3
- Version: 1.6.0.dev29
3
+ Version: 1.6.0.dev30
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,7 +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.3
38
+ Requires-Dist: dtcstamp>=0.1.4
39
39
  Provides-Extra: rdf
40
40
  Requires-Dist: rdflib>=7.0; extra == "rdf"
41
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.dev29"
7
+ version = "1.6.0.dev30"
8
8
  description = "3D Stratigraphic Graph Management Library for archaeological and heritage applications"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -56,7 +56,7 @@ dependencies = [
56
56
  # the four above. It has zero dependencies of its own and is one module, so
57
57
  # it can also simply be copied; s3dgraphy depends on it rather than
58
58
  # vendoring it, because two copies of a format rule drift.
59
- "dtcstamp>=0.1.3", # 0.1.1 lacks stamp_description: import s3dgraphy.stamp fails (MICRO-DTCSTAMP-012)
59
+ "dtcstamp>=0.1.4", # 0.1.1 lacks stamp_description: import s3dgraphy.stamp fails (MICRO-DTCSTAMP-012)
60
60
  ]
61
61
 
62
62
  [project.urls]
@@ -216,6 +216,9 @@ testpaths = ["tests"]
216
216
  python_files = ["test_*.py"]
217
217
  python_classes = ["Test*"]
218
218
  python_functions = ["test_*"]
219
+ markers = [
220
+ "slow: reads real data when it is on this machine (skipped otherwise)",
221
+ ]
219
222
 
220
223
  [tool.mypy]
221
224
  python_version = "3.8"
@@ -615,7 +615,7 @@
615
615
  },
616
616
  "GCPSetNode": {
617
617
  "description": {
618
- "en": "The set of ground control points a registration was (or will be) solved from. data.points is a list of {id, world:[x,y,z], observations:[{image, pixel:[x,y]}], uncertainty?}; data.crs names the frame the world coordinates are in (null = a site-local grid, which is a different statement from absent). Minimum 3 observed non-collinear points for a similarity to be determined — reported by `solvable`, enforced by the runner, never at construction (a set being assembled in the field is legitimately incomplete).",
618
+ "en": "The set of ground control points a registration was (or will be) solved from. data.points is a list of {id, world:[x,y,z], observations:[{image, pixel:[x,y]}], uncertainty?}; data.crs names the frame the world coordinates are in (null = a site-local grid, which is a different statement from absent). Minimum 3 observed non-collinear points for a similarity to be determined — reported by `solvable`, enforced by the runner, never at construction (a set being assembled in the field is legitimately incomplete). 1.6.24 (dev30, decided by E.D. 2 Oct 2026, D7): data.control says WHAT the points are — ground_control_points (default, not written) or camera_positions: the GPS positions of the cameras themselves, each point {id, world, image, uncertainty?} with no pixel observation (the camera is where the photograph was taken from, not something seen in it), solvable with three; data.accuracy_m is the accuracy the project records for the cameras. A chunk referenced only by its cameras' GPS is placed absolute with such a set, and validate warns «georeferenced only by camera GPS»: absolute without the control said would claim more than the data.",
619
619
  "validated_it": false,
620
620
  "validated_el": false,
621
621
  "validated_he": false,
@@ -8091,5 +8091,112 @@
8091
8091
  "fr": "maçonnée"
8092
8092
  }
8093
8093
  }
8094
+ },
8095
+ "packagings": {
8096
+ "archive": {
8097
+ "label": {
8098
+ "en": "Archive",
8099
+ "validated_it": false,
8100
+ "validated_el": false,
8101
+ "validated_he": false,
8102
+ "validated_es": false,
8103
+ "validated_pl": false,
8104
+ "validated_ro": false,
8105
+ "validated_fr": false,
8106
+ "validated_de": false,
8107
+ "it": "Archivio",
8108
+ "el": "Αρχειοθήκη",
8109
+ "he": "ארכיון",
8110
+ "es": "Archivo comprimido",
8111
+ "pl": "Archiwum",
8112
+ "ro": "Arhivă",
8113
+ "fr": "Archive",
8114
+ "de": "Archiv"
8115
+ }
8116
+ },
8117
+ "datablock": {
8118
+ "label": {
8119
+ "en": "Blender object",
8120
+ "validated_it": false,
8121
+ "validated_el": false,
8122
+ "validated_he": false,
8123
+ "validated_es": false,
8124
+ "validated_pl": false,
8125
+ "validated_ro": false,
8126
+ "validated_fr": false,
8127
+ "validated_de": false,
8128
+ "it": "Oggetto Blender",
8129
+ "el": "Αντικείμενο Blender",
8130
+ "he": "אובייקט Blender",
8131
+ "es": "Objeto de Blender",
8132
+ "pl": "Obiekt Blendera",
8133
+ "ro": "Obiect Blender",
8134
+ "fr": "Objet Blender",
8135
+ "de": "Blender-Objekt"
8136
+ }
8137
+ },
8138
+ "directory": {
8139
+ "label": {
8140
+ "en": "Folder",
8141
+ "validated_it": false,
8142
+ "validated_el": false,
8143
+ "validated_he": false,
8144
+ "validated_es": false,
8145
+ "validated_pl": false,
8146
+ "validated_ro": false,
8147
+ "validated_fr": false,
8148
+ "validated_de": false,
8149
+ "it": "Cartella",
8150
+ "el": "Φάκελος",
8151
+ "he": "תיקייה",
8152
+ "es": "Carpeta",
8153
+ "pl": "Folder",
8154
+ "ro": "Dosar",
8155
+ "fr": "Dossier",
8156
+ "de": "Ordner"
8157
+ }
8158
+ },
8159
+ "file": {
8160
+ "label": {
8161
+ "en": "File",
8162
+ "validated_it": false,
8163
+ "validated_el": false,
8164
+ "validated_he": false,
8165
+ "validated_es": false,
8166
+ "validated_pl": false,
8167
+ "validated_ro": false,
8168
+ "validated_fr": false,
8169
+ "validated_de": false,
8170
+ "it": "File",
8171
+ "el": "Αρχείο",
8172
+ "he": "קובץ",
8173
+ "es": "Archivo",
8174
+ "pl": "Plik",
8175
+ "ro": "Fișier",
8176
+ "fr": "Fichier",
8177
+ "de": "Datei"
8178
+ }
8179
+ },
8180
+ "file_set": {
8181
+ "label": {
8182
+ "en": "File set",
8183
+ "validated_it": false,
8184
+ "validated_el": false,
8185
+ "validated_he": false,
8186
+ "validated_es": false,
8187
+ "validated_pl": false,
8188
+ "validated_ro": false,
8189
+ "validated_fr": false,
8190
+ "validated_de": false,
8191
+ "it": "Insieme di file",
8192
+ "el": "Σύνολο αρχείων",
8193
+ "he": "ערכת קבצים",
8194
+ "es": "Conjunto de archivos",
8195
+ "pl": "Zestaw plików",
8196
+ "ro": "Set de fișiere",
8197
+ "fr": "Ensemble de fichiers",
8198
+ "de": "Dateigruppe"
8199
+ }
8200
+ }
8094
8201
  }
8095
8202
  }
@@ -47,8 +47,8 @@
47
47
  dcterms:creator "Emanuele Demetrescu" ;
48
48
  dcterms:license <https://creativecommons.org/licenses/by/4.0/> ;
49
49
  dcterms:issued "2026-05-23"^^xsd:date ;
50
- owl:versionInfo "1.6.13" ;
51
- 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.13 (2026-10-02, dev29, measured on San Pietro): seven DatatypeProperties, section 17 — how the bytes of a resource are packed and what its digest covers (em:packaging, em:tier, em:digestCovers, em:contentDigest) and what a DTC step declares (em:technique, em:parameters, em:software, the last two rdf:JSON): the round trip em.json → TTL → em.json lost all seven. v1.6.12 (2026-11-01, dev28, decided by E.D. 2026-10-01): no new term — em:authMode admits a third value, 'declared' (an iD typed in a tool's preferences and checked by nobody), with no em:attestedBy. v1.6.11 (2026-10-31, dev27, decided by E.D. 2026-10-01): ten properties. Section 15, several addresses of ONE resource (em:hasAddress to <resource>/address/<i>, em:locator, em:checkedAt, em:reachable) and a dated digest (em:checksumAt); section 16, how the hand of a signature had entered (em:createdVia, em:modifiedVia, em:validatedVia to <node>/auth/<stamp>, em:authMode orcid | node_password, em:attestedBy the StratiGraph node). The language of the content of a resource leaves as dcterms:language: no em: term. v1.6.10 (2026-10-29, MICRO le traduzioni, decided by E.D. 2026-10-01): six DatatypeProperties for the language of the original and its translations (section 14) — em:originalLanguage on any node, which says which literal is the original once translations share its predicate, and em:sourceLanguage, em:translatedField, em:translationMethod, em:sourceDigest, em:reviewRequested on a TranslationNode, which is a plain crm:E33_Linguistic_Object reached by crm:P73_has_translation: CIDOC has the class and the relation, so no em: class is added. v1.6.9 (2026-10-18, MICRO la risorsa e i suoi file): em:ResourceFile, ONE FILE of a resource (node datamodel 1.6.17), a subclass of crmdig:D1_Digital_Object; the resource is composed of its files by crm:P106_is_composed_of (connections has_file, 1.6.30). A distinct URI because a DTC output resource is already typed crmdig:D1, and a file typed only D1 would read back as a resource. 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. v1.6.5 (2026-10-20, MICRO la definizione dell\'unita\'): em:hasDefinition, the DEFINIZIONE of a stratigraphic unit as a subproperty of crm:P2_has_type — declared for the node datamodel 1.6.9 entry StratigraphicNode.properties.definition, not emitted by default (owl:versionInfo was left at 1.6.2 by the 1.6.3/1.6.4 passes and is realigned here). v1.6.8 (2026-10-11, MICRO la geometria per origine): the vertices of a 3D reading (point, line, polyline) are data of the region (node datamodel 1.6.15, AnnotationRegionNode.coords) and leave for RDF as ONE GeoSPARQL 1.1 literal: <region> geo:hasGeometry <region>/geometry, a geo:Geometry with geo:asWKT '<CRS IRI> POINT Z (x y z)' | 'MULTIPOINT Z (...)' | 'LINESTRING Z (...)'^^geo:wktLiteral. WHY GeoSPARQL and not em: terms: the WKT literal is the standard every triplestore with a spatial index reads, and it is the 3D twin of the Media Fragment a 2D region already emits (a string a consumer outside EM can act on); CRMgeo was built to meet GeoSPARQL at exactly this point (SP5 Geometric Place Expression ~ geo:Geometry), and an em:coords literal would say the same thing to nobody. The CRS travels INSIDE the literal, so it cannot be separated from the numbers: em:LocalSceneFrame (declared here) for the scene-local frame, the OGC EPSG IRI for a projected one. em:vertexCount stays (the count of a .glb resource above the threshold). The .glb of a reading is no longer a SemanticShape's rdfs:seeAlso: above coords.inline_max_vertices (500) it is a ResourceNode the region reaches with has_linked_resource (crm:P67_refers_to), and a proxy's .glb is likewise a proxy_model ResourceNode (connections 1.6.28-1.6.29). v1.6.7 (2026-09-30, MICRO la cattura in RDF): no em: term added — the acquisition of a digital object is typed by its KIND. A capture is not a transfer: crmdig:D2_Digitization_Process for a photograph or a laser scan, crmdig:D11_Digital_Measurement_Event for a topographic or GNSS survey, crm:E65_Creation for a field drawing or a recording sheet (made by hand; the file is their copy, so no D7 machine event is asserted); a retrieval (download, local import, URI, ingest) stays crmdig:D12_Data_Transfer_Event. The rule is data (em_visual_rules 1.6.24, dtc_kinds.acquisition.<kind>.mapping). v1.6.6 (2026-10-07, MICRO la misura in RDF): the place of a reading gets its quote and its measure. The quote of a passage reuses W3C Web Annotation (oa:hasSelector -> oa:TextQuoteSelector, oa:exact) — the only standard term for a quote, which has no fragment-string form; its offsets stay the RFC 5147 em:hasSelector 'char=s,e'. The length of a line or polyline reuses CIDOC (crm:P43_has_dimension -> crm:E54_Dimension, P90_has_value xsd:double, P91_has_unit -> a QUDT unit IRI); two em: terms are new, em:vertexCount and em:crs, for what neither vocabulary says. The .glb of a 3D reading is not described here: its URL is the rdfs:seeAlso of the SemanticShape the region reaches with em:hasSemanticShape, and no coordinate enters RDF."@en ;
50
+ owl:versionInfo "1.6.14" ;
51
+ 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.14 (2026-10-02, dev30, decided by E.D. on the dev29 report): section 18 — em:retrievedFrom, where a retrieval came from (D1), and em:membersDigest, the digest of a file_set with a predicate of its own (D4; em:digestCovers stays for compatibility). v1.6.13 (2026-10-02, dev29, measured on San Pietro): seven DatatypeProperties, section 17 — how the bytes of a resource are packed and what its digest covers (em:packaging, em:tier, em:digestCovers, em:contentDigest) and what a DTC step declares (em:technique, em:parameters, em:software, the last two rdf:JSON): the round trip em.json → TTL → em.json lost all seven. v1.6.12 (2026-11-01, dev28, decided by E.D. 2026-10-01): no new term — em:authMode admits a third value, 'declared' (an iD typed in a tool's preferences and checked by nobody), with no em:attestedBy. v1.6.11 (2026-10-31, dev27, decided by E.D. 2026-10-01): ten properties. Section 15, several addresses of ONE resource (em:hasAddress to <resource>/address/<i>, em:locator, em:checkedAt, em:reachable) and a dated digest (em:checksumAt); section 16, how the hand of a signature had entered (em:createdVia, em:modifiedVia, em:validatedVia to <node>/auth/<stamp>, em:authMode orcid | node_password, em:attestedBy the StratiGraph node). The language of the content of a resource leaves as dcterms:language: no em: term. v1.6.10 (2026-10-29, MICRO le traduzioni, decided by E.D. 2026-10-01): six DatatypeProperties for the language of the original and its translations (section 14) — em:originalLanguage on any node, which says which literal is the original once translations share its predicate, and em:sourceLanguage, em:translatedField, em:translationMethod, em:sourceDigest, em:reviewRequested on a TranslationNode, which is a plain crm:E33_Linguistic_Object reached by crm:P73_has_translation: CIDOC has the class and the relation, so no em: class is added. v1.6.9 (2026-10-18, MICRO la risorsa e i suoi file): em:ResourceFile, ONE FILE of a resource (node datamodel 1.6.17), a subclass of crmdig:D1_Digital_Object; the resource is composed of its files by crm:P106_is_composed_of (connections has_file, 1.6.30). A distinct URI because a DTC output resource is already typed crmdig:D1, and a file typed only D1 would read back as a resource. 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. v1.6.5 (2026-10-20, MICRO la definizione dell\'unita\'): em:hasDefinition, the DEFINIZIONE of a stratigraphic unit as a subproperty of crm:P2_has_type — declared for the node datamodel 1.6.9 entry StratigraphicNode.properties.definition, not emitted by default (owl:versionInfo was left at 1.6.2 by the 1.6.3/1.6.4 passes and is realigned here). v1.6.8 (2026-10-11, MICRO la geometria per origine): the vertices of a 3D reading (point, line, polyline) are data of the region (node datamodel 1.6.15, AnnotationRegionNode.coords) and leave for RDF as ONE GeoSPARQL 1.1 literal: <region> geo:hasGeometry <region>/geometry, a geo:Geometry with geo:asWKT '<CRS IRI> POINT Z (x y z)' | 'MULTIPOINT Z (...)' | 'LINESTRING Z (...)'^^geo:wktLiteral. WHY GeoSPARQL and not em: terms: the WKT literal is the standard every triplestore with a spatial index reads, and it is the 3D twin of the Media Fragment a 2D region already emits (a string a consumer outside EM can act on); CRMgeo was built to meet GeoSPARQL at exactly this point (SP5 Geometric Place Expression ~ geo:Geometry), and an em:coords literal would say the same thing to nobody. The CRS travels INSIDE the literal, so it cannot be separated from the numbers: em:LocalSceneFrame (declared here) for the scene-local frame, the OGC EPSG IRI for a projected one. em:vertexCount stays (the count of a .glb resource above the threshold). The .glb of a reading is no longer a SemanticShape's rdfs:seeAlso: above coords.inline_max_vertices (500) it is a ResourceNode the region reaches with has_linked_resource (crm:P67_refers_to), and a proxy's .glb is likewise a proxy_model ResourceNode (connections 1.6.28-1.6.29). v1.6.7 (2026-09-30, MICRO la cattura in RDF): no em: term added — the acquisition of a digital object is typed by its KIND. A capture is not a transfer: crmdig:D2_Digitization_Process for a photograph or a laser scan, crmdig:D11_Digital_Measurement_Event for a topographic or GNSS survey, crm:E65_Creation for a field drawing or a recording sheet (made by hand; the file is their copy, so no D7 machine event is asserted); a retrieval (download, local import, URI, ingest) stays crmdig:D12_Data_Transfer_Event. The rule is data (em_visual_rules 1.6.24, dtc_kinds.acquisition.<kind>.mapping). v1.6.6 (2026-10-07, MICRO la misura in RDF): the place of a reading gets its quote and its measure. The quote of a passage reuses W3C Web Annotation (oa:hasSelector -> oa:TextQuoteSelector, oa:exact) — the only standard term for a quote, which has no fragment-string form; its offsets stay the RFC 5147 em:hasSelector 'char=s,e'. The length of a line or polyline reuses CIDOC (crm:P43_has_dimension -> crm:E54_Dimension, P90_has_value xsd:double, P91_has_unit -> a QUDT unit IRI); two em: terms are new, em:vertexCount and em:crs, for what neither vocabulary says. The .glb of a 3D reading is not described here: its URL is the rdfs:seeAlso of the SemanticShape the region reaches with em:hasSemanticShape, and no coordinate enters RDF."@en ;
52
52
  owl:imports <http://www.cidoc-crm.org/cidoc-crm/> ,
53
53
  <http://www.cidoc-crm.org/extensions/crminf/> ,
54
54
  <http://www.cidoc-crm.org/extensions/crmarchaeo/> ,
@@ -980,5 +980,21 @@ em:software
980
980
  rdfs:comment "The software of a DTC step, as ONE rdf:JSON list of {name, version, commit?}: a real chain names two (the tool and the library), and the commit says which build. Maps to: node_datamodel DTCProcessNode.properties.software."@en .
981
981
 
982
982
  # ============================================================================
983
- # End of em.ttl v1.6.13
983
+ # 18. Where a retrieval came from, and the digest of a set (v1.6.14, dev30,
984
+ # decided by E.D. 2026-10-02)
985
+ # ============================================================================
986
+
987
+ em:retrievedFrom
988
+ a owl:DatatypeProperty ;
989
+ rdfs:label "retrieved from"@en ;
990
+ rdfs:comment "Where a retrieved digital object came from: the DOI (as https://doi.org/…) or the URL of a Download — the stamp format's how.acquisition.retrieved_from. A literal, an xsd:anyURI when it is a URL: an origin is an address the act was made from, not a parent with an identity, so it is not a prov:used. Optional: an event that does not say it is warned about, never refused. Maps to: node_datamodel DTCAcquisitionNode.properties.retrieved_from."@en .
991
+
992
+ em:membersDigest
993
+ a owl:DatatypeProperty ;
994
+ rdfs:label "members digest"@en ;
995
+ rdfs:range xsd:string ;
996
+ rdfs:comment "The digest of a file_set, 'sha256:<hex>' of the canonical list of its members (role, path and digest of each) — the identity of the set, not the bytes of any one file; it is checked against the files with dtcstamp.verify_members, never by hashing one file. The same value em:checksum carries beside em:digestCovers 'members', given a predicate of its own so a reader need not read two triples together; em:digestCovers stays for compatibility. Maps to: node_datamodel ResourceNode.properties.members_digest."@en .
997
+
998
+ # ============================================================================
999
+ # End of em.ttl v1.6.14
984
1000
  # ============================================================================
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "formal_language": "EM",
3
- "version": "1.6.30",
3
+ "version": "1.6.31",
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,8 @@
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.30": "AN IMAGE SET AND TEXTURING (dev29, 2 Oct 2026, proposed from the measurements on San Pietro and confirmed by E.D. the same day). dtc_kinds.output += image_set (a set of photographs kept and handed on as ONE product, its images the members of one resource), glyph 09_photos reused; dtc_kinds.process += texturing (a model given its colour from images: projection onto a mesh or baking into an atlas, one kind until decided otherwise), glyph 03_mesh reused. Labels in the nine languages (not validated); 2d_glyphs regenerated. Like every process kind texturing declares no mapping.",
12
+ "1.6.31": "THE CHOICES OF DEV29, CONFIRMED (E.D., 2 Oct 2026, on the dev29 report, D5). dtc_kinds.process.texturing is projection AND baking of the photographs onto the mesh, one act, one kind; the baking of levels of detail in Blender stays lod_generation, an act of its own. The «until E.D. says otherwise» of 1.6.30 is gone from the description. Text only: no kind, glyph or label changed.",
13
+ "1.6.30": "AN IMAGE SET AND TEXTURING (dev29, 2 Oct 2026, proposed from the measurements on San Pietro and confirmed by E.D. the same day). dtc_kinds.output += image_set (a set of photographs kept and handed on as ONE product, its images the members of one resource), glyph 09_photos reused; dtc_kinds.process += texturing (a model given its colour from images: projection onto a mesh and baking into an atlas, one kind — confirmed in 1.6.31), glyph 03_mesh reused. Labels in the nine languages (not validated); 2d_glyphs regenerated. Like every process kind texturing declares no mapping.",
13
14
  "1.6.29": "THE FOUR GESTURES OF WHOEVER EXPORTS (dev28, decision of E.D. 1 Oct 2026 on the dev27 report, part D). dtc_kinds.process += export (an object of a working project written as a file of its own), lod_generation (a level of detail baked from the master), tiling (a mesh divided into a 3D Tiles tree), packing (a tree packed into one archive, the .3tz). Until dev28 EM Tools and 3DSC wrote them format_conversion / decimation / transformation with the gesture in `technique`; those stamps stay true. NO NEW GLYPH: they reuse 17_format_conversion (export, packing), 15_decimation (lod_generation), 00_transformation (tiling) — a mark of their own is an act of EM iconography, left to E.D.; 2d_glyphs regenerated (dtc:<kind> entries). NO MAPPING, measured: no process kind declares one; a step is the crmdig:D7 of DTCProcessNode whatever its kind. Labels in the nine languages in datamodel_translations.json (dtc_kinds).",
14
15
  "1.6.28": "THE TRANSLATION NODE (MICRO le traduzioni, 29 Oct 2026, decision of E.D. 1 Oct 2026). node_styles.TRANSL for TranslationNode: the narrative's neutral grey and its glyph (src/2D/narrative.svg, SHARED, declared by 2d_file_vect — the way UL / USN / USNt share US.png), with a DASHED border so a translation does not read as a narrative. Choosing a mark of its own is an act of EM iconography and is left to E.D.; no file_3d, no material: a translation never becomes a mesh.",
15
16
  "1.6.27": "THE GLYPH OF THE FILE (MICRO-REVISIONE, 20 Oct 2026, decision of E.D. 30 Sep 2026: Claude draws it). node_styles.FILE.2d_file_vect: src/2D/link.svg -> src/2D/resource_file.svg, a sheet with a folded corner and the digest sign inside the 2017 DTC circle. WHERE, MEASURED: a resource takes its sign from node_styles.<KEY>.2d_file_vect (LINK -> src/2D/link.svg), a FILE, which EMStudio's icons.ts resolves (declaration, then src/2D/<node_type>.svg) and sync-datamodels.sh vendors from the top level of src/2D/. It is NOT a DTC glyph (dtc_kinds name the glyphs of DTC kinds, and a file is a node type, not a kind) and NOT a 2d_glyphs entry: LINK is not in 2d_render_glyph_types either, and joining that list would change how the label is laid out, which nobody asked. Still no .glb (as before). The dashed border and the LINK colour stay.",
@@ -4331,7 +4332,7 @@
4331
4332
  "texturing": {
4332
4333
  "label": "Texturing",
4333
4334
  "glyph": "03_mesh",
4334
- "description": "Giving a model its colour from images: projecting photographs onto a mesh, or baking its textures into an atlas (measured on San Pietro: the published LOD0 and the case-study LOD1 have the same geometry and differ only in the textures). Projection and baking stay one kind until E.D. says otherwise; which one it was goes in `technique`. Proposed in dev29, confirmed by E.D. on 2 Oct 2026. A crmdig:D7 Digital Machine Event like every process."
4335
+ "description": "Giving a model its colour from images: projecting photographs onto a mesh, or baking its textures into an atlas (measured on San Pietro: the published LOD0 and the case-study LOD1 have the same geometry and differ only in the textures). Projection and baking of the photographs onto the mesh are ONE act of this kind (E.D., 2 Oct 2026); the baking of levels of detail in Blender is not texturing but lod_generation, an act of its own. Proposed in dev29, confirmed by E.D. on 2 Oct 2026. A crmdig:D7 Digital Machine Event like every process."
4335
4336
  },
4336
4337
  "transformation": {
4337
4338
  "label": "Transformation",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "_generated": "by `python -m s3dgraphy.tools.sync_node_datamodel` — DO NOT hand-edit. The flat class hierarchy (parent/node_type/description) is derived from the Python Node subclasses; hand-authored semantics and CIDOC mappings live in s3Dgraphy_node_datamodel.json.",
3
- "s3Dgraphy_data_model_version": "1.6.23",
3
+ "s3Dgraphy_data_model_version": "1.6.24",
4
4
  "node_types": {
5
5
  "ActivityNodeGroup": {
6
6
  "parent": "GroupNode",
@@ -1,6 +1,6 @@
1
1
  {
2
- "s3Dgraphy_data_model_version": "1.6.23",
3
- "description": "v1.6.23 (dev29, 2026-10-02, measured on San Pietro): seven properties that the round trip em.json → TTL → em.json lost now leave and come back — ResourceNode packaging / tier / digest_covers / content_digest (em:packaging, em:tier, em:digestCovers, em:contentDigest) and the declared fields of a DTC step, technique / parameters / software (em:technique, em:parameters, em:software, the last two as rdf:JSON). digest_covers admits members (a file_set). The blend:// locator stays out of RDF on purpose: it is a private path. v1.6.22 (dev28, 2026-11-01, decided by E.D. 2026-10-01 on the dev27 report): the access mode of a signature (created_auth / modified_auth / validated_auth) admits a third mode, 'declared' — an iD typed in a tool's preferences and checked by nobody (EMStudio's declared identity, EM Tools' local identity), with no attested_by; through a relay the mode is the relay's, read from the token (crdt.stamp_auth), not the client's declaration. The language a node is born in travels in the add_node op (crdt.make_op requires it of the producer, 'und' when unknown); the study's language is read only for old ops, said and counted. CRMem 1.6.12. v1.6.21 (dev27, 2026-10-31, decided by E.D. 2026-10-01, «il testo, la risorsa e la selezione» and «l'accesso sul campo»): ResourceNode.properties gains lang — on a resource the language(s) of its CONTENT, one tag or a sorted list, leaving as dcterms:language and outside the cascade of the texts — addresses (several addresses of ONE resource, same digest: em:hasAddress with em:locator, em:residency, em:checkedAt, em:reachable) and checksum_at (a dated digest, em:checksumAt). Node.properties gains created_auth / modified_auth / validated_auth: how the hand of a signature had entered, {mode: orcid | node_password, attested_by} (em:createdVia / em:modifiedVia / em:validatedVia, em:authMode, em:attestedBy). data.lang is written at birth (s3dgraphy.language.stamp_birth_language), also when equal to the study's. v1.6.20 (MICRO le traduzioni, 2026-10-29, decided by E.D. 2026-10-01, «Le traduzioni»): NEW TranslationNode (TRANSL, crm:E33_Linguistic_Object) — ONE translation of one text field of one node. The original stays a string in its field (data.lang on the node, else the study's), never overwritten; each translation is a node reached by has_translation (crm:P73_has_translation, connections 1.6.34) with data.lang (arrival), data.from_lang (departure, written because the original can change), data.field (CRDT vocabulary: description | data.<key>; a PropertyNode's value is data.value; never name), data.text, data.method (manual | ai | edition), data.source_digest (sha256 of the original translated: a different digest = «da riallineare») and data.review_requested («da rivedere»). Who: has_author; AI: data.ai_assisted, unverified until validated_by; an edition: extracted_from → the DocumentNode. RDF (em.ttl 1.6.10): Node.properties.lang names em:originalLanguage — the node's own data.lang leaves as that literal whenever it is declared, equal to the study's too, so a reader tells the original literal from the translations that share its predicate and the round trip gives data.lang back exactly where it was (the D.1 limit of 1.6.19 is closed); the TranslationNode's fields name em:sourceLanguage, em:translatedField, em:translationMethod, em:sourceDigest, em:reviewRequested. v1.6.19 (MICRO la lingua dei dati, 2026-10-27, decided by E.D. 2026-09-28): Node.properties.description becomes an object {cidoc: P3_has_note, natural_language: true, note} — the MARKER that says the description is text in a natural language and leaves in RDF with its language tag; declared once on the base class and inherited by every node type. name is NOT marked: names are invariant identities. No field added, no node element, no graph change: the em.json is the same; only the RDF literal gains its tag. v1.6.18 (MICRO i termini di em.ttl nel datamodel, 2026-10-26, decided by E.D. 2026-10-01 — the datamodel JSON is the truth, so every em: term of em.ttl is cited by a datamodel or is a written exception): the em: predicates the RDF exporter already writes are now NAMED in properties, as plain-string mapping notes (no field added, no node element, no graph change). Node (inherited by every class): the last-hand stamps created_by em:createdBy / modified_by em:lastEditedBy / modified_at em:modifiedAt (created_at prov:generatedAtTime), the tombstone removed.ts em:removedAt / removed.by em:removedBy, the AI marker ai_assisted.by em:aiAssistedBy / .model em:aiModel / .prompt_ref em:aiPromptRef / .fields em:aiAssistedField and the verification validated_by em:validatedBy / validated_at em:validatedAt (properties_note). ResourceNode: checksum em:checksum, scope em:resourceScope, residency em:residency. SemanticShapeNode: convexshapes em:convexShape, spheres em:sphere. AnnotationRegionNode: crs em:crs, coords.frame_iri em:LocalSceneFrame. AuthorNode and AuthorAINode: verified em:orcidVerified (AuthorAINode also names orcid P48, which the exporter writes for both). LocationNodeGroup.propagation.mapping: uri em:propagation. THREE ENTRIES CORRECTED TO WHAT THE CODE WRITES (measured in rdf_exporter.py): PropertyNode.property_type was P2_has_type, is em:hasQualiaType; AuthorAINode model / prompt_reference were P3_has_note, are em:modelIdentifier / em:promptReference; ResourceFileNode.checksum was P1_is_identified_by, is em:checksum; and LocationNodeGroup.propagation said 'not serialized to triplestore' while the exporter has written the non-default value as em:propagation since c1a702c (2026-08-12). v1.6.17 (MICRO la risorsa e i suoi file, 2026-10-18, decided by E.D. 2026-09-30): NEW ResourceFileNode (FILE, crmdig:D1_Digital_Object) — the ResourceNode is the set, the ResourceFileNode is each file, reached by has_file (connections 1.6.30) with role and relative path on the edge. With one file the node is implicit (url and checksum stay on the ResourceNode, as today). ResourceNode.PACKAGINGS += file_set (a few files that call each other: obj → mtl → textures, gltf → bin, shp and companions) and datablock (one object inside a file, a blend:// locator). Representations of the same thing are sibling ResourceNodes tied by dtc_derived_from and chosen by tier and packaging. ADDITIVE: nothing narrowed, no graph changes. v1.6.16 (MICRO le annotazioni ATON sull'asset, 2026-10-15, decided by E.D.): AnnotationRegionNode gains geometry_kind 'volume' — an annotation that encloses a part of a 3D model (ATON / Hathor convex hulls and spheres) and is the proxy of no unit. The region carries no vertices: it reaches a SemanticShapeNode (convexshapes, spheres) with has_semantic_shape and the model with is_on_resource. geometry.aton.import_aton_scene makes one for every semantic id no EM node is named after (a stratigraphic unit only with an explicit create_type); api.promote_region_to_proxy turns it into the proxy of a unit later. RDF: P2_has_type 'volume', no selector, no WKT; the shape travels as itself. Additive. v1.6.15 (MICRO la geometria per origine, 2026-10-11, decided by E.D. 2026-09-30): AnnotationRegionNode's point / line / polyline keep their vertices IN THE NODE, data.coords [[x, y, z], ...] (scene-local, glTF Y-up, metres) with crs and, for a line or a polyline, length and unit — no .glb and no SemanticShape for a reading. New block coords (inline_max_vertices 500: above it the vertices go to a .glb resource via has_linked_resource, with a warning). RDF: geo:hasGeometry -> <region>/geometry geo:asWKT (POINT Z / LINESTRING Z, GeoSPARQL). The readings/<id>.glb of 2026-10-06 are migrated on opening. v1.6.14 (MICRO la cattura in RDF, 2026-09-30): DTCAcquisitionNode.mapping.by_kind — its D12 is the class of a retrieval; a capture takes the class its kind declares in em_visual_rules 1.6.24 (D2 / D11 / E65). Mapping text only, no field changed. v1.6.13 (MICRO i generi delle US, 2026-09-30, decided by E.D. the same day): stratigraphic_kind gains 'coating' — the USR (rivestimento) and its English translation USS (surface): plaster, floors, revetments — with `labels`, `codes` and `default_code` per kind; new node element `source_code` (data.source_code) keeps the code a unit came in with when it is not its kind's default, so the way back to pyArchInit gives the same code. A legacy node_type 'USR' / 'USS' opens as US + coating. v1.6.12 (MICRO la cattura nel DTC e le murature, 2026-09-30): StratigraphicUnit (US) gains the node element `stratigraphic_kind` (em.json data.stratigraphic_kind; today one value, 'masonry'): a USM is a US + masonry, and the legacy node_type 'USM' — never a type of this datamodel — opens as that. DTCAcquisitionNode's description names the two families of the acquisition axis (em_visual_rules 1.6.22: capture / retrieval). v1.6.11 (MICRO la misura in RDF, 2026-10-07): AnnotationRegionNode.properties says how the fields left unprojected by 1.6.10 now travel — the quote of a passage as oa:TextQuoteSelector, the length of a line/polyline as crm:E54_Dimension (P90 value, P91 QUDT unit, em:crs), vertex_count as em:vertexCount. CRMem (em.ttl) 1.6.5 -> 1.6.6. Mapping text only, no field changed. v1.6.10 (MICRO la geometria della lettura, 2026-10-06, decided by E.D. on 2026-09-29): AnnotationRegionNode becomes the node of THE PLACE A READING LOOKED AT, with a new field geometry_kind: region2d (default, every older region), passage (start, end, text), point, line, polyline. The three 3D kinds keep their coordinates in a .glb (glTF POINTS / LINES / LINE_STRIP) linked with has_semantic_shape exactly like a proxy's payload, never in the em.json; the node keeps vertex_count and, for line/polyline, length + unit + crs (api.measure). See the entry's geometry_kinds and glb_payload. Paired with connections 1.6.27 (is_on_resource.target += the representation models). Additive: a region without geometry_kind reads as region2d. v1.6.9 (MICRO la definizione dell'unita', 2026-10-20, decided by E.D. on 2026-09-27): StratigraphicNode.properties gains `definition`, the DEFINIZIONE of the US sheet, as an element of the node like name and description and NOT a qualia. Value = a controlled-vocabulary concept {concept, label}; em.json carries it as data.definition (CRDT field 'data.definition', no change to the frozen em.json v1 node shape); inherited by every stratigraphic subtype. The RDF projection is declared in the entry itself (`rdf`): crm:P2_has_type -> crm:E55_Type when a concept URI is present, nothing when only a label is (`label_only: null`). CRMem 1.6.4 -> 1.6.5 for the companion em:hasDefinition (subproperty of crm:P2_has_type, declared, not emitted by default). Additive only. v1.6.7 (CRMem WIRING, 2026-09-24): rimosso il campo legacy `cidoc_s3d` da tutte le mapping. Non era letto da nessuna parte del codice e portava quattro nomi di classe senza namespace, mai dichiarati e mai emessi: EpochNode = StratigraphicTimeframe; ActivityNodeGroup = StratigraphicActivity; ParadataNodeGroup = ParadataCollection; ResourceNode = ExternalResourceReference. Il prefisso CIDOC-S3D non esiste piu' in nessuno dei due datamodel. v1.6.6 (CIDOC REPAIR, 2026-09-21): classes that pointed at IRIs nobody declares. Checked by parsing the official releases, not from memory. crm:E78_Collection is gone from CIDOC CRM 7.1.3 — renamed E78_Curated_Holding — and E.D. decided NOT to follow the rename, because E78_Curated_Holding is a subclass of E24 Physical Human-Made Thing and a group of nodes is not a physical thing. The three classes that carried it therefore split, each to the class it actually is: GroupNode and RepresentationModelNodeGroup to crm:E73_Information_Object (a conceptual set, and an E90 Symbolic Object, which is what the P106i membership edge needs at both ends), ParadataNodeGroup to crm:E89_Propositional_Object — which is what a gathered body of reasoning IS and what the range of crm:P129i_is_subject_of demands, that being the predicate has_paradata_nodegroup takes in connections 1.6.17 the same day; it stays an E90 through em:NodeGroup, so the membership edge does not break. SemanticShapeNode leaves crmgeo:SP5_Geometric_Place_Expression for crm:E73_Information_Object, PROVVISORIAMENTE: SP5 is not declared at the crmgeo namespace this datamodel emits, crmgeo:SP6_Declarative_Place is the better candidate, and the decision is rinviata da E.D. — E73 commits to nothing meanwhile. crm:P131_is_identified_by, deprecated in CRM 7.x together with E82 Actor Appellation, becomes crm:P1_is_identified_by on AuthorNode (name, surname) and AuthorAINode (name). «CRMs3D» is renamed «CRMem», in components and in referenced_ontology_versions alike: the companion ontology is em.ttl and its namespace is em:, so the old name pointed at nothing anyone could look up. CRMsci moves 3.1 -> 3.2 (latest release). The eight em: terms this file and the connections datamodel cite but em.ttl never defined are now declared there (em:FunctionalUnit, em:GCPSet, em:Narrative, em:NeutralSU, em:RegistrationTransform, em:RepresentationModelNodeGroup, em:hasSubEpoch, em:validatedBy), with domain, range and superclass read off these datamodels and nothing invented. NOT TOUCHED: the `alternative` and legacy `cidoc_s3d` prose fields, which still discuss E78 as an option — prose, not a projection, and rewording them is modelling rather than repair. v1.6.5 (EM16-RMNG, 2026-09-10): adds RepresentationModelNodeGroup, the RM container as a first-class group of the graph — sixth subtype of GroupNode, keeping the parent's E78 Collection because a container IS a curatorial set. Paired with connections datamodel 1.6.14, which adds the is_in_representation_model_group membership edge and widens has_representation_model.target to accept the group. Additive only: no existing entry changed. s3Dgraphy nodes datamodel including node types with CIDOC-CRM mappings. v1.6.4 adds the ADDITIVE georeferencing_nodes section (GCPSetNode = em:GCPSet, RegistrationTransformNode = em:RegistrationTransform, both subclasses of crm:E73_Information_Object with their own extension URIs so the RDF projection stays bijective): the CONTROL and the SOLUTION that place a produced model in the world, introduced with the photogrammetry processing connector. The two modes of that connector are the SHAPE of the graph (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), never a flag. No existing family changed. v1.6.3 re-reads SemanticShapeNode as a PAYLOAD carrier: the proxy of a unit is now a PropertyNode of qualia type 'geometry' that points at the shape (has_semantic_shape), so the proxy inherits the paradata chain it never had. Breaking for consumers that read the proxy as a standalone SemanticShape. v1.6.2 adds AnnotationRegionNode (em:AnnotationRegion, subclass of crm:E36_Visual_Item): the geometry of a 2D annotation in NORMALISED image space, distinct from SemanticShapeNode (3D scene geometry, crmgeo:SP5) - the semantics of the 2D annotator, defined before any canvas exists. v1.6.0 inaugurates a systematic CIDOC-CRM mapping revision: complete audit of all node types against CIDOC-CRM, CRMarchaeo, CRMinf, CRMdig, CRMsci, CRMgeo; replacement of legacy 'cidoc_s3d' pseudo-class names (invented strings without IRI or superclass declaration) with formal em:/s3d: IRIs declared as proper subclasses of CRM classes; introduction of CRMinf as primary (not alternative) for the paradata chain (ParadataNode, PropertyNode interpretive case, ExtractorNode, CombinerNode); introduction of PROV-O for AuthorNode to cover both human and AI agents; alignment with the Heritage Digital Twin Ontology (HDT-O) for containment / granularity properties; LocationNodeGroup (v1.5.3) adopted as the reference pattern (CIDOC-native composition via P2_has_type → E55 Type instances, with explicit extension_status and rationale). Companion deliverables: em.ttl (formal EM extension ontology, dereferenceable via w3id.org/em/) and hdto_extension.ttl (HDT-O granularity properties: contains_HDT, contains_SU, isPrimary). v1.5.4 added RSF (Reused Special Find — spolia) as a stratigraphic subtype, octagon with red border, family=real, is_series=false. Originating DP: DP-26 (spolia project, last DP before the EM 1.5 cut). v1.5.3 added LocationNodeGroup (E53 Place + E55 Type) for spatial / locational membership orthogonal to ActivityNodeGroup (intention) and EpochNode (time). v1.5.2 added family + is_series classification metadata on stratigraphic subtypes.",
2
+ "s3Dgraphy_data_model_version": "1.6.24",
3
+ "description": "v1.6.24 (dev30, decided by E.D. 2026-10-02 on the dev29 report): DTCAcquisitionNode.retrieved_from — where a retrieved object came from, a DOI or a URL (em:retrievedFrom, D1; optional, validate warns «download without origin»). ResourceNode.members_digest names em:membersDigest, the digest of a file_set with a predicate of its own beside em:checksum + em:digestCovers (D4; not a second field). ResourceNode.packaging carries its vocabulary with values and labels, translated in datamodel_translations.json (packagings; A3). ResourceNode.content_digest also holds the digest of the data of a master inside another file — a Metashape model's mesh.ply — compared, never verified by downloading (D7). GCPSetNode gains data.control (ground_control_points | camera_positions) and data.accuracy_m: a chunk referenced only by its cameras' GPS is absolute with the control said for what it is, and validate warns «georeferenced only by camera GPS» (D7). Node.properties.lang states the one explicit exception to the AI marker: a recognised language confirmed by a person is data.lang only (U5). CRMem 1.6.14. v1.6.23 (dev29, 2026-10-02, measured on San Pietro): seven properties that the round trip em.json → TTL → em.json lost now leave and come back — ResourceNode packaging / tier / digest_covers / content_digest (em:packaging, em:tier, em:digestCovers, em:contentDigest) and the declared fields of a DTC step, technique / parameters / software (em:technique, em:parameters, em:software, the last two as rdf:JSON). digest_covers admits members (a file_set). The blend:// locator stays out of RDF on purpose: it is a private path. v1.6.22 (dev28, 2026-11-01, decided by E.D. 2026-10-01 on the dev27 report): the access mode of a signature (created_auth / modified_auth / validated_auth) admits a third mode, 'declared' — an iD typed in a tool's preferences and checked by nobody (EMStudio's declared identity, EM Tools' local identity), with no attested_by; through a relay the mode is the relay's, read from the token (crdt.stamp_auth), not the client's declaration. The language a node is born in travels in the add_node op (crdt.make_op requires it of the producer, 'und' when unknown); the study's language is read only for old ops, said and counted. CRMem 1.6.12. v1.6.21 (dev27, 2026-10-31, decided by E.D. 2026-10-01, «il testo, la risorsa e la selezione» and «l'accesso sul campo»): ResourceNode.properties gains lang — on a resource the language(s) of its CONTENT, one tag or a sorted list, leaving as dcterms:language and outside the cascade of the texts — addresses (several addresses of ONE resource, same digest: em:hasAddress with em:locator, em:residency, em:checkedAt, em:reachable) and checksum_at (a dated digest, em:checksumAt). Node.properties gains created_auth / modified_auth / validated_auth: how the hand of a signature had entered, {mode: orcid | node_password, attested_by} (em:createdVia / em:modifiedVia / em:validatedVia, em:authMode, em:attestedBy). data.lang is written at birth (s3dgraphy.language.stamp_birth_language), also when equal to the study's. v1.6.20 (MICRO le traduzioni, 2026-10-29, decided by E.D. 2026-10-01, «Le traduzioni»): NEW TranslationNode (TRANSL, crm:E33_Linguistic_Object) — ONE translation of one text field of one node. The original stays a string in its field (data.lang on the node, else the study's), never overwritten; each translation is a node reached by has_translation (crm:P73_has_translation, connections 1.6.34) with data.lang (arrival), data.from_lang (departure, written because the original can change), data.field (CRDT vocabulary: description | data.<key>; a PropertyNode's value is data.value; never name), data.text, data.method (manual | ai | edition), data.source_digest (sha256 of the original translated: a different digest = «da riallineare») and data.review_requested («da rivedere»). Who: has_author; AI: data.ai_assisted, unverified until validated_by; an edition: extracted_from → the DocumentNode. RDF (em.ttl 1.6.10): Node.properties.lang names em:originalLanguage — the node's own data.lang leaves as that literal whenever it is declared, equal to the study's too, so a reader tells the original literal from the translations that share its predicate and the round trip gives data.lang back exactly where it was (the D.1 limit of 1.6.19 is closed); the TranslationNode's fields name em:sourceLanguage, em:translatedField, em:translationMethod, em:sourceDigest, em:reviewRequested. v1.6.19 (MICRO la lingua dei dati, 2026-10-27, decided by E.D. 2026-09-28): Node.properties.description becomes an object {cidoc: P3_has_note, natural_language: true, note} — the MARKER that says the description is text in a natural language and leaves in RDF with its language tag; declared once on the base class and inherited by every node type. name is NOT marked: names are invariant identities. No field added, no node element, no graph change: the em.json is the same; only the RDF literal gains its tag. v1.6.18 (MICRO i termini di em.ttl nel datamodel, 2026-10-26, decided by E.D. 2026-10-01 — the datamodel JSON is the truth, so every em: term of em.ttl is cited by a datamodel or is a written exception): the em: predicates the RDF exporter already writes are now NAMED in properties, as plain-string mapping notes (no field added, no node element, no graph change). Node (inherited by every class): the last-hand stamps created_by em:createdBy / modified_by em:lastEditedBy / modified_at em:modifiedAt (created_at prov:generatedAtTime), the tombstone removed.ts em:removedAt / removed.by em:removedBy, the AI marker ai_assisted.by em:aiAssistedBy / .model em:aiModel / .prompt_ref em:aiPromptRef / .fields em:aiAssistedField and the verification validated_by em:validatedBy / validated_at em:validatedAt (properties_note). ResourceNode: checksum em:checksum, scope em:resourceScope, residency em:residency. SemanticShapeNode: convexshapes em:convexShape, spheres em:sphere. AnnotationRegionNode: crs em:crs, coords.frame_iri em:LocalSceneFrame. AuthorNode and AuthorAINode: verified em:orcidVerified (AuthorAINode also names orcid P48, which the exporter writes for both). LocationNodeGroup.propagation.mapping: uri em:propagation. THREE ENTRIES CORRECTED TO WHAT THE CODE WRITES (measured in rdf_exporter.py): PropertyNode.property_type was P2_has_type, is em:hasQualiaType; AuthorAINode model / prompt_reference were P3_has_note, are em:modelIdentifier / em:promptReference; ResourceFileNode.checksum was P1_is_identified_by, is em:checksum; and LocationNodeGroup.propagation said 'not serialized to triplestore' while the exporter has written the non-default value as em:propagation since c1a702c (2026-08-12). v1.6.17 (MICRO la risorsa e i suoi file, 2026-10-18, decided by E.D. 2026-09-30): NEW ResourceFileNode (FILE, crmdig:D1_Digital_Object) — the ResourceNode is the set, the ResourceFileNode is each file, reached by has_file (connections 1.6.30) with role and relative path on the edge. With one file the node is implicit (url and checksum stay on the ResourceNode, as today). ResourceNode.PACKAGINGS += file_set (a few files that call each other: obj → mtl → textures, gltf → bin, shp and companions) and datablock (one object inside a file, a blend:// locator). Representations of the same thing are sibling ResourceNodes tied by dtc_derived_from and chosen by tier and packaging. ADDITIVE: nothing narrowed, no graph changes. v1.6.16 (MICRO le annotazioni ATON sull'asset, 2026-10-15, decided by E.D.): AnnotationRegionNode gains geometry_kind 'volume' — an annotation that encloses a part of a 3D model (ATON / Hathor convex hulls and spheres) and is the proxy of no unit. The region carries no vertices: it reaches a SemanticShapeNode (convexshapes, spheres) with has_semantic_shape and the model with is_on_resource. geometry.aton.import_aton_scene makes one for every semantic id no EM node is named after (a stratigraphic unit only with an explicit create_type); api.promote_region_to_proxy turns it into the proxy of a unit later. RDF: P2_has_type 'volume', no selector, no WKT; the shape travels as itself. Additive. v1.6.15 (MICRO la geometria per origine, 2026-10-11, decided by E.D. 2026-09-30): AnnotationRegionNode's point / line / polyline keep their vertices IN THE NODE, data.coords [[x, y, z], ...] (scene-local, glTF Y-up, metres) with crs and, for a line or a polyline, length and unit — no .glb and no SemanticShape for a reading. New block coords (inline_max_vertices 500: above it the vertices go to a .glb resource via has_linked_resource, with a warning). RDF: geo:hasGeometry -> <region>/geometry geo:asWKT (POINT Z / LINESTRING Z, GeoSPARQL). The readings/<id>.glb of 2026-10-06 are migrated on opening. v1.6.14 (MICRO la cattura in RDF, 2026-09-30): DTCAcquisitionNode.mapping.by_kind — its D12 is the class of a retrieval; a capture takes the class its kind declares in em_visual_rules 1.6.24 (D2 / D11 / E65). Mapping text only, no field changed. v1.6.13 (MICRO i generi delle US, 2026-09-30, decided by E.D. the same day): stratigraphic_kind gains 'coating' — the USR (rivestimento) and its English translation USS (surface): plaster, floors, revetments — with `labels`, `codes` and `default_code` per kind; new node element `source_code` (data.source_code) keeps the code a unit came in with when it is not its kind's default, so the way back to pyArchInit gives the same code. A legacy node_type 'USR' / 'USS' opens as US + coating. v1.6.12 (MICRO la cattura nel DTC e le murature, 2026-09-30): StratigraphicUnit (US) gains the node element `stratigraphic_kind` (em.json data.stratigraphic_kind; today one value, 'masonry'): a USM is a US + masonry, and the legacy node_type 'USM' — never a type of this datamodel — opens as that. DTCAcquisitionNode's description names the two families of the acquisition axis (em_visual_rules 1.6.22: capture / retrieval). v1.6.11 (MICRO la misura in RDF, 2026-10-07): AnnotationRegionNode.properties says how the fields left unprojected by 1.6.10 now travel — the quote of a passage as oa:TextQuoteSelector, the length of a line/polyline as crm:E54_Dimension (P90 value, P91 QUDT unit, em:crs), vertex_count as em:vertexCount. CRMem (em.ttl) 1.6.5 -> 1.6.6. Mapping text only, no field changed. v1.6.10 (MICRO la geometria della lettura, 2026-10-06, decided by E.D. on 2026-09-29): AnnotationRegionNode becomes the node of THE PLACE A READING LOOKED AT, with a new field geometry_kind: region2d (default, every older region), passage (start, end, text), point, line, polyline. The three 3D kinds keep their coordinates in a .glb (glTF POINTS / LINES / LINE_STRIP) linked with has_semantic_shape exactly like a proxy's payload, never in the em.json; the node keeps vertex_count and, for line/polyline, length + unit + crs (api.measure). See the entry's geometry_kinds and glb_payload. Paired with connections 1.6.27 (is_on_resource.target += the representation models). Additive: a region without geometry_kind reads as region2d. v1.6.9 (MICRO la definizione dell'unita', 2026-10-20, decided by E.D. on 2026-09-27): StratigraphicNode.properties gains `definition`, the DEFINIZIONE of the US sheet, as an element of the node like name and description and NOT a qualia. Value = a controlled-vocabulary concept {concept, label}; em.json carries it as data.definition (CRDT field 'data.definition', no change to the frozen em.json v1 node shape); inherited by every stratigraphic subtype. The RDF projection is declared in the entry itself (`rdf`): crm:P2_has_type -> crm:E55_Type when a concept URI is present, nothing when only a label is (`label_only: null`). CRMem 1.6.4 -> 1.6.5 for the companion em:hasDefinition (subproperty of crm:P2_has_type, declared, not emitted by default). Additive only. v1.6.7 (CRMem WIRING, 2026-09-24): rimosso il campo legacy `cidoc_s3d` da tutte le mapping. Non era letto da nessuna parte del codice e portava quattro nomi di classe senza namespace, mai dichiarati e mai emessi: EpochNode = StratigraphicTimeframe; ActivityNodeGroup = StratigraphicActivity; ParadataNodeGroup = ParadataCollection; ResourceNode = ExternalResourceReference. Il prefisso CIDOC-S3D non esiste piu' in nessuno dei due datamodel. v1.6.6 (CIDOC REPAIR, 2026-09-21): classes that pointed at IRIs nobody declares. Checked by parsing the official releases, not from memory. crm:E78_Collection is gone from CIDOC CRM 7.1.3 — renamed E78_Curated_Holding — and E.D. decided NOT to follow the rename, because E78_Curated_Holding is a subclass of E24 Physical Human-Made Thing and a group of nodes is not a physical thing. The three classes that carried it therefore split, each to the class it actually is: GroupNode and RepresentationModelNodeGroup to crm:E73_Information_Object (a conceptual set, and an E90 Symbolic Object, which is what the P106i membership edge needs at both ends), ParadataNodeGroup to crm:E89_Propositional_Object — which is what a gathered body of reasoning IS and what the range of crm:P129i_is_subject_of demands, that being the predicate has_paradata_nodegroup takes in connections 1.6.17 the same day; it stays an E90 through em:NodeGroup, so the membership edge does not break. SemanticShapeNode leaves crmgeo:SP5_Geometric_Place_Expression for crm:E73_Information_Object, PROVVISORIAMENTE: SP5 is not declared at the crmgeo namespace this datamodel emits, crmgeo:SP6_Declarative_Place is the better candidate, and the decision is rinviata da E.D. — E73 commits to nothing meanwhile. crm:P131_is_identified_by, deprecated in CRM 7.x together with E82 Actor Appellation, becomes crm:P1_is_identified_by on AuthorNode (name, surname) and AuthorAINode (name). «CRMs3D» is renamed «CRMem», in components and in referenced_ontology_versions alike: the companion ontology is em.ttl and its namespace is em:, so the old name pointed at nothing anyone could look up. CRMsci moves 3.1 -> 3.2 (latest release). The eight em: terms this file and the connections datamodel cite but em.ttl never defined are now declared there (em:FunctionalUnit, em:GCPSet, em:Narrative, em:NeutralSU, em:RegistrationTransform, em:RepresentationModelNodeGroup, em:hasSubEpoch, em:validatedBy), with domain, range and superclass read off these datamodels and nothing invented. NOT TOUCHED: the `alternative` and legacy `cidoc_s3d` prose fields, which still discuss E78 as an option — prose, not a projection, and rewording them is modelling rather than repair. v1.6.5 (EM16-RMNG, 2026-09-10): adds RepresentationModelNodeGroup, the RM container as a first-class group of the graph — sixth subtype of GroupNode, keeping the parent's E78 Collection because a container IS a curatorial set. Paired with connections datamodel 1.6.14, which adds the is_in_representation_model_group membership edge and widens has_representation_model.target to accept the group. Additive only: no existing entry changed. s3Dgraphy nodes datamodel including node types with CIDOC-CRM mappings. v1.6.4 adds the ADDITIVE georeferencing_nodes section (GCPSetNode = em:GCPSet, RegistrationTransformNode = em:RegistrationTransform, both subclasses of crm:E73_Information_Object with their own extension URIs so the RDF projection stays bijective): the CONTROL and the SOLUTION that place a produced model in the world, introduced with the photogrammetry processing connector. The two modes of that connector are the SHAPE of the graph (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), never a flag. No existing family changed. v1.6.3 re-reads SemanticShapeNode as a PAYLOAD carrier: the proxy of a unit is now a PropertyNode of qualia type 'geometry' that points at the shape (has_semantic_shape), so the proxy inherits the paradata chain it never had. Breaking for consumers that read the proxy as a standalone SemanticShape. v1.6.2 adds AnnotationRegionNode (em:AnnotationRegion, subclass of crm:E36_Visual_Item): the geometry of a 2D annotation in NORMALISED image space, distinct from SemanticShapeNode (3D scene geometry, crmgeo:SP5) - the semantics of the 2D annotator, defined before any canvas exists. v1.6.0 inaugurates a systematic CIDOC-CRM mapping revision: complete audit of all node types against CIDOC-CRM, CRMarchaeo, CRMinf, CRMdig, CRMsci, CRMgeo; replacement of legacy 'cidoc_s3d' pseudo-class names (invented strings without IRI or superclass declaration) with formal em:/s3d: IRIs declared as proper subclasses of CRM classes; introduction of CRMinf as primary (not alternative) for the paradata chain (ParadataNode, PropertyNode interpretive case, ExtractorNode, CombinerNode); introduction of PROV-O for AuthorNode to cover both human and AI agents; alignment with the Heritage Digital Twin Ontology (HDT-O) for containment / granularity properties; LocationNodeGroup (v1.5.3) adopted as the reference pattern (CIDOC-native composition via P2_has_type → E55 Type instances, with explicit extension_status and rationale). Companion deliverables: em.ttl (formal EM extension ontology, dereferenceable via w3id.org/em/) and hdto_extension.ttl (HDT-O granularity properties: contains_HDT, contains_SU, isPrimary). v1.5.4 added RSF (Reused Special Find — spolia) as a stratigraphic subtype, octagon with red border, family=real, is_series=false. Originating DP: DP-26 (spolia project, last DP before the EM 1.5 cut). v1.5.3 added LocationNodeGroup (E53 Place + E55 Type) for spatial / locational membership orthogonal to ActivityNodeGroup (intention) and EpochNode (time). v1.5.2 added family + is_series classification metadata on stratigraphic subtypes.",
4
4
  "components": [
5
5
  "CIDOC-CRM",
6
6
  "CRMarchaeo",
@@ -48,7 +48,7 @@
48
48
  "source": "https://www.w3.org/TR/prov-o/"
49
49
  },
50
50
  "CRMem": {
51
- "version": "1.6.13",
51
+ "version": "1.6.14",
52
52
  "source": "internal em.ttl / hdto_extension.ttl companion ontologies"
53
53
  }
54
54
  },
@@ -88,7 +88,7 @@
88
88
  "ai_assisted.fields": "em:aiAssistedField",
89
89
  "validated_by": "em:validatedBy",
90
90
  "validated_at": "em:validatedAt",
91
- "lang": "em:originalLanguage",
91
+ "lang": {"rdf": "em:originalLanguage", "note": "1.6.24 (dev30, decided by E.D. 2 Oct 2026, U5): a language RECOGNISED by a tool and confirmed by a person with one gesture is written as data.lang ONLY — no ai_assisted, no record in the graph's register: recognising the language of a text is cleaning of the data, not provenance (s3dgraphy.language.confirm_recognised_language). It is the one explicit exception to the AI marker; every other field a tool proposes keeps it."},
92
92
  "created_auth": {
93
93
  "rdf": "em:createdVia",
94
94
  "note": "1.6.21 (dev27, decided by E.D. 2026-10-01, «l'accesso sul campo»): HOW the hand of a signature had entered, beside each signature — created_auth beside created_by, modified_auth beside modified_by, validated_auth beside validated_by: {mode, attested_by?}, mode 'orcid' (verified by ORCID) or 'node_password' (the iD and a password of a StratiGraph node, which attests the identity offline; attested_by = the node's name, required) or, since 1.6.22 (dev28), 'declared' (an iD typed in a tool's preferences, checked by nobody; no attested_by). Through a relay the mode is the relay's, read from the token (crdt.stamp_auth), never the client's declaration. Written by editorial.stamp_created / stamp_modified (auth=), ai_validation.verify (auth=) and the CRDT op's 'auth'; modified_auth follows the last hand and is removed when a new hand comes without one. In RDF: <node>/auth/<created|modified|validated>, reached by em:createdVia / em:modifiedVia / em:validatedVia, with em:authMode and em:attestedBy."
@@ -1079,10 +1079,11 @@
1079
1079
  "checksum": "em:checksum",
1080
1080
  "scope": "em:resourceScope",
1081
1081
  "residency": "em:residency",
1082
- "packaging": {"rdf": "em:packaging", "note": "1.6.23 (dev29): how the bytes are packed (file | file_set | directory | archive | datablock, the dtcstamp PACKAGINGS), DECLARED — never the effective_packaging fallback. Emitted only when recorded."},
1082
+ "packaging": {"rdf": "em:packaging", "note": "1.6.23 (dev29): how the bytes are packed (file | file_set | directory | archive | datablock, the dtcstamp PACKAGINGS), DECLARED — never the effective_packaging fallback. Emitted only when recorded. 1.6.24 (dev30): the vocabulary with its labels lives here (values, labels; translations in datamodel_translations.json, section packagings), so an interface reads the name of a packaging from the datamodel instead of its own words.", "values": {"file": "One file: the resource is its bytes.", "file_set": "A few files that call each other (obj → mtl → textures, gltf → bin, shp and companions): the resource is the list of its members, stamped by the digest of that list.", "directory": "A folder: the resource is everything under it, members reached by has_file with their relative path.", "archive": "One file that packs others (zip, .3tz): the resource is the archive's bytes.", "datablock": "One object inside a file (a blend:// locator): comparable by a structural digest, not verifiable by downloading."}, "labels": {"file": "File", "file_set": "File set", "directory": "Folder", "archive": "Archive", "datablock": "Blender object"}},
1083
1083
  "tier": {"rdf": "em:tier", "note": "1.6.23 (dev29): master | distribution | …, declared; emitted only when recorded."},
1084
1084
  "digest_covers": {"rdf": "em:digestCovers", "note": "1.6.23 (dev29): what em:checksum covers — artifact (the bytes), payload, members (the canonical list of the members of a file_set, dtcstamp.members_digest). add_resource writes members for a file_set; a legacy members_digest equal to the checksum leaves as members."},
1085
- "content_digest": {"rdf": "em:contentDigest", "note": "1.6.23 (dev29): the digest of the CONTENT of a tree (a folder or its .3tz), dtcstamp.content_digest — the same for both forms."},
1085
+ "members_digest": {"rdf": "em:membersDigest", "note": "1.6.24 (dev30, decided by E.D. 2 Oct 2026, D4): NOT A SECOND FIELD — the digest of a file_set is its checksum with digest_covers members (dtcstamp.members_digest of the list of members, A1 of dev29). In RDF it leaves ALSO as em:membersDigest, a predicate of its own, so a reader tells the digest of a set from the digest of a file without reading em:checksum and em:digestCovers together; those two stay, for compatibility. A TTL carrying only em:membersDigest comes back as checksum + digest_covers members."},
1086
+ "content_digest": {"rdf": "em:contentDigest", "note": "1.6.23 (dev29): the digest of the CONTENT of a tree (a folder or its .3tz), dtcstamp.content_digest — the same for both forms. 1.6.24 (dev30, decided by E.D. 2 Oct 2026, D7): also the digest of the DATA of a master that lives inside another file — for a Metashape model (a datablock, psx://) the sha256 of its mesh.ply inside the project's model.zip, written by importer.metashape_project. It is COMPARED (has the master changed?), never verified by downloading, and so it is never the checksum, which is the digest of bytes one can fetch."},
1086
1087
  "addresses": {
1087
1088
  "rdf": "em:hasAddress",
1088
1089
  "note": "1.6.21 (dev27, decided by E.D. 2026-10-01, «più risorse per un documento»): the SAME bytes — the same digest — are ONE resource with several addresses (the same PDF on the disk, on MinIO, on Zenodo); different manifestations are sister resources. data.addresses = [{locator, residency?, checked_at?, ok?}], written only when there is a second address or a check; address 0 is data.url, which a consumer that knows only url keeps reading. ok true = reachable at checked_at, false = dead (a warning while a live one remains, never removed by a check), absent = never checked. Written by s3dgraphy.resources.addresses (add_address refuses a different digest, and a resource with no digest). In RDF every locator is an rdfs:seeAlso of the resource, and each address <resource>/address/<i> em:hasAddress, with em:locator, em:residency, em:checkedAt, em:reachable."
@@ -1715,7 +1716,8 @@
1715
1716
  "dtc_kind": "P2_has_type",
1716
1717
  "technique": {"rdf": "em:technique", "note": "1.6.23 (dev29): the free word of whoever did the gesture, beside the controlled dtc_kind. Leaves for RDF and comes back (it was lost by the round trip, measured on San Pietro)."},
1717
1718
  "parameters": {"rdf": "em:parameters", "note": "1.6.23 (dev29): how the technique was applied, a dict; ONE rdf:JSON literal, because the stamp format owns its shape."},
1718
- "software": {"rdf": "em:software", "note": "1.6.23 (dev29): the list of software of the step, each {name, version, commit?}; ONE rdf:JSON literal. data.tool is read back from its first entry, as declare_derivation writes it."}
1719
+ "software": {"rdf": "em:software", "note": "1.6.23 (dev29): the list of software of the step, each {name, version, commit?}; ONE rdf:JSON literal. data.tool is read back from its first entry, as declare_derivation writes it."},
1720
+ "retrieved_from": {"rdf": "em:retrievedFrom", "note": "1.6.24 (dev30, decided by E.D. 2 Oct 2026, D1): WHERE A RETRIEVED OBJECT CAME FROM — the DOI (as https://doi.org/…) or the URL a Download was made from; the stamp's how.acquisition.retrieved_from. Not from[]: from[] names parents with an identity (a digest), and an origin has none. On the node it is one of the event's facts, data.retrieved_from (bucket_acquisition's metadata) or data.acquisition.retrieved_from (an absorbed stamp): dtc.ingest.acquisition_origin reads both. OPTIONAL in the format — validate warns «download without origin» for a dtc_kind download that does not say it, never an error, so an old stamp stays readable; EMStudio's composer requires it for a Download and fills it when it can be read. Leaves as em:retrievedFrom (xsd:anyURI for a URL) and comes back as data.retrieved_from."}
1719
1721
  }
1720
1722
  },
1721
1723
  "DTCDeviceNode": {
@@ -1755,7 +1757,7 @@
1755
1757
  "parent": "Node",
1756
1758
  "abbreviation": "GCP",
1757
1759
  "label": "Ground control points",
1758
- "description": "The set of ground control points a registration was (or will be) solved from. data.points is a list of {id, world:[x,y,z], observations:[{image, pixel:[x,y]}], uncertainty?}; data.crs names the frame the world coordinates are in (null = a site-local grid, which is a different statement from absent). Minimum 3 observed non-collinear points for a similarity to be determined — reported by `solvable`, enforced by the runner, never at construction (a set being assembled in the field is legitimately incomplete).",
1760
+ "description": "The set of ground control points a registration was (or will be) solved from. data.points is a list of {id, world:[x,y,z], observations:[{image, pixel:[x,y]}], uncertainty?}; data.crs names the frame the world coordinates are in (null = a site-local grid, which is a different statement from absent). Minimum 3 observed non-collinear points for a similarity to be determined — reported by `solvable`, enforced by the runner, never at construction (a set being assembled in the field is legitimately incomplete). 1.6.24 (dev30, decided by E.D. 2 Oct 2026, D7): data.control says WHAT the points are — ground_control_points (default, not written) or camera_positions: the GPS positions of the cameras themselves, each point {id, world, image, uncertainty?} with no pixel observation (the camera is where the photograph was taken from, not something seen in it), solvable with three; data.accuracy_m is the accuracy the project records for the cameras. A chunk referenced only by its cameras' GPS is placed absolute with such a set, and validate warns «georeferenced only by camera GPS»: absolute without the control said would claim more than the data.",
1759
1761
  "s3Dgraphy_file": "georeferencing_node.py",
1760
1762
  "mapping": {
1761
1763
  "cidoc": "crm:E73_Information_Object",
@@ -1,4 +1,4 @@
1
- __version__ = "1.6.0.dev29"
1
+ __version__ = "1.6.0.dev30"
2
2
  __datamodel_version__ = "1.5.5" # s3Dgraphy connections datamodel version
3
3
 
4
4
  # s3Dgraphy/__init__.py
@@ -156,6 +156,9 @@ def validate(graph: Graph) -> Dict[str, Any]:
156
156
  f"from '{r['unit_name']}', which has no '{r['property_name']}' "
157
157
  f"property of its own")
158
158
  warnings = list(getattr(graph, "warnings", []) or [])
159
+ warnings.extend(_dtc_warnings(graph))
160
+ warnings.extend(_license_warnings(graph))
161
+ warnings.extend(_camera_gps_warnings(graph))
159
162
  geo = georeference_state(graph)
160
163
  if geo == "undeclared":
161
164
  info.append("the graph is not georeferenced: no CRS is declared "
@@ -174,6 +177,89 @@ def validate(graph: Graph) -> Dict[str, Any]:
174
177
  }
175
178
 
176
179
 
180
+ def _dtc_warnings(graph: Graph) -> List[str]:
181
+ """What a DTC chain leaves unsaid that a reader would want said — warnings,
182
+ never issues: an old stamp stays readable and nobody is stopped.
183
+
184
+ * D1 (E.D., 2 Oct 2026) — a Download that does not say where it came from
185
+ (``how.acquisition.retrieved_from``: a DOI or a URL). The composer asks
186
+ for it; the format leaves it optional."""
187
+ from .dtc.ingest import DOWNLOAD_KIND, acquisition_origin
188
+ out: List[str] = []
189
+ for node in getattr(graph, "nodes", []) or []:
190
+ if getattr(node, "node_type", None) != "dtc_acquisition":
191
+ continue
192
+ data = getattr(node, "data", None) or {}
193
+ if data.get("dtc_kind") == DOWNLOAD_KIND and not acquisition_origin(node):
194
+ out.append(
195
+ f"download without origin: '{getattr(node, 'name', '')}' "
196
+ f"({node.node_id}) does not say where it came from "
197
+ f"(how.acquisition.retrieved_from — a DOI or a URL)")
198
+ return out
199
+
200
+
201
+ def _camera_gps_warnings(graph: Graph) -> List[str]:
202
+ """D7 (E.D., 2 Oct 2026): a registration controlled ONLY by the GPS
203
+ positions of the cameras (a GCPSetNode of control camera_positions, no set
204
+ of ground control beside it). It counts as absolute, and is said for what it
205
+ is: a drone's GPS can be tens of metres off the survey."""
206
+ from .nodes.georeferencing_node import GCPSetNode
207
+ nodes = {n.node_id: n for n in getattr(graph, "nodes", []) or []}
208
+ sets_of: Dict[str, List[Any]] = {}
209
+ for e in getattr(graph, "edges", []) or []:
210
+ if getattr(e, "edge_type", None) == "has_gcp_set" and e.edge_target in nodes:
211
+ sets_of.setdefault(e.edge_source, []).append(nodes[e.edge_target])
212
+ out: List[str] = []
213
+ for transform_id, sets in sets_of.items():
214
+ controls = {(getattr(s, "data", None) or {}).get("control")
215
+ or GCPSetNode.GROUND_CONTROL for s in sets}
216
+ if controls == {GCPSetNode.CAMERA_POSITIONS}:
217
+ for gcp in sets:
218
+ d = getattr(gcp, "data", None) or {}
219
+ acc = d.get("accuracy_m")
220
+ out.append(
221
+ f"georeferenced only by camera GPS: '{getattr(gcp, 'name', '')}' "
222
+ f"({gcp.node_id}) controls the registration {transform_id} with "
223
+ f"{len(d.get('points') or [])} camera positions"
224
+ + (f" (accuracy {acc:g} m)" if isinstance(acc, (int, float)) else "")
225
+ + " and no ground control point")
226
+ return out
227
+
228
+
229
+ _LICENSE_CODE = re.compile(r"^(?:CC|CC0)(?:[-_ ][A-Z]{2})*(?:[-_ ]\d+(?:\.\d+)?)?$")
230
+
231
+
232
+ def _license_code(text: Any) -> Optional[str]:
233
+ """A Creative Commons code read for comparison — upper case, '-' between
234
+ the parts, no version («cc by-nd 4.0» → «CC-BY-ND») — or ``None`` when the
235
+ text is not a code («Creative Commons Attribution» is a name, not a code)."""
236
+ t = str(text or "").strip().upper().replace("_", "-")
237
+ if not t or not _LICENSE_CODE.match(t):
238
+ return None
239
+ t = re.sub(r"[- ]+\d+(?:\.\d+)?$", "", t)
240
+ return re.sub(r"[- ]+", "-", t)
241
+
242
+
243
+ def _license_warnings(graph: Graph) -> List[str]:
244
+ """D6 (E.D., 2 Oct 2026): a licence whose NAME and TYPE are two different
245
+ licences («CC-BY-ND» of type CC-BY-NC-ND, San Pietro). The graph is not
246
+ corrected — which one is right is the author's to say, against the record
247
+ it was published with — it is said. Compared only when the name is itself
248
+ a licence code: a long name beside a code is not a disagreement."""
249
+ out: List[str] = []
250
+ for node in getattr(graph, "nodes", []) or []:
251
+ if getattr(node, "node_type", None) != "license":
252
+ continue
253
+ name = getattr(node, "name", "")
254
+ ltype = (getattr(node, "data", None) or {}).get("license_type")
255
+ a, b = _license_code(name), _license_code(ltype)
256
+ if a and b and a != b:
257
+ out.append(
258
+ f"license name and type disagree: '{name}' ({node.node_id}) is "
259
+ f"of type '{ltype}' — say which licence the work carries")
260
+ return out
261
+
262
+
177
263
  # ── a property with more than one owner ─────────────────────────────────────
178
264
  def property_owners(graph: Graph, property_id: str) -> List[Dict[str, Any]]:
179
265
  """The owners of a property, the original first: ``[{owner, edge,
@@ -2756,12 +2842,20 @@ def resolve_resource(graph: Graph, resource_id: str, *, registry: Any = None
2756
2842
  Looks up the ResourceNode by its ``node_id`` (the stable ID), reads its current
2757
2843
  locator, and asks the resolver registry (default: passthrough) to map it to
2758
2844
  a :class:`~s3dgraphy.resources.Location`. Returns the Location as a dict
2759
- ``{kind, value, exists}``, or ``None`` if no such resource exists."""
2845
+ ``{kind, value, exists}``, or ``None`` if no such resource exists.
2846
+
2847
+ A DocumentNode answers too (dev30, A1): it carries its file in ``url`` (the
2848
+ GraphML's «/DosCo/D.02.jpg»), read as a locator like a resource's — so a
2849
+ caller asks one seam for both and never reads the url by itself. A document
2850
+ with no url answers ``None``, as a missing resource does."""
2760
2851
  from .resources import default_registry
2761
2852
  node = graph.find_node_by_id(resource_id)
2762
- if node is None or getattr(node, "node_type", None) != "resource":
2853
+ kind = getattr(node, "node_type", None) if node is not None else None
2854
+ if kind not in ("resource", "document"):
2763
2855
  return None
2764
2856
  locator = _resource_locator(node)
2857
+ if kind == "document" and not locator:
2858
+ return None
2765
2859
  reg = registry if registry is not None else default_registry()
2766
2860
  loc = reg.resolve(resource_id, locator, graph=graph)
2767
2861
  return loc.to_dict() if loc is not None else None
@@ -51,6 +51,8 @@ from .neighbourhood import (
51
51
  from .ingest import (
52
52
  DEFAULT_ACQUISITION_KIND,
53
53
  DEFAULT_PROCESS_KIND,
54
+ DOWNLOAD_KIND,
55
+ acquisition_origin,
54
56
  acquisition_members,
55
57
  attribute_batch,
56
58
  batch_summary,
@@ -83,6 +83,28 @@ _USAGE_ROLES = {
83
83
 
84
84
  # ── the small shared readers (dict-or-object, tombstone-aware) ───────────────
85
85
 
86
+ #: the kind of an acquisition whose origin is asked for (E.D., 2 Oct 2026, D1)
87
+ DOWNLOAD_KIND = "download"
88
+
89
+
90
+ def acquisition_origin(node: Any) -> Optional[str]:
91
+ """Where a retrieved object came from — ``how.acquisition.retrieved_from``
92
+ of the stamp format: the DOI or URL a Download was made from.
93
+
94
+ Read in the two places an acquisition keeps its facts: ``data.acquisition``
95
+ (an event absorbed from a stamp) and ``data`` itself (an event made by
96
+ :func:`bucket_acquisition`, whose ``metadata`` are the event's facts). The
97
+ second is the shape a graph is saved in, and the one the RDF importer
98
+ gives back. ``None`` when the act does not say."""
99
+ data = _data(node)
100
+ block = data.get("acquisition")
101
+ for holder in ((block if isinstance(block, dict) else {}), data):
102
+ value = holder.get("retrieved_from")
103
+ if isinstance(value, str) and value.strip():
104
+ return value.strip()
105
+ return None
106
+
107
+
86
108
  def _data(node: Any) -> Dict[str, Any]:
87
109
  d = getattr(node, "data", None)
88
110
  return d if isinstance(d, dict) else {}
@@ -2008,6 +2008,15 @@ class RDFExporter:
2008
2008
  ctx.add((node_iri, pred, Literal(
2009
2009
  json.dumps(value, ensure_ascii=False, sort_keys=True),
2010
2010
  datatype=RDF.JSON)))
2011
+ # dev30 (D1): where a retrieved object came from — a DOI or a URL,
2012
+ # an xsd:anyURI when it is one, a plain literal otherwise
2013
+ if node_type == "dtc_acquisition":
2014
+ from ..dtc.ingest import acquisition_origin
2015
+ origin = acquisition_origin(node)
2016
+ if origin:
2017
+ is_uri = origin.startswith(("http://", "https://"))
2018
+ ctx.add((node_iri, EM.retrievedFrom, Literal(
2019
+ origin, datatype=XSD.anyURI if is_uri else None)))
2011
2020
 
2012
2021
  @staticmethod
2013
2022
  def _emit_resource_packing(node_iri: URIRef, data: Dict[str, Any],
@@ -2025,6 +2034,12 @@ class RDFExporter:
2025
2034
  covers = "members"
2026
2035
  if covers:
2027
2036
  ctx.add((node_iri, EM.digestCovers, Literal(str(covers))))
2037
+ # dev30 (D4): the digest of a SET has a predicate of its own, so a
2038
+ # reader tells it from the digest of a file without reading two triples
2039
+ # together; em:checksum + em:digestCovers stay beside it for the readers
2040
+ # that already know them.
2041
+ if covers == "members" and data.get("checksum"):
2042
+ ctx.add((node_iri, EM.membersDigest, Literal(str(data["checksum"]))))
2028
2043
  content = data.get("content_digest")
2029
2044
  if isinstance(content, dict):
2030
2045
  content = content.get("digest")