s3dgraphy 1.6.0.dev25__tar.gz → 1.6.0.dev26__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 (485) hide show
  1. {s3dgraphy-1.6.0.dev25/src/s3dgraphy.egg-info → s3dgraphy-1.6.0.dev26}/PKG-INFO +2 -2
  2. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/pyproject.toml +2 -2
  3. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/datamodel_translations.json +99 -0
  4. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/em.ttl +51 -3
  5. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/em_qualia_types.json +9 -3
  6. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/em_visual_rules.json +13 -1
  7. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/node_registry.generated.json +6 -1
  8. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json +57 -7
  9. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/s3Dgraphy_node_datamodel.json +37 -6
  10. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/__init__.py +1 -1
  11. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/ai_validation.py +104 -0
  12. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/api.py +112 -3
  13. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/crdt.py +30 -0
  14. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/rdf_exporter.py +291 -7
  15. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/importer/mapped_xlsx_importer.py +82 -13
  16. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/importer/qualia_importer.py +24 -4
  17. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/importer/rdf_importer.py +139 -4
  18. s3dgraphy-1.6.0.dev26/src/s3dgraphy/importer/sheet_header.py +128 -0
  19. s3dgraphy-1.6.0.dev26/src/s3dgraphy/language.py +181 -0
  20. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/mappings/authoring.py +38 -1
  21. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/mappings/emdb/generic_specialfind_mapping.json +3 -3
  22. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/mappings/emdb/site_properties_mapping.json +3 -3
  23. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/mappings/emdb/usm_mapping.json +3 -3
  24. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/mappings/generic/excel_to_graphml_mapping.json +3 -3
  25. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/mappings/pyarchinit/pyarchinit_us_mapping.json +3 -3
  26. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/mappings/source_list/source_list_mapping.json +3 -3
  27. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/mappings/template_emdb_mapping.json +3 -3
  28. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/mappings/template_pyarchinit_mapping.json +3 -3
  29. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/__init__.py +4 -0
  30. s3dgraphy-1.6.0.dev26/src/s3dgraphy/nodes/translation_node.py +100 -0
  31. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/study.py +10 -1
  32. s3dgraphy-1.6.0.dev26/src/s3dgraphy/translation.py +301 -0
  33. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26/src/s3dgraphy.egg-info}/PKG-INFO +2 -2
  34. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy.egg-info/SOURCES.txt +8 -0
  35. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy.egg-info/requires.txt +1 -1
  36. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_em_ttl_matches_the_datamodels.py +5 -12
  37. s3dgraphy-1.6.0.dev26/tests/test_la_lingua_dei_dati.py +410 -0
  38. s3dgraphy-1.6.0.dev26/tests/test_la_riga_d_intestazione.py +238 -0
  39. s3dgraphy-1.6.0.dev26/tests/test_le_traduzioni.py +435 -0
  40. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_mapping_csv_and_relations.py +8 -5
  41. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_qualia_dai_d7_d8.py +3 -2
  42. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_rdf_reverse_edges.py +2 -1
  43. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_resource_file_node.py +4 -4
  44. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_resource_revision.py +3 -2
  45. s3dgraphy-1.6.0.dev26/tests/test_verifica_provenance.py +139 -0
  46. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/LICENSE +0 -0
  47. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/MANIFEST.in +0 -0
  48. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/README.md +0 -0
  49. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/setup.cfg +0 -0
  50. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/acquisition_descriptor.schema.json +0 -0
  51. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/acquisition_mappings/ercolano.json +0 -0
  52. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/acquisition_mappings/fs.json +0 -0
  53. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/acquisition_mappings/uri.json +0 -0
  54. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/em_document_types.json +0 -0
  55. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/em_extractor_types.json +0 -0
  56. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/em_palette_icons.json +0 -0
  57. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/em_qualia_types_additions.json +0 -0
  58. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/hdto_extension.ttl +0 -0
  59. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/new_qualia_template.json +0 -0
  60. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/outdated_s3dgraphy.ttl +0 -0
  61. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/outdated_s3dgraphy_nomapping.ttl +0 -0
  62. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json.v155.bak +0 -0
  63. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/ActivityNodeGroup.svg +0 -0
  64. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.png +0 -0
  65. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.svg +0 -0
  66. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/EpochNode.svg +0 -0
  67. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/ParadataNodeGroup.svg +0 -0
  68. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/RSF.png +0 -0
  69. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/RSF.svg +0 -0
  70. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/SE.svg +0 -0
  71. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/SE_old.png +0 -0
  72. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/SE_old.svg +0 -0
  73. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/SF.png +0 -0
  74. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/SF.svg +0 -0
  75. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/TSU.png +0 -0
  76. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/US.png +0 -0
  77. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/US.svg +0 -0
  78. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/USD.png +0 -0
  79. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/USD.svg +0 -0
  80. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/USVn.png +0 -0
  81. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/USVn.svg +0 -0
  82. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/USVs.png +0 -0
  83. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/USVs.svg +0 -0
  84. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/UTR.svg +0 -0
  85. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/VSF.png +0 -0
  86. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/VSF.svg +0 -0
  87. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/author.png +0 -0
  88. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/author.svg +0 -0
  89. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/author_ai.png +0 -0
  90. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/author_ai.svg +0 -0
  91. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/combiner.png +0 -0
  92. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/combiner.svg +0 -0
  93. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/continuity.png +0 -0
  94. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/continuity.svg +0 -0
  95. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/document.png +0 -0
  96. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/document.svg +0 -0
  97. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/00_transformation.svg +0 -0
  98. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/01_topographicnetwork.svg +0 -0
  99. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/02_pointcloud.svg +0 -0
  100. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/03_mesh.svg +0 -0
  101. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/04_points.svg +0 -0
  102. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/05_lines.svg +0 -0
  103. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/06_polygons.svg +0 -0
  104. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/07_DEM.svg +0 -0
  105. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/08_ortophoto.svg +0 -0
  106. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/09_photos.svg +0 -0
  107. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/10_laserscanner.svg +0 -0
  108. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device.svg +0 -0
  109. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_computer.svg +0 -0
  110. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_drone.svg +0 -0
  111. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_gnss.svg +0 -0
  112. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_optical.svg +0 -0
  113. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_scanner.svg +0 -0
  114. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_sensor.svg +0 -0
  115. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_station.svg +0 -0
  116. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/12_gnss_survey.svg +0 -0
  117. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/13_field_drawing.svg +0 -0
  118. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/14_recording_sheet.svg +0 -0
  119. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/15_decimation.svg +0 -0
  120. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/16_georeferencing.svg +0 -0
  121. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/17_format_conversion.svg +0 -0
  122. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/18_classification.svg +0 -0
  123. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/dtc/19_vectorization.svg +0 -0
  124. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/embargo.png +0 -0
  125. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/embargo.svg +0 -0
  126. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/extractor.png +0 -0
  127. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/extractor.svg +0 -0
  128. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/gcp_set.svg +0 -0
  129. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/generic_node.svg +0 -0
  130. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/geo_position.svg +0 -0
  131. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/graph.svg +0 -0
  132. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/license.png +0 -0
  133. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/license.svg +0 -0
  134. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/link.svg +0 -0
  135. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/narrative.png +0 -0
  136. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/narrative.svg +0 -0
  137. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/play.svg +0 -0
  138. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/property.png +0 -0
  139. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/property.svg +0 -0
  140. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/registration_transform.svg +0 -0
  141. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/representation_model.svg +0 -0
  142. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/representation_model_doc.svg +0 -0
  143. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/representation_model_sf.svg +0 -0
  144. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/resource_file.svg +0 -0
  145. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/semantic_shape.svg +0 -0
  146. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/serSU.png +0 -0
  147. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/serSU.svg +0 -0
  148. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/serUSD.png +0 -0
  149. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/serUSV.png +0 -0
  150. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/serUSVn.svg +0 -0
  151. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/2D/serUSVs.svg +0 -0
  152. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/3D/RSF.glb +0 -0
  153. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/3D/SF.glb +0 -0
  154. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/3D/TSU.glb +0 -0
  155. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/3D/US.glb +0 -0
  156. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/3D/USD.glb +0 -0
  157. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/3D/USVn.glb +0 -0
  158. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/3D/USVs.glb +0 -0
  159. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/3D/VSF.glb +0 -0
  160. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/3D/combiner.glb +0 -0
  161. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/3D/continuity.glb +0 -0
  162. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/3D/document.glb +0 -0
  163. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/3D/extractor.glb +0 -0
  164. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/3D/property.glb +0 -0
  165. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/3D/serSU.glb +0 -0
  166. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/3D/serUSD.glb +0 -0
  167. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/JSON_config/src/3D/serUSV.glb +0 -0
  168. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/acquisition/__init__.py +0 -0
  169. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/acquisition/acquire.py +0 -0
  170. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/acquisition/descriptor.py +0 -0
  171. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/acquisition/mapping.py +0 -0
  172. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/annotation/__init__.py +0 -0
  173. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/annotation/migrate_reading.py +0 -0
  174. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/annotation/paradata.py +0 -0
  175. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/annotation/reading.py +0 -0
  176. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/authorities/__init__.py +0 -0
  177. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/authorities/resolver.py +0 -0
  178. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/authorities/snapshots/LICENSE +0 -0
  179. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/authorities/snapshots/chronontology.jsonld +0 -0
  180. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/authorities/snapshots/getty_aat.jsonld +0 -0
  181. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/authorities/snapshots/getty_tgn.jsonld +0 -0
  182. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/authorities/snapshots/periodo.jsonld +0 -0
  183. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/authorities/snapshots/provenance.json +0 -0
  184. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/classification.py +0 -0
  185. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/container.py +0 -0
  186. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/contract/__init__.py +0 -0
  187. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/contract/connector.py +0 -0
  188. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/contract/consumer.py +0 -0
  189. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/contract/core.py +0 -0
  190. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/contract/reference.py +0 -0
  191. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/data/StratiMiner_Extraction_Prompt.md +0 -0
  192. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/datamodel.py +0 -0
  193. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/diagnostics.py +0 -0
  194. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/dissemination.py +0 -0
  195. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/dtc/__init__.py +0 -0
  196. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/dtc/capture.py +0 -0
  197. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/dtc/corpus.py +0 -0
  198. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/dtc/devices.py +0 -0
  199. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/dtc/ingest.py +0 -0
  200. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/dtc/neighbourhood.py +0 -0
  201. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/dtc/residency.py +0 -0
  202. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/edges/__init__.py +0 -0
  203. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/edges/connection_resolver.py +0 -0
  204. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/edges/connections_loader.py +0 -0
  205. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/edges/edge.py +0 -0
  206. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/editorial.py +0 -0
  207. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/__init__.py +0 -0
  208. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/docx_exporter.py +0 -0
  209. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/emjson_exporter.py +0 -0
  210. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/graphml/__init__.py +0 -0
  211. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/graphml/canvas_generator.py +0 -0
  212. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/graphml/edge_generator.py +0 -0
  213. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/graphml/epoch_generator.py +0 -0
  214. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/graphml/graphml_exporter.py +0 -0
  215. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/graphml/graphml_patcher.py +0 -0
  216. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/graphml/group_node_generator.py +0 -0
  217. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/graphml/node_generator.py +0 -0
  218. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/graphml/node_registry.py +0 -0
  219. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/graphml/palette_resources.py +0 -0
  220. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/graphml/paradata_generator.py +0 -0
  221. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/graphml/paradata_image_generator.py +0 -0
  222. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/graphml/paradata_node_generators.py +0 -0
  223. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/graphml/table_node_generator.py +0 -0
  224. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/graphml/utils.py +0 -0
  225. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/html_exporter.py +0 -0
  226. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/ipynb_exporter.py +0 -0
  227. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/json_exporter.py +0 -0
  228. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/latex_exporter.py +0 -0
  229. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/exporter/unified_xlsx_exporter.py +0 -0
  230. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/geometry/__init__.py +0 -0
  231. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/geometry/aton.py +0 -0
  232. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/geometry/gltf.py +0 -0
  233. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/geometry/migrate.py +0 -0
  234. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/geometry/proxy.py +0 -0
  235. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/geometry/reading_glb.py +0 -0
  236. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/geometry/store_backed.py +0 -0
  237. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/geometry/wkt.py +0 -0
  238. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/graph.py +0 -0
  239. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/iiif.py +0 -0
  240. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/importer/__init__.py +0 -0
  241. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/importer/base_importer.py +0 -0
  242. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/importer/csv_importer.py +0 -0
  243. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/importer/emjson_importer.py +0 -0
  244. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/importer/fmpxml_importer.py +0 -0
  245. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/importer/import_graphml.py +0 -0
  246. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/importer/pyarchinit_importer.py +0 -0
  247. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/importer/source_text.py +0 -0
  248. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/importer/unified_xlsx_importer.py +0 -0
  249. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/importer/xlsx_importer.py +0 -0
  250. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/importer/xml_importer.py +0 -0
  251. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/indices.py +0 -0
  252. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/mappings/__init__.py +0 -0
  253. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/mappings/registry.py +0 -0
  254. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/merge/__init__.py +0 -0
  255. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/merge/graph_merger.py +0 -0
  256. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/multigraph/__init__.py +0 -0
  257. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/multigraph/multigraph.py +0 -0
  258. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/narrative/__init__.py +0 -0
  259. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/narrative/bake.py +0 -0
  260. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/narrative/generation.py +0 -0
  261. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/narrative/query.py +0 -0
  262. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/narrative/registry.py +0 -0
  263. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/narrative/site_story.py +0 -0
  264. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/annotation_region_node.py +0 -0
  265. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/author_node.py +0 -0
  266. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/base_node.py +0 -0
  267. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/combiner_node.py +0 -0
  268. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/document_node.py +0 -0
  269. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/dtc_acquisition_node.py +0 -0
  270. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/dtc_device_node.py +0 -0
  271. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/dtc_node.py +0 -0
  272. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/dtc_process_node.py +0 -0
  273. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/embargo_node.py +0 -0
  274. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/epoch_node.py +0 -0
  275. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/extractor_node.py +0 -0
  276. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/geo_position_node.py +0 -0
  277. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/georeferencing_node.py +0 -0
  278. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/graph_node.py +0 -0
  279. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/group_node.py +0 -0
  280. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/hdt_node.py +0 -0
  281. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/heritage_entity_node.py +0 -0
  282. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/license_node.py +0 -0
  283. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/narrative_node.py +0 -0
  284. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/paradata_node.py +0 -0
  285. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/project_node.py +0 -0
  286. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/property_node.py +0 -0
  287. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/representation_node.py +0 -0
  288. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/resource_file_node.py +0 -0
  289. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/resource_node.py +0 -0
  290. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/semantic_shape_node.py +0 -0
  291. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/stratigraphic_node.py +0 -0
  292. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/nodes/study_node.py +0 -0
  293. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/ownership.py +0 -0
  294. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/photogrammetry/__init__.py +0 -0
  295. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/photogrammetry/delta.py +0 -0
  296. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/publication.py +0 -0
  297. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/resolvers/__init__.py +0 -0
  298. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/resolvers/builtin_rules.py +0 -0
  299. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/resolvers/property_resolver.py +0 -0
  300. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/resources/__init__.py +0 -0
  301. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/resources/files.py +0 -0
  302. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/resources/fs_backend.py +0 -0
  303. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/resources/minio_backend.py +0 -0
  304. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/resources/resolver.py +0 -0
  305. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/resources/tiles3tz.py +0 -0
  306. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/rights.py +0 -0
  307. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/shelf/__init__.py +0 -0
  308. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/shelf/core.py +0 -0
  309. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/stamp/__init__.py +0 -0
  310. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/stamp/absorb.py +0 -0
  311. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/stamp/emit.py +0 -0
  312. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/stamp/hints.py +0 -0
  313. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/stamp/identity.py +0 -0
  314. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/__init__.py +0 -0
  315. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/_db_handle.py +0 -0
  316. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/_legacy_paradata_svgs.py +0 -0
  317. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/_workspace.py +0 -0
  318. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/conflict_resolver.py +0 -0
  319. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/edge_registry.py +0 -0
  320. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/graph_ingestor.py +0 -0
  321. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/graph_projector.py +0 -0
  322. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/graphml_writer.py +0 -0
  323. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/group_projector.py +0 -0
  324. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/group_store.py +0 -0
  325. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/ingest_result.py +0 -0
  326. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/paradata_store.py +0 -0
  327. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/pyarchinit_pg_importer.py +0 -0
  328. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/rapporti.py +0 -0
  329. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/uuid7.py +0 -0
  330. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/vocab_provider_core.py +0 -0
  331. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/vocab_types.py +0 -0
  332. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/yed_classifier.py +0 -0
  333. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/yed_detector.py +0 -0
  334. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/yed_group_walker.py +0 -0
  335. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/yed_import_pipeline.py +0 -0
  336. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/yed_rapporti_policy.py +0 -0
  337. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/sync/yed_table_parser.py +0 -0
  338. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/templates/em_data_template.xlsx +0 -0
  339. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/templates/em_palette_template.graphml +0 -0
  340. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/temporal/__init__.py +0 -0
  341. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/temporal/inference_engine.py +0 -0
  342. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/tools/__init__.py +0 -0
  343. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/tools/consumer_drift.py +0 -0
  344. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/tools/datamodel_i18n.py +0 -0
  345. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/tools/deliverable_report.py +0 -0
  346. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/tools/glyph_sheet.py +0 -0
  347. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/tools/glyphs_from_svg.py +0 -0
  348. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/tools/sync_node_datamodel.py +0 -0
  349. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/tools/wheel_drift.py +0 -0
  350. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/transforms/__init__.py +0 -0
  351. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/transforms/aux_tracking.py +0 -0
  352. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/transforms/compact.py +0 -0
  353. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/transforms/materialize_continuity.py +0 -0
  354. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/utils/__init__.py +0 -0
  355. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/utils/utils.py +0 -0
  356. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/utils/visual_layout.py +0 -0
  357. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy/zero_hour.py +0 -0
  358. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy.egg-info/dependency_links.txt +0 -0
  359. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/src/s3dgraphy.egg-info/top_level.txt +0 -0
  360. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_acquisition.py +0 -0
  361. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_acquisition_fs.py +0 -0
  362. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_add_resource.py +0 -0
  363. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_ai_validation_nodes.py +0 -0
  364. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_api_surface.py +0 -0
  365. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_asset_dtc_protocol.py +0 -0
  366. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_aton_shapes.py +0 -0
  367. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_attach_only.py +0 -0
  368. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_authority_projection.py +0 -0
  369. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_authority_resolver.py +0 -0
  370. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_blend_locator.py +0 -0
  371. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_canonical_document_rename.py +0 -0
  372. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_canvas_metadata_import.py +0 -0
  373. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_capture_acquisition.py +0 -0
  374. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_capture_rdf_class.py +0 -0
  375. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_chronology_on_request.py +0 -0
  376. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_coating_unit.py +0 -0
  377. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_composite_node_name.py +0 -0
  378. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_connection_resolver.py +0 -0
  379. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_consumer_drift.py +0 -0
  380. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_container.py +0 -0
  381. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_containment_tpq.py +0 -0
  382. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_contract.py +0 -0
  383. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_contract_consumer.py +0 -0
  384. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_convert_command.py +0 -0
  385. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_crdt.py +0 -0
  386. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_datamodel_fingerprint.py +0 -0
  387. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_datamodel_i18n.py +0 -0
  388. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_deterministic_ids.py +0 -0
  389. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_devices.py +0 -0
  390. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_dissemination_tombstones.py +0 -0
  391. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_dtc_corpus.py +0 -0
  392. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_dtc_ingest.py +0 -0
  393. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_dtc_neighbourhood.py +0 -0
  394. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_dtc_projection.py +0 -0
  395. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_dtc_residency.py +0 -0
  396. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_edge_ui_phrases.py +0 -0
  397. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_editorial.py +0 -0
  398. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_emjson_roundtrip.py +0 -0
  399. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_emjson_schema_version.py +0 -0
  400. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_epoch_properties_and_sub_epochs.py +0 -0
  401. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_epoch_undated_import.py +0 -0
  402. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_explicit_node_type_marker.py +0 -0
  403. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_extracted_from_unit.py +0 -0
  404. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_filtered_import.py +0 -0
  405. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_fmpxml_importer.py +0 -0
  406. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_fs_backend.py +0 -0
  407. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_functional_units.py +0 -0
  408. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_georeference_scene.py +0 -0
  409. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_gltf_stitch.py +0 -0
  410. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_glyph_paths.py +0 -0
  411. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_graph_indices_edges.py +0 -0
  412. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_graph_scope_migration.py +0 -0
  413. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_hdto_projection.py +0 -0
  414. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_header_key_aliases.py +0 -0
  415. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_iiif.py +0 -0
  416. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_il_proprietario_si_legge.py +0 -0
  417. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_importer_edge_hygiene.py +0 -0
  418. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_ipynb_exporter.py +0 -0
  419. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_latex_exporter.py +0 -0
  420. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_lossless_roundtrip.py +0 -0
  421. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_mapping_authoring.py +0 -0
  422. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_masonry_unit.py +0 -0
  423. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_material_color.py +0 -0
  424. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_merge_conflicts.py +0 -0
  425. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_migrate_legacy_proxy.py +0 -0
  426. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_minio_backend.py +0 -0
  427. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_narrative_authorship.py +0 -0
  428. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_narrative_bake_docx.py +0 -0
  429. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_narrative_figures.py +0 -0
  430. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_narrative_generation.py +0 -0
  431. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_narrative_mentions.py +0 -0
  432. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_narrative_node.py +0 -0
  433. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_narrative_query.py +0 -0
  434. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_narrative_scaffolder.py +0 -0
  435. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_narrative_site_place.py +0 -0
  436. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_narrative_unvalidated_export.py +0 -0
  437. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_node_datamodel_registry.py +0 -0
  438. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_node_type_map_integrity.py +0 -0
  439. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_one_spelling_writers.py +0 -0
  440. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_pg_importer.py +0 -0
  441. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_photogrammetry_delta.py +0 -0
  442. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_physical_relation_spellings.py +0 -0
  443. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_promotion.py +0 -0
  444. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_property_owners.py +0 -0
  445. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_proxy_resource.py +0 -0
  446. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_proxy_retype.py +0 -0
  447. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_pyarchinit_tier2.py +0 -0
  448. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_rdf_embedding.py +0 -0
  449. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_rdf_roundtrip.py +0 -0
  450. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_reading_coords.py +0 -0
  451. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_reading_glb.py +0 -0
  452. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_reading_migration.py +0 -0
  453. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_reading_place.py +0 -0
  454. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_reading_rdf.py +0 -0
  455. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_recompute_warnings.py +0 -0
  456. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_reproject.py +0 -0
  457. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_resource_files_implicit.py +0 -0
  458. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_resource_layer.py +0 -0
  459. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_resource_representations.py +0 -0
  460. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_resource_tier.py +0 -0
  461. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_reverse_edges.py +0 -0
  462. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_rm_container_node_group.py +0 -0
  463. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_semantic_purity.py +0 -0
  464. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_shelf.py +0 -0
  465. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_shelf_facets.py +0 -0
  466. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_shelf_hatting.py +0 -0
  467. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_shelf_role_uri_table.py +0 -0
  468. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_shipped_mappings.py +0 -0
  469. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_source_list_mapping.py +0 -0
  470. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_source_text.py +0 -0
  471. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_stamp.py +0 -0
  472. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_stamp_hints.py +0 -0
  473. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_stamp_title_description.py +0 -0
  474. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_store_backed_geometry.py +0 -0
  475. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_stratiminer_api.py +0 -0
  476. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_study_metadata.py +0 -0
  477. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_tileset_resource.py +0 -0
  478. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_ttl_roundtrip.py +0 -0
  479. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_unit_definition.py +0 -0
  480. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_visual_assets.py +0 -0
  481. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_wheel_drift.py +0 -0
  482. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_xlsx_containment_and_unknown_bounds.py +0 -0
  483. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_xlsx_importer_graph_init.py +0 -0
  484. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/tests/test_xlsx_source_column.py +0 -0
  485. {s3dgraphy-1.6.0.dev25 → s3dgraphy-1.6.0.dev26}/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.dev25
