s3dgraphy 1.6.0.dev15__tar.gz → 1.6.0.dev17__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 (376) hide show
  1. {s3dgraphy-1.6.0.dev15/src/s3dgraphy.egg-info → s3dgraphy-1.6.0.dev17}/PKG-INFO +2 -2
  2. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/README.md +1 -1
  3. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/pyproject.toml +1 -1
  4. s3dgraphy-1.6.0.dev17/src/s3dgraphy/JSON_config/acquisition_mappings/uri.json +22 -0
  5. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/datamodel_translations.json +16 -0
  6. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/em_visual_rules.json +41 -7
  7. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/node_registry.generated.json +11 -1
  8. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json +55 -2
  9. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/s3Dgraphy_node_datamodel.json +52 -2
  10. s3dgraphy-1.6.0.dev17/src/s3dgraphy/JSON_config/src/2D/gcp_set.svg +8 -0
  11. s3dgraphy-1.6.0.dev17/src/s3dgraphy/JSON_config/src/2D/graph.svg +6 -0
  12. s3dgraphy-1.6.0.dev17/src/s3dgraphy/JSON_config/src/2D/registration_transform.svg +6 -0
  13. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/__init__.py +1 -1
  14. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/acquisition/__init__.py +5 -1
  15. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/acquisition/acquire.py +12 -2
  16. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/acquisition/descriptor.py +20 -2
  17. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/acquisition/mapping.py +72 -1
  18. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/api.py +315 -11
  19. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/container.py +2 -2
  20. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/contract/connector.py +1 -1
  21. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/contract/consumer.py +10 -10
  22. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/crdt.py +1 -1
  23. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/dtc/__init__.py +15 -0
  24. s3dgraphy-1.6.0.dev17/src/s3dgraphy/dtc/neighbourhood.py +253 -0
  25. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/geometry/store_backed.py +1 -1
  26. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/importer/base_importer.py +99 -19
  27. s3dgraphy-1.6.0.dev17/src/s3dgraphy/importer/csv_importer.py +138 -0
  28. s3dgraphy-1.6.0.dev17/src/s3dgraphy/importer/xml_importer.py +220 -0
  29. s3dgraphy-1.6.0.dev17/src/s3dgraphy/mappings/authoring.py +1024 -0
  30. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/__init__.py +8 -0
  31. s3dgraphy-1.6.0.dev17/src/s3dgraphy/nodes/georeferencing_node.py +233 -0
  32. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/resource_node.py +39 -1
  33. s3dgraphy-1.6.0.dev17/src/s3dgraphy/photogrammetry/__init__.py +23 -0
  34. s3dgraphy-1.6.0.dev17/src/s3dgraphy/photogrammetry/delta.py +301 -0
  35. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/publication.py +2 -2
  36. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/rights.py +1 -1
  37. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/shelf/__init__.py +9 -0
  38. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/shelf/core.py +230 -11
  39. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/study.py +2 -2
  40. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17/src/s3dgraphy.egg-info}/PKG-INFO +2 -2
  41. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy.egg-info/SOURCES.txt +18 -0
  42. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_api_surface.py +1 -1
  43. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_asset_dtc_protocol.py +1 -1
  44. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_contract_consumer.py +3 -3
  45. s3dgraphy-1.6.0.dev17/tests/test_dtc_neighbourhood.py +327 -0
  46. s3dgraphy-1.6.0.dev17/tests/test_mapping_authoring.py +491 -0
  47. s3dgraphy-1.6.0.dev17/tests/test_mapping_csv_and_relations.py +320 -0
  48. s3dgraphy-1.6.0.dev17/tests/test_photogrammetry_delta.py +291 -0
  49. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_promotion.py +1 -1
  50. s3dgraphy-1.6.0.dev17/tests/test_semantic_purity.py +185 -0
  51. s3dgraphy-1.6.0.dev17/tests/test_shelf_role_uri_table.py +443 -0
  52. s3dgraphy-1.6.0.dev17/tests/test_visual_assets.py +104 -0
  53. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/LICENSE +0 -0
  54. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/MANIFEST.in +0 -0
  55. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/setup.cfg +0 -0
  56. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/acquisition_descriptor.schema.json +0 -0
  57. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/acquisition_mappings/ercolano.json +0 -0
  58. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/acquisition_mappings/fs.json +0 -0
  59. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/em.ttl +0 -0
  60. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/em_document_types.json +0 -0
  61. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/em_extractor_types.json +0 -0
  62. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/em_palette_icons.json +0 -0
  63. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/em_qualia_types.json +0 -0
  64. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/em_qualia_types_additions.json +0 -0
  65. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/hdto_extension.ttl +0 -0
  66. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/new_qualia_template.json +0 -0
  67. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/outdated_s3dgraphy.ttl +0 -0
  68. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/outdated_s3dgraphy_nomapping.ttl +0 -0
  69. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json.v155.bak +0 -0
  70. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/ActivityNodeGroup.svg +0 -0
  71. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.png +0 -0
  72. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.svg +0 -0
  73. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/EpochNode.svg +0 -0
  74. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/ParadataNodeGroup.svg +0 -0
  75. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/RSF.png +0 -0
  76. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/RSF.svg +0 -0
  77. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/SE.svg +0 -0
  78. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/SE_old.png +0 -0
  79. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/SE_old.svg +0 -0
  80. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/SF.png +0 -0
  81. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/SF.svg +0 -0
  82. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/TSU.png +0 -0
  83. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/US.png +0 -0
  84. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/US.svg +0 -0
  85. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/USD.png +0 -0
  86. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/USD.svg +0 -0
  87. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/USVn.png +0 -0
  88. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/USVn.svg +0 -0
  89. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/USVs.png +0 -0
  90. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/USVs.svg +0 -0
  91. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/UTR.svg +0 -0
  92. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/VSF.png +0 -0
  93. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/VSF.svg +0 -0
  94. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/author.png +0 -0
  95. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/author.svg +0 -0
  96. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/author_ai.png +0 -0
  97. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/combiner.png +0 -0
  98. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/combiner.svg +0 -0
  99. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/continuity.png +0 -0
  100. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/continuity.svg +0 -0
  101. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/document.png +0 -0
  102. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/document.svg +0 -0
  103. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/dtc/00_transformation.svg +0 -0
  104. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/dtc/01_topographicnetwork.svg +0 -0
  105. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/dtc/02_pointcloud.svg +0 -0
  106. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/dtc/03_mesh.svg +0 -0
  107. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/dtc/04_points.svg +0 -0
  108. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/dtc/05_lines.svg +0 -0
  109. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/dtc/06_polygons.svg +0 -0
  110. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/dtc/07_DEM.svg +0 -0
  111. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/dtc/08_ortophoto.svg +0 -0
  112. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/dtc/09_photos.svg +0 -0
  113. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/dtc/10_laserscanner.svg +0 -0
  114. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/embargo.png +0 -0
  115. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/extractor.png +0 -0
  116. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/extractor.svg +0 -0
  117. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/generic_node.svg +0 -0
  118. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/geo_position.svg +0 -0
  119. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/license.png +0 -0
  120. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/link.svg +0 -0
  121. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/narrative.png +0 -0
  122. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/play.svg +0 -0
  123. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/property.png +0 -0
  124. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/property.svg +0 -0
  125. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/representation_model.svg +0 -0
  126. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/representation_model_doc.svg +0 -0
  127. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/representation_model_sf.svg +0 -0
  128. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/semantic_shape.svg +0 -0
  129. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/serSU.png +0 -0
  130. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/serSU.svg +0 -0
  131. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/serUSD.png +0 -0
  132. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/serUSV.png +0 -0
  133. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/serUSVn.svg +0 -0
  134. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/2D/serUSVs.svg +0 -0
  135. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/3D/RSF.glb +0 -0
  136. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/3D/SF.glb +0 -0
  137. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/3D/TSU.glb +0 -0
  138. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/3D/US.glb +0 -0
  139. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/3D/USD.glb +0 -0
  140. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/3D/USVn.glb +0 -0
  141. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/3D/USVs.glb +0 -0
  142. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/3D/VSF.glb +0 -0
  143. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/3D/combiner.glb +0 -0
  144. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/3D/continuity.glb +0 -0
  145. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/3D/document.glb +0 -0
  146. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/3D/extractor.glb +0 -0
  147. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/3D/property.glb +0 -0
  148. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/3D/serSU.glb +0 -0
  149. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/3D/serUSD.glb +0 -0
  150. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/JSON_config/src/3D/serUSV.glb +0 -0
  151. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/annotation/__init__.py +0 -0
  152. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/annotation/paradata.py +0 -0
  153. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/authorities/__init__.py +0 -0
  154. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/authorities/resolver.py +0 -0
  155. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/authorities/snapshots/LICENSE +0 -0
  156. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/authorities/snapshots/chronontology.jsonld +0 -0
  157. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/authorities/snapshots/getty_aat.jsonld +0 -0
  158. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/authorities/snapshots/getty_tgn.jsonld +0 -0
  159. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/authorities/snapshots/periodo.jsonld +0 -0
  160. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/authorities/snapshots/provenance.json +0 -0
  161. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/classification.py +0 -0
  162. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/contract/__init__.py +0 -0
  163. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/contract/core.py +0 -0
  164. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/contract/reference.py +0 -0
  165. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/data/StratiMiner_Extraction_Prompt.md +0 -0
  166. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/diagnostics.py +0 -0
  167. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/dissemination.py +0 -0
  168. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/dtc/corpus.py +0 -0
  169. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/dtc/ingest.py +0 -0
  170. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/dtc/residency.py +0 -0
  171. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/edges/__init__.py +0 -0
  172. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/edges/connection_resolver.py +0 -0
  173. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/edges/connections_loader.py +0 -0
  174. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/edges/edge.py +0 -0
  175. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/editorial.py +0 -0
  176. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/__init__.py +0 -0
  177. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/docx_exporter.py +0 -0
  178. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/emjson_exporter.py +0 -0
  179. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/graphml/__init__.py +0 -0
  180. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/graphml/canvas_generator.py +0 -0
  181. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/graphml/edge_generator.py +0 -0
  182. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/graphml/epoch_generator.py +0 -0
  183. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/graphml/graphml_exporter.py +0 -0
  184. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/graphml/graphml_patcher.py +0 -0
  185. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/graphml/group_node_generator.py +0 -0
  186. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/graphml/node_generator.py +0 -0
  187. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/graphml/node_registry.py +0 -0
  188. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/graphml/palette_resources.py +0 -0
  189. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/graphml/paradata_generator.py +0 -0
  190. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/graphml/paradata_image_generator.py +0 -0
  191. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/graphml/paradata_node_generators.py +0 -0
  192. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/graphml/table_node_generator.py +0 -0
  193. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/graphml/utils.py +0 -0
  194. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/html_exporter.py +0 -0
  195. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/ipynb_exporter.py +0 -0
  196. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/json_exporter.py +0 -0
  197. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/latex_exporter.py +0 -0
  198. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/rdf_exporter.py +0 -0
  199. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/exporter/unified_xlsx_exporter.py +0 -0
  200. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/geometry/__init__.py +0 -0
  201. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/geometry/migrate.py +0 -0
  202. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/geometry/proxy.py +0 -0
  203. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/graph.py +0 -0
  204. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/iiif.py +0 -0
  205. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/importer/__init__.py +0 -0
  206. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/importer/emjson_importer.py +0 -0
  207. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/importer/import_graphml.py +0 -0
  208. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/importer/mapped_xlsx_importer.py +0 -0
  209. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/importer/pyarchinit_importer.py +0 -0
  210. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/importer/qualia_importer.py +0 -0
  211. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/importer/rdf_importer.py +0 -0
  212. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/importer/source_text.py +0 -0
  213. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/importer/unified_xlsx_importer.py +0 -0
  214. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/importer/xlsx_importer.py +0 -0
  215. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/indices.py +0 -0
  216. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/mappings/__init__.py +0 -0
  217. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/mappings/emdb/generic_specialfind_mapping.json +0 -0
  218. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/mappings/emdb/site_properties_mapping.json +0 -0
  219. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/mappings/emdb/usm_mapping.json +0 -0
  220. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/mappings/generic/excel_to_graphml_mapping.json +0 -0
  221. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/mappings/pyarchinit/pyarchinit_us_mapping.json +0 -0
  222. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/mappings/registry.py +0 -0
  223. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/mappings/source_list/source_list_mapping.json +0 -0
  224. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/mappings/template_emdb_mapping.json +0 -0
  225. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/mappings/template_pyarchinit_mapping.json +0 -0
  226. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/merge/__init__.py +0 -0
  227. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/merge/graph_merger.py +0 -0
  228. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/multigraph/__init__.py +0 -0
  229. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/multigraph/multigraph.py +0 -0
  230. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/narrative/__init__.py +0 -0
  231. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/narrative/bake.py +0 -0
  232. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/narrative/generation.py +0 -0
  233. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/narrative/query.py +0 -0
  234. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/narrative/registry.py +0 -0
  235. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/narrative/site_story.py +0 -0
  236. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/annotation_region_node.py +0 -0
  237. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/author_node.py +0 -0
  238. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/base_node.py +0 -0
  239. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/combiner_node.py +0 -0
  240. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/document_node.py +0 -0
  241. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/dtc_acquisition_node.py +0 -0
  242. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/dtc_node.py +0 -0
  243. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/dtc_process_node.py +0 -0
  244. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/embargo_node.py +0 -0
  245. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/epoch_node.py +0 -0
  246. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/extractor_node.py +0 -0
  247. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/geo_position_node.py +0 -0
  248. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/graph_node.py +0 -0
  249. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/group_node.py +0 -0
  250. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/hdt_node.py +0 -0
  251. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/heritage_entity_node.py +0 -0
  252. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/license_node.py +0 -0
  253. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/narrative_node.py +0 -0
  254. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/paradata_node.py +0 -0
  255. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/project_node.py +0 -0
  256. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/property_node.py +0 -0
  257. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/representation_node.py +0 -0
  258. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/semantic_shape_node.py +0 -0
  259. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/stratigraphic_node.py +0 -0
  260. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/nodes/study_node.py +0 -0
  261. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/resolvers/__init__.py +0 -0
  262. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/resolvers/builtin_rules.py +0 -0
  263. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/resolvers/property_resolver.py +0 -0
  264. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/resources/__init__.py +0 -0
  265. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/resources/fs_backend.py +0 -0
  266. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/resources/minio_backend.py +0 -0
  267. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/resources/resolver.py +0 -0
  268. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/__init__.py +0 -0
  269. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/_db_handle.py +0 -0
  270. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/_legacy_paradata_svgs.py +0 -0
  271. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/_workspace.py +0 -0
  272. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/conflict_resolver.py +0 -0
  273. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/edge_registry.py +0 -0
  274. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/graph_ingestor.py +0 -0
  275. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/graph_projector.py +0 -0
  276. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/graphml_writer.py +0 -0
  277. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/group_projector.py +0 -0
  278. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/group_store.py +0 -0
  279. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/ingest_result.py +0 -0
  280. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/paradata_store.py +0 -0
  281. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/pyarchinit_pg_importer.py +0 -0
  282. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/rapporti.py +0 -0
  283. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/uuid7.py +0 -0
  284. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/vocab_provider_core.py +0 -0
  285. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/vocab_types.py +0 -0
  286. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/yed_classifier.py +0 -0
  287. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/yed_detector.py +0 -0
  288. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/yed_group_walker.py +0 -0
  289. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/yed_import_pipeline.py +0 -0
  290. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/yed_rapporti_policy.py +0 -0
  291. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/sync/yed_table_parser.py +0 -0
  292. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/templates/em_data_template.xlsx +0 -0
  293. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/templates/em_palette_template.graphml +0 -0
  294. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/temporal/__init__.py +0 -0
  295. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/temporal/inference_engine.py +0 -0
  296. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/tools/__init__.py +0 -0
  297. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/tools/consumer_drift.py +0 -0
  298. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/tools/datamodel_i18n.py +0 -0
  299. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/tools/sync_node_datamodel.py +0 -0
  300. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/tools/wheel_drift.py +0 -0
  301. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/transforms/__init__.py +0 -0
  302. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/transforms/aux_tracking.py +0 -0
  303. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/transforms/compact.py +0 -0
  304. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/transforms/materialize_continuity.py +0 -0
  305. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/utils/__init__.py +0 -0
  306. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/utils/utils.py +0 -0
  307. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy/utils/visual_layout.py +0 -0
  308. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy.egg-info/dependency_links.txt +0 -0
  309. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy.egg-info/requires.txt +0 -0
  310. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/src/s3dgraphy.egg-info/top_level.txt +0 -0
  311. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_acquisition.py +0 -0
  312. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_acquisition_fs.py +0 -0
  313. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_authority_projection.py +0 -0
  314. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_authority_resolver.py +0 -0
  315. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_canonical_document_rename.py +0 -0
  316. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_canvas_metadata_import.py +0 -0
  317. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_composite_node_name.py +0 -0
  318. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_connection_resolver.py +0 -0
  319. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_consumer_drift.py +0 -0
  320. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_container.py +0 -0
  321. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_contract.py +0 -0
  322. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_convert_command.py +0 -0
  323. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_crdt.py +0 -0
  324. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_datamodel_i18n.py +0 -0
  325. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_deterministic_ids.py +0 -0
  326. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_dissemination_tombstones.py +0 -0
  327. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_dtc_corpus.py +0 -0
  328. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_dtc_ingest.py +0 -0
  329. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_dtc_projection.py +0 -0
  330. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_dtc_residency.py +0 -0
  331. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_editorial.py +0 -0
  332. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_emjson_roundtrip.py +0 -0
  333. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_emjson_schema_version.py +0 -0
  334. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_epoch_undated_import.py +0 -0
  335. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_explicit_node_type_marker.py +0 -0
  336. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_filtered_import.py +0 -0
  337. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_fs_backend.py +0 -0
  338. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_functional_units.py +0 -0
  339. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_georeference_scene.py +0 -0
  340. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_graph_scope_migration.py +0 -0
  341. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_hdto_projection.py +0 -0
  342. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_header_key_aliases.py +0 -0
  343. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_iiif.py +0 -0
  344. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_importer_edge_hygiene.py +0 -0
  345. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_ipynb_exporter.py +0 -0
  346. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_latex_exporter.py +0 -0
  347. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_lossless_roundtrip.py +0 -0
  348. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_material_color.py +0 -0
  349. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_merge_conflicts.py +0 -0
  350. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_migrate_legacy_proxy.py +0 -0
  351. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_minio_backend.py +0 -0
  352. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_narrative_authorship.py +0 -0
  353. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_narrative_bake_docx.py +0 -0
  354. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_narrative_figures.py +0 -0
  355. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_narrative_generation.py +0 -0
  356. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_narrative_node.py +0 -0
  357. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_narrative_query.py +0 -0
  358. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_narrative_scaffolder.py +0 -0
  359. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_node_datamodel_registry.py +0 -0
  360. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_pg_importer.py +0 -0
  361. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_pyarchinit_tier2.py +0 -0
  362. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_rdf_roundtrip.py +0 -0
  363. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_recompute_warnings.py +0 -0
  364. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_reproject.py +0 -0
  365. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_resource_layer.py +0 -0
  366. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_shelf.py +0 -0
  367. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_shelf_facets.py +0 -0
  368. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_shelf_hatting.py +0 -0
  369. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_source_list_mapping.py +0 -0
  370. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_source_text.py +0 -0
  371. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_store_backed_geometry.py +0 -0
  372. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_stratiminer_api.py +0 -0
  373. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_study_metadata.py +0 -0
  374. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_ttl_roundtrip.py +0 -0
  375. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_wheel_drift.py +0 -0
  376. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev17}/tests/test_xlsx_importer_graph_init.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: s3dgraphy
3
- Version: 1.6.0.dev15
3
+ Version: 1.6.0.dev17
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>
@@ -274,7 +274,7 @@ The rule the other repos inherit, in one line: *if an endpoint needs to compute
274
274
  something about a graph, that something belongs here.* This library has no web
275
275
  framework and no socket on purpose — what it does can be proved on a table.
276
276
 
277
- **The whole map:** [`ARCHITECTURE-SYSTEM.md`](../em-server/docs/ARCHITECTURE-SYSTEM.md).
277
+ **The whole map:** [`ARCHITECTURE-SYSTEM.md`](../stratigraph-server/docs/ARCHITECTURE-SYSTEM.md).
278
278
 
279
279
  ---
280
280
 
@@ -198,7 +198,7 @@ The rule the other repos inherit, in one line: *if an endpoint needs to compute
198
198
  something about a graph, that something belongs here.* This library has no web
199
199
  framework and no socket on purpose — what it does can be proved on a table.
200
200
 
201
- **The whole map:** [`ARCHITECTURE-SYSTEM.md`](../em-server/docs/ARCHITECTURE-SYSTEM.md).
201
+ **The whole map:** [`ARCHITECTURE-SYSTEM.md`](../stratigraph-server/docs/ARCHITECTURE-SYSTEM.md).
202
202
 