3
+ Version: 1.6.0.dev26
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.0
38
+ Requires-Dist: dtcstamp>=0.1.2
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.dev25"
7
+ version = "1.6.0.dev26"
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.0",
59
+ "dtcstamp>=0.1.2", # 0.1.1 lacks stamp_description: import s3dgraphy.stamp fails (MICRO-DTCSTAMP-012)
60
60
  ]
61
61
 
62
62
  [project.urls]
@@ -2057,6 +2057,46 @@
2057
2057
  "de": "TSU"
2058
2058
  }
2059
2059
  },
2060
+ "TranslationNode": {
2061
+ "description": {
2062
+ "en": "ONE TRANSLATION of one text field of one node (E.D. 2026-10-01, «Le traduzioni»). The ORIGINAL stays a string in its own field, in the language it was written in — data.lang on the node says which, else the study's working language — and a translation never overwrites it: the original is testimony. Each translation is a node of its own, reached from the translated node by has_translation (reverse is_translation_of). Fields in data: lang (the language of ARRIVAL, BCP 47 — the same key as every node's data.lang, so its own text takes its tag by the ordinary cascade); from_lang (the language of DEPARTURE, the original's WHEN it was translated: written, because the original can change); field (the translated field in the CRDT's vocabulary: description, or data.<key> — a PropertyNode's value is data.value; name is never translated, names are invariant identities); text; method (manual | ai | edition); source_digest ('sha256:<hex>' of the original text translated, NFC + UTF-8: when the original changes the digests differ and the translation is «da riallineare», which no signature clears); review_requested (true when the translator asks for a review, «da rivedere»). WHO translated is has_author (an AuthorNode); WHEN is the editorial stamp created_at. An AI translation carries data.ai_assisted and stays among the warnings until a person verifies it (data.validated_by / validated_at, the same two fields that close a requested review: ai_validation.verify). A translation from a published EDITION reaches the DocumentNode of that edition with extracted_from: a published translation is a source, Vitruvius read through a translator is an interpretation.",
2063
+ "validated_it": false,
2064
+ "validated_el": false,
2065
+ "validated_he": false,
2066
+ "validated_es": false,
2067
+ "validated_pl": false,
2068
+ "validated_ro": false,
2069
+ "validated_fr": false,
2070
+ "validated_de": false,
2071
+ "it": "UNA TRADUZIONE di un campo di testo di un nodo (E.D. 1 ott 2026, «Le traduzioni»). L'ORIGINALE resta una stringa nel suo campo, nella lingua in cui è nato (data.lang del nodo, altrimenti la lingua dello studio), e una traduzione non lo sovrascrive mai: l'originale è testimonianza. Ogni traduzione è un nodo, raggiunto da has_translation, con lang (arrivo), from_lang (partenza, scritta perché l'originale può cambiare), field (description o data.<chiave>; il nome non si traduce), text, method (manual | ai | edition), source_digest (sha256 dell'originale tradotto: se cambia, la traduzione è «da riallineare») e review_requested («da rivedere»). Chi ha tradotto: has_author; una traduzione AI resta tra gli avvisi finché una persona non la verifica (validated_by); da un'edizione: extracted_from verso il DocumentNode.",
2072
+ "el": "ΜΙΑ ΜΕΤΑΦΡΑΣΗ ενός πεδίου κειμένου ενός κόμβου (E.D. 1/10/2026). Το ΠΡΩΤΟΤΥΠΟ μένει συμβολοσειρά στο πεδίο του, στη γλώσσα όπου γράφτηκε (data.lang του κόμβου, αλλιώς η γλώσσα της μελέτης), και η μετάφραση δεν το αντικαθιστά ποτέ. Κάθε μετάφραση είναι κόμβος, που συνδέεται με has_translation, με lang (άφιξη), from_lang (αφετηρία), field, text, method (manual | ai | edition), source_digest (sha256 του πρωτοτύπου: αν αλλάξει, η μετάφραση χρειάζεται ευθυγράμμιση) και review_requested. Ποιος μετέφρασε: has_author· μια μετάφραση AI μένει στις προειδοποιήσεις ώσπου να την επαληθεύσει ένα πρόσωπο (validated_by)· από έκδοση: extracted_from προς τον DocumentNode.",
2073
+ "he": "תרגום אחד של שדה טקסט אחד של צומת (E.D. 1.10.2026). המקור נשאר מחרוזת בשדה שלו, בשפה שבה נכתב (data.lang של הצומת, אחרת שפת המחקר), ותרגום לעולם אינו דורס אותו. כל תרגום הוא צומת, המחובר ב-has_translation, עם lang (שפת היעד), from_lang (שפת המקור), field, text, method (manual | ai | edition), source_digest (sha256 של המקור: אם השתנה, התרגום דורש יישור) ו-review_requested. מי תרגם: has_author; תרגום AI נשאר באזהרות עד שאדם מאמת אותו (validated_by); ממהדורה: extracted_from אל ה-DocumentNode.",
2074
+ "es": "UNA TRADUCCIÓN de un campo de texto de un nodo (E.D. 1 oct 2026). El ORIGINAL sigue siendo una cadena en su campo, en la lengua en que se escribió (data.lang del nodo, si no la del estudio), y una traducción nunca lo sobrescribe. Cada traducción es un nodo, alcanzado por has_translation, con lang (llegada), from_lang (partida), field, text, method (manual | ai | edition), source_digest (sha256 del original: si cambia, la traducción está «por realinear») y review_requested («por revisar»). Quién tradujo: has_author; una traducción IA queda entre los avisos hasta que una persona la verifica (validated_by); de una edición: extracted_from hacia el DocumentNode.",
2075
+ "pl": "JEDNO TŁUMACZENIE jednego pola tekstowego węzła (E.D. 1.10.2026). ORYGINAŁ pozostaje ciągiem w swoim polu, w języku, w którym powstał (data.lang węzła, w przeciwnym razie język badania), a tłumaczenie nigdy go nie nadpisuje. Każde tłumaczenie jest węzłem, osiąganym przez has_translation, z lang (docelowy), from_lang (źródłowy), field, text, method (manual | ai | edition), source_digest (sha256 oryginału: gdy się zmieni, tłumaczenie wymaga uzgodnienia) i review_requested. Kto przetłumaczył: has_author; tłumaczenie AI pozostaje wśród ostrzeżeń, dopóki osoba go nie zweryfikuje (validated_by); z wydania: extracted_from do DocumentNode.",
2076
+ "ro": "O TRADUCERE a unui câmp de text al unui nod (E.D. 1 oct 2026). ORIGINALUL rămâne un șir în câmpul său, în limba în care a fost scris (data.lang al nodului, altfel limba studiului), iar o traducere nu îl suprascrie niciodată. Fiecare traducere este un nod, atins prin has_translation, cu lang (sosire), from_lang (plecare), field, text, method (manual | ai | edition), source_digest (sha256 al originalului: dacă se schimbă, traducerea trebuie realiniată) și review_requested. Cine a tradus: has_author; o traducere AI rămâne printre avertismente până o verifică o persoană (validated_by); dintr-o ediție: extracted_from către DocumentNode.",
2077
+ "fr": "UNE TRADUCTION d'un champ de texte d'un nœud (E.D. 1er oct. 2026). L'ORIGINAL reste une chaîne dans son champ, dans la langue où il a été écrit (data.lang du nœud, sinon celle de l'étude), et une traduction ne l'écrase jamais. Chaque traduction est un nœud, atteint par has_translation, avec lang (arrivée), from_lang (départ), field, text, method (manual | ai | edition), source_digest (sha256 de l'original : s'il change, la traduction est « à réaligner ») et review_requested (« à revoir »). Qui a traduit : has_author ; une traduction IA reste parmi les avertissements jusqu'à ce qu'une personne la vérifie (validated_by) ; d'une édition : extracted_from vers le DocumentNode.",
2078
+ "de": "EINE ÜBERSETZUNG eines Textfelds eines Knotens (E.D. 1.10.2026). Das ORIGINAL bleibt eine Zeichenkette in seinem Feld, in der Sprache, in der es geschrieben wurde (data.lang des Knotens, sonst die Sprache der Studie), und eine Übersetzung überschreibt es nie. Jede Übersetzung ist ein Knoten, erreicht über has_translation, mit lang (Ziel), from_lang (Ausgang), field, text, method (manual | ai | edition), source_digest (sha256 des Originals: ändert es sich, ist die Übersetzung neu abzugleichen) und review_requested. Wer übersetzt hat: has_author; eine KI-Übersetzung bleibt unter den Warnungen, bis eine Person sie prüft (validated_by); aus einer Edition: extracted_from zum DocumentNode."
2079
+ },
2080
+ "label": {
2081
+ "en": "Translation",
2082
+ "validated_it": false,
2083
+ "validated_el": false,
2084
+ "validated_he": false,
2085
+ "validated_es": false,
2086
+ "validated_pl": false,
2087
+ "validated_ro": false,
2088
+ "validated_fr": false,
2089
+ "validated_de": false,
2090
+ "it": "Traduzione",
2091
+ "el": "Μετάφραση",
2092
+ "he": "תרגום",
2093
+ "es": "Traducción",
2094
+ "pl": "Tłumaczenie",
2095
+ "ro": "Traducere",
2096
+ "fr": "Traduction",
2097
+ "de": "Übersetzung"
2098
+ }
2099
+ },
2060
2100
  "UnknownNode": {
2061
2101
  "description": {
2062
2102
  "en": "Fallback node for unrecognized types. This type of node should not normally appear in the system but serves exclusively to handle anomalies in the data.",
@@ -6289,6 +6329,65 @@
6289
6329
  "de": "Hat Zeitzweig"
6290
6330
  }
6291
6331
  },
6332
+ "has_translation": {
6333
+ "label": {
6334
+ "en": "Has translation",
6335
+ "validated_it": false,
6336
+ "validated_el": false,
6337
+ "validated_he": false,
6338
+ "validated_es": false,
6339
+ "validated_pl": false,
6340
+ "validated_ro": false,
6341
+ "validated_fr": false,
6342
+ "validated_de": false,
6343
+ "it": "Ha la traduzione",
6344
+ "el": "Έχει μετάφραση",
6345
+ "he": "יש תרגום",
6346
+ "es": "Tiene la traducción",
6347
+ "pl": "Ma tłumaczenie",
6348
+ "ro": "Are traducerea",
6349
+ "fr": "A pour traduction",
6350
+ "de": "Hat die Übersetzung"
6351
+ },
6352
+ "ui_phrase_as_source": {
6353
+ "en": "{node} translated as {x}",
6354
+ "validated_it": false,
6355
+ "validated_el": false,
6356
+ "validated_he": false,
6357
+ "validated_es": false,
6358
+ "validated_pl": false,
6359
+ "validated_ro": false,
6360
+ "validated_fr": false,
6361
+ "validated_de": false,
6362
+ "it": "{node} tradotto come {x}",
6363
+ "el": "{node} μεταφρασμένο ως {x}",
6364
+ "he": "{node} מתורגם כ־{x}",
6365
+ "es": "{node} traducido como {x}",
6366
+ "pl": "{node} przetłumaczone jako {x}",
6367
+ "ro": "{node} tradus ca {x}",
6368
+ "fr": "{node} traduit par {x}",
6369
+ "de": "{node} übersetzt als {x}"
6370
+ },
6371
+ "ui_phrase_as_target": {
6372
+ "en": "{node} translation of {x}",
6373
+ "validated_it": false,
6374
+ "validated_el": false,
6375
+ "validated_he": false,
6376
+ "validated_es": false,
6377
+ "validated_pl": false,
6378
+ "validated_ro": false,
6379
+ "validated_fr": false,
6380
+ "validated_de": false,
6381
+ "it": "{node} traduzione di {x}",
6382
+ "el": "{node} μετάφραση του {x}",
6383
+ "he": "{node} תרגום של {x}",
6384
+ "es": "{node} traducción de {x}",
6385
+ "pl": "{node} tłumaczenie {x}",
6386
+ "ro": "{node} traducere a {x}",
6387
+ "fr": "{node} traduction de {x}",
6388
+ "de": "{node} Übersetzung von {x}"
6389
+ }
6390
+ },
6292
6391
  "has_visual_reference": {
6293
6392
  "ui_phrase_as_source": {
6294
6393
  "en": "{node} shown in {x}",
@@ -46,8 +46,8 @@
46
46
  dcterms:creator "Emanuele Demetrescu" ;
47
47
  dcterms:license <https://creativecommons.org/licenses/by/4.0/> ;
48
48
  dcterms:issued "2026-05-23"^^xsd:date ;
49
- owl:versionInfo "1.6.9" ;
50
- 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.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 ;
49
+ owl:versionInfo "1.6.10" ;
50
+ 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.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 ;
51
51
  owl:imports <http://www.cidoc-crm.org/cidoc-crm/> ,
52
52
  <http://www.cidoc-crm.org/extensions/crminf/> ,
53
53
  <http://www.cidoc-crm.org/extensions/crmarchaeo/> ,
@@ -817,5 +817,53 @@ em:hasDefinition
817
817
  rdfs:comment "The DEFINITION of a stratigraphic unit — strato di crollo, riempimento, taglio: the DEFINIZIONE box of the US sheet — as a concept of a controlled vocabulary (a SKOS concept, typed crm:E55_Type). It is a TYPE of the unit and nothing more, which is why it narrows crm:P2_has_type rather than widening anything: every em:hasDefinition triple IS a P2_has_type triple, and a CIDOC-only consumer reading the entailment loses nothing. What the subproperty adds is the ability to tell, in SPARQL, the definition from any other type a unit may carry. NOT EMITTED BY DEFAULT: the exporter writes crm:P2_has_type directly (node datamodel StratigraphicNode.properties.definition.rdf.with_concept), because an unreasoned store would otherwise not see the P2 edge at all; the switch is one line in that entry. A definition that carries only a label and no concept URI projects to nothing (rdf.label_only = null): a word is not a concept. Maps to: node_datamodel StratigraphicNode.properties.definition (em.json data.definition), inherited by every stratigraphic subtype."@en .
818
818
 
819
819
  # ============================================================================
820
- # End of em.ttl v1.6.7
820
+ # 14. THE LANGUAGE OF THE ORIGINAL, AND ITS TRANSLATIONS — CRMem v1.6.10
821
+ # Decided by E.D. on 2026-10-01 («Le traduzioni»): the original stays a
822
+ # string in its field; each translation is a node (crm:E33, reached by
823
+ # crm:P73_has_translation). CIDOC names the class and the relation; these
824
+ # six terms say what it does not.
825
+ # ============================================================================
826
+
827
+ em:originalLanguage
828
+ a owl:DatatypeProperty ;
829
+ rdfs:label "original language"@en ;
830
+ rdfs:range xsd:string ;
831
+ rdfs:comment "The language the node's ORIGINAL texts are written in, as a BCP 47 tag ('la', 'it', 'und'). Written whenever the node itself declares one (em.json data.lang), equal to the study's working language or not, so a reader can tell the original literal from its translations — they share the predicate (dcterms:description \"…\"@la beside \"…\"@it) — and the round trip em.json → RDF → em.json gives data.lang back exactly where it was. NOT crm:P72_has_language: its domain is E33 Linguistic Object, and the node (a stratigraphic unit, a document) is not the text; the TranslationNode, which IS one, carries P72. Absent when the node declares nothing: its texts then take the study's language (dcterms:language on the graph), and saying 'original' would be a claim nobody made. Maps to: node_datamodel Node.properties.lang (em.json data.lang)."@en .
832
+
833
+ em:sourceLanguage
834
+ a owl:DatatypeProperty ;
835
+ rdfs:label "source language"@en ;
836
+ rdfs:domain crm:E33_Linguistic_Object ;
837
+ rdfs:range xsd:string ;
838
+ rdfs:comment "The language a translation was made FROM: the original's language at the moment of translating, as a BCP 47 tag. Recorded on the translation and not read off the original later, because the original can change. crm:P72_has_language on the same node is the language it was translated INTO. Maps to: node_datamodel TranslationNode.properties.from_lang (data.from_lang)."@en .
839
+
840
+ em:translatedField
841
+ a owl:DatatypeProperty ;
842
+ rdfs:label "translated field"@en ;
843
+ rdfs:domain crm:E33_Linguistic_Object ;
844
+ rdfs:range xsd:string ;
845
+ rdfs:comment "WHICH text of the translated node this translation translates, in the field vocabulary of the em.json CRDT: 'description', or 'data.<key>' (a PropertyNode's value is 'data.value'). Needed because crm:P73_has_translation runs from the node, and a node can hold more than one text; never 'name', names being invariant identities. Maps to: node_datamodel TranslationNode.properties.field (data.field)."@en .
846
+
847
+ em:translationMethod
848
+ a owl:DatatypeProperty ;
849
+ rdfs:label "translation method"@en ;
850
+ rdfs:domain crm:E33_Linguistic_Object ;
851
+ rdfs:range xsd:string ;
852
+ rdfs:comment "How a translation was made: 'manual' (a person), 'ai' (a model, and the node then carries em:aiAssistedBy until a person verifies it, em:validatedBy), or 'edition' (taken from a published translation, which the node reaches as a source). A closed list of three, a literal until a vocabulary of translation methods exists to point at. Maps to: node_datamodel TranslationNode.properties.method (data.method)."@en .
853
+
854
+ em:sourceDigest
855
+ a owl:DatatypeProperty ;
856
+ rdfs:label "source digest"@en ;
857
+ rdfs:domain crm:E33_Linguistic_Object ;
858
+ rdfs:range xsd:string ;
859
+ rdfs:comment "The digest of the original text a translation translated, 'sha256:<hex>' over the NFC, UTF-8 text. When the original changes the digests differ and the translation is 'to realign': it no longer translates what the node says, and the exporter stops writing its literal beside the original's (its own resource still leaves). Same form as em:checksum, which is a digest of bytes; this one is of a text. Maps to: node_datamodel TranslationNode.properties.source_digest (data.source_digest)."@en .
860
+
861
+ em:reviewRequested
862
+ a owl:DatatypeProperty ;
863
+ rdfs:label "review requested"@en ;
864
+ rdfs:range xsd:boolean ;
865
+ rdfs:comment "The author of a piece of content asks a person to review it («da rivedere»): true, or absent. Closed — not removed — by em:validatedBy / em:validatedAt, the same signature that clears AI-assisted content: the request stays written, and the signature says it was done and by whom. Introduced for translations made by hand; the field is generic. Maps to: node_datamodel TranslationNode.properties.review_requested (data.review_requested)."@en .
866
+
867
+ # ============================================================================
868
+ # End of em.ttl v1.6.10
821
869
  # ============================================================================
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "metadata": {
3
- "version": "1.6.3",
3
+ "version": "1.6.5",
4
4
  "last_updated": "2026-10-01",
5
5
  "maintainers": ["Emanuel Demetrescu"],
6
6
  "license": "CC-BY-SA-4.0",
7
7
  "license_note": "Share-alike per allinearsi agli strumenti terminologici da cui questo datamodel prende gli ancoraggi (ICCD CC BY-SA 3.0 IT) e perche' una derivazione resti aperta. Gli identificatori AAT/CIDOC citati nei `mappings` sono RIFERIMENTI, non contenuto incorporato: lo share-alike non si propaga ai vocabolari altrui, che mantengono i propri termini.",
8
- "changelog": "v1.6.3 (MICRO em.ttl nel datamodel, 2026-10-26, decided by E.D. 2026-10-01 — every em: term of em.ttl is cited by a datamodel): epistemic.confidence.confidence_level.mappings gains specialised_alternative 'em:confidenceLevel', the em.ttl literal form of the same scalar, declared and NOT emitted (the exporter keeps crminf:I6_Belief_Value via J5). Mapping text only, no quale changed. v1.6.2: added two descriptive qualia of the stratigraphic unit asked for by the DAI record (iDAI.field Layer, D7/D8) — proposte da Cowork per E.D., 28 set 2026, dalla scheda DAI: `feature_shape` (spatial; the shape in plan or section named with a term, AAT 300056273, E55_Type) and `boundary_distinctness` (material; how sharp the limits are: abrupt / clear / gradual / diffuse, E55_Type, no AAT evident). Both controlled vocabularies with indicative seed values; templates declare their own. v1.6.1: added the spatial qualia `geometry` — the PROXY as a quale. The geometry-without-material of a unit becomes a PropertyNode whose payload is a SemanticShapeNode (has_semantic_shape), so the proxy inherits the paradata chain a lone node could not have, and one proxy can be synthesised from several sources. CIDOC default crmgeo:SP5_Geometric_Place_Expression, flagged `confirm_with: Felicetti` (E36 is the alternative, to be decided together with em:AnnotationRegion). v1.6.0: version realigned to the EM language version (EM 1.6) — supersedes the standalone 4.x line (last was 4.2), so all EM JSON config files now share the 1.6.x scheme. Added optional `rationale` + `example` fields to qualia entries (a plain-language why + a concrete case), shown by the EMStudio vocabulary picker when creating a PropertyNode. Seeded for the temporal qualia (absolute_time_start / absolute_time_end / dating_method); to be filled in for the rest incrementally. Prior (4.x) history: v4.2 added rationale/example scaffolding; v4.1: expanded spatial elevation qualia for pyArchInit us_table quote (all E54_Dimension): elevation_relative, elevation_min_absolute, elevation_max_absolute, elevation_min_relative, elevation_max_relative, elevation_min_usm, elevation_max_usm (the generic 'elevation' = absolute MASL, used by quota_abs). Each pyArchInit quota column maps to its own qualia id so they don't collide on the single-PropertyNode-per-property_name rule. v4.0: verified all v3.0 CIDOC-CRM mappings (correct). Expanded with: volume, area, circumference in dimensional; color, texture, finish, patina, hardness, porosity in material; damage_type, fragility, completeness in state; tool_marks, joining_technique in technical; bounding_box, footprint_area in spatial; duration, terminus_post_quem, terminus_ante_quem, relative_chronology in temporal; ceremonial_function, ritual_function, defensive_function, domestic_function, symbolic_function in telic; school, workshop, period_attribution in stylistic. NEW subcategories: iconographic + semantic under cultural_interpretive (iconographic_subject, narrative_content, iconographic_program, aesthetic_value, religious_significance, monumental_status, attribution). Added provenance_history, exhibition_history, publication_history under administrative; NEW ownership subcategory (current_custodian, ownership_chain). NEW CATEGORY epistemic — meta-qualia central to EM paradata model (confidence_level, certainty_level, uncertainty_factors, methodology_used, validation_method, source_quality, primary_contributor, review_status, last_modified)."
8
+ "changelog": "v1.6.5 (MICRO le traduzioni, 2026-10-29, decided by E.D. 2026-10-01, domanda 3): the doubtful qualia, MEASURED. contextual.administrative.intervention_history is prose (a history of conservation interventions) and gains `natural_language: true`. provenance_history, exhibition_history, publication_history and contextual.ownership.ownership_chain are `object_chain` WITHOUT a schema: no field of theirs is declared and no code reads a structure, so what a PropertyNode stores is ONE string (the chain as written) — the whole string is marked. cultural_interpretive.semantic.attribution is an `object` WITH separate fields (attributed_to: an E39 Actor reference, attribution_type: a closed list, confidence: a float): none of them is a note, so nothing is marked — the rule is to mark only the note, and this object has none. Its value today travels as one string (\"attributed to Phidias\") and leaves untagged; marking it would need a `note` field in its schema, which is E.D.'s to add. inventory_number stays a code. v1.6.4 (MICRO la lingua dei dati, 2026-10-27, decided by E.D. 2026-09-28): cultural_interpretive.iconographic.narrative_content gains `natural_language: true` — its value is prose and leaves in RDF with its language tag (crm:P90_has_value \"la guerra di Troia\"@it), the language coming from the property node's data.lang, else the study's working language. data_type alone does not say it: inventory_number is a string too, and it is a CODE, so it is not marked and never tagged. No other quale marked: the ones whose value may be prose (intervention_history, attribution, the *_history and ownership_chain object chains) are waiting for E.D. v1.6.3 (MICRO em.ttl nel datamodel, 2026-10-26, decided by E.D. 2026-10-01 — every em: term of em.ttl is cited by a datamodel): epistemic.confidence.confidence_level.mappings gains specialised_alternative 'em:confidenceLevel', the em.ttl literal form of the same scalar, declared and NOT emitted (the exporter keeps crminf:I6_Belief_Value via J5). Mapping text only, no quale changed. v1.6.2: added two descriptive qualia of the stratigraphic unit asked for by the DAI record (iDAI.field Layer, D7/D8) — proposte da Cowork per E.D., 28 set 2026, dalla scheda DAI: `feature_shape` (spatial; the shape in plan or section named with a term, AAT 300056273, E55_Type) and `boundary_distinctness` (material; how sharp the limits are: abrupt / clear / gradual / diffuse, E55_Type, no AAT evident). Both controlled vocabularies with indicative seed values; templates declare their own. v1.6.1: added the spatial qualia `geometry` — the PROXY as a quale. The geometry-without-material of a unit becomes a PropertyNode whose payload is a SemanticShapeNode (has_semantic_shape), so the proxy inherits the paradata chain a lone node could not have, and one proxy can be synthesised from several sources. CIDOC default crmgeo:SP5_Geometric_Place_Expression, flagged `confirm_with: Felicetti` (E36 is the alternative, to be decided together with em:AnnotationRegion). v1.6.0: version realigned to the EM language version (EM 1.6) — supersedes the standalone 4.x line (last was 4.2), so all EM JSON config files now share the 1.6.x scheme. Added optional `rationale` + `example` fields to qualia entries (a plain-language why + a concrete case), shown by the EMStudio vocabulary picker when creating a PropertyNode. Seeded for the temporal qualia (absolute_time_start / absolute_time_end / dating_method); to be filled in for the rest incrementally. Prior (4.x) history: v4.2 added rationale/example scaffolding; v4.1: expanded spatial elevation qualia for pyArchInit us_table quote (all E54_Dimension): elevation_relative, elevation_min_absolute, elevation_max_absolute, elevation_min_relative, elevation_max_relative, elevation_min_usm, elevation_max_usm (the generic 'elevation' = absolute MASL, used by quota_abs). Each pyArchInit quota column maps to its own qualia id so they don't collide on the single-PropertyNode-per-property_name rule. v4.0: verified all v3.0 CIDOC-CRM mappings (correct). Expanded with: volume, area, circumference in dimensional; color, texture, finish, patina, hardness, porosity in material; damage_type, fragility, completeness in state; tool_marks, joining_technique in technical; bounding_box, footprint_area in spatial; duration, terminus_post_quem, terminus_ante_quem, relative_chronology in temporal; ceremonial_function, ritual_function, defensive_function, domestic_function, symbolic_function in telic; school, workshop, period_attribution in stylistic. NEW subcategories: iconographic + semantic under cultural_interpretive (iconographic_subject, narrative_content, iconographic_program, aesthetic_value, religious_significance, monumental_status, attribution). Added provenance_history, exhibition_history, publication_history under administrative; NEW ownership subcategory (current_custodian, ownership_chain). NEW CATEGORY epistemic — meta-qualia central to EM paradata model (confidence_level, certainty_level, uncertainty_factors, methodology_used, validation_method, source_quality, primary_contributor, review_status, last_modified)."
9
9
  },
10
10
  "qualia_categories": [
11
11
  {
@@ -982,6 +982,7 @@
982
982
  "cidoc_crm": "E73_Information_Object"
983
983
  },
984
984
  "data_type": "string_or_reference",
985
+ "natural_language": true,
985
986
  "expected_extractors": ["iconographic_analysis", "literary_comparison"]
986
987
  },
987
988
  {
@@ -1105,7 +1106,8 @@
1105
1106
  "mappings": {
1106
1107
  "getty_aat": "300379504",
1107
1108
  "cidoc_crm": "E11_Modification"
1108
- }
1109
+ },
1110
+ "natural_language": true
1109
1111
  },
1110
1112
  {
1111
1113
  "id": "conservation_status",
@@ -1148,6 +1150,7 @@
1148
1150
  "cidoc_crm": "E12_Production"
1149
1151
  },
1150
1152
  "data_type": "object_chain",
1153
+ "natural_language": true,
1151
1154
  "expected_extractors": ["archival_research", "provenance_research"]
1152
1155
  },