203
203
  ---
204
204
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "s3dgraphy"
7
- version = "1.6.0.dev15"
7
+ version = "1.6.0.dev17"
8
8
  description = "3D Stratigraphic Graph Management Library for archaeological and heritage applications"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -0,0 +1,22 @@
1
+ {
2
+ "mapping_version": "0",
3
+ "source": "uri",
4
+ "tier": 0,
5
+ "_comment": "Per-source acquisition mapping for a BARE URI — the asset nobody downloads. Somebody pastes a link (a IIIF manifest, a Zenodo record, a Sketchfab model, a colleague's WebDAV folder) and what enters the shelf is the URI plus the protocol you reach it through: asset.access = {mode: subscribe|open, endpoint?}. NO BYTES ARE COPIED and no object store is touched — that is the whole point of this mapping, and the difference from fs.json, which acquires a local file. Build the raw record with s3dgraphy.acquisition.uri_record(uri, protocol=..., access=...), then apply_mapping('uri', record). The acquisition method is uri_reference: the URI is what was acquired, not the object, and calling it 'download' would record a retrieval that never happened.",
6
+ "descriptor_defaults": {
7
+ "schema_version": "0",
8
+ "source": {"repo_id": "uri", "capabilities": []},
9
+ "acquisition": {"agent": "emtools-shelf@0", "method": "uri_reference"},
10
+ "rights": {"license": "unknown"}
11
+ },
12
+ "field_map": {
13
+ "asset.ref": "uri",
14
+ "asset.name": "name",
15
+ "asset.media_type": "media_type",
16
+ "asset.access": "access",
17
+ "asset.protocol": "protocol",
18
+ "source.repo_id": "repo_id",
19
+ "source.record_id": "record_id",
20
+ "source.record_url": "record_url"
21
+ }
22
+ }
@@ -1081,6 +1081,22 @@
1081
1081
  "label": {
1082
1082
  "en": "Annotation Region"
1083
1083
  }
1084
+ },
1085
+ "GCPSetNode": {
1086
+ "description": {
1087
+ "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)."
1088
+ },
1089
+ "label": {
1090
+ "en": "Ground control points"
1091
+ }
1092
+ },
1093
+ "RegistrationTransformNode": {
1094
+ "description": {
1095
+ "en": "The 7-parameter similarity (rotation 3x3 row-major, translation [x,y,z], positive scale) that places a produced model, with data.rms and data.residuals — the error bar, stored beside the claim rather than in a log nobody keeps. data.crs is the frame the model lands IN; null means a site-local frame (mode 'local'), which is NOT the same sentence as an absent transform. Re-registration is a NEW node produced by a NEW crmdig:D7; the superseded one is never edited."
1096
+ },
1097
+ "label": {
1098
+ "en": "Registration transform"
1099
+ }
1084
1100
  }
1085
1101
  }