1153
1156
  {
@@ -1159,6 +1162,7 @@
1159
1162
  "cidoc_crm": "E7_Activity"
1160
1163
  },
1161
1164
  "data_type": "object_chain",
1165
+ "natural_language": true,
1162
1166
  "expected_extractors": ["archival_research", "museum_documentation"]
1163
1167
  },
1164
1168
  {
@@ -1170,6 +1174,7 @@
1170
1174
  "cidoc_crm": "E31_Document"
1171
1175
  },
1172
1176
  "data_type": "object_chain",
1177
+ "natural_language": true,
1173
1178
  "expected_extractors": ["bibliographic_research", "citation_analysis"]
1174
1179
  }
1175
1180
  ]
@@ -1197,6 +1202,7 @@
1197
1202
  "cidoc_crm": "E8_Acquisition"
1198
1203
  },
1199
1204
  "data_type": "object_chain",
1205
+ "natural_language": true,
1200
1206
  "expected_extractors": ["archival_research", "provenance_research"]
1201
1207
  }
1202
1208
  ]
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "formal_language": "EM",
3
- "version": "1.6.27",
3
+ "version": "1.6.28",
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,7 @@
9
9
  "In breve: qui si decide di che colore DISEGNARE una US; li si registra di che colore ERA."
10
10
  ],
11
11
  "_changelog": {
12
+ "1.6.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.",
12
13
  "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.",
13
14
  "1.6.26": "THE FILE OF A RESOURCE (MICRO-RISORSA-FILE, 18 Oct 2026, decision of E.D. 30 Sep 2026). node_styles += FILE for ResourceFileNode (node datamodel 1.6.17): the LINK chain glyph and colour with a DASHED border — a file is a member of the resource it hangs from, the same family and not a second resource. NO NEW GLYPH: it reuses src/2D/link.svg, declares no .glb (LINK's src/3D/link.glb is itself among the missing 3D models, and a new type must not add to that gap), and a sign of its own is left to E.D.",
14
15
  "1.6.25": "THE EIGHT DTC GLYPHS APPROVED (E.D., 30 Sep 2026; MICRO-GEOMETRIA-ORIGINE part 1). The eight drafts of 1.6.23 moved from src/2D/bozze/dtc_<glyph>.svg to src/2D/dtc/<glyph>.svg (12_gnss_survey … 19_vectorization), the BOZZA word removed from their comment, glyphs_from_svg --write rerun: their 2d_glyphs entries no longer carry draft: true. src/2D/bozze/ is empty again. Still without a glyph (open): the four recoveries download, local_import, uri_reference, ingest.",
@@ -3336,6 +3337,17 @@
3336
3337
  },
3337
3338
  "label_position": "over"
3338
3339
  },