1086
1102
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "formal_language": "EM",
3
- "version": "1.6.14",
3
+ "version": "1.6.16",
4
4
  "_note_material_vs_qualia_color": [
5
5
  "DUE COSE DIVERSE CHE SI CHIAMANO ENTRAMBE color. Non confonderle: e gia successo.",
6
6
  "1) QUI, in node_styles.<tipo>.style.material.rgba_color — il COLORE DEL MATERIALE BLENDER del proxy 3D, in float LINEARI. UNA sola chiave: `rgba_color`. Fino a S8 il file ne usava due (`color` sui 13 tipi stratigrafici, `rgba_color` sugli altri) e get_material_color() ne leggeva una sola, restituendo None per 21 tipi su 38; ora sono unificate e la vecchia `color` e letta solo come tolleranza verso file scritti prima. Un tipo che non diventa mai una mesh NON ha material affatto (i contenitori di gruppo, e da S7 i dieci nodi che rendono per icona): per loro get_material_color() torna None, ed e corretto.",
@@ -9,6 +9,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.16": "Asset declarations made TRUE. Four styles named a 2D file that is not there — SE.png, TSU.svg, serUSD.svg and unknown.png (which never existed) — and GRAPH named two, so it drew no icon at all. icons.ts returns null for a missing file and the canvas quietly draws the shape, so all five failed silently. Now: graph.svg authored (neutral gray, three nodes and their edges, the meta-container), unknown points at the generic_node.svg that exists, the three stale halves name the file that is there. Enforced by tests/test_visual_assets.py; the 16 unmodelled .glb are REPORTED (there and in sync-datamodels.sh), not asserted \u2014 a placeholder that looks official is harder to notice than an absence.",
13
+ "1.6.15": "Georeferencing gets its symbol on the canvas: node_styles GCP (GCPSetNode, crosshair) and RGT (RegistrationTransformNode, axes + rotation arc), in the same #FF6600 reference family as GEO/SS/LINK, each with its own 2D icon. ADDITIVE. Also 1.6.14-era: dtc_kinds.process.photogrammetry. Note the limit of a per-TYPE rule: whether a transform is georeferenced or a site-local frame is an INSTANCE fact (data.crs) and is read from the has_gcp_set edge, not from the style.",
12
14
  "1.6.14": "BUGFIX-GLYPH follow-up (2026-08-05, E.D.): SE now renders its GLYPH in the scene (the new SE.svg, a stratigraphic-section box with a writable middle band) instead of a bare triangle, so a name can be written inside it. Added SE to 2d_render_glyph_types (aspect 1.331 from the SVG viewBox) and switched SE 2d_icon_prefer to vector (the raster SE.png is the stale stipple; the new symbol is the SVG). Dropped the interim shape_bbox=square. The shape:triangle stays declared for other consumers but the 2D scene draws the glyph. NOTE: verify the SVG carries a light background for dark-canvas legibility (like combiner.svg).",
13
15
  "1.6.13": "BUGFIX-GLYPH (2026-08-05): SE (StratigraphicEvent) gains shape_bbox=\"square\" on its style, like BR. Its triangle was drawn in the wide default 90x32 box, leaving the connect handle far from the glyph; a square bbox (side = min(w,h)) makes the triangle sit in a ~32x32 box with the handle adjacent, matching BR (diamond, square) and the glyph types. No shape_scale: unlike BR (a 0.7 marker) the SE triangle stays full-size. The SCENE representation of SE remains the triangle shape, not the raster icon (S10/POL5 decision unchanged).",
14
16
  "1.6.12": "EM3 - `2d_render_glyph_types` guadagna una tabella `aspect`: la larghezza del box di un nodo-glifo e la sua ALTEZZA per l'aspect del disegno, quindi tutti i glifi hanno la stessa altezza e differiscono solo in larghezza (regola E.D.). Default 1.0 = quadrato, che e cio che sono gli undici glifi DTC dopo l'autocrop di POL4 ed extractor/combiner per costruzione; l'unico davvero non quadrato oggi e `author` (0.875 = 448/512). I numeri sono STATICI e misurati una volta dai file: un aspect letto da naturalWidth a runtime farebbe dipendere il layout da quando un bitmap finisce di decodificare (box che salta, due run diversi sullo stesso documento). Il prezzo di un numero statico e che puo diventare stantio se un asset viene ridisegnato: da questa versione sync-datamodels.sh ri-misura ogni file vendorato e AVVISA se una dichiarazione sbaglia di oltre il 2%.",
@@ -224,7 +226,7 @@
224
226
  "serUSD": {
225
227
  "3d_file": "src/3D/serUSD.glb",
226
228
  "2d_file_rast": "src/2D/serUSD.png",
227
- "2d_file_vect": "src/2D/serUSD.svg",
229
+ "2d_file_vect": "src/2D/serUSD.png",
228
230
  "style": {
229
231
  "material": {
230
232
  "rgba_color": {
@@ -287,7 +289,7 @@
287
289
  "TSU": {
288
290
  "3d_file": "src/3D/TSU.glb",
289
291
  "2d_file_rast": "src/2D/TSU.png",
290
- "2d_file_vect": "src/2D/TSU.svg",
292
+ "2d_file_vect": "src/2D/TSU.png",
291
293
  "style": {
292
294
  "material": {
293
295
  "rgba_color": {
@@ -332,7 +334,7 @@
332
334
  "SE": {
333
335
  "_comment": "Stratigraphic Event: l'ATTO che crea, modifica o distrugge un'unita — un terremoto che fa cadere l'intonaco, una demolizione, l'inizio di un cantiere. Non e materia, e un processo, e per questo non appartiene a nessuna delle famiglie cromatiche della materia (rosso reale, verde/blu virtuale, arancio documentario, giallo special find, grigio negativo). Prende il TEAL della famiglia attivita: un ActivityNodeGroup e un fascio di atti e porta gia la linguetta ciano #CCFFFF, quindi il ciano e l'unico colore del linguaggio che dice gia 'e successo qualcosa' invece di 'qualcosa c'e'. Curato in S10 (2026-08-02): fino ad allora SE portava il segnaposto #BC0000 mai scelto, che per giunta contraddiceva il proprio bordo nero, e il node datamodel dichiarava il simbolo 'to be defined'. Il nero di BR e stato scartato di proposito: un material nero rende un proxy illeggibile in viewport, e i proxy SE si vedono (Heriverse li disegna fra i suoi stratigraphicTypes). POL5 (2026-08-04): l'ICONA e il raster (`2d_icon_prefer: raster`), come per NARR e per la stessa ragione — SE.svg e un tratteggio vettorializzato da 284 KB per un glifo che nessun renderer disegna oltre i 30 px. Il vettore resta dichiarato perche esiste; il flag dice quale dei due DISEGNARE. Il PNG a 256 px e reso DA quell'SVG, quindi i due non possono divergere. Nel grafo SE resta comunque un TRIANGOLO disegnato (shape), non l'icona: il raster serve a palette ed elenchi.",
334
336
  "3d_file": "src/3D/SE.glb",
335
- "2d_file_rast": "src/2D/SE.png",
337
+ "2d_file_rast": "src/2D/SE.svg",
336
338
  "2d_file_vect": "src/2D/SE.svg",
337
339
  "2d_icon_prefer": "vector",
338
340
  "style": {
@@ -490,7 +492,7 @@
490
492
  "GRAPH": {
491
493
  "_comment": "Top-level container node representing the EM graph itself. Anchor for graph-wide metadata propagation (default author, license, embargo, epoch). Rendered as a dashed rounded rectangle to read as a meta-container, neutral gray to stay visually distinct from stratigraphic and paradata nodes. Graphml palette prefix: 'G.'.",
492
494
  "file_3d": "src/3D/graph.glb",
493
- "2d_file_rast": "src/2D/graph.png",
495
+ "2d_file_rast": "src/2D/graph.svg",
494
496
  "2d_file_vect": "src/2D/graph.svg",
495
497
  "style": {
496
498
  "material": {
@@ -542,6 +544,32 @@
542
544
  },
543
545
  "label_position": "over"
544
546
  },
547
+ "GCP": {
548
+ "_comment": "Ground control points — the EVIDENCE behind a registration: which point was seen on which photograph at which pixel, and where it is in the world. The NODE IS THE SET, never the single GCP (data.points), which is why the icon shows one target among several marks. Same orange as the other reference/georeferencing nodes (GEO, SS, LINK) because it is that family; the crosshair shape distinguishes measurement-of-a-place from position-of-a-site. Graphml palette prefix: 'GC.'.",
549
+ "file_3d": "src/3D/gcp_set.glb",
550
+ "2d_file_rast": "src/2D/gcp_set.svg",
551
+ "2d_file_vect": "src/2D/gcp_set.svg",
552
+ "style": {
553
+ "border_color": "#FF6600",
554
+ "fill_color": "#FFFFFF",
555
+ "border_style": "solid",
556
+ "shape": "crosshair"
557
+ },
558
+ "label_position": "over"
559
+ },
560
+ "RGT": {
561
+ "_comment": "Registration transform — the SOLUTION: the 7-parameter similarity that places a produced model, with its RMS. Drawn as axes plus a rotation arc. NOTE, and it is a limit of a per-TYPE rule: whether a given transform is georeferenced (data.crs set) or a site-local frame (crs null) is an INSTANCE fact and cannot be encoded here — a reader tells the two modes apart by the presence of the has_gcp_set edge, which is why that edge exists. Graphml palette prefix: 'RG.'.",
562
+ "file_3d": "src/3D/registration_transform.glb",
563
+ "2d_file_rast": "src/2D/registration_transform.svg",
564
+ "2d_file_vect": "src/2D/registration_transform.svg",
565
+ "style": {
566
+ "border_color": "#FF6600",
567
+ "fill_color": "#FFFFFF",
568
+ "border_style": "solid",
569
+ "shape": "axes"
570
+ },
571
+ "label_position": "over"
572
+ },
545
573
  "GEO": {
546
574
  "file_3d": "src/3D/geo.glb",
547
575
  "2d_file_rast": "src/2D/geo_position.svg",
@@ -628,7 +656,7 @@
628
656
  },
629
657
  "unknown": {
630
658
  "file_3d": "src/3D/unknown.glb",
631
- "file_2d": "src/2D/unknown.png",
659
+ "file_2d": "src/2D/generic_node.svg",
632
660
  "style": {
633
661
  "border_color": "#FF0000",
634
662
  "fill_color": "#FFFFFF",
@@ -835,12 +863,18 @@
835
863
  "topographic": { "label": "Topographic survey", "glyph": "01_topographicnetwork", "description": "Total-station / topographic-network acquisition." }
836
864
  },
837
865
  "process": {
866
+ "photogrammetry": {
867
+ "label": "Photogrammetry",
868
+ "glyph": "03_mesh",
869
+ "description": "Structure-from-motion reconstruction: a cluster of photographs becomes a 3D model. A specific kind of transformation, named because what a reader needs to know about a mesh is which family of process made it \u2014 and because the placement (RegistrationTransform) only means something for this one."
870
+ },
838
871
  "transformation": { "label": "Transformation", "glyph": "00_transformation", "description": "A processing/transformation step turning inputs into produced digital objects." }
839
872
  },
840
873
  "acquisition": {
841
874
  "download": { "label": "Download", "glyph": null, "description": "Retrieval of a digital object from a remote (opaque, Tier-0) repository." },
842
875
  "ingest": { "label": "Ingest", "glyph": null, "description": "Generic ingestion of a digital object into the study." },
843
- "local_import": { "label": "Local import", "glyph": null, "description": "Acquisition from the local file system (project-folder search) — the local analog of remote acquisition." }
876
+ "local_import": { "label": "Local import", "glyph": null, "description": "Acquisition from the local file system (project-folder search) — the local analog of remote acquisition." },
877
+ "uri_reference": { "label": "URI reference", "glyph": null, "description": "The URI was acquired, not the object: the resource stays where it is and is reached through its own access protocol (an open link, or one you subscribe to). No bytes were copied — calling this a download would record a retrieval that never happened." }
844
878
  },
845
879
  "output": {
846
880
  "pointcloud": { "label": "Point cloud", "glyph": "02_pointcloud", "description": "Produced point cloud." },
@@ -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.3",
3
+ "s3Dgraphy_data_model_version": "1.6.4",
4
4
  "node_types": {
5
5
  "ActivityNodeGroup": {
6
6
  "parent": "GroupNode",
@@ -77,6 +77,11 @@
77
77
  "node_type": "FunctionalUnitNodeGroup",
78
78
  "description": "Typed aggregation of the stratigraphic units that make up one"
79
79
  },
80
+ "GCPSetNode": {
81
+ "parent": "Node",
82
+ "node_type": "gcp_set",
83
+ "description": "The ground control points a registration was (or will be) solved from."
84
+ },
80
85
  "GeoPositionNode": {
81
86
  "parent": "Node",
82
87
  "node_type": "geo_position",
@@ -157,6 +162,11 @@
157
162
  "node_type": "property",
158
163
  "description": "Nodo che rappresenta una proprietà associata a un altro nodo."
159
164
  },
165
+ "RegistrationTransformNode": {
166
+ "parent": "Node",
167
+ "node_type": "registration_transform",
168
+ "description": "The similarity that places a model — 7 parameters and what they cost."
169
+ },
160
170
  "RepresentationModelDocNode": {
161
171
  "parent": "RepresentationNode",
162
172
  "node_type": "representation_model_doc",
@@ -1,5 +1,5 @@
1
1
  {
2
- "s3Dgraphy_connections_model_version": "1.6.11",
2
+ "s3Dgraphy_connections_model_version": "1.6.13",
3
3
  "description": "s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.11 (batch ingestion, 2026-08-17): two widenings for bulk assets. has_author.source DTCProcessNode -> DTCNode, so an ACQUISITION event (D12) can carry the author of a whole lot; dtc_had_input.target += DTCNode, so a DECLARED derivation can name a whole acquisition as its input (one input, not 500 edges) — that case projects as prov:wasInformedBy, not prov:used/L10, which range over digital objects and would be wrong for an event. v1.6.8 (MIG1-A): graph-scope rights metadata become first-class nodes (DP-65). is_in_paradata_nodegroup.source += AuthorNode/LicenseNode/EmbargoNode and has_paradata_nodegroup.source += GraphNode, so the graph-self node (GraphNode) owns a graph-scope ParadataNodeGroup whose members are the AuthorNode/LicenseNode/EmbargoNode (+ the DP-65 GeoPositionNode shift), replacing the legacy graph.data['author_name'/'license'/'embargo'] fields. The Data Funnel canvas tier now reads these member nodes (one reader per scope); a one-shot load-time migration materialises the legacy fields into nodes. v1.6.7 (BUGFIX-CONN3): closes the two silent follow-ups of CONN2. has_documentation.source gains PropertyNode (judicious widening): the honest reading of a legacy yEd dashed PropertyNode→Document connector is P70i_is_documented_in ('the property is documented in this source'), NOT has_visual_reference (which CONN2 moved to PropertyNode→ResourceNode). The import heuristic (import_graphml.enhance_edge_type) now routes PropertyNode→Document to has_documentation and the rarer CombinerNode/ParadataNode→Document to generic_connection+warning (a combiner aggregates extractors and cites no document; the DTC chain is NOT synthesised at import). Shelf: hat_as_document no longer offers has_visual_reference (a Document attaches via has_documentation/extracted_from); a new hat_as_visual_resource attaches a ResourceNode image via has_visual_reference from a PropertyNode — the correct home after CONN2. No illegal edge is produced or expected. v1.6.6 (BUGFIX-CONN2): closes the two open domain questions on has_visual_reference (E.D. 2026-08-05). SOURCE narrowed to exactly [PropertyNode]: only a property (an asserted quale) is what a visual reference illustrates; the generic ParadataNode entry is dropped, which — because ExtractorNode, CombinerNode and DocumentNode are all subclasses of ParadataNode — now excludes them by class hierarchy (a PropertyNode is neither a sibling nor a parent of the others). The extractor/combiner denied_edges from v1.6.5 are therefore REDUNDANT for this edge but are KEPT as a defensive guard (they still bite if the source is ever broadened back to ParadataNode). TARGET changed from [DocumentNode] to [ResourceNode]: the oddity was that a visual reference pointed at a source-document (E31) rather than at a visual resource. It now points at the resource-layer image node (ResourceNode = E73 Information Object / ExternalResourceReference — the same P67 hinge RM/RMDoc use via has_linked_resource), keeping DocumentNode = fonte. CIDOC stays P138i_has_representation with the target co-typed E36 Visual Item: E36 is a subclass of E73, so co-typing a ResourceNode as E36 is range-consistent (it was NOT, strictly, for an E31 Document). FOLLOW-UPS flagged for E.D. (see end-of report): (a) import_graphml.enhance_edge_type still hardcodes PropertyNode/Combiner/Paradata→DocumentNode ⇒ has_visual_reference (legacy yEd heuristic, now produces an edge this datamodel refuses) — needs a domain decision on what legacy paradata→document edges become; (b) shelf.hat_as_document lists has_visual_reference among the Document-attach edges — it can no longer validate (target is ResourceNode), so a paradata attach silently no longer attaches; a hat_as_visual_resource(ResourceNode)+has_visual_reference path is the proper home. v1.6.5 (BUGFIX-CONN): has_visual_reference is no longer offered FROM an ExtractorNode or a CombinerNode. An extractor toward a document expresses ONLY extracted_from (its relation to the source is the extraction, not an illustration); a combiner aggregates extractors and illustrates nothing. Because ExtractorNode, CombinerNode and PropertyNode are all subclasses of ParadataNode, and has_visual_reference.source lists ParadataNode, simply dropping the two subtypes from the source list would not exclude them (they still match via the parent class). So this is expressed with node_type_restrictions (keyed by RUNTIME node_type, like USNt) using a new denied_edges blacklist (the mirror of allowed_edges): extractor/combiner deny has_visual_reference. PropertyNode and any other legitimate ParadataNode source keep it unchanged. OPEN domain question for E.D.: which paradata node-types may legitimately have a visual reference (today source = PropertyNode/ExtractorNode/CombinerNode/ParadataNode) — extractor/combiner removed; the rest left as-is, not invented. v1.6.1: has_paradata_nodegroup source extended to include EpochNode — an epoch can now own a ParadataNodeGroup holding its temporal-definition properties (e.g. absolute_time_start/end as PropertyNodes with paradata provenance), mirroring how a StratigraphicNode carries its paradata group. v1.6.0 (paired with node datamodel v1.6.0) introduces: bug fix on is_in_paradata_nodegroup (typo 'ProperrtyNOde' → 'PropertyNode'); semantic fix on has_documentation (P104_is_subject_to → P70i_is_documented_in — P104 means 'subject to a legal right', not 'has documentation'); deprecation of has_timebranch as duplicate of is_in_timebranch (the latter is the canonical one — used by import_graphml.py and graphml_patcher.py; the former exists only in config JSON); component list aligned with node datamodel (HDT-O, PROV-O added). HDT-O containment properties (hdto:contains_HDT, hdto:contains_SU, hdto:isPrimary) and physical-relation discriminator subproperties (em:abuts, em:cuts, em:fills, em:overlies, em:bonded_to, em:equals as rdfs:subPropertyOf crmarchaeo:AP11_has_physical_relation) to be added in v1.6.1. v1.5.3 introduced canonical/reverse directionality with verb-based labels for clear socket identification in node editors. v1.5.4 added 'has_visual_reference' edge type. v1.5.5 added 'is_in_location' edge type with context-sensitive CIDOC mapping (P53 for node→location, P89 for the recursive location→location hierarchy) and an optional 'is_primary' boolean attribute (s3d:isPrimary, proposed). v1.6.3: added node_type_restrictions — a per-node-type narrowing of the class-level edge rules (POL5): USN (the NEUTRAL stratigraphic unit, a risparmio) takes is_after/is_before and nothing else, because a void cannot cut, fill, abut or bond. v1.6.4 (POL6): the same restriction, moved to USNt — the tokens went back to their conventional meanings, USN = US negativa (all relations, it is a unit of the sequence) and USNt = US neutra (sequence only).",
4
4
  "components": [
5
5
  "CIDOC-CRM",
@@ -1311,6 +1311,7 @@
1311
1311
  },
1312
1312
  "dtc_had_input": {
1313
1313
  "name": "dtc_had_input",
1314
+ "dtc_role": "chain",
1314
1315
  "label": "DTC process had input",
1315
1316
  "description": "DTC chain: a processing step (DTCProcess) consumed an input RESOURCE — a raw acquisition (photo/laser scan/…) = the ResourceNode (E73/D1). ECHOES DTC substrate profile. Dual projection CRMdig + PROV-O.",
1316
1317
  "reverse": {
@@ -1337,6 +1338,7 @@
1337
1338
  },
1338
1339
  "dtc_had_output": {
1339
1340
  "name": "dtc_had_output",
1341
+ "dtc_role": "chain",
1340
1342
  "label": "DTC process had output",
1341
1343
  "description": "DTC chain: a processing step (DTCProcess) produced a RESOURCE (a file: mesh/orthophoto/table…) — the ResourceNode (E73/D1), which is the SHARED HINGE that a RepresentationModel and/or a Document may reference. The produced ResourceNode carries data.dtc_kind + resource_type. ECHOES DTC substrate profile. Dual projection CRMdig + PROV-O.",
1342
1344
  "reverse": {
@@ -1362,6 +1364,7 @@
1362
1364
  },
1363
1365
  "dtc_derived_from": {
1364
1366
  "name": "dtc_derived_from",
1367
+ "dtc_role": "chain",
1365
1368
  "label": "DTC output derived from input",
1366
1369
  "description": "DTC chain: the produced RESOURCE (ResourceNode) was derived from an acquisition (DTCInput) — the direct provenance shortcut alongside the process. ECHOES DTC substrate profile. Dual projection CRMdig + PROV-O.",
1367
1370
  "reverse": {
@@ -1384,6 +1387,55 @@
1384
1387
  ]
1385
1388
  }
1386
1389
  },
1390
+ "has_registration_transform": {
1391
+ "name": "has_registration_transform",
1392
+ "label": "Placed by",
1393
+ "description": "A produced RESOURCE (a reconstructed model) is placed in space by a RegistrationTransform — the 7-parameter similarity solved for it. The absence of this edge is a statement too: a model nobody placed. Re-registration adds a NEW transform node and a new edge; the superseded one stays, because moving a model is provenance, not an edit.",
1394
+ "reverse": {
1395
+ "name": "places",
1396
+ "label": "Places the model"
1397
+ },
1398
+ "mapping": {
1399
+ "cidoc": "P67i_is_referred_to_by",
1400
+ "cidoc_extension": "CIDOC-CRM",
1401
+ "extension_mapping": null,
1402
+ "extension_name": null,
1403
+ "rationale": "The transform is an information object ABOUT the model, so the CRM property runs transform -P67_refers_to-> model. The EM-native edge reads from the model (the direction every consumer traverses: 'where do I put this file?'), so the projection is the inverse P67i. No PROV-O dual: PROV has nothing to say about spatial placement, and inventing one would be noise."
1404
+ },
1405
+ "allowed_connections": {
1406
+ "_note": "Source is the ResourceNode (E73/D1), the shared hinge a RepresentationModel or a Document may reference — the same target the DTC output edge uses, so the model that was produced and the model that was placed are one node.",
1407
+ "source": [
1408
+ "ResourceNode"
1409
+ ],
1410
+ "target": [
1411
+ "RegistrationTransformNode"
1412
+ ]
1413
+ }
1414
+ },
1415
+ "has_gcp_set": {
1416
+ "name": "has_gcp_set",
1417
+ "label": "Solved from control points",
1418
+ "description": "A RegistrationTransform was solved from a GCPSet — the evidence behind the placement. Present ONLY in absolute mode: a transform with no such edge is a site-local frame, and the missing edge is what tells a reader so without having to trust a flag.",
1419
+ "reverse": {
1420
+ "name": "controlled_registration",
1421
+ "label": "Controlled this registration"
1422
+ },
1423
+ "mapping": {
1424
+ "cidoc": "L21_used_as_derivation_source",
1425
+ "cidoc_extension": "CRMdig",
1426
+ "extension_mapping": "prov:wasDerivedFrom",
1427
+ "extension_name": "PROV-O",
1428
+ "rationale": "The same argument dtc_derived_from already makes, applied one layer up: CRM routes derivation through the event, and the event (crmdig:D7) IS in the graph — this edge is the direct shortcut between the derived object (the transform) and its source (the control set), in the same direction, so it can be read without naming the process."
1429
+ },
1430
+ "allowed_connections": {
1431
+ "source": [
1432
+ "RegistrationTransformNode"
1433
+ ],
1434
+ "target": [
1435
+ "GCPSetNode"
1436
+ ]
1437
+ }
1438
+ },
1387
1439
  "generic_connection": {
1388
1440
  "name": "generic_connection",
1389
1441
  "label": "Generic connection",
@@ -1404,5 +1456,6 @@
1404
1456
  ]
1405
1457
  }
1406
1458
  }
1407
- }
1459
+ },
1460
+ "_dtc_role_note": "dtc_role marks an edge as part of the DTC CHAIN — the three edges a provenance walk may traverse. It exists because the classification used to be written twice: by name on the node (s3dgraphy.dtc) and by PREFIX in the client (startsWith('dtc_')). The prefix presumed every future dtc_* edge would be chain, so a dtc_* edge that is CONTEXT — a dtc_annotated_by, say — would have been a corridor on the client and not on the node: two rules with one name. Now the datamodel says it once and both sides read it. An edge WITHOUT dtc_role is context by construction: adding one is a JSON entry, and it is born non-traversable."
1408
1461
  }
@@ -1,6 +1,6 @@
1
1
  {
2
- "s3Dgraphy_data_model_version": "1.6.3",
3
- "description": "s3Dgraphy nodes datamodel including node types with CIDOC-CRM mappings. 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.4",
3
+ "description": "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",
@@ -1572,6 +1572,56 @@
1572
1572
  }
1573
1573
  }
1574
1574
  },
1575
+ "georeferencing_nodes": {
1576
+ "_section_note": "GEOREFERENCING — how a produced model got INTO the world, as two distinct things that fail differently: GCPSetNode = the CONTROL (evidence: which point was seen on which photograph at which pixel, and where it is in the world, in which CRS, with what uncertainty) — it can exist before any model and survives being reused by a second reconstruction; RegistrationTransformNode = the SOLUTION (the 7-parameter similarity the bundle adjustment settled on, with its RMS/residuals) — it is what the model is placed by and what gets REPLACED when better coordinates arrive, the old one staying in the graph because moving a model is provenance. The TWO MODES of the photogrammetry design are the SHAPE of the graph, not a flag: absolute = a transform with a crs that has_gcp_set points at; local = a transform with a scale and crs=null (scaled and oriented in a site frame, honestly NOT georeferenced); no transform at all = nobody placed it. Distinct from GeoPositionNode (where a STUDY/site is) and from SemanticShapeNode (3D geometry of a unit): this section is about the REGISTRATION ACT's evidence and result. Attached to the produced Resource, so the DTC genesis (crmdig:D7, dtc_had_input/dtc_had_output) is not duplicated here. Gated OUT of the stratigrapher palette, like dtc_nodes and hdto_nodes. Added 2026-08-29 with the photogrammetry processing connector; ADDITIVE — no existing family changed.",
1577
+ "GCPSetNode": {
1578
+ "class": "GCPSetNode",
1579
+ "parent": "Node",
1580
+ "abbreviation": "GCP",
1581
+ "label": "Ground control points",
1582
+ "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).",
1583
+ "s3Dgraphy_file": "georeferencing_node.py",
1584
+ "mapping": {
1585
+ "cidoc": "crm:E73_Information_Object",
1586
+ "cidoc_s3d": null,
1587
+ "alternative": "prov:Entity",
1588
+ "rationale": "A control set is an INFORMATION OBJECT: a documented list of measured places and where each was observed. It is not itself a Place (crm:E53) nor a Measurement (crmsci:S21) — it CARRIES both. The individual observations stay payload literals in v1 and the explicit refinement is declared, not implied: each point would explode into an crmsci:S21_Measurement of an crm:E53_Place observed on a crmdig:D1 photograph. Doing that now would create three nodes per control point in a graph nobody yet reads that way."
1589
+ },
1590
+ "em_extension": {
1591
+ "uri": "em:GCPSet",
1592
+ "rdf_type": "owl:Class",
1593
+ "subclass_of": [
1594
+ "crm:E73_Information_Object"
1595
+ ],
1596
+ "extension_status": "proposed",
1597
+ "rationale": "Named in the EM extension because 'the set of control points behind this registration' is the unit archaeologists actually hand each other, and CIDOC has no class for it above E73."
1598
+ }
1599
+ },
1600
+ "RegistrationTransformNode": {
1601
+ "class": "RegistrationTransformNode",
1602
+ "parent": "Node",
1603
+ "abbreviation": "RGT",
1604
+ "label": "Registration transform",
1605
+ "description": "The 7-parameter similarity (rotation 3x3 row-major, translation [x,y,z], positive scale) that places a produced model, with data.rms and data.residuals — the error bar, stored beside the claim rather than in a log nobody keeps. data.crs is the frame the model lands IN; null means a site-local frame (mode 'local'), which is NOT the same sentence as an absent transform. Re-registration is a NEW node produced by a NEW crmdig:D7; the superseded one is never edited.",
1606
+ "s3Dgraphy_file": "georeferencing_node.py",
1607
+ "mapping": {
1608
+ "cidoc": "crm:E73_Information_Object",
1609
+ "cidoc_s3d": null,
1610
+ "alternative": "prov:Entity",
1611
+ "rationale": "The transform is an information object that DESCRIBES a mapping between two spatial reference systems (crmgeo:SP4_Spatial_Coordinate_Reference_System). CIDOC/CRMgeo models coordinate systems and geometric expressions but has no class for the parameterised map between two of them, so E73 is the honest superclass and the specificity lives in em:RegistrationTransform. It is deliberately NOT an event: the ACT of registering is the crmdig:D7 that produced this object."
1612
+ },
1613
+ "em_extension": {
1614
+ "uri": "em:RegistrationTransform",
1615
+ "rdf_type": "owl:Class",
1616
+ "subclass_of": [
1617
+ "crm:E73_Information_Object"
1618
+ ],
1619
+ "extension_status": "proposed",
1620
+ "relates": "two crmgeo:SP4_Spatial_Coordinate_Reference_System",
1621
+ "rationale": "Proposed rather than asserted: the natural CRM-native alternative is to leave the parameters as literals on the D7 event, which loses the ability to point at 'the placement' as a thing that gets superseded — and superseding it is the whole reason mode (b) exists."
1622
+ }
1623
+ }
1624
+ },
1575
1625
  "narrative_nodes": {
1576
1626
  "_section_note": "EM Narrative (DP-79, draft). A narrative is the story told OVER a graph: chapters anchored to the graph's lanes (epochs, activities), each carrying prose and embeds. It is a first-class node so it can be queried ('which narratives cite this US', 'which rest on a withdrawn source'), versioned and carried through the DTC. Chapters and blocks are NOT nodes: they are ordered structures inside node.data — EM has no ordered-edge primitive, and a chapter has no existence apart from its narrative. An embed holds only the stable id of the resource it shows, never a copy of it, so a narrative always says what the graph currently says.",
1577
1627
  "NarrativeNode": {
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!-- EM · GCPSetNode. A survey target seen from above: the crosshair is one control point, the three small marks around it are the SET — the node is the set, never the single GCP. Drawn for Extended Matrix, same licence as the datamodel. -->
2
+ <circle cx="256" cy="248" r="96" fill="#FFFFFF" stroke="#FF6600" stroke-width="26"/>
3
+ <circle cx="256" cy="248" r="26" fill="#FF6600"/>
4
+ <path fill="#FF6600" d="M242 96h28v72h-28zM242 328h28v72h-28zM104 234h72v28h-72zM336 234h72v28h-72z"/>
5
+ <circle cx="72" cy="432" r="26" fill="#FF6600"/>
6
+ <circle cx="256" cy="464" r="26" fill="#FF6600"/>
7
+ <circle cx="440" cy="432" r="26" fill="#FF6600"/>
8
+ </svg>
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!-- EM · GraphNode. The graph itself, as a container: three nodes and the edges between them. Neutral gray (#333333, the GRAPH style's own colour) so it stays visually distinct from stratigraphic and paradata nodes — it is the meta-container, not a unit. Drawn for Extended Matrix, same licence as the datamodel. -->
2
+ <path fill="none" stroke="#333333" stroke-width="26" stroke-linecap="round" d="M256 132v120M256 252 148 372M256 252l108 120"/>
3
+ <circle cx="256" cy="108" r="60" fill="#FFFFFF" stroke="#333333" stroke-width="26"/>
4
+ <circle cx="124" cy="396" r="60" fill="#FFFFFF" stroke="#333333" stroke-width="26"/>
5
+ <circle cx="388" cy="396" r="60" fill="#FFFFFF" stroke="#333333" stroke-width="26"/>
6
+ </svg>
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!-- EM · RegistrationTransformNode. Three axes and the arc that turns them: the 7-parameter similarity that places a model. The arc is the rotation, the axes the frame it lands in. Drawn for Extended Matrix, same licence as the datamodel. -->
2
+ <path fill="none" stroke="#FF6600" stroke-width="28" stroke-linecap="round" d="M152 360V152M152 360h208"/>
3
+ <path fill="#FF6600" d="M152 92l40 72h-80zM420 360l-72 40v-80z"/>
4
+ <path fill="none" stroke="#FF6600" stroke-width="28" stroke-linecap="round" d="M152 360 262 250"/>
5
+ <path fill="none" stroke="#FF6600" stroke-width="22" stroke-linecap="round" stroke-dasharray="34 30" d="M340 168a136 136 0 0 1 44 100"/>
6
+ </svg>
@@ -1,4 +1,4 @@
1
- __version__ = "1.6.0.dev15"
1
+ __version__ = "1.6.0.dev17"
2
2
  __datamodel_version__ = "1.5.5" # s3Dgraphy connections datamodel version
3
3
 
4
4
  # s3Dgraphy/__init__.py
@@ -16,7 +16,8 @@ from .descriptor import (
16
16
  AcquisitionError,
17
17
  schema,
18
18
  )
19
- from .mapping import apply_mapping, available_mappings, fs_record, load_mapping
19
+ from .mapping import (ACCESS_MODES, apply_mapping, available_mappings,
20
+ fs_record, load_mapping, uri_record)
20
21
  from .acquire import acquire_from_descriptor
21
22
 
22
23
  __all__ = [
@@ -28,5 +29,8 @@ __all__ = [
28
29
  "apply_mapping",
29
30
  "available_mappings",
30
31
  "fs_record",
32
+ # the asset nobody downloads: a URI plus how you reach it
33
+ "uri_record",
34
+ "ACCESS_MODES",
31
35
  "acquire_from_descriptor",
32
36
  ]
@@ -92,9 +92,19 @@ def acquire_from_descriptor(descriptor: Any, shelf: Any = None
92
92
  name = desc.asset.get("name") or (ref.rstrip("/").rsplit("/", 1)[-1] if ref else rid[:8])
93
93
  origin = desc.origin()
94
94
 
95
- # 1) Resource on the shelf (reuse-not-duplicate; origin preserved)
95
+ # 1) Resource on the shelf (reuse-not-duplicate; origin preserved).
96
+ #
97
+ # `media_type` / `size` / `access` are written only when the descriptor
98
+ # carried them — the fs mapping knows a file's size, a bare URI does not, and
99
+ # a resource that never said its size must not start claiming zero. They are
100
+ # here because they are what the shelf TABLE shows: without them the column
101
+ # would be empty for every entry and a reader would think the shelf lost it.
96
102
  entry = add_to_shelf(shelf, ref, resource_id=rid, name=name,
97
- resource_type=_resource_type(desc), origin=origin)
103
+ resource_type=_resource_type(desc), origin=origin,
104
+ media_type=desc.asset.get("media_type") or None,
105
+ size=desc.asset.get("size") or None,
106
+ access=origin.get("access"),
107
+ role=desc.asset.get("role") or None)
98
108
 
99
109
  # 2) acquisition event — a distinct DTC event type (crmdig:D12), literals for
100
110
  # the opaque upstream source (Tier 0: no genesis sub-graph)
@@ -97,9 +97,27 @@ class AcquisitionDescriptor:
97
97
 
98
98
  def origin(self) -> Dict[str, Any]:
99
99
  """The capability/origin envelope carried onto the shelf entry (for
100
- downstream tier badges): repo + capabilities + scope."""
101
- return {
100
+ downstream tier badges): repo + capabilities + scope, and — when the
101
+ asset says so — how it is REACHED.
102
+
103
+ ``access`` rides in the origin rather than in a channel of its own
104
+ because that is exactly what it is: a fact about where this resource came
105
+ from and how to get back to it. A URI-only entry has no bytes here, so
106
+ its origin is the only place that can answer "and how do I open it?".
107
+ """
108
+ out: Dict[str, Any] = {
102
109
  "repo": self.source.get("repo_id"),
103
110
  "capabilities": self.capabilities(),
104
111
  "scope": (self.payload_graph or {}).get("scope"), # None in Tier 0
105
112
  }
113
+ access = self.asset.get("access")
114
+ if access:
115
+ out["access"] = (dict(access) if isinstance(access, dict)
116
+ else {"mode": str(access)})
117
+ if self.asset.get("protocol"):
118
+ out["protocol"] = self.asset.get("protocol")
119
+ return out
120
+
121
+ def access(self) -> Optional[Dict[str, Any]]:
122
+ """``{mode, endpoint?}`` when the asset declared how it is reached."""
123
+ return self.origin().get("access")
@@ -25,7 +25,7 @@ from __future__ import annotations
25
25
  import copy
26
26
  import json
27
27
  from pathlib import Path
28
- from typing import Any, Dict
28
+ from typing import Any, Dict, Optional
29
29
 
30
30
  _MAPPINGS_DIR = (Path(__file__).resolve().parent.parent
31
31
  / "JSON_config" / "acquisition_mappings")
@@ -83,6 +83,77 @@ _FS_MEDIA_TYPES = {
83
83
  }
84
84
 
85
85
 
86
+ #: How you get to a resource you did not copy. TWO modes, because the practical
87
+ #: question a colleague asks is binary: can I click this, or do I have to ask
88
+ #: for access?
89
+ #:
90
+ #: * ``open`` — the link is freely reachable;
91
+ #: * ``subscribe`` — you subscribe/register/are granted access first (an
92
+ #: institutional repository, a shared drive, a IIIF endpoint behind a login).
93
+ #:
94
+ #: This is deliberately NOT a rights statement: `rights.license` says what you
95
+ #: may do with the object, `access.mode` says whether you can reach it at all.
96
+ #: A CC-BY image behind a login is both, and conflating them would make one of
97
+ #: the two unaskable.
98
+ ACCESS_MODES = ("open", "subscribe")
99
+
100
+
101
+ def uri_record(uri: str, *, protocol: Optional[str] = None,
102
+ access: Optional[Any] = None, name: Optional[str] = None,
103
+ media_type: Optional[str] = None,
104
+ repo_id: Optional[str] = None) -> Dict[str, Any]:
105
+ """Build a raw record for the ``uri`` mapping from a bare **URI**.
106
+
107
+ The asset nobody downloads: somebody pastes a link and what enters the shelf
108
+ is the URI plus the protocol it is reached through. **No bytes are copied**
109
+ and no object store is touched — that is the point, and the difference from
110
+ :func:`fs_record`.
111
+
112
+ ``access`` is ``{"mode": "open"|"subscribe", "endpoint": …}``, or just the
113
+ mode as a string (the common case). ``record_id`` is the URI itself, so
114
+ re-acquiring the same link lands on the same stable Resource id and the shelf
115
+ does not grow a second entry — the idempotence the fs record gets from the
116
+ absolute path.
117
+
118
+ Returns ``{uri, name, protocol, media_type, access, repo_id, record_id,
119
+ record_url}``.
120
+ """
121
+ import mimetypes
122
+ from urllib.parse import urlsplit
123
+
124
+ text = (uri or "").strip()
125
+ if not text:
126
+ raise ValueError("a URI-only entry needs a URI")
127
+ parts = urlsplit(text)
128
+ scheme = (protocol or parts.scheme or "").lower() or "http"
129
+ if isinstance(access, str):
130
+ access = {"mode": access}
131
+ access = dict(access or {})
132
+ mode = str(access.get("mode") or "open").lower()
133
+ if mode not in ACCESS_MODES:
134
+ raise ValueError(f"access.mode must be one of {list(ACCESS_MODES)}, "
135
+ f"got {access.get('mode')!r}")
136
+ access["mode"] = mode
137
+ tail = parts.path.rstrip("/").rsplit("/", 1)[-1]
138
+ guessed = media_type or (_FS_MEDIA_TYPES.get(tail.rsplit(".", 1)[-1].lower())
139
+ if "." in tail else None) \
140
+ or (mimetypes.guess_type(tail)[0] if "." in tail else None) or ""
141
+ return {
142
+ "uri": text,
143
+ # The host is the honest name when the tail is not a filename: a record
144
+ # page ends in an id, and "12345" is not what anybody is looking for.
145
+ "name": name or (tail if "." in tail else (parts.netloc or text)),
146
+ "protocol": scheme,
147
+ "media_type": guessed,
148
+ "access": access,
149
+ # …and the repo is the HOST unless told otherwise, so two links from the
150
+ # same institution group together without anybody configuring a repo.
151
+ "repo_id": repo_id or (parts.netloc or "uri"),
152
+ "record_id": text,
153
+ "record_url": text,
154
+ }
155
+
156
+
86
157
  def fs_record(path: str) -> Dict[str, Any]:
87
158
  """Build a raw FILE-SYSTEM record for the ``fs`` mapping from a local ``path``:
88
159
  ``{filename, path, record_id, record_url, size, ext, media_type}``. The local