3340
+ "TRANSL": {
3341
+ "_comment": "TranslationNode (MICRO le traduzioni, E.D. 2026-10-01): one translation of one text field — a crm:E33 like the narrative, hence its grey and, until E.D. draws a mark of its own, its glyph (declared sharing). DASHED, unlike NARR's solid: the translation stands beside an original, it is not an authored object over the graph.",
3342
+ "2d_file_vect": "src/2D/narrative.svg",
3343
+ "style": {
3344
+ "border_color": "#5A5A66",
3345
+ "fill_color": "#F2F2F5",
3346
+ "border_style": "dashed",
3347
+ "shape": "rounded_rectangle"
3348
+ },
3349
+ "label_position": "over"
3350
+ },
3339
3351
  "LINK": {
3340
3352
  "file_3d": "src/3D/link.glb",
3341
3353
  "2d_file_vect": "src/2D/link.svg",
@@ -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.18",
3
+ "s3Dgraphy_data_model_version": "1.6.20",
4
4
  "node_types": {
5
5
  "ActivityNodeGroup": {
6
6
  "parent": "GroupNode",
@@ -277,6 +277,11 @@
277
277
  "node_type": "TSU",
278
278
  "description": ""
279
279
  },
280
+ "TranslationNode": {
281
+ "parent": "Node",
282
+ "node_type": "translation",
283
+ "description": "ONE TRANSLATION of one text field of one node — a text, not a value."
284
+ },
280
285
  "UnknownNode": {
281
286
  "parent": "StratigraphicNode",
282
287
  "node_type": "unknown",
@@ -1,6 +1,6 @@
1
1
  {
2
- "s3Dgraphy_connections_model_version": "1.6.32",
3
- "description": "v1.6.32 (MICRO i termini di em.ttl nel datamodel, 2026-10-26, decided by E.D. 2026-10-01): the eight edges of the AP11 physical family (abuts, cuts, fills, overlies, bonded_to, is_bonded_to, equals, is_physically_equal_to) gain mapping.subproperty, the em: subproperty of crmarchaeo:AP11_has_physical_relation_to they are written with (em:abuts, em:cuts, em:fills, em:overlies, em:bondedTo, em:physicallyEquals). Until now the pairing type_tag -> subproperty lived only in rdf_exporter.AP11_SUBPROPS; the exporter and the importer now BUILD that table from here, so a new physical relation is a datamodel change and not a code change. has_property.mapping gains when_inherited em:inheritsQualia, the subproperty the exporter already writes for an inherited owner (ownership.py). Mapping only: no edge added, nothing emitted differently. v1.6.31 (LA REVISIONE DELLA RISORSA, 2026-10-20, decision of E.D. 2026-09-30): NEW was_revision_of / had_revision — ResourceNode → ResourceNode, prov:wasRevisionOf (CIDOC projection crmdig:L21_used_as_derivation_source, as dtc_derived_from, because CRMdig has no term of its own for a revision). The name is the one the em.json container already uses for a ProjectVersion (container.py ProjectVersion.was_revision_of, projected as prov:wasRevisionOf by the RDF exporter): until now it was a FIELD of a document version, never an edge; it is widened here to resources. replace_file makes a NEW resource (same fields, the same files but the replaced one, the new file dtc_derived_from the old file) that was_revision_of the old one; the old one stays as it was, citable, and what pointed at it does not move by itself. No ui_phrase: a revision is made by replace_file, never picked from a menu. ADDITIVE: nothing narrowed. v1.6.30 (LA RISORSA E I SUOI FILE, 2026-10-18, decision of E.D. 2026-09-30): NEW has_file / is_file_of — ResourceNode → ResourceFileNode (node datamodel 1.6.17), crm:P106_is_composed_of + prov:hadMember; the edge `attributes` carry role (entry_point | member) and the path relative to the entry point, because one file sits in several resources under different paths. dtc_derived_from.source/target += ResourceFileNode, so a corrected texture declares the texture it comes from. Representations of the same thing (the datablock in the .blend as master, an OBJ export as distribution) are sibling ResourceNodes tied by dtc_derived_from: no new edge. NO REVISION EDGE exists for resources (measured: none of the 56 edges says «is a revision of»); replace_file keeps the old file and declares the new one derived from it, and the missing edge is reported, not invented. ADDITIVE: nothing narrowed. v1.6.29 (LA GEOMETRIA PER ORIGINE, 2026-10-11, decision of E.D. 2026-09-30): the vertices of a point / line / polyline reading are data of the region (node datamodel 1.6.15, data.coords); has_semantic_shape no longer carries a reading's .glb (the 1.6.27 hinge is migrated on opening). has_linked_resource.source += AnnotationRegionNode: above coords.inline_max_vertices (500) the vertices go to a .glb RESOURCE the region reaches with has_linked_resource (P67), as a proxy's shape and an RM do. ADDITIVE: nothing narrowed. v1.6.28 (IL PROXY COME RISORSA, 2026-10-11, decision of E.D. 2026-09-30): the proxy is a property of the US and its .glb is a RESOURCE. has_linked_resource.source += SemanticShapeNode: the shape reaches its glb with has_linked_resource -> ResourceNode(url_type proxy_model), the same hinge a Representation Model uses for its bytes (P67_refers_to), instead of carrying the path in its own url. SemanticShape.url is READ, never written: on opening, a shape with a url and no resource gets one (geometry/migrate.py, uuid5, idempotent), which also covers the older form EMtools still writes (US -has_semantic_shape-> shape with url proxies/<US>.glb). Convex hulls and spheres stay in the shape's data and ask for no resource. ADDITIVE: nothing narrowed. v1.6.27 (LA GEOMETRIA DELLA LETTURA, 2026-10-06, decision of E.D. 2026-09-29): the place of a reading is ONE node, AnnotationRegion with geometry_kind (region2d | passage | point | line | polyline; node datamodel 1.6.10). The chain is extractor -extracted_from-> region -is_on_resource-> what it is on, for every kind. is_on_resource.target += RepresentationModelNode, RepresentationModelDocNode, RepresentationModelSpecialFindNode: a point/line/polyline sits on a 3D model — the one edge that was missing. NO NEW EDGE for the .glb: the region reaches it with has_semantic_shape (source 'Node', already legal), the hinge a proxy uses (Property(geometry) -> SemanticShape.url). has_linked_resource was measured and NOT used: its source does not admit an AnnotationRegion, and it is the RM's hinge to a file, not a proxy's. ADDITIVE: nothing narrowed. s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.26 (DUE FRASI, 2026-10-04, E.D. 2026-09-29): combines.ui_phrase.as_source «{node} combining {x}» → «{node} of {x}» — the new node is the combiner and {x} the extractor it combines, and «Combiner combining D.3.1» said the verb twice; the eight other languages already read «di/de/von…». has_property.ui_phrase.as_source «{node} with {x}» CHECKED for every owner the edge admits (US and every stratigraphic unit, Document, RMDoc, Epoch, Graph): «US with material», «Document with height», «Epoch with absolute_time_start», «Graph with license» all read; kept. With more than one owner (v1.6.23) the same phrase names an inheriting owner created from an existing property. v1.6.25 (SUPPORTO AI E VERIFICA SUI NODI, 2026-10-04, decision of E.D. 2026-09-29): human authorship with AI support — an AI proposal a person accepts stays signed by the person, with the mark «supporto AI»; what was made with AI stays among the warnings until a person verifies it with their ORCID. On NODES this lives in `data`, with the names of the narrative blocks: `ai_assisted` {model, by (AuthorAINode id), prompt_ref, fields?}, `validated_by` (AuthorNode id with data.orcid), `validated_at`. See validated_by `node_verification_note` and s3dgraphy.ai_validation. NO EDGE CHANGED: the validated_by EDGE keeps source NarrativeNode; em.ttl widens em:validatedBy's domain to crm:E1 and adds em:aiAssistedBy/aiModel/aiPromptRef/aiAssistedField/validatedAt. v1.6.24 (L'ESTRATTORE LEGGE UN'UNITA', 2026-10-04, decision of E.D. 2026-09-29, extending the proposal of 2026-09-28 on SF/RSF): extracted_from.target += StratigraphicNode — an extractor may read FROM A UNIT that itself has the property it feeds (a reused find whose material is read off the unit it comes from), and not only from a document or an annotation region. The whole StratigraphicNode family, matched by class MRO (US, USV/s, USV/n, SF, RSF, VSF, USD, serSU…). A SUGGESTION, NOT AN ERROR: when the unit read from has no property of the same name as the property the extractor feeds, api.validate reports it under `info` (diagnostics.extraction_source_hints). The extractor keeps the name <source>.<ordinal> whatever its source is (the unit's name in place of the document's). ADDITIVE: nothing narrowed, no mapping changed. v1.6.23 (PIU' PROPRIETARI, 2026-10-04, decision of E.D. 2026-09-29, revisione della scrivania v7): a PropertyNode may have MORE THAN ONE incoming has_property — one unit INSTANTIATES another's property (a USV/s takes the material of the US it completes). The property stays ONE (one value, one paradata chain) with several owners. The inheritance is DECLARED, never automatic: the inheriting has_property carries the edge attribute `inherited: true`. The property stays in the ParadataNodeGroup of its ORIGINAL owner (the one that created it); the others refer to it through their own has_property, never through a group. See has_property `owners_note`. ADDITIVE: no edge, rule or mapping changed (has_property had no cardinality). v1.6.22 (FRASI DEGLI ARCHI, 2026-09-29, decision of E.D. 2026-09-29): `ui_phrase` {as_source, as_target} on the 34 edge types an interface proposes in a menu — the phrase that names a NEW node created linked to an existing one («US above X», «Property of X», «Document for X»). It is EM language, so it lives here and not in a consumer's i18n; the translations are in datamodel_translations.json, section `edge_types` (fields `ui_phrase_as_source` / `ui_phrase_as_target`). See `_ui_phrase_note`. ADDITIVE: no edge, rule or mapping changed. v1.6.21 (PROPRIETA' DIRETTE, 2026-09-28, decision of E.D. revising v1.6.1): has_property.source += EpochNode, GraphNode. Principle: every node that accepts properties receives them DIRECTLY. The sources are now the graph itself (GraphNode), the documents (DocumentNode, RepresentationModelDocNode), every stratigraphic unit (StratigraphicNode, matched by class MRO so SF, RSF, serSU, USD, USN, USNt... are included; the USNt node_type_restriction has scope stratigraphic and does not narrow has_property) and the epochs (EpochNode). v1.6.1 had routed an epoch's absolute_time_start/end through a ParadataNodeGroup because has_property refused an EpochNode (StratiMiner epoch claims degraded to generic_connection). The ParadataNodeGroup (DP-60, E89) is NOT a mandatory passage: it is a grouping, which can be created on the fly, useful to connect something to the whole set of a node's properties (connecting to the group equals connecting to each member PropertyNode) or to one property inside it. Coherence rule (validator, not datamodel): a PropertyNode in the PNG of X (is_in_paradata_nodegroup + X has_paradata_nodegroup PNG) requires X has_property that PropertyNode. has_paradata_nodegroup.source keeps EpochNode. NOT TOUCHED, question for E.D.: the cidoc P43_has_dimension has domain E70 Thing; A8/E31/E73 satisfy it, an E4 Period does not. s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.20 (UNA GRAFIA SOLA, 2026-09-27): NEW optional field `spelling_of` on an edge entry, naming the canonical entry of which this one is an OLDER SPELLING. Meaning: the SAME relation, the SAME RDF projection, ACCEPTED WHEN READ, NEVER WRITTEN — every writer (importers, exporters, merge, inference, sync) asks the datamodel for the canonical name (connections_loader: canonical_name / is_canonical False / normalize_edge_name) instead of keeping its own list. It is NOT `deprecated`: `deprecated` drops the edge from RDF on export AND import (measured: an is_bonded_to marked deprecated leaves 0 em:bondedTo triples), which is right for has_timebranch that nobody writes and wrong for a spelling pyArchInit writes every day. Set on the two legacy physical bonds: is_bonded_to spelling_of bonded_to, is_physically_equal_to spelling_of equals. em.ttl is unchanged: it already has ONE property per pair (em:bondedTo, em:physicallyEquals) and its `Maps to:` names both spellings. The datamodel is the source of truth for names (docs/SOURCE_OF_TRUTH.md). s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.18 (CRMem WIRING, 2026-09-24): il prefisso CIDOC-S3D esce dal datamodel. Non era un namespace: era una stringa che _resolve_prefixed non risolve, quindi nessuna tripla veniva emessa da quei campi. Disposizione termine per termine: incompatibleWith -> em:contrastsWith; belongsToAlternative -> em:belongsToAlternative (is_in_timebranch e has_timebranch); hasSymbolicSpatialRepresentation -> em:hasSemanticShape; isPartOfParadataGroup e hasParadataDocumentation RIMOSSI, perche' crm:P106i_forms_part_of e crm:P129i_is_subject_of dicono gia' quello che serve una volta tipizzato il gruppo; has3DRepresentation RIMOSSO sui tre archi di rappresentazione, perche' crm:P138i_has_representation con la co-tipizzazione del target a E36_Visual_Item basta e il '3D' sta nel rdf:type del bersaglio, non nella relazione. INOLTRE contrasts_with perde crm:P15_was_influenced_by: dominio E7_Activity contro un E4_Period, e comunque un'altra proposizione. Esce sulla sola em:contrastsWith. s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.17 (CIDOC REPAIR, 2026-09-21): a pass over IRIs that do not exist. An undeclared IRI raises no error anywhere — it makes a well-formed triple that no reasoner uses and no query finds — so these were found by parsing the official releases (CIDOC CRM 7.1.3 + Supplement, CRMarchaeo 2.1.1, CRMinf 1.2.1, CRMsci 3.2, CRMdig 5.0, CRMgeo) and checking every term this file cites against them. FIXED: the nine physical-relation edges (abuts, cuts, fills, overlies, bonded_to, is_bonded_to, equals, is_physically_equal_to, generic_connection) moved from AP11_has_physical_relation to AP11_has_physical_relation_to, the name CRMarchaeo has used since 2.0 — the old one exists only in 1.4.1. is_after: crm:P120_occurs_before is not declared in CRM 7.1.3, so crmarchaeo:AP28_occurs_before — already the extension_mapping, and the same proposition — is promoted to `cidoc` and the extension_mapping cleared; rdf_subject=target is UNCHANGED and still right. has_same_time: crm:P114_is_equal_in_time_to undeclared, same promotion of AP22. changed_from: P123_resulted_from -> P123i_resulted_from (the «i» of the inverse was missing). has_geoposition: the crmgeo:Q4 extension_mapping removed, P53 alone being valid and sufficient. THREE PROJECTIONS RAN BACKWARDS, none of them declaring rdf_subject, so the exporter wrote source-first and the proposition came out reversed: is_in_paradata_nodegroup P106_is_composed_of -> P106i_forms_part_of, has_paradata_nodegroup P70_documents -> P129i_is_subject_of (the reason ParadataNodeGroup becomes E89 in the node datamodel), and is_in_activity, where P9_consists_of is removed and NOTHING replaces it: neither P9i (needs an E4 Period as subject) nor P129i (needs an E89 as object; ActivityNodeGroup is E7) holds, and the empty field is a question for E.D., not an omission. Inverse properties were preferred to rdf_subject throughout: one indirection less. ALSO, by decision of E.D.: has_first_epoch and survive_in_epoch both accept FunctionalUnitNodeGroup, so a functional unit carries its own temporal index — the asymmetry with ActivityNodeGroup, which takes the first and never the second, is meant, because an activity is an event and a functional unit is a thing that persists. «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). NOT TOUCHED and still open: the seven CIDOC-S3D properties and their extension_mappings, the E36 co-typing on has_representation_model*, and the direction of has_sub_epoch's P10_falls_within, which the repair report of the same day records as a decision for E.D. v1.6.15 (HW1, 2026-09-16): the act of acquisition gets a BODY. NEW dtc_happened_on_device — DTCNode -> DTCDeviceNode, crmdig:L12_happened_on_device — because until today the apparatus was a STRING inside how.acquisition, and a string cannot be asked «what did this machine produce», «which surveys used that scanner», «that lens was distorted, which models are affected». It attaches to the EVENT and not to the input or the output: the three dtc_kinds axes are the FLOW (what went in, what happened, what came out) and a device is what it happened ON — the distinction CRMdig draws between L12 and L10, and the one that makes the three questions askable. It is CONTEXT and carries no dtc_role, so a provenance walk does not enter it (per _dtc_role_note below). It has NO PROV-O projection on purpose: prov:used is taken by dtc_had_input and prov:Agent ranges over things that bear responsibility, which a camera does not — same honesty as the 2026-08-17 note on wasInformedBy. NOTHING IS REMOVED and nothing is narrowed. NOT DONE, and named so it is not forgotten: a rig (a sensor ON a drone) is an assembly of two devices and has no edge yet; the glyph family says it by drawing their connectors touching, which is a picture and not a statement. s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.14 (EM16-RMNG, 2026-09-10): the RM container becomes a first-class group in the graph. NEW is_in_representation_model_group — membership of a representation model in a RepresentationModelNodeGroup, on the is_in_* tag convention (is_in_activity / is_in_location / is_in_timebranch / is_in_paradata_nodegroup / is_in_functional_unit), 1:1 instead of m:n because a mesh belongs to exactly one container. WIDENED has_representation_model.target += RepresentationModelNodeGroup, so a Document points at the named set as well as at each model. NOTHING IS REMOVED: the epoch↔RM edges and the direct Document→RM edges stay written as before, without a flag and without a mode — the group sits beside and never in between (D1, resolved by E.D. on 2026-09-10). 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).",
2
+ "s3Dgraphy_connections_model_version": "1.6.34",
3
+ "description": "v1.6.34 (MICRO le traduzioni, 2026-10-29, decided by E.D. 2026-10-01): NEW has_translation / is_translation_of — any node → TranslationNode (node datamodel 1.6.20), crm:P73_has_translation, the CIDOC relation of a text to its translation. has_author.source += TranslationNode (who translated). extracted_from.source += TranslationNode: a translation taken from a published EDITION reaches the DocumentNode of that edition with the edge that already says «this text was taken from that source», instead of a second name for the same relation. v1.6.33 (MICRO la lingua dei dati, part H, 2026-10-27, decided by E.D. 2026-10-01): two em.ttl terms that had no edge now leave with the edge nearest to them. has_documentation gains extension_mapping em:derivedFromDocument, guarded by extension_when.source_node_class (DocumentaryStratigraphicUnit, SeriesOfDocumentaryStratigraphicUnit): a USD documented in a document is derived from it; every other source keeps P70i alone. is_part_of gains inverse_extension em:reconstructsFrom, written from the whole to the part (<VSF> em:reconstructsFrom <SF>) only when a SpecialFindUnit is part of a VirtualSpecialFindUnit. extension_when may now name the source class as well as the target; inverse_extension is new and read by the exporter and the importer (which skips it: the edge comes back from P46i). No edge added, no graph changed. v1.6.32 (MICRO i termini di em.ttl nel datamodel, 2026-10-26, decided by E.D. 2026-10-01): the eight edges of the AP11 physical family (abuts, cuts, fills, overlies, bonded_to, is_bonded_to, equals, is_physically_equal_to) gain mapping.subproperty, the em: subproperty of crmarchaeo:AP11_has_physical_relation_to they are written with (em:abuts, em:cuts, em:fills, em:overlies, em:bondedTo, em:physicallyEquals). Until now the pairing type_tag -> subproperty lived only in rdf_exporter.AP11_SUBPROPS; the exporter and the importer now BUILD that table from here, so a new physical relation is a datamodel change and not a code change. has_property.mapping gains when_inherited em:inheritsQualia, the subproperty the exporter already writes for an inherited owner (ownership.py). Mapping only: no edge added, nothing emitted differently. v1.6.31 (LA REVISIONE DELLA RISORSA, 2026-10-20, decision of E.D. 2026-09-30): NEW was_revision_of / had_revision — ResourceNode → ResourceNode, prov:wasRevisionOf (CIDOC projection crmdig:L21_used_as_derivation_source, as dtc_derived_from, because CRMdig has no term of its own for a revision). The name is the one the em.json container already uses for a ProjectVersion (container.py ProjectVersion.was_revision_of, projected as prov:wasRevisionOf by the RDF exporter): until now it was a FIELD of a document version, never an edge; it is widened here to resources. replace_file makes a NEW resource (same fields, the same files but the replaced one, the new file dtc_derived_from the old file) that was_revision_of the old one; the old one stays as it was, citable, and what pointed at it does not move by itself. No ui_phrase: a revision is made by replace_file, never picked from a menu. ADDITIVE: nothing narrowed. v1.6.30 (LA RISORSA E I SUOI FILE, 2026-10-18, decision of E.D. 2026-09-30): NEW has_file / is_file_of — ResourceNode → ResourceFileNode (node datamodel 1.6.17), crm:P106_is_composed_of + prov:hadMember; the edge `attributes` carry role (entry_point | member) and the path relative to the entry point, because one file sits in several resources under different paths. dtc_derived_from.source/target += ResourceFileNode, so a corrected texture declares the texture it comes from. Representations of the same thing (the datablock in the .blend as master, an OBJ export as distribution) are sibling ResourceNodes tied by dtc_derived_from: no new edge. NO REVISION EDGE exists for resources (measured: none of the 56 edges says «is a revision of»); replace_file keeps the old file and declares the new one derived from it, and the missing edge is reported, not invented. ADDITIVE: nothing narrowed. v1.6.29 (LA GEOMETRIA PER ORIGINE, 2026-10-11, decision of E.D. 2026-09-30): the vertices of a point / line / polyline reading are data of the region (node datamodel 1.6.15, data.coords); has_semantic_shape no longer carries a reading's .glb (the 1.6.27 hinge is migrated on opening). has_linked_resource.source += AnnotationRegionNode: above coords.inline_max_vertices (500) the vertices go to a .glb RESOURCE the region reaches with has_linked_resource (P67), as a proxy's shape and an RM do. ADDITIVE: nothing narrowed. v1.6.28 (IL PROXY COME RISORSA, 2026-10-11, decision of E.D. 2026-09-30): the proxy is a property of the US and its .glb is a RESOURCE. has_linked_resource.source += SemanticShapeNode: the shape reaches its glb with has_linked_resource -> ResourceNode(url_type proxy_model), the same hinge a Representation Model uses for its bytes (P67_refers_to), instead of carrying the path in its own url. SemanticShape.url is READ, never written: on opening, a shape with a url and no resource gets one (geometry/migrate.py, uuid5, idempotent), which also covers the older form EMtools still writes (US -has_semantic_shape-> shape with url proxies/<US>.glb). Convex hulls and spheres stay in the shape's data and ask for no resource. ADDITIVE: nothing narrowed. v1.6.27 (LA GEOMETRIA DELLA LETTURA, 2026-10-06, decision of E.D. 2026-09-29): the place of a reading is ONE node, AnnotationRegion with geometry_kind (region2d | passage | point | line | polyline; node datamodel 1.6.10). The chain is extractor -extracted_from-> region -is_on_resource-> what it is on, for every kind. is_on_resource.target += RepresentationModelNode, RepresentationModelDocNode, RepresentationModelSpecialFindNode: a point/line/polyline sits on a 3D model — the one edge that was missing. NO NEW EDGE for the .glb: the region reaches it with has_semantic_shape (source 'Node', already legal), the hinge a proxy uses (Property(geometry) -> SemanticShape.url). has_linked_resource was measured and NOT used: its source does not admit an AnnotationRegion, and it is the RM's hinge to a file, not a proxy's. ADDITIVE: nothing narrowed. s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.26 (DUE FRASI, 2026-10-04, E.D. 2026-09-29): combines.ui_phrase.as_source «{node} combining {x}» → «{node} of {x}» — the new node is the combiner and {x} the extractor it combines, and «Combiner combining D.3.1» said the verb twice; the eight other languages already read «di/de/von…». has_property.ui_phrase.as_source «{node} with {x}» CHECKED for every owner the edge admits (US and every stratigraphic unit, Document, RMDoc, Epoch, Graph): «US with material», «Document with height», «Epoch with absolute_time_start», «Graph with license» all read; kept. With more than one owner (v1.6.23) the same phrase names an inheriting owner created from an existing property. v1.6.25 (SUPPORTO AI E VERIFICA SUI NODI, 2026-10-04, decision of E.D. 2026-09-29): human authorship with AI support — an AI proposal a person accepts stays signed by the person, with the mark «supporto AI»; what was made with AI stays among the warnings until a person verifies it with their ORCID. On NODES this lives in `data`, with the names of the narrative blocks: `ai_assisted` {model, by (AuthorAINode id), prompt_ref, fields?}, `validated_by` (AuthorNode id with data.orcid), `validated_at`. See validated_by `node_verification_note` and s3dgraphy.ai_validation. NO EDGE CHANGED: the validated_by EDGE keeps source NarrativeNode; em.ttl widens em:validatedBy's domain to crm:E1 and adds em:aiAssistedBy/aiModel/aiPromptRef/aiAssistedField/validatedAt. v1.6.24 (L'ESTRATTORE LEGGE UN'UNITA', 2026-10-04, decision of E.D. 2026-09-29, extending the proposal of 2026-09-28 on SF/RSF): extracted_from.target += StratigraphicNode — an extractor may read FROM A UNIT that itself has the property it feeds (a reused find whose material is read off the unit it comes from), and not only from a document or an annotation region. The whole StratigraphicNode family, matched by class MRO (US, USV/s, USV/n, SF, RSF, VSF, USD, serSU…). A SUGGESTION, NOT AN ERROR: when the unit read from has no property of the same name as the property the extractor feeds, api.validate reports it under `info` (diagnostics.extraction_source_hints). The extractor keeps the name <source>.<ordinal> whatever its source is (the unit's name in place of the document's). ADDITIVE: nothing narrowed, no mapping changed. v1.6.23 (PIU' PROPRIETARI, 2026-10-04, decision of E.D. 2026-09-29, revisione della scrivania v7): a PropertyNode may have MORE THAN ONE incoming has_property — one unit INSTANTIATES another's property (a USV/s takes the material of the US it completes). The property stays ONE (one value, one paradata chain) with several owners. The inheritance is DECLARED, never automatic: the inheriting has_property carries the edge attribute `inherited: true`. The property stays in the ParadataNodeGroup of its ORIGINAL owner (the one that created it); the others refer to it through their own has_property, never through a group. See has_property `owners_note`. ADDITIVE: no edge, rule or mapping changed (has_property had no cardinality). v1.6.22 (FRASI DEGLI ARCHI, 2026-09-29, decision of E.D. 2026-09-29): `ui_phrase` {as_source, as_target} on the 34 edge types an interface proposes in a menu — the phrase that names a NEW node created linked to an existing one («US above X», «Property of X», «Document for X»). It is EM language, so it lives here and not in a consumer's i18n; the translations are in datamodel_translations.json, section `edge_types` (fields `ui_phrase_as_source` / `ui_phrase_as_target`). See `_ui_phrase_note`. ADDITIVE: no edge, rule or mapping changed. v1.6.21 (PROPRIETA' DIRETTE, 2026-09-28, decision of E.D. revising v1.6.1): has_property.source += EpochNode, GraphNode. Principle: every node that accepts properties receives them DIRECTLY. The sources are now the graph itself (GraphNode), the documents (DocumentNode, RepresentationModelDocNode), every stratigraphic unit (StratigraphicNode, matched by class MRO so SF, RSF, serSU, USD, USN, USNt... are included; the USNt node_type_restriction has scope stratigraphic and does not narrow has_property) and the epochs (EpochNode). v1.6.1 had routed an epoch's absolute_time_start/end through a ParadataNodeGroup because has_property refused an EpochNode (StratiMiner epoch claims degraded to generic_connection). The ParadataNodeGroup (DP-60, E89) is NOT a mandatory passage: it is a grouping, which can be created on the fly, useful to connect something to the whole set of a node's properties (connecting to the group equals connecting to each member PropertyNode) or to one property inside it. Coherence rule (validator, not datamodel): a PropertyNode in the PNG of X (is_in_paradata_nodegroup + X has_paradata_nodegroup PNG) requires X has_property that PropertyNode. has_paradata_nodegroup.source keeps EpochNode. NOT TOUCHED, question for E.D.: the cidoc P43_has_dimension has domain E70 Thing; A8/E31/E73 satisfy it, an E4 Period does not. s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.20 (UNA GRAFIA SOLA, 2026-09-27): NEW optional field `spelling_of` on an edge entry, naming the canonical entry of which this one is an OLDER SPELLING. Meaning: the SAME relation, the SAME RDF projection, ACCEPTED WHEN READ, NEVER WRITTEN — every writer (importers, exporters, merge, inference, sync) asks the datamodel for the canonical name (connections_loader: canonical_name / is_canonical False / normalize_edge_name) instead of keeping its own list. It is NOT `deprecated`: `deprecated` drops the edge from RDF on export AND import (measured: an is_bonded_to marked deprecated leaves 0 em:bondedTo triples), which is right for has_timebranch that nobody writes and wrong for a spelling pyArchInit writes every day. Set on the two legacy physical bonds: is_bonded_to spelling_of bonded_to, is_physically_equal_to spelling_of equals. em.ttl is unchanged: it already has ONE property per pair (em:bondedTo, em:physicallyEquals) and its `Maps to:` names both spellings. The datamodel is the source of truth for names (docs/SOURCE_OF_TRUTH.md). s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.18 (CRMem WIRING, 2026-09-24): il prefisso CIDOC-S3D esce dal datamodel. Non era un namespace: era una stringa che _resolve_prefixed non risolve, quindi nessuna tripla veniva emessa da quei campi. Disposizione termine per termine: incompatibleWith -> em:contrastsWith; belongsToAlternative -> em:belongsToAlternative (is_in_timebranch e has_timebranch); hasSymbolicSpatialRepresentation -> em:hasSemanticShape; isPartOfParadataGroup e hasParadataDocumentation RIMOSSI, perche' crm:P106i_forms_part_of e crm:P129i_is_subject_of dicono gia' quello che serve una volta tipizzato il gruppo; has3DRepresentation RIMOSSO sui tre archi di rappresentazione, perche' crm:P138i_has_representation con la co-tipizzazione del target a E36_Visual_Item basta e il '3D' sta nel rdf:type del bersaglio, non nella relazione. INOLTRE contrasts_with perde crm:P15_was_influenced_by: dominio E7_Activity contro un E4_Period, e comunque un'altra proposizione. Esce sulla sola em:contrastsWith. s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.17 (CIDOC REPAIR, 2026-09-21): a pass over IRIs that do not exist. An undeclared IRI raises no error anywhere — it makes a well-formed triple that no reasoner uses and no query finds — so these were found by parsing the official releases (CIDOC CRM 7.1.3 + Supplement, CRMarchaeo 2.1.1, CRMinf 1.2.1, CRMsci 3.2, CRMdig 5.0, CRMgeo) and checking every term this file cites against them. FIXED: the nine physical-relation edges (abuts, cuts, fills, overlies, bonded_to, is_bonded_to, equals, is_physically_equal_to, generic_connection) moved from AP11_has_physical_relation to AP11_has_physical_relation_to, the name CRMarchaeo has used since 2.0 — the old one exists only in 1.4.1. is_after: crm:P120_occurs_before is not declared in CRM 7.1.3, so crmarchaeo:AP28_occurs_before — already the extension_mapping, and the same proposition — is promoted to `cidoc` and the extension_mapping cleared; rdf_subject=target is UNCHANGED and still right. has_same_time: crm:P114_is_equal_in_time_to undeclared, same promotion of AP22. changed_from: P123_resulted_from -> P123i_resulted_from (the «i» of the inverse was missing). has_geoposition: the crmgeo:Q4 extension_mapping removed, P53 alone being valid and sufficient. THREE PROJECTIONS RAN BACKWARDS, none of them declaring rdf_subject, so the exporter wrote source-first and the proposition came out reversed: is_in_paradata_nodegroup P106_is_composed_of -> P106i_forms_part_of, has_paradata_nodegroup P70_documents -> P129i_is_subject_of (the reason ParadataNodeGroup becomes E89 in the node datamodel), and is_in_activity, where P9_consists_of is removed and NOTHING replaces it: neither P9i (needs an E4 Period as subject) nor P129i (needs an E89 as object; ActivityNodeGroup is E7) holds, and the empty field is a question for E.D., not an omission. Inverse properties were preferred to rdf_subject throughout: one indirection less. ALSO, by decision of E.D.: has_first_epoch and survive_in_epoch both accept FunctionalUnitNodeGroup, so a functional unit carries its own temporal index — the asymmetry with ActivityNodeGroup, which takes the first and never the second, is meant, because an activity is an event and a functional unit is a thing that persists. «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). NOT TOUCHED and still open: the seven CIDOC-S3D properties and their extension_mappings, the E36 co-typing on has_representation_model*, and the direction of has_sub_epoch's P10_falls_within, which the repair report of the same day records as a decision for E.D. v1.6.15 (HW1, 2026-09-16): the act of acquisition gets a BODY. NEW dtc_happened_on_device — DTCNode -> DTCDeviceNode, crmdig:L12_happened_on_device — because until today the apparatus was a STRING inside how.acquisition, and a string cannot be asked «what did this machine produce», «which surveys used that scanner», «that lens was distorted, which models are affected». It attaches to the EVENT and not to the input or the output: the three dtc_kinds axes are the FLOW (what went in, what happened, what came out) and a device is what it happened ON — the distinction CRMdig draws between L12 and L10, and the one that makes the three questions askable. It is CONTEXT and carries no dtc_role, so a provenance walk does not enter it (per _dtc_role_note below). It has NO PROV-O projection on purpose: prov:used is taken by dtc_had_input and prov:Agent ranges over things that bear responsibility, which a camera does not — same honesty as the 2026-08-17 note on wasInformedBy. NOTHING IS REMOVED and nothing is narrowed. NOT DONE, and named so it is not forgotten: a rig (a sensor ON a drone) is an assembly of two devices and has no edge yet; the glyph family says it by drawing their connectors touching, which is a picture and not a statement. s3Dgraphy connections datamodel including edge types with CIDOC-CRM mappings. v1.6.14 (EM16-RMNG, 2026-09-10): the RM container becomes a first-class group in the graph. NEW is_in_representation_model_group — membership of a representation model in a RepresentationModelNodeGroup, on the is_in_* tag convention (is_in_activity / is_in_location / is_in_timebranch / is_in_paradata_nodegroup / is_in_functional_unit), 1:1 instead of m:n because a mesh belongs to exactly one container. WIDENED has_representation_model.target += RepresentationModelNodeGroup, so a Document points at the named set as well as at each model. NOTHING IS REMOVED: the epoch↔RM edges and the direct Document→RM edges stay written as before, without a flag and without a mode — the group sits beside and never in between (D1, resolved by E.D. on 2026-09-10). 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",
6
6
  "CRMarchaeo",
@@ -660,13 +660,15 @@
660
660
  },
661
661
  "allowed_connections": {
662
662
  "source": [
663
- "ExtractorNode"
663
+ "ExtractorNode",
664
+ "TranslationNode"
664
665
  ],
665
666
  "target": [
666
667
  "DocumentNode",
667
668
  "AnnotationRegionNode",
668
669
  "StratigraphicNode"
669
- ]
670
+ ],
671
+ "_note": "WIDENED 2026-10-29 (connections 1.6.34): TranslationNode as a SOURCE, for a translation taken from a published edition (E.D. 2026-10-01: «una traduzione pubblicata è una fonte»). Measured first: the source was ExtractorNode alone, so the domain did not admit it. Widened rather than a new edge for the reason the 1.6.10 widening gives: the relation «this text was taken from that document» already has a name, and a reader following a chain would otherwise have to know two. The CRM reading holds — the translation P67_refers_to the edition, and as evidence (CRMinf J7) a translator's text is read the way an extractor's passage is. The target stays DocumentNode for a translation (an edition is a document); a translation is NOT an extractor: it feeds no property, and its ordinal is not counted with the extractors of a document."
670
672
  }
671
673
  },
672
674
  "combines": {
@@ -811,7 +813,8 @@
811
813
  "EpochNode",
812
814
  "DTCNode",
813
815
  "NarrativeNode",
814
- "ResourceNode"
816
+ "ResourceNode",
817
+ "TranslationNode"
815
818
  ],
816
819
  "target": [
817
820
  "AuthorNode",
@@ -820,6 +823,34 @@
820
823
  "_note": "SOURCE WIDENED 2026-08-17 (batch ingestion): DTCProcessNode -> DTCNode, the DTC event BASE class, so an ACQUISITION (DTCAcquisitionNode, D12) can carry an author too — the same fix already applied to dtc_had_input/dtc_had_output for the same reason. A campaign of four hundred photographs is attributed ONCE, on the event that brought them in, and the reader (s3dgraphy.rights) already walks the chain to find it; without this the batch attribution silently degraded to generic_connection and the licence became unreadable."
821
824
  }
822
825
  },
826
+ "has_translation": {
827
+ "name": "has_translation",
828
+ "label": "Has translation",
829
+ "description": "A node has a TRANSLATION of one of its text fields (E.D. 2026-10-01, «Le traduzioni»): the source is the node whose original stays in its field, the target the TranslationNode that holds the text in another language, with who, when, how and of which original (data.field, data.lang, data.from_lang, data.method, data.source_digest). The original is never overwritten: a translation is testimony beside it. A node may have many translations — several languages, several translators of the same language, a manual one beside an edition's.",
830
+ "reverse": {
831
+ "name": "is_translation_of",
832
+ "label": "Is translation of"
833
+ },
834
+ "ui_phrase": {
835
+ "as_source": "{node} translated as {x}",
836
+ "as_target": "{node} translation of {x}"
837
+ },
838
+ "mapping": {
839
+ "cidoc": "P73_has_translation",
840
+ "cidoc_extension": "CIDOC-CRM",
841
+ "extension_mapping": null,
842
+ "extension_name": null,
843
+ "rationale": "crm:P73_has_translation (E33 Linguistic Object → E33): the CIDOC relation of a text to its translation, same direction as the edge. STRICTLY its domain is the TEXT, not the node that holds it — a US is not an E33, its description is — and EM keeps the text as a field of the node (the original is a string, ~475 readers depend on it), so the node stands for its field here, and which field is data.field of the translation. Not minted as an em: subproperty: the CIDOC term exists. The translation also leaves prov:wasDerivedFrom → the node (rdf_exporter), the PROV reading of the same fact, which the importer reads as this edge's companion, never as an edge."
844
+ },
845
+ "allowed_connections": {
846
+ "source": [
847
+ "Node"
848
+ ],
849
+ "target": [
850
+ "TranslationNode"
851
+ ]
852
+ }
853
+ },
823
854
  "has_geoposition": {
824
855
  "name": "has_geoposition",
825
856
  "label": "Has geoposition",
@@ -1116,8 +1147,15 @@
1116
1147
  "mapping": {
1117
1148
  "cidoc": "P70i_is_documented_in",
1118
1149
  "cidoc_extension": "CIDOC-CRM",
1119
- "extension_mapping": null,
1120
- "extension_name": null,
1150
+ "extension_mapping": "em:derivedFromDocument",
1151
+ "extension_name": "CRMem",
1152
+ "extension_when": {
1153
+ "source_node_class": [
1154
+ "DocumentaryStratigraphicUnit",
1155
+ "SeriesOfDocumentaryStratigraphicUnit"
1156
+ ],
1157
+ "_comment": "1.6.33 (MICRO la lingua dei dati, part H, decided by E.D. 2026-10-01): em:derivedFromDocument has domain em:DocumentaryVirtualSU — the USD, whose EXISTENCE is inferred from the document — so it goes out beside P70i only when the documented unit is a USD (or a series of USD, em:SeriesOfDocumentaryVirtualSU, a subclass of it in em.ttl). From a US, a SF or a property the edge says 'documented in' and nothing more: P70i alone, as before. The guard is on the SOURCE class, the side the domain constrains, as is_part_of's is on the target."
1158
+ },
1121
1159
  "rationale": "P70i_is_documented_in (inverse of P70_documents) is the canonical CRM predicate to link an entity to a document about it. Earlier v1.5.5 used P104_is_subject_to which is semantically wrong (P104 means 'subject to a legal right or rule', not 'has documentation about it'). v1.6.7 (BUGFIX-CONN3): PropertyNode added to source — a property (an asserted quale) may be documented in a source-document (P70i reads true). This is the honest reading of a legacy yEd dashed connector PropertyNode→Document, now that has_visual_reference (CONN2) points at a ResourceNode image and no longer at a Document. Widening is deliberately limited to PropertyNode: a CombinerNode aggregates extractors and a bare ParadataNode carry no documentation relation, so those legacy endpoints are left as generic_connection with a warning at import rather than asserting P70i (the DTC evidence chain property<-combiner<-extractor->document is NOT synthesised at import)."
1122
1160
  },
1123
1161
  "allowed_connections": {
@@ -1213,6 +1251,18 @@
1213
1251
  ],
1214
1252
  "_comment": "AP21i ranges STRICTLY over A2 Stratigraphic Volume Unit, and in this datamodel only StratigraphicUnit (US) maps to A2: DocumentaryStratigraphicUnit and the virtual units map to A8 Stratigraphic Unit, VirtualSpecialFindUnit to E89/E19, FunctionalUnitNodeGroup to E24. Emitting AP21i at those targets would be range-inconsistent, so the extension predicate is emitted only when the container is a US. The core P46i goes out for every containment regardless. FORWARD NOTE (2026-09-25, E.D.): this condition is tied to A2, not to the US as such. CRMba 1.4 declares B5 Stratigraphic Building Unit a SUBCLASS OF A2 — the very term the built-heritage gap points at, the one that would stop masonry and revetment units flattening onto the soil-unit type — so the day that subtyping is adopted, whatever node class carries B5 must be added here or the refinement switches itself off on exactly the masonry case. CRMba is NOT adopted today and is deliberately absent from referenced_ontology_versions: version 1.4 is a draft of April 2016, five classes, and it aligns itself to CRMarchaeo 2.0 and CRMsci 2.0, both earlier than the releases this datamodel is audited against."
1215
1253
  },
1254
+ "inverse_extension": {
1255
+ "predicate": "em:reconstructsFrom",
1256
+ "when": {
1257
+ "source_node_class": [
1258
+ "SpecialFindUnit"
1259
+ ],
1260
+ "target_node_class": [
1261
+ "VirtualSpecialFindUnit"
1262
+ ]
1263
+ },
1264
+ "_comment": "1.6.33 (MICRO la lingua dei dati, part H, decided by E.D. 2026-10-01): a fragment (SF) that is part of a reassembled virtual find (VSF) says, read from the other side, that the VSF is reconstructed FROM it — em:reconstructsFrom, domain em:VirtualSpecialFind (VirtualSpecialFindUnit), range em:DisplacedSpecialFind (SpecialFindUnit). Written <VSF> em:reconstructsFrom <SF>, i.e. object and subject of the core triple swapped, and only for that pair of classes: a SF inside a US, or a VSF inside a wall, is containment and nothing more. A restatement of the same edge: the RDF importer reads the edge from P46i and skips this triple."
1265
+ },
1216
1266
  "rationale": "P46i_forms_part_of is the correct GENERIC projection and stays: containment in EM is mereological. It is however weaker than what CRMarchaeo offers for the archaeologically central case — an object found inside a stratigraphic unit. AP21 contains / AP21i is contained in is the CRMarchaeo shortcut for the full path E18 -AP18i- A7 Embedding -AP19- A2, and A7 Embedding's scope note covers exactly the distinction that matters here: an embedding is normally stable from the generation of the A2 that surrounds it, but 'may also be due to later intrusion'. Emitting AP21i beside P46i is a REFINEMENT, not a correction: AP18 is declared rdfs:subPropertyOf P46_is_composed_of in CRMarchaeo v2.1.1, so readers of P46 keep seeing what they saw and no existing export is invalidated. REPAIR 2026-09-25: the slot previously held P46_is_composed_of, the INVERSE of the core predicate. The exporter emits the extension with the same subject and object as the core, so every containment was also asserting that the part is composed of the whole. Same fault found and fixed in is_in_functional_unit and is_in_representation_model_group."
1217
1267
  },
1218
1268
  "allowed_connections": {