s3dgraphy 1.6.0.dev26__tar.gz → 1.6.0.dev27__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.
- {s3dgraphy-1.6.0.dev26/src/s3dgraphy.egg-info → s3dgraphy-1.6.0.dev27}/PKG-INFO +1 -1
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/pyproject.toml +1 -1
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/em.ttl +70 -3
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/em_qualia_types.json +5 -3
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/node_registry.generated.json +1 -1
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json +8 -6
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/s3Dgraphy_node_datamodel.json +28 -5
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/__init__.py +1 -1
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/ai_validation.py +37 -8
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/api.py +136 -29
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/crdt.py +50 -4
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/editorial.py +58 -5
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/rdf_exporter.py +91 -1
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/importer/mapped_xlsx_importer.py +7 -7
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/importer/rdf_importer.py +62 -1
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/language.py +133 -26
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/mappings/authoring.py +11 -11
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/mappings/emdb/generic_specialfind_mapping.json +2 -2
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/mappings/emdb/site_properties_mapping.json +2 -2
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/mappings/emdb/usm_mapping.json +2 -2
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/mappings/generic/excel_to_graphml_mapping.json +2 -2
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/mappings/pyarchinit/pyarchinit_us_mapping.json +2 -2
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/mappings/source_list/source_list_mapping.json +2 -2
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/mappings/template_emdb_mapping.json +2 -2
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/mappings/template_pyarchinit_mapping.json +2 -2
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/publication.py +13 -0
- s3dgraphy-1.6.0.dev27/src/s3dgraphy/resources/addresses.py +226 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/resources/resolver.py +11 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/translation.py +96 -2
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27/src/s3dgraphy.egg-info}/PKG-INFO +1 -1
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy.egg-info/SOURCES.txt +6 -0
- s3dgraphy-1.6.0.dev27/tests/test_dove_sta_il_testo.py +128 -0
- s3dgraphy-1.6.0.dev27/tests/test_il_modo_d_accesso.py +112 -0
- s3dgraphy-1.6.0.dev27/tests/test_il_riallineamento.py +171 -0
- s3dgraphy-1.6.0.dev27/tests/test_la_lingua_alla_nascita.py +190 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_la_lingua_dei_dati.py +6 -3
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_la_riga_d_intestazione.py +8 -4
- s3dgraphy-1.6.0.dev27/tests/test_piu_indirizzi.py +180 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_qualia_dai_d7_d8.py +2 -2
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_resource_file_node.py +3 -3
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_resource_revision.py +5 -4
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/LICENSE +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/MANIFEST.in +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/README.md +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/setup.cfg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/acquisition_descriptor.schema.json +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/acquisition_mappings/ercolano.json +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/acquisition_mappings/fs.json +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/acquisition_mappings/uri.json +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/datamodel_translations.json +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/em_document_types.json +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/em_extractor_types.json +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/em_palette_icons.json +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/em_qualia_types_additions.json +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/em_visual_rules.json +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/hdto_extension.ttl +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/new_qualia_template.json +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/outdated_s3dgraphy.ttl +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/outdated_s3dgraphy_nomapping.ttl +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json.v155.bak +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/ActivityNodeGroup.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/EpochNode.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/ParadataNodeGroup.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/RSF.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/RSF.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/SE.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/SE_old.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/SE_old.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/SF.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/SF.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/TSU.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/US.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/US.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/USD.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/USD.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/USVn.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/USVn.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/USVs.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/USVs.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/UTR.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/VSF.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/VSF.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/author.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/author.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/author_ai.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/author_ai.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/combiner.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/combiner.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/continuity.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/continuity.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/document.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/document.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/00_transformation.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/01_topographicnetwork.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/02_pointcloud.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/03_mesh.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/04_points.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/05_lines.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/06_polygons.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/07_DEM.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/08_ortophoto.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/09_photos.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/10_laserscanner.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_computer.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_drone.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_gnss.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_optical.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_scanner.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_sensor.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_station.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/12_gnss_survey.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/13_field_drawing.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/14_recording_sheet.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/15_decimation.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/16_georeferencing.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/17_format_conversion.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/18_classification.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/dtc/19_vectorization.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/embargo.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/embargo.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/extractor.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/extractor.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/gcp_set.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/generic_node.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/geo_position.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/graph.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/license.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/license.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/link.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/narrative.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/narrative.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/play.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/property.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/property.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/registration_transform.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/representation_model.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/representation_model_doc.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/representation_model_sf.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/resource_file.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/semantic_shape.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/serSU.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/serSU.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/serUSD.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/serUSV.png +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/serUSVn.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/2D/serUSVs.svg +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/3D/RSF.glb +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/3D/SF.glb +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/3D/TSU.glb +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/3D/US.glb +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/3D/USD.glb +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/3D/USVn.glb +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/3D/USVs.glb +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/3D/VSF.glb +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/3D/combiner.glb +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/3D/continuity.glb +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/3D/document.glb +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/3D/extractor.glb +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/3D/property.glb +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/3D/serSU.glb +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/3D/serUSD.glb +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/src/3D/serUSV.glb +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/acquisition/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/acquisition/acquire.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/acquisition/descriptor.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/acquisition/mapping.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/annotation/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/annotation/migrate_reading.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/annotation/paradata.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/annotation/reading.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/authorities/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/authorities/resolver.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/authorities/snapshots/LICENSE +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/authorities/snapshots/chronontology.jsonld +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/authorities/snapshots/getty_aat.jsonld +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/authorities/snapshots/getty_tgn.jsonld +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/authorities/snapshots/periodo.jsonld +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/authorities/snapshots/provenance.json +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/classification.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/container.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/contract/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/contract/connector.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/contract/consumer.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/contract/core.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/contract/reference.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/data/StratiMiner_Extraction_Prompt.md +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/datamodel.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/diagnostics.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/dissemination.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/dtc/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/dtc/capture.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/dtc/corpus.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/dtc/devices.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/dtc/ingest.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/dtc/neighbourhood.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/dtc/residency.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/edges/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/edges/connection_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/edges/connections_loader.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/edges/edge.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/docx_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/emjson_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/graphml/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/graphml/canvas_generator.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/graphml/edge_generator.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/graphml/epoch_generator.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/graphml/graphml_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/graphml/graphml_patcher.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/graphml/group_node_generator.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/graphml/node_generator.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/graphml/node_registry.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/graphml/palette_resources.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/graphml/paradata_generator.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/graphml/paradata_image_generator.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/graphml/paradata_node_generators.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/graphml/table_node_generator.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/graphml/utils.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/html_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/ipynb_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/json_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/latex_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/exporter/unified_xlsx_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/geometry/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/geometry/aton.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/geometry/gltf.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/geometry/migrate.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/geometry/proxy.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/geometry/reading_glb.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/geometry/store_backed.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/geometry/wkt.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/graph.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/iiif.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/importer/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/importer/base_importer.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/importer/csv_importer.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/importer/emjson_importer.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/importer/fmpxml_importer.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/importer/import_graphml.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/importer/pyarchinit_importer.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/importer/qualia_importer.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/importer/sheet_header.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/importer/source_text.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/importer/unified_xlsx_importer.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/importer/xlsx_importer.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/importer/xml_importer.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/indices.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/mappings/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/mappings/registry.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/merge/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/merge/graph_merger.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/multigraph/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/multigraph/multigraph.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/narrative/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/narrative/bake.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/narrative/generation.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/narrative/query.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/narrative/registry.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/narrative/site_story.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/annotation_region_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/author_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/base_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/combiner_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/document_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/dtc_acquisition_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/dtc_device_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/dtc_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/dtc_process_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/embargo_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/epoch_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/extractor_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/geo_position_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/georeferencing_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/graph_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/group_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/hdt_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/heritage_entity_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/license_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/narrative_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/paradata_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/project_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/property_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/representation_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/resource_file_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/resource_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/semantic_shape_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/stratigraphic_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/study_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/nodes/translation_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/ownership.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/photogrammetry/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/photogrammetry/delta.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/resolvers/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/resolvers/builtin_rules.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/resolvers/property_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/resources/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/resources/files.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/resources/fs_backend.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/resources/minio_backend.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/resources/tiles3tz.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/rights.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/shelf/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/shelf/core.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/stamp/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/stamp/absorb.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/stamp/emit.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/stamp/hints.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/stamp/identity.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/study.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/_db_handle.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/_legacy_paradata_svgs.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/_workspace.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/conflict_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/edge_registry.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/graph_ingestor.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/graph_projector.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/graphml_writer.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/group_projector.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/group_store.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/ingest_result.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/paradata_store.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/pyarchinit_pg_importer.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/rapporti.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/uuid7.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/vocab_provider_core.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/vocab_types.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/yed_classifier.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/yed_detector.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/yed_group_walker.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/yed_import_pipeline.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/yed_rapporti_policy.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/sync/yed_table_parser.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/templates/em_data_template.xlsx +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/templates/em_palette_template.graphml +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/temporal/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/temporal/inference_engine.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/tools/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/tools/consumer_drift.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/tools/datamodel_i18n.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/tools/deliverable_report.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/tools/glyph_sheet.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/tools/glyphs_from_svg.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/tools/sync_node_datamodel.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/tools/wheel_drift.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/transforms/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/transforms/aux_tracking.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/transforms/compact.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/transforms/materialize_continuity.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/utils/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/utils/utils.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/utils/visual_layout.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/zero_hour.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy.egg-info/dependency_links.txt +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy.egg-info/requires.txt +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy.egg-info/top_level.txt +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_acquisition.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_acquisition_fs.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_add_resource.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_ai_validation_nodes.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_api_surface.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_asset_dtc_protocol.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_aton_shapes.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_attach_only.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_authority_projection.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_authority_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_blend_locator.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_canonical_document_rename.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_canvas_metadata_import.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_capture_acquisition.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_capture_rdf_class.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_chronology_on_request.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_coating_unit.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_composite_node_name.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_connection_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_consumer_drift.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_container.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_containment_tpq.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_contract.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_contract_consumer.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_convert_command.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_crdt.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_datamodel_fingerprint.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_datamodel_i18n.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_deterministic_ids.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_devices.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_dissemination_tombstones.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_dtc_corpus.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_dtc_ingest.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_dtc_neighbourhood.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_dtc_projection.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_dtc_residency.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_edge_ui_phrases.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_editorial.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_em_ttl_matches_the_datamodels.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_emjson_roundtrip.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_emjson_schema_version.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_epoch_properties_and_sub_epochs.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_epoch_undated_import.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_explicit_node_type_marker.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_extracted_from_unit.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_filtered_import.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_fmpxml_importer.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_fs_backend.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_functional_units.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_georeference_scene.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_gltf_stitch.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_glyph_paths.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_graph_indices_edges.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_graph_scope_migration.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_hdto_projection.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_header_key_aliases.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_iiif.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_il_proprietario_si_legge.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_importer_edge_hygiene.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_ipynb_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_latex_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_le_traduzioni.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_lossless_roundtrip.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_mapping_authoring.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_mapping_csv_and_relations.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_masonry_unit.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_material_color.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_merge_conflicts.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_migrate_legacy_proxy.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_minio_backend.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_narrative_authorship.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_narrative_bake_docx.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_narrative_figures.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_narrative_generation.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_narrative_mentions.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_narrative_node.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_narrative_query.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_narrative_scaffolder.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_narrative_site_place.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_narrative_unvalidated_export.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_node_datamodel_registry.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_node_type_map_integrity.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_one_spelling_writers.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_pg_importer.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_photogrammetry_delta.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_physical_relation_spellings.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_promotion.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_property_owners.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_proxy_resource.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_proxy_retype.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_pyarchinit_tier2.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_rdf_embedding.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_rdf_reverse_edges.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_rdf_roundtrip.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_reading_coords.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_reading_glb.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_reading_migration.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_reading_place.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_reading_rdf.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_recompute_warnings.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_reproject.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_resource_files_implicit.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_resource_layer.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_resource_representations.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_resource_tier.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_reverse_edges.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_rm_container_node_group.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_semantic_purity.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_shelf.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_shelf_facets.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_shelf_hatting.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_shelf_role_uri_table.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_shipped_mappings.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_source_list_mapping.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_source_text.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_stamp.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_stamp_hints.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_stamp_title_description.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_store_backed_geometry.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_stratiminer_api.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_study_metadata.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_tileset_resource.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_ttl_roundtrip.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_unit_definition.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_verifica_provenance.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_visual_assets.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_wheel_drift.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_xlsx_containment_and_unknown_bounds.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_xlsx_importer_graph_init.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/tests/test_xlsx_source_column.py +0 -0
- {s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/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.
|
|
3
|
+
Version: 1.6.0.dev27
|
|
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>
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "s3dgraphy"
|
|
7
|
-
version = "1.6.0.
|
|
7
|
+
version = "1.6.0.dev27"
|
|
8
8
|
description = "3D Stratigraphic Graph Management Library for archaeological and heritage applications"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
@@ -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.
|
|
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 ;
|
|
49
|
+
owl:versionInfo "1.6.11" ;
|
|
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.11 (2026-10-31, dev27, decided by E.D. 2026-10-01): ten properties. Section 15, several addresses of ONE resource (em:hasAddress to <resource>/address/<i>, em:locator, em:checkedAt, em:reachable) and a dated digest (em:checksumAt); section 16, how the hand of a signature had entered (em:createdVia, em:modifiedVia, em:validatedVia to <node>/auth/<stamp>, em:authMode orcid | node_password, em:attestedBy the StratiGraph node). The language of the content of a resource leaves as dcterms:language: no em: term. v1.6.10 (2026-10-29, MICRO le traduzioni, decided by E.D. 2026-10-01): six DatatypeProperties for the language of the original and its translations (section 14) — em:originalLanguage on any node, which says which literal is the original once translations share its predicate, and em:sourceLanguage, em:translatedField, em:translationMethod, em:sourceDigest, em:reviewRequested on a TranslationNode, which is a plain crm:E33_Linguistic_Object reached by crm:P73_has_translation: CIDOC has the class and the relation, so no em: class is added. v1.6.9 (2026-10-18, MICRO la risorsa e i suoi file): em:ResourceFile, ONE FILE of a resource (node datamodel 1.6.17), a subclass of crmdig:D1_Digital_Object; the resource is composed of its files by crm:P106_is_composed_of (connections has_file, 1.6.30). A distinct URI because a DTC output resource is already typed crmdig:D1, and a file typed only D1 would read back as a resource. v1.6.2 (2026-09-21, CIDOC repair pass): the eight terms the datamodels cited and this file never defined are declared in section 12; em:NodeGroup and em:ParadataNodeGroup leave the undeclared crm:E78_Collection for crm:E73_Information_Object and crm:E89_Propositional_Object; em:SemanticShape leaves crmgeo:SP5 for crm:E73_Information_Object, provisionally; crmarchaeo:AP11_has_physical_relation becomes AP11_has_physical_relation_to, the name CRMarchaeo has used since 2.0; and em:RepresentationModel says what a representation model IS. v1.6.5 (2026-10-20, MICRO la definizione dell\'unita\'): em:hasDefinition, the DEFINIZIONE of a stratigraphic unit as a subproperty of crm:P2_has_type — declared for the node datamodel 1.6.9 entry StratigraphicNode.properties.definition, not emitted by default (owl:versionInfo was left at 1.6.2 by the 1.6.3/1.6.4 passes and is realigned here). v1.6.8 (2026-10-11, MICRO la geometria per origine): the vertices of a 3D reading (point, line, polyline) are data of the region (node datamodel 1.6.15, AnnotationRegionNode.coords) and leave for RDF as ONE GeoSPARQL 1.1 literal: <region> geo:hasGeometry <region>/geometry, a geo:Geometry with geo:asWKT '<CRS IRI> POINT Z (x y z)' | 'MULTIPOINT Z (...)' | 'LINESTRING Z (...)'^^geo:wktLiteral. WHY GeoSPARQL and not em: terms: the WKT literal is the standard every triplestore with a spatial index reads, and it is the 3D twin of the Media Fragment a 2D region already emits (a string a consumer outside EM can act on); CRMgeo was built to meet GeoSPARQL at exactly this point (SP5 Geometric Place Expression ~ geo:Geometry), and an em:coords literal would say the same thing to nobody. The CRS travels INSIDE the literal, so it cannot be separated from the numbers: em:LocalSceneFrame (declared here) for the scene-local frame, the OGC EPSG IRI for a projected one. em:vertexCount stays (the count of a .glb resource above the threshold). The .glb of a reading is no longer a SemanticShape's rdfs:seeAlso: above coords.inline_max_vertices (500) it is a ResourceNode the region reaches with has_linked_resource (crm:P67_refers_to), and a proxy's .glb is likewise a proxy_model ResourceNode (connections 1.6.28-1.6.29). v1.6.7 (2026-09-30, MICRO la cattura in RDF): no em: term added — the acquisition of a digital object is typed by its KIND. A capture is not a transfer: crmdig:D2_Digitization_Process for a photograph or a laser scan, crmdig:D11_Digital_Measurement_Event for a topographic or GNSS survey, crm:E65_Creation for a field drawing or a recording sheet (made by hand; the file is their copy, so no D7 machine event is asserted); a retrieval (download, local import, URI, ingest) stays crmdig:D12_Data_Transfer_Event. The rule is data (em_visual_rules 1.6.24, dtc_kinds.acquisition.<kind>.mapping). v1.6.6 (2026-10-07, MICRO la misura in RDF): the place of a reading gets its quote and its measure. The quote of a passage reuses W3C Web Annotation (oa:hasSelector -> oa:TextQuoteSelector, oa:exact) — the only standard term for a quote, which has no fragment-string form; its offsets stay the RFC 5147 em:hasSelector 'char=s,e'. The length of a line or polyline reuses CIDOC (crm:P43_has_dimension -> crm:E54_Dimension, P90_has_value xsd:double, P91_has_unit -> a QUDT unit IRI); two em: terms are new, em:vertexCount and em:crs, for what neither vocabulary says. The .glb of a 3D reading is not described here: its URL is the rdfs:seeAlso of the SemanticShape the region reaches with em:hasSemanticShape, and no coordinate enters RDF."@en ;
|
|
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/> ,
|
|
@@ -865,5 +865,72 @@ em:reviewRequested
|
|
|
865
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
866
|
|
|
867
867
|
# ============================================================================
|
|
868
|
-
#
|
|
868
|
+
# 15. Several addresses of one resource (v1.6.11, dev27, decided by E.D.
|
|
869
|
+
# 2026-10-01, «il testo, la risorsa e la selezione»)
|
|
870
|
+
# ============================================================================
|
|
871
|
+
|
|
872
|
+
em:hasAddress
|
|
873
|
+
a owl:ObjectProperty ;
|
|
874
|
+
rdfs:label "has address"@en ;
|
|
875
|
+
rdfs:domain crm:E73_Information_Object ;
|
|
876
|
+
rdfs:comment "One of the places where the SAME bytes of a resource can be fetched — the same digest on the disk, on MinIO, on Zenodo: identical copies are one resource with several addresses, and losing one address does not lose the resource. The object is a derived IRI <resource>/address/<i>, number 0 being the resource's url; every locator is also an rdfs:seeAlso of the resource, so a reader that knows nothing of EM finds every copy. Different manifestations are not addresses but sister resources. Maps to: node_datamodel ResourceNode.properties.addresses (data.addresses)."@en .
|
|
877
|
+
|
|
878
|
+
em:locator
|
|
879
|
+
a owl:DatatypeProperty ;
|
|
880
|
+
rdfs:label "locator"@en ;
|
|
881
|
+
rdfs:range xsd:string ;
|
|
882
|
+
rdfs:comment "Where an address points: a path relative to the project, an s3:// or http(s):// URL. A literal, because a relative path is not an IRI. Maps to: node_datamodel ResourceNode.properties.addresses.locator."@en .
|
|
883
|
+
|
|
884
|
+
em:checkedAt
|
|
885
|
+
a owl:DatatypeProperty ;
|
|
886
|
+
rdfs:label "checked at"@en ;
|
|
887
|
+
rdfs:range xsd:dateTime ;
|
|
888
|
+
rdfs:comment "When an address was last checked; em:reachable says what was found. Absent: never checked, which is not the same as reachable. Maps to: node_datamodel ResourceNode.properties.addresses.checked_at."@en .
|
|
889
|
+
|
|
890
|
+
em:reachable
|
|
891
|
+
a owl:DatatypeProperty ;
|
|
892
|
+
rdfs:label "reachable"@en ;
|
|
893
|
+
rdfs:range xsd:boolean ;
|
|
894
|
+
rdfs:comment "Whether an address answered at em:checkedAt. false is a dated fact, not a removal: the address stays, and the resource stays while another address is alive. Maps to: node_datamodel ResourceNode.properties.addresses.ok."@en .
|
|
895
|
+
|
|
896
|
+
em:checksumAt
|
|
897
|
+
a owl:DatatypeProperty ;
|
|
898
|
+
rdfs:label "checksum at"@en ;
|
|
899
|
+
rdfs:range xsd:dateTime ;
|
|
900
|
+
rdfs:comment "The instant a DATED digest was taken: a page online without saved bytes has no em:checksum until somebody downloads it, and then the digest is of that day's bytes, because a page changes. Maps to: node_datamodel ResourceNode.properties.checksum_at."@en .
|
|
901
|
+
|
|
902
|
+
# ============================================================================
|
|
903
|
+
# 16. How the hand of a signature had entered (v1.6.11, dev27, decided by E.D.
|
|
904
|
+
# 2026-10-01, «l'accesso sul campo»)
|
|
905
|
+
# ============================================================================
|
|
906
|
+
|
|
907
|
+
em:createdVia
|
|
908
|
+
a owl:ObjectProperty ;
|
|
909
|
+
rdfs:label "created via"@en ;
|
|
910
|
+
rdfs:comment "How the hand that created the node (em:createdBy) had entered: the object <node>/auth/created carries em:authMode and, for a node's password, em:attestedBy. A signature made offline on the field, attested by a StratiGraph node, stays valid when the network comes back, and says how it was born. Maps to: node_datamodel Node.properties.created_auth (data.created_auth)."@en .
|
|
911
|
+
|
|
912
|
+
em:modifiedVia
|
|
913
|
+
a owl:ObjectProperty ;
|
|
914
|
+
rdfs:label "modified via"@en ;
|
|
915
|
+
rdfs:comment "How the last hand (em:lastEditedBy) had entered; see em:createdVia. Maps to: node_datamodel Node.properties.modified_auth."@en .
|
|
916
|
+
|
|
917
|
+
em:validatedVia
|
|
918
|
+
a owl:ObjectProperty ;
|
|
919
|
+
rdfs:label "validated via"@en ;
|
|
920
|
+
rdfs:comment "How the person who verified the node (em:validatedBy) had entered; see em:createdVia. Maps to: node_datamodel Node.properties.validated_auth."@en .
|
|
921
|
+
|
|
922
|
+
em:authMode
|
|
923
|
+
a owl:DatatypeProperty ;
|
|
924
|
+
rdfs:label "access mode"@en ;
|
|
925
|
+
rdfs:range xsd:string ;
|
|
926
|
+
rdfs:comment "'orcid' — the identity was verified by ORCID at that moment; 'node_password' — the iD and a password of a StratiGraph node, which attests the identity while offline (the iD was verified by ORCID once, at the accreditation). A closed list of two. Maps to: node_datamodel Node.properties.created_auth.mode (and modified_auth / validated_auth)."@en .
|
|
927
|
+
|
|
928
|
+
em:attestedBy
|
|
929
|
+
a owl:DatatypeProperty ;
|
|
930
|
+
rdfs:label "attested by"@en ;
|
|
931
|
+
rdfs:range xsd:string ;
|
|
932
|
+
rdfs:comment "The name of the StratiGraph node that attested an identity entered with the node's password (em:authMode 'node_password'). Maps to: node_datamodel Node.properties.created_auth.attested_by."@en .
|
|
933
|
+
|
|
934
|
+
# ============================================================================
|
|
935
|
+
# End of em.ttl v1.6.11
|
|
869
936
|
# ============================================================================
|
{s3dgraphy-1.6.0.dev26 → s3dgraphy-1.6.0.dev27}/src/s3dgraphy/JSON_config/em_qualia_types.json
RENAMED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"metadata": {
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.6",
|
|
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.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)."
|
|
8
|
+
"changelog": "v1.6.6 (dev27, 2026-10-31, decided by E.D. 2026-10-01): cultural_interpretive.semantic.attribution gains an optional `note` in its schema and `natural_language_fields: [\"note\"]` — the object is not text, its note is, and only the note carries a language tag (rdf_exporter._Datamodel.natural_language_fields). 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
|
{
|
|
@@ -1046,7 +1046,9 @@
|
|
|
1046
1046
|
"cidoc_crm": "E13_Attribute_Assignment"
|
|
1047
1047
|
},
|
|
1048
1048
|
"data_type": "object",
|
|
1049
|
-
"schema": {"attributed_to": "E39_Actor reference", "attribution_type": "maker | patron | commission | school", "confidence": "float 0-1"},
|
|
1049
|
+
"schema": {"attributed_to": "E39_Actor reference", "attribution_type": "maker | patron | commission | school", "confidence": "float 0-1", "note": "optional free text in a natural language: the attribution as the source words it, or its grounds (P3_has_note)"},
|
|
1050
|
+
"natural_language_fields": ["note"],
|
|
1051
|
+
"_natural_language_note": "1.6.6 (dev27, E.D. 2026-10-01): the object has separate fields, so only its NOTE is text in a natural language and carries a language tag; attributed_to, attribution_type and confidence are a reference, a closed term and a number. Read by rdf_exporter._Datamodel.natural_language_fields. Measured: no writer stores attribution as an object today (it travels as one string, untagged), so the marker waits for the first that does.",
|
|
1050
1052
|
"expected_extractors": ["expert_assessment", "archival_research", "stylistic_analysis"]
|
|
1051
1053
|
}
|
|
1052
1054
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_generated": "by `python -m s3dgraphy.tools.sync_node_datamodel` — DO NOT hand-edit. The flat class hierarchy (parent/node_type/description) is derived from the Python Node subclasses; hand-authored semantics and CIDOC mappings live in s3Dgraphy_node_datamodel.json.",
|
|
3
|
-
"s3Dgraphy_data_model_version": "1.6.
|
|
3
|
+
"s3Dgraphy_data_model_version": "1.6.21",
|
|
4
4
|
"node_types": {
|
|
5
5
|
"ActivityNodeGroup": {
|
|
6
6
|
"parent": "GroupNode",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"s3Dgraphy_connections_model_version": "1.6.
|
|
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).",
|
|
2
|
+
"s3Dgraphy_connections_model_version": "1.6.35",
|
|
3
|
+
"description": "v1.6.35 (dev27, 2026-10-31, decided by E.D. 2026-10-01, «il testo, la risorsa e la selezione»): was_revision_of admits TranslationNode on both ends — a translation realigned after its original changed is a new TranslationNode that was_revision_of the old one (s3dgraphy.translation.realign_translation). 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",
|
|
@@ -1705,12 +1705,14 @@
|
|
|
1705
1705
|
},
|
|
1706
1706
|
"allowed_connections": {
|
|
1707
1707
|
"source": [
|
|
1708
|
-
"ResourceNode"
|
|
1708
|
+
"ResourceNode",
|
|
1709
|
+
"TranslationNode"
|
|
1709
1710
|
],
|
|
1710
1711
|
"target": [
|
|
1711
|
-
"ResourceNode"
|
|
1712
|
+
"ResourceNode",
|
|
1713
|
+
"TranslationNode"
|
|
1712
1714
|
],
|
|
1713
|
-
"_note": "2026-10-20 (connections 1.6.31): resources only. A file is not revised, it is replaced: the new file derives from the old with dtc_derived_from, and the RESOURCE (the set) is what has revisions."
|
|
1715
|
+
"_note": "2026-10-20 (connections 1.6.31): resources only. A file is not revised, it is replaced: the new file derives from the old with dtc_derived_from, and the RESOURCE (the set) is what has revisions. 2026-10-31 (connections 1.6.35, dev27): also a TRANSLATION, realigned — when its original changes, the new translation of the current text is a new TranslationNode that was_revision_of the old one (s3dgraphy.translation.realign_translation; E.D. 2026-10-01, «il testo, la risorsa e la selezione»). The old one stays, with its author and verification, and is no longer a literal of the original. Same kind only: a resource is not a revision of a translation."
|
|
1714
1716
|
}
|
|
1715
1717
|
},
|
|
1716
1718
|
"has_registration_transform": {
|
|
@@ -1813,4 +1815,4 @@
|
|
|
1813
1815
|
},
|
|
1814
1816
|
"_dtc_role_note": "dtc_role marks an edge as part of the DTC CHAIN — the three edges a provenance walk may traverse. It exists because the classification used to be written twice: by name on the node (s3dgraphy.dtc) and by PREFIX in the client (startsWith('dtc_')). The prefix presumed every future dtc_* edge would be chain, so a dtc_* edge that is CONTEXT — a dtc_annotated_by, say — would have been a corridor on the client and not on the node: two rules with one name. Now the datamodel says it once and both sides read it. An edge WITHOUT dtc_role is context by construction: adding one is a JSON entry, and it is born non-traversable.",
|
|
1815
1817
|
"_ui_phrase_note": "v1.6.22 · `edge_types.<edge>.ui_phrase` = the phrase an interface uses for a menu entry that CREATES a node already linked to an existing one by this edge. Canonical English; the other languages are in datamodel_translations.json → `edge_types.<edge>.ui_phrase_as_source|ui_phrase_as_target` (text per language + validated_<lang>, the form of every other entry), read with s3dgraphy.tools.datamodel_i18n.edge_ui_phrase(edge, direction, lang), which falls back to this English. TWO DIRECTIONS: `as_source` when the NEW node is the edge's source, `as_target` when it is the target. PLACEHOLDERS, both always present: `{node}` = the label of the new node's TYPE (typeLabel), `{x}` = the NAME of the existing node. Examples: US12 selected, a new US that is more recent — the new US is the source of is_after → as_source «{node} above {x}» → «US above US12»; a new property of US12 — US12 —has_property→ new → as_target «{node} of {x}» → «Property of US12». A SYMMETRIC edge (equals, bonded_to, has_same_time, contrasts_with) has the same phrase both ways. WHICH EDGES: the 34 that EMStudio's menus can propose, MEASURED 2026-10-02 (add-menu.ts linkedItems «Collegato a X» + connectItems, the anchor drag, over the four contexts; probe in .claude/wip/reports/2026-10-02-documento-e-frasi/). The 22 without a phrase are created by an importer, a tool or a structural gesture, never picked from a menu: the alias spellings (is_bonded_to, is_physically_equal_to), the epoch links made by placing a unit in a lane (has_first_epoch, survive_in_epoch) or by the periodisation (has_sub_epoch), the 3D/spatial links written by the tools that make the asset (has_geoposition, has_representation_model*, has_semantic_shape, is_on_resource, has_registration_transform, has_gcp_set, is_in_representation_model_group), validated_by (a person signing a narrative: its own gesture, never a node created from a menu), is_in_functional_unit (the FunctionalUnitNodeGroup is not on EMStudio's authoring surface, add-menu.ts SECTIONS, so no menu reaches it), the HDT-O links written by the twin's own tooling (has_digital_twin, has_digital_twin_component, contains_proposition_set, has_digital_object_part, study_produced_proposition_set), and generic_connection, which is the absence of a relation, not one to propose. The day a menu proposes one of them, it gets its phrase here first (tests/test_edge_ui_phrases.py)."
|
|
1816
|
-
}
|
|
1818
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"s3Dgraphy_data_model_version": "1.6.
|
|
3
|
-
"description": "v1.6.20 (MICRO le traduzioni, 2026-10-29, decided by E.D. 2026-10-01, «Le traduzioni»): NEW TranslationNode (TRANSL, crm:E33_Linguistic_Object) — ONE translation of one text field of one node. The original stays a string in its field (data.lang on the node, else the study's), never overwritten; each translation is a node reached by has_translation (crm:P73_has_translation, connections 1.6.34) with data.lang (arrival), data.from_lang (departure, written because the original can change), data.field (CRDT vocabulary: description | data.<key>; a PropertyNode's value is data.value; never name), data.text, data.method (manual | ai | edition), data.source_digest (sha256 of the original translated: a different digest = «da riallineare») and data.review_requested («da rivedere»). Who: has_author; AI: data.ai_assisted, unverified until validated_by; an edition: extracted_from → the DocumentNode. RDF (em.ttl 1.6.10): Node.properties.lang names em:originalLanguage — the node's own data.lang leaves as that literal whenever it is declared, equal to the study's too, so a reader tells the original literal from the translations that share its predicate and the round trip gives data.lang back exactly where it was (the D.1 limit of 1.6.19 is closed); the TranslationNode's fields name em:sourceLanguage, em:translatedField, em:translationMethod, em:sourceDigest, em:reviewRequested. v1.6.19 (MICRO la lingua dei dati, 2026-10-27, decided by E.D. 2026-09-28): Node.properties.description becomes an object {cidoc: P3_has_note, natural_language: true, note} — the MARKER that says the description is text in a natural language and leaves in RDF with its language tag; declared once on the base class and inherited by every node type. name is NOT marked: names are invariant identities. No field added, no node element, no graph change: the em.json is the same; only the RDF literal gains its tag. v1.6.18 (MICRO i termini di em.ttl nel datamodel, 2026-10-26, decided by E.D. 2026-10-01 — the datamodel JSON is the truth, so every em: term of em.ttl is cited by a datamodel or is a written exception): the em: predicates the RDF exporter already writes are now NAMED in properties, as plain-string mapping notes (no field added, no node element, no graph change). Node (inherited by every class): the last-hand stamps created_by em:createdBy / modified_by em:lastEditedBy / modified_at em:modifiedAt (created_at prov:generatedAtTime), the tombstone removed.ts em:removedAt / removed.by em:removedBy, the AI marker ai_assisted.by em:aiAssistedBy / .model em:aiModel / .prompt_ref em:aiPromptRef / .fields em:aiAssistedField and the verification validated_by em:validatedBy / validated_at em:validatedAt (properties_note). ResourceNode: checksum em:checksum, scope em:resourceScope, residency em:residency. SemanticShapeNode: convexshapes em:convexShape, spheres em:sphere. AnnotationRegionNode: crs em:crs, coords.frame_iri em:LocalSceneFrame. AuthorNode and AuthorAINode: verified em:orcidVerified (AuthorAINode also names orcid P48, which the exporter writes for both). LocationNodeGroup.propagation.mapping: uri em:propagation. THREE ENTRIES CORRECTED TO WHAT THE CODE WRITES (measured in rdf_exporter.py): PropertyNode.property_type was P2_has_type, is em:hasQualiaType; AuthorAINode model / prompt_reference were P3_has_note, are em:modelIdentifier / em:promptReference; ResourceFileNode.checksum was P1_is_identified_by, is em:checksum; and LocationNodeGroup.propagation said 'not serialized to triplestore' while the exporter has written the non-default value as em:propagation since c1a702c (2026-08-12). v1.6.17 (MICRO la risorsa e i suoi file, 2026-10-18, decided by E.D. 2026-09-30): NEW ResourceFileNode (FILE, crmdig:D1_Digital_Object) — the ResourceNode is the set, the ResourceFileNode is each file, reached by has_file (connections 1.6.30) with role and relative path on the edge. With one file the node is implicit (url and checksum stay on the ResourceNode, as today). ResourceNode.PACKAGINGS += file_set (a few files that call each other: obj → mtl → textures, gltf → bin, shp and companions) and datablock (one object inside a file, a blend:// locator). Representations of the same thing are sibling ResourceNodes tied by dtc_derived_from and chosen by tier and packaging. ADDITIVE: nothing narrowed, no graph changes. v1.6.16 (MICRO le annotazioni ATON sull'asset, 2026-10-15, decided by E.D.): AnnotationRegionNode gains geometry_kind 'volume' — an annotation that encloses a part of a 3D model (ATON / Hathor convex hulls and spheres) and is the proxy of no unit. The region carries no vertices: it reaches a SemanticShapeNode (convexshapes, spheres) with has_semantic_shape and the model with is_on_resource. geometry.aton.import_aton_scene makes one for every semantic id no EM node is named after (a stratigraphic unit only with an explicit create_type); api.promote_region_to_proxy turns it into the proxy of a unit later. RDF: P2_has_type 'volume', no selector, no WKT; the shape travels as itself. Additive. v1.6.15 (MICRO la geometria per origine, 2026-10-11, decided by E.D. 2026-09-30): AnnotationRegionNode's point / line / polyline keep their vertices IN THE NODE, data.coords [[x, y, z], ...] (scene-local, glTF Y-up, metres) with crs and, for a line or a polyline, length and unit — no .glb and no SemanticShape for a reading. New block coords (inline_max_vertices 500: above it the vertices go to a .glb resource via has_linked_resource, with a warning). RDF: geo:hasGeometry -> <region>/geometry geo:asWKT (POINT Z / LINESTRING Z, GeoSPARQL). The readings/<id>.glb of 2026-10-06 are migrated on opening. v1.6.14 (MICRO la cattura in RDF, 2026-09-30): DTCAcquisitionNode.mapping.by_kind — its D12 is the class of a retrieval; a capture takes the class its kind declares in em_visual_rules 1.6.24 (D2 / D11 / E65). Mapping text only, no field changed. v1.6.13 (MICRO i generi delle US, 2026-09-30, decided by E.D. the same day): stratigraphic_kind gains 'coating' — the USR (rivestimento) and its English translation USS (surface): plaster, floors, revetments — with `labels`, `codes` and `default_code` per kind; new node element `source_code` (data.source_code) keeps the code a unit came in with when it is not its kind's default, so the way back to pyArchInit gives the same code. A legacy node_type 'USR' / 'USS' opens as US + coating. v1.6.12 (MICRO la cattura nel DTC e le murature, 2026-09-30): StratigraphicUnit (US) gains the node element `stratigraphic_kind` (em.json data.stratigraphic_kind; today one value, 'masonry'): a USM is a US + masonry, and the legacy node_type 'USM' — never a type of this datamodel — opens as that. DTCAcquisitionNode's description names the two families of the acquisition axis (em_visual_rules 1.6.22: capture / retrieval). v1.6.11 (MICRO la misura in RDF, 2026-10-07): AnnotationRegionNode.properties says how the fields left unprojected by 1.6.10 now travel — the quote of a passage as oa:TextQuoteSelector, the length of a line/polyline as crm:E54_Dimension (P90 value, P91 QUDT unit, em:crs), vertex_count as em:vertexCount. CRMem (em.ttl) 1.6.5 -> 1.6.6. Mapping text only, no field changed. v1.6.10 (MICRO la geometria della lettura, 2026-10-06, decided by E.D. on 2026-09-29): AnnotationRegionNode becomes the node of THE PLACE A READING LOOKED AT, with a new field geometry_kind: region2d (default, every older region), passage (start, end, text), point, line, polyline. The three 3D kinds keep their coordinates in a .glb (glTF POINTS / LINES / LINE_STRIP) linked with has_semantic_shape exactly like a proxy's payload, never in the em.json; the node keeps vertex_count and, for line/polyline, length + unit + crs (api.measure). See the entry's geometry_kinds and glb_payload. Paired with connections 1.6.27 (is_on_resource.target += the representation models). Additive: a region without geometry_kind reads as region2d. v1.6.9 (MICRO la definizione dell'unita', 2026-10-20, decided by E.D. on 2026-09-27): StratigraphicNode.properties gains `definition`, the DEFINIZIONE of the US sheet, as an element of the node like name and description and NOT a qualia. Value = a controlled-vocabulary concept {concept, label}; em.json carries it as data.definition (CRDT field 'data.definition', no change to the frozen em.json v1 node shape); inherited by every stratigraphic subtype. The RDF projection is declared in the entry itself (`rdf`): crm:P2_has_type -> crm:E55_Type when a concept URI is present, nothing when only a label is (`label_only: null`). CRMem 1.6.4 -> 1.6.5 for the companion em:hasDefinition (subproperty of crm:P2_has_type, declared, not emitted by default). Additive only. v1.6.7 (CRMem WIRING, 2026-09-24): rimosso il campo legacy `cidoc_s3d` da tutte le mapping. Non era letto da nessuna parte del codice e portava quattro nomi di classe senza namespace, mai dichiarati e mai emessi: EpochNode = StratigraphicTimeframe; ActivityNodeGroup = StratigraphicActivity; ParadataNodeGroup = ParadataCollection; ResourceNode = ExternalResourceReference. Il prefisso CIDOC-S3D non esiste piu' in nessuno dei due datamodel. v1.6.6 (CIDOC REPAIR, 2026-09-21): classes that pointed at IRIs nobody declares. Checked by parsing the official releases, not from memory. crm:E78_Collection is gone from CIDOC CRM 7.1.3 — renamed E78_Curated_Holding — and E.D. decided NOT to follow the rename, because E78_Curated_Holding is a subclass of E24 Physical Human-Made Thing and a group of nodes is not a physical thing. The three classes that carried it therefore split, each to the class it actually is: GroupNode and RepresentationModelNodeGroup to crm:E73_Information_Object (a conceptual set, and an E90 Symbolic Object, which is what the P106i membership edge needs at both ends), ParadataNodeGroup to crm:E89_Propositional_Object — which is what a gathered body of reasoning IS and what the range of crm:P129i_is_subject_of demands, that being the predicate has_paradata_nodegroup takes in connections 1.6.17 the same day; it stays an E90 through em:NodeGroup, so the membership edge does not break. SemanticShapeNode leaves crmgeo:SP5_Geometric_Place_Expression for crm:E73_Information_Object, PROVVISORIAMENTE: SP5 is not declared at the crmgeo namespace this datamodel emits, crmgeo:SP6_Declarative_Place is the better candidate, and the decision is rinviata da E.D. — E73 commits to nothing meanwhile. crm:P131_is_identified_by, deprecated in CRM 7.x together with E82 Actor Appellation, becomes crm:P1_is_identified_by on AuthorNode (name, surname) and AuthorAINode (name). «CRMs3D» is renamed «CRMem», in components and in referenced_ontology_versions alike: the companion ontology is em.ttl and its namespace is em:, so the old name pointed at nothing anyone could look up. CRMsci moves 3.1 -> 3.2 (latest release). The eight em: terms this file and the connections datamodel cite but em.ttl never defined are now declared there (em:FunctionalUnit, em:GCPSet, em:Narrative, em:NeutralSU, em:RegistrationTransform, em:RepresentationModelNodeGroup, em:hasSubEpoch, em:validatedBy), with domain, range and superclass read off these datamodels and nothing invented. NOT TOUCHED: the `alternative` and legacy `cidoc_s3d` prose fields, which still discuss E78 as an option — prose, not a projection, and rewording them is modelling rather than repair. v1.6.5 (EM16-RMNG, 2026-09-10): adds RepresentationModelNodeGroup, the RM container as a first-class group of the graph — sixth subtype of GroupNode, keeping the parent's E78 Collection because a container IS a curatorial set. Paired with connections datamodel 1.6.14, which adds the is_in_representation_model_group membership edge and widens has_representation_model.target to accept the group. Additive only: no existing entry changed. s3Dgraphy nodes datamodel including node types with CIDOC-CRM mappings. v1.6.4 adds the ADDITIVE georeferencing_nodes section (GCPSetNode = em:GCPSet, RegistrationTransformNode = em:RegistrationTransform, both subclasses of crm:E73_Information_Object with their own extension URIs so the RDF projection stays bijective): the CONTROL and the SOLUTION that place a produced model in the world, introduced with the photogrammetry processing connector. The two modes of that connector are the SHAPE of the graph (a transform with a CRS that has_gcp_set points at = absolute; a transform with crs=null and no control set = a site-local frame; no transform at all = nobody placed it), never a flag. No existing family changed. v1.6.3 re-reads SemanticShapeNode as a PAYLOAD carrier: the proxy of a unit is now a PropertyNode of qualia type 'geometry' that points at the shape (has_semantic_shape), so the proxy inherits the paradata chain it never had. Breaking for consumers that read the proxy as a standalone SemanticShape. v1.6.2 adds AnnotationRegionNode (em:AnnotationRegion, subclass of crm:E36_Visual_Item): the geometry of a 2D annotation in NORMALISED image space, distinct from SemanticShapeNode (3D scene geometry, crmgeo:SP5) - the semantics of the 2D annotator, defined before any canvas exists. v1.6.0 inaugurates a systematic CIDOC-CRM mapping revision: complete audit of all node types against CIDOC-CRM, CRMarchaeo, CRMinf, CRMdig, CRMsci, CRMgeo; replacement of legacy 'cidoc_s3d' pseudo-class names (invented strings without IRI or superclass declaration) with formal em:/s3d: IRIs declared as proper subclasses of CRM classes; introduction of CRMinf as primary (not alternative) for the paradata chain (ParadataNode, PropertyNode interpretive case, ExtractorNode, CombinerNode); introduction of PROV-O for AuthorNode to cover both human and AI agents; alignment with the Heritage Digital Twin Ontology (HDT-O) for containment / granularity properties; LocationNodeGroup (v1.5.3) adopted as the reference pattern (CIDOC-native composition via P2_has_type → E55 Type instances, with explicit extension_status and rationale). Companion deliverables: em.ttl (formal EM extension ontology, dereferenceable via w3id.org/em/) and hdto_extension.ttl (HDT-O granularity properties: contains_HDT, contains_SU, isPrimary). v1.5.4 added RSF (Reused Special Find — spolia) as a stratigraphic subtype, octagon with red border, family=real, is_series=false. Originating DP: DP-26 (spolia project, last DP before the EM 1.5 cut). v1.5.3 added LocationNodeGroup (E53 Place + E55 Type) for spatial / locational membership orthogonal to ActivityNodeGroup (intention) and EpochNode (time). v1.5.2 added family + is_series classification metadata on stratigraphic subtypes.",
|
|
2
|
+
"s3Dgraphy_data_model_version": "1.6.21",
|
|
3
|
+
"description": "v1.6.21 (dev27, 2026-10-31, decided by E.D. 2026-10-01, «il testo, la risorsa e la selezione» and «l'accesso sul campo»): ResourceNode.properties gains lang — on a resource the language(s) of its CONTENT, one tag or a sorted list, leaving as dcterms:language and outside the cascade of the texts — addresses (several addresses of ONE resource, same digest: em:hasAddress with em:locator, em:residency, em:checkedAt, em:reachable) and checksum_at (a dated digest, em:checksumAt). Node.properties gains created_auth / modified_auth / validated_auth: how the hand of a signature had entered, {mode: orcid | node_password, attested_by} (em:createdVia / em:modifiedVia / em:validatedVia, em:authMode, em:attestedBy). data.lang is written at birth (s3dgraphy.language.stamp_birth_language), also when equal to the study's. v1.6.20 (MICRO le traduzioni, 2026-10-29, decided by E.D. 2026-10-01, «Le traduzioni»): NEW TranslationNode (TRANSL, crm:E33_Linguistic_Object) — ONE translation of one text field of one node. The original stays a string in its field (data.lang on the node, else the study's), never overwritten; each translation is a node reached by has_translation (crm:P73_has_translation, connections 1.6.34) with data.lang (arrival), data.from_lang (departure, written because the original can change), data.field (CRDT vocabulary: description | data.<key>; a PropertyNode's value is data.value; never name), data.text, data.method (manual | ai | edition), data.source_digest (sha256 of the original translated: a different digest = «da riallineare») and data.review_requested («da rivedere»). Who: has_author; AI: data.ai_assisted, unverified until validated_by; an edition: extracted_from → the DocumentNode. RDF (em.ttl 1.6.10): Node.properties.lang names em:originalLanguage — the node's own data.lang leaves as that literal whenever it is declared, equal to the study's too, so a reader tells the original literal from the translations that share its predicate and the round trip gives data.lang back exactly where it was (the D.1 limit of 1.6.19 is closed); the TranslationNode's fields name em:sourceLanguage, em:translatedField, em:translationMethod, em:sourceDigest, em:reviewRequested. v1.6.19 (MICRO la lingua dei dati, 2026-10-27, decided by E.D. 2026-09-28): Node.properties.description becomes an object {cidoc: P3_has_note, natural_language: true, note} — the MARKER that says the description is text in a natural language and leaves in RDF with its language tag; declared once on the base class and inherited by every node type. name is NOT marked: names are invariant identities. No field added, no node element, no graph change: the em.json is the same; only the RDF literal gains its tag. v1.6.18 (MICRO i termini di em.ttl nel datamodel, 2026-10-26, decided by E.D. 2026-10-01 — the datamodel JSON is the truth, so every em: term of em.ttl is cited by a datamodel or is a written exception): the em: predicates the RDF exporter already writes are now NAMED in properties, as plain-string mapping notes (no field added, no node element, no graph change). Node (inherited by every class): the last-hand stamps created_by em:createdBy / modified_by em:lastEditedBy / modified_at em:modifiedAt (created_at prov:generatedAtTime), the tombstone removed.ts em:removedAt / removed.by em:removedBy, the AI marker ai_assisted.by em:aiAssistedBy / .model em:aiModel / .prompt_ref em:aiPromptRef / .fields em:aiAssistedField and the verification validated_by em:validatedBy / validated_at em:validatedAt (properties_note). ResourceNode: checksum em:checksum, scope em:resourceScope, residency em:residency. SemanticShapeNode: convexshapes em:convexShape, spheres em:sphere. AnnotationRegionNode: crs em:crs, coords.frame_iri em:LocalSceneFrame. AuthorNode and AuthorAINode: verified em:orcidVerified (AuthorAINode also names orcid P48, which the exporter writes for both). LocationNodeGroup.propagation.mapping: uri em:propagation. THREE ENTRIES CORRECTED TO WHAT THE CODE WRITES (measured in rdf_exporter.py): PropertyNode.property_type was P2_has_type, is em:hasQualiaType; AuthorAINode model / prompt_reference were P3_has_note, are em:modelIdentifier / em:promptReference; ResourceFileNode.checksum was P1_is_identified_by, is em:checksum; and LocationNodeGroup.propagation said 'not serialized to triplestore' while the exporter has written the non-default value as em:propagation since c1a702c (2026-08-12). v1.6.17 (MICRO la risorsa e i suoi file, 2026-10-18, decided by E.D. 2026-09-30): NEW ResourceFileNode (FILE, crmdig:D1_Digital_Object) — the ResourceNode is the set, the ResourceFileNode is each file, reached by has_file (connections 1.6.30) with role and relative path on the edge. With one file the node is implicit (url and checksum stay on the ResourceNode, as today). ResourceNode.PACKAGINGS += file_set (a few files that call each other: obj → mtl → textures, gltf → bin, shp and companions) and datablock (one object inside a file, a blend:// locator). Representations of the same thing are sibling ResourceNodes tied by dtc_derived_from and chosen by tier and packaging. ADDITIVE: nothing narrowed, no graph changes. v1.6.16 (MICRO le annotazioni ATON sull'asset, 2026-10-15, decided by E.D.): AnnotationRegionNode gains geometry_kind 'volume' — an annotation that encloses a part of a 3D model (ATON / Hathor convex hulls and spheres) and is the proxy of no unit. The region carries no vertices: it reaches a SemanticShapeNode (convexshapes, spheres) with has_semantic_shape and the model with is_on_resource. geometry.aton.import_aton_scene makes one for every semantic id no EM node is named after (a stratigraphic unit only with an explicit create_type); api.promote_region_to_proxy turns it into the proxy of a unit later. RDF: P2_has_type 'volume', no selector, no WKT; the shape travels as itself. Additive. v1.6.15 (MICRO la geometria per origine, 2026-10-11, decided by E.D. 2026-09-30): AnnotationRegionNode's point / line / polyline keep their vertices IN THE NODE, data.coords [[x, y, z], ...] (scene-local, glTF Y-up, metres) with crs and, for a line or a polyline, length and unit — no .glb and no SemanticShape for a reading. New block coords (inline_max_vertices 500: above it the vertices go to a .glb resource via has_linked_resource, with a warning). RDF: geo:hasGeometry -> <region>/geometry geo:asWKT (POINT Z / LINESTRING Z, GeoSPARQL). The readings/<id>.glb of 2026-10-06 are migrated on opening. v1.6.14 (MICRO la cattura in RDF, 2026-09-30): DTCAcquisitionNode.mapping.by_kind — its D12 is the class of a retrieval; a capture takes the class its kind declares in em_visual_rules 1.6.24 (D2 / D11 / E65). Mapping text only, no field changed. v1.6.13 (MICRO i generi delle US, 2026-09-30, decided by E.D. the same day): stratigraphic_kind gains 'coating' — the USR (rivestimento) and its English translation USS (surface): plaster, floors, revetments — with `labels`, `codes` and `default_code` per kind; new node element `source_code` (data.source_code) keeps the code a unit came in with when it is not its kind's default, so the way back to pyArchInit gives the same code. A legacy node_type 'USR' / 'USS' opens as US + coating. v1.6.12 (MICRO la cattura nel DTC e le murature, 2026-09-30): StratigraphicUnit (US) gains the node element `stratigraphic_kind` (em.json data.stratigraphic_kind; today one value, 'masonry'): a USM is a US + masonry, and the legacy node_type 'USM' — never a type of this datamodel — opens as that. DTCAcquisitionNode's description names the two families of the acquisition axis (em_visual_rules 1.6.22: capture / retrieval). v1.6.11 (MICRO la misura in RDF, 2026-10-07): AnnotationRegionNode.properties says how the fields left unprojected by 1.6.10 now travel — the quote of a passage as oa:TextQuoteSelector, the length of a line/polyline as crm:E54_Dimension (P90 value, P91 QUDT unit, em:crs), vertex_count as em:vertexCount. CRMem (em.ttl) 1.6.5 -> 1.6.6. Mapping text only, no field changed. v1.6.10 (MICRO la geometria della lettura, 2026-10-06, decided by E.D. on 2026-09-29): AnnotationRegionNode becomes the node of THE PLACE A READING LOOKED AT, with a new field geometry_kind: region2d (default, every older region), passage (start, end, text), point, line, polyline. The three 3D kinds keep their coordinates in a .glb (glTF POINTS / LINES / LINE_STRIP) linked with has_semantic_shape exactly like a proxy's payload, never in the em.json; the node keeps vertex_count and, for line/polyline, length + unit + crs (api.measure). See the entry's geometry_kinds and glb_payload. Paired with connections 1.6.27 (is_on_resource.target += the representation models). Additive: a region without geometry_kind reads as region2d. v1.6.9 (MICRO la definizione dell'unita', 2026-10-20, decided by E.D. on 2026-09-27): StratigraphicNode.properties gains `definition`, the DEFINIZIONE of the US sheet, as an element of the node like name and description and NOT a qualia. Value = a controlled-vocabulary concept {concept, label}; em.json carries it as data.definition (CRDT field 'data.definition', no change to the frozen em.json v1 node shape); inherited by every stratigraphic subtype. The RDF projection is declared in the entry itself (`rdf`): crm:P2_has_type -> crm:E55_Type when a concept URI is present, nothing when only a label is (`label_only: null`). CRMem 1.6.4 -> 1.6.5 for the companion em:hasDefinition (subproperty of crm:P2_has_type, declared, not emitted by default). Additive only. v1.6.7 (CRMem WIRING, 2026-09-24): rimosso il campo legacy `cidoc_s3d` da tutte le mapping. Non era letto da nessuna parte del codice e portava quattro nomi di classe senza namespace, mai dichiarati e mai emessi: EpochNode = StratigraphicTimeframe; ActivityNodeGroup = StratigraphicActivity; ParadataNodeGroup = ParadataCollection; ResourceNode = ExternalResourceReference. Il prefisso CIDOC-S3D non esiste piu' in nessuno dei due datamodel. v1.6.6 (CIDOC REPAIR, 2026-09-21): classes that pointed at IRIs nobody declares. Checked by parsing the official releases, not from memory. crm:E78_Collection is gone from CIDOC CRM 7.1.3 — renamed E78_Curated_Holding — and E.D. decided NOT to follow the rename, because E78_Curated_Holding is a subclass of E24 Physical Human-Made Thing and a group of nodes is not a physical thing. The three classes that carried it therefore split, each to the class it actually is: GroupNode and RepresentationModelNodeGroup to crm:E73_Information_Object (a conceptual set, and an E90 Symbolic Object, which is what the P106i membership edge needs at both ends), ParadataNodeGroup to crm:E89_Propositional_Object — which is what a gathered body of reasoning IS and what the range of crm:P129i_is_subject_of demands, that being the predicate has_paradata_nodegroup takes in connections 1.6.17 the same day; it stays an E90 through em:NodeGroup, so the membership edge does not break. SemanticShapeNode leaves crmgeo:SP5_Geometric_Place_Expression for crm:E73_Information_Object, PROVVISORIAMENTE: SP5 is not declared at the crmgeo namespace this datamodel emits, crmgeo:SP6_Declarative_Place is the better candidate, and the decision is rinviata da E.D. — E73 commits to nothing meanwhile. crm:P131_is_identified_by, deprecated in CRM 7.x together with E82 Actor Appellation, becomes crm:P1_is_identified_by on AuthorNode (name, surname) and AuthorAINode (name). «CRMs3D» is renamed «CRMem», in components and in referenced_ontology_versions alike: the companion ontology is em.ttl and its namespace is em:, so the old name pointed at nothing anyone could look up. CRMsci moves 3.1 -> 3.2 (latest release). The eight em: terms this file and the connections datamodel cite but em.ttl never defined are now declared there (em:FunctionalUnit, em:GCPSet, em:Narrative, em:NeutralSU, em:RegistrationTransform, em:RepresentationModelNodeGroup, em:hasSubEpoch, em:validatedBy), with domain, range and superclass read off these datamodels and nothing invented. NOT TOUCHED: the `alternative` and legacy `cidoc_s3d` prose fields, which still discuss E78 as an option — prose, not a projection, and rewording them is modelling rather than repair. v1.6.5 (EM16-RMNG, 2026-09-10): adds RepresentationModelNodeGroup, the RM container as a first-class group of the graph — sixth subtype of GroupNode, keeping the parent's E78 Collection because a container IS a curatorial set. Paired with connections datamodel 1.6.14, which adds the is_in_representation_model_group membership edge and widens has_representation_model.target to accept the group. Additive only: no existing entry changed. s3Dgraphy nodes datamodel including node types with CIDOC-CRM mappings. v1.6.4 adds the ADDITIVE georeferencing_nodes section (GCPSetNode = em:GCPSet, RegistrationTransformNode = em:RegistrationTransform, both subclasses of crm:E73_Information_Object with their own extension URIs so the RDF projection stays bijective): the CONTROL and the SOLUTION that place a produced model in the world, introduced with the photogrammetry processing connector. The two modes of that connector are the SHAPE of the graph (a transform with a CRS that has_gcp_set points at = absolute; a transform with crs=null and no control set = a site-local frame; no transform at all = nobody placed it), never a flag. No existing family changed. v1.6.3 re-reads SemanticShapeNode as a PAYLOAD carrier: the proxy of a unit is now a PropertyNode of qualia type 'geometry' that points at the shape (has_semantic_shape), so the proxy inherits the paradata chain it never had. Breaking for consumers that read the proxy as a standalone SemanticShape. v1.6.2 adds AnnotationRegionNode (em:AnnotationRegion, subclass of crm:E36_Visual_Item): the geometry of a 2D annotation in NORMALISED image space, distinct from SemanticShapeNode (3D scene geometry, crmgeo:SP5) - the semantics of the 2D annotator, defined before any canvas exists. v1.6.0 inaugurates a systematic CIDOC-CRM mapping revision: complete audit of all node types against CIDOC-CRM, CRMarchaeo, CRMinf, CRMdig, CRMsci, CRMgeo; replacement of legacy 'cidoc_s3d' pseudo-class names (invented strings without IRI or superclass declaration) with formal em:/s3d: IRIs declared as proper subclasses of CRM classes; introduction of CRMinf as primary (not alternative) for the paradata chain (ParadataNode, PropertyNode interpretive case, ExtractorNode, CombinerNode); introduction of PROV-O for AuthorNode to cover both human and AI agents; alignment with the Heritage Digital Twin Ontology (HDT-O) for containment / granularity properties; LocationNodeGroup (v1.5.3) adopted as the reference pattern (CIDOC-native composition via P2_has_type → E55 Type instances, with explicit extension_status and rationale). Companion deliverables: em.ttl (formal EM extension ontology, dereferenceable via w3id.org/em/) and hdto_extension.ttl (HDT-O granularity properties: contains_HDT, contains_SU, isPrimary). v1.5.4 added RSF (Reused Special Find — spolia) as a stratigraphic subtype, octagon with red border, family=real, is_series=false. Originating DP: DP-26 (spolia project, last DP before the EM 1.5 cut). v1.5.3 added LocationNodeGroup (E53 Place + E55 Type) for spatial / locational membership orthogonal to ActivityNodeGroup (intention) and EpochNode (time). v1.5.2 added family + is_series classification metadata on stratigraphic subtypes.",
|
|
4
4
|
"components": [
|
|
5
5
|
"CIDOC-CRM",
|
|
6
6
|
"CRMarchaeo",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"source": "https://www.w3.org/TR/prov-o/"
|
|
49
49
|
},
|
|
50
50
|
"CRMem": {
|
|
51
|
-
"version": "1.6.
|
|
51
|
+
"version": "1.6.11",
|
|
52
52
|
"source": "internal em.ttl / hdto_extension.ttl companion ontologies"
|
|
53
53
|
}
|
|
54
54
|
},
|
|
@@ -88,7 +88,15 @@
|
|
|
88
88
|
"ai_assisted.fields": "em:aiAssistedField",
|
|
89
89
|
"validated_by": "em:validatedBy",
|
|
90
90
|
"validated_at": "em:validatedAt",
|
|
91
|
-
"lang": "em:originalLanguage"
|
|
91
|
+
"lang": "em:originalLanguage",
|
|
92
|
+
"created_auth": {
|
|
93
|
+
"rdf": "em:createdVia",
|
|
94
|
+
"note": "1.6.21 (dev27, decided by E.D. 2026-10-01, «l'accesso sul campo»): HOW the hand of a signature had entered, beside each signature — created_auth beside created_by, modified_auth beside modified_by, validated_auth beside validated_by: {mode, attested_by?}, mode 'orcid' (verified by ORCID) or 'node_password' (the iD and a password of a StratiGraph node, which attests the identity offline; attested_by = the node's name, required). Written by editorial.stamp_created / stamp_modified (auth=), ai_validation.verify (auth=) and the CRDT op's 'auth'; modified_auth follows the last hand and is removed when a new hand comes without one. In RDF: <node>/auth/<created|modified|validated>, reached by em:createdVia / em:modifiedVia / em:validatedVia, with em:authMode and em:attestedBy."
|
|
95
|
+
},
|
|
96
|
+
"modified_auth": "em:modifiedVia",
|
|
97
|
+
"validated_auth": "em:validatedVia",
|
|
98
|
+
"created_auth.mode": "em:authMode",
|
|
99
|
+
"created_auth.attested_by": "em:attestedBy"
|
|
92
100
|
},
|
|
93
101
|
"properties_note": "1.6.18: the fields every node may carry in data, beside name and description, and the em: predicate each one leaves with (rdf_exporter: _serialize_editorial, _serialize_ai — called for every node, so declared here on the base class and inherited). created_by / created_at / modified_by / modified_at are the last-hand stamps (editorial.py; an ORCID iD becomes an https://orcid.org/ IRI, anything else a literal); em:createdBy is also written as prov:wasAttributedTo and em:modifiedAt as dcterms:modified. removed.ts / removed.by are the TOMBSTONE (crdt.py, data.removed = {ts, by}). ai_assisted.* is the AI marker (ai_validation.py, data.ai_assisted = {by, model, prompt_ref, fields}): by and prompt_ref are node ids and leave as IRIs, one em:aiAssistedField per touched field, '*' when the marker names none; validated_by / validated_at are the person's verification (em:validatedBy is also prov:wasInfluencedBy). Every one is emitted ONLY when the node carries it. The dotted keys name a member of an object in data (removed.ts is data.removed.ts). Plain strings, so mapping notes and not node elements: no reader turns them into fields to edit. 1.6.20: lang (the node's own data.lang, the first step of the language cascade) leaves as em:originalLanguage, whenever declared — it says which literal is the original once translations (TranslationNode) share its predicate. Not crm:P72_has_language: P72's domain is E33, and the node is not the text.",
|
|
94
102
|
"node_type": "Node"
|
|
@@ -1070,7 +1078,22 @@
|
|
|
1070
1078
|
"url_type": "P2_has_type",
|
|
1071
1079
|
"checksum": "em:checksum",
|
|
1072
1080
|
"scope": "em:resourceScope",
|
|
1073
|
-
"residency": "em:residency"
|
|
1081
|
+
"residency": "em:residency",
|
|
1082
|
+
"addresses": {
|
|
1083
|
+
"rdf": "em:hasAddress",
|
|
1084
|
+
"note": "1.6.21 (dev27, decided by E.D. 2026-10-01, «più risorse per un documento»): the SAME bytes — the same digest — are ONE resource with several addresses (the same PDF on the disk, on MinIO, on Zenodo); different manifestations are sister resources. data.addresses = [{locator, residency?, checked_at?, ok?}], written only when there is a second address or a check; address 0 is data.url, which a consumer that knows only url keeps reading. ok true = reachable at checked_at, false = dead (a warning while a live one remains, never removed by a check), absent = never checked. Written by s3dgraphy.resources.addresses (add_address refuses a different digest, and a resource with no digest). In RDF every locator is an rdfs:seeAlso of the resource, and each address <resource>/address/<i> em:hasAddress, with em:locator, em:residency, em:checkedAt, em:reachable."
|
|
1085
|
+
},
|
|
1086
|
+
"addresses.locator": "em:locator",
|
|
1087
|
+
"addresses.checked_at": "em:checkedAt",
|
|
1088
|
+
"addresses.ok": "em:reachable",
|
|
1089
|
+
"checksum_at": {
|
|
1090
|
+
"rdf": "em:checksumAt",
|
|
1091
|
+
"note": "1.6.21 (dev27): the instant a DATED digest was taken — s3dgraphy.resources.addresses.snapshot_uri downloads the page a reference points at and gives it checksum + checksum_at, because a page changes and the digest says of which day it is."
|
|
1092
|
+
},
|
|
1093
|
+
"lang": {
|
|
1094
|
+
"rdf": "dcterms:language",
|
|
1095
|
+
"note": "1.6.21 (dev27, decided by E.D. 2026-10-01, «il testo, la risorsa e la selezione»): on a RESOURCE, data.lang is the language of the CONTENT of the file — what it is made of — not the language of the resource's own description: a Latin PDF does not make its Italian description Latin. One BCP 47 tag, or a sorted list for more («latino e italiano a fronte» = [\"it\", \"la\"]), written by s3dgraphy.language.set_content_languages. It does NOT enter the cascade of the language of the texts (language.node_language skips resources and their files), it is not written at birth, and it leaves as one dcterms:language per tag instead of em:originalLanguage. The DocumentNode is the WORK, with no text in its fields; the resources are its manifestations, the text is in the file; the ExtractorNode is the selection, with the original words of the passage in its description and its own data.lang."
|
|
1096
|
+
}
|
|
1074
1097
|
},
|
|
1075
1098
|
"resource_types": {
|
|
1076
1099
|
"3d_model": [
|
|
@@ -204,15 +204,17 @@ def resolve_validator(graph: Any, author_id: str):
|
|
|
204
204
|
|
|
205
205
|
|
|
206
206
|
def validate_node(graph: Any, node: Any, author_id: str, *,
|
|
207
|
-
at: Optional[str] = None) -> Dict[str, Any]:
|
|
208
|
-
"""A person verifies an AI-assisted node: ``validated_by`` + ``validated_at
|
|
207
|
+
at: Optional[str] = None, auth: Any = None) -> Dict[str, Any]:
|
|
208
|
+
"""A person verifies an AI-assisted node: ``validated_by`` + ``validated_at``
|
|
209
|
+
(+ ``validated_auth``, how the person had entered — dev27).
|
|
209
210
|
|
|
210
211
|
Only AI-assisted content needs it; a node without the marker is refused
|
|
211
212
|
rather than silently stamped (a verification of nothing is noise that
|
|
212
213
|
reads as a statement).
|
|
213
214
|
"""
|
|
214
|
-
from .editorial import now_iso, normalize_instant
|
|
215
|
+
from .editorial import normalize_auth, now_iso, normalize_instant
|
|
215
216
|
resolve_validator(graph, author_id)
|
|
217
|
+
how = normalize_auth(auth)
|
|
216
218
|
if not is_ai_assisted(node):
|
|
217
219
|
raise AIValidationError(
|
|
218
220
|
f"'{getattr(node, 'node_id', '?')}' is not AI-assisted: human "
|
|
@@ -220,7 +222,14 @@ def validate_node(graph: Any, node: Any, author_id: str, *,
|
|
|
220
222
|
data = _data(node)
|
|
221
223
|
data[VALIDATED_BY] = author_id
|
|
222
224
|
data[VALIDATED_AT] = normalize_instant(at) if at else now_iso()
|
|
223
|
-
|
|
225
|
+
if how:
|
|
226
|
+
data["validated_auth"] = how
|
|
227
|
+
else:
|
|
228
|
+
data.pop("validated_auth", None)
|
|
229
|
+
out = {VALIDATED_BY: data[VALIDATED_BY], VALIDATED_AT: data[VALIDATED_AT]}
|
|
230
|
+
if how:
|
|
231
|
+
out["validated_auth"] = how
|
|
232
|
+
return out
|
|
224
233
|
|
|
225
234
|
|
|
226
235
|
def unvalidated_ai(graph: Any) -> List[Dict[str, Any]]:
|
|
@@ -382,7 +391,14 @@ def needs_review(node: Any, graph: Any = None) -> List[str]:
|
|
|
382
391
|
cannot be measured and is not claimed).
|
|
383
392
|
|
|
384
393
|
The same function for every node: a translation is a node like the others,
|
|
385
|
-
and an AI-made unit has nothing to realign.
|
|
394
|
+
and an AI-made unit has nothing to realign.
|
|
395
|
+
|
|
396
|
+
A translation that a newer one REALIGNED (``was_revision_of``, dev27) waits
|
|
397
|
+
for nobody: it is history, kept with its author and its verification."""
|
|
398
|
+
if graph is not None and getattr(node, "node_type", None) == "translation":
|
|
399
|
+
from .translation import is_superseded
|
|
400
|
+
if is_superseded(graph, node):
|
|
401
|
+
return []
|
|
386
402
|
reasons: List[str] = []
|
|
387
403
|
if is_unvalidated_ai(node):
|
|
388
404
|
reasons.append(REASON_AI)
|
|
@@ -431,7 +447,7 @@ def to_review(graph: Any) -> List[Dict[str, Any]]:
|
|
|
431
447
|
|
|
432
448
|
|
|
433
449
|
def verify(graph: Any, node: Any, author_id: str, *,
|
|
434
|
-
at: Optional[str] = None) -> Dict[str, Any]:
|
|
450
|
+
at: Optional[str] = None, auth: Any = None) -> Dict[str, Any]:
|
|
435
451
|
"""A person signs what waited for them: AI content OR a requested review.
|
|
436
452
|
|
|
437
453
|
The same signature as :func:`validate_node` (``validated_by`` = a human
|
|
@@ -439,9 +455,15 @@ def verify(graph: Any, node: Any, author_id: str, *,
|
|
|
439
455
|
node that waits for nothing. ``review_requested`` stays written: it says
|
|
440
456
|
the review was asked for, and ``validated_by`` says it was done and by whom.
|
|
441
457
|
A stale translation is not cleared by a signature (see :func:`needs_review`).
|
|
458
|
+
|
|
459
|
+
``auth`` — how the signer had entered (dev27, *l'accesso sul campo*):
|
|
460
|
+
``"orcid"`` or ``{"mode": "node_password", "attested_by": <node>}``,
|
|
461
|
+
written as ``validated_auth`` beside ``validated_by``
|
|
462
|
+
(:func:`s3dgraphy.editorial.normalize_auth`).
|
|
442
463
|
"""
|
|
443
|
-
from .editorial import now_iso, normalize_instant
|
|
464
|
+
from .editorial import normalize_auth, now_iso, normalize_instant
|
|
444
465
|
resolve_validator(graph, author_id)
|
|
466
|
+
how = normalize_auth(auth)
|
|
445
467
|
if not (is_ai_assisted(node) or review_requested(node)):
|
|
446
468
|
raise AIValidationError(
|
|
447
469
|
f"'{getattr(node, 'node_id', '?')}' waits for no verification: it is "
|
|
@@ -449,4 +471,11 @@ def verify(graph: Any, node: Any, author_id: str, *,
|
|
|
449
471
|
data = _data(node)
|
|
450
472
|
data[VALIDATED_BY] = author_id
|
|
451
473
|
data[VALIDATED_AT] = normalize_instant(at) if at else now_iso()
|
|
452
|
-
|
|
474
|
+
if how:
|
|
475
|
+
data["validated_auth"] = how
|
|
476
|
+
else:
|
|
477
|
+
data.pop("validated_auth", None)
|
|
478
|
+
out = {VALIDATED_BY: data[VALIDATED_BY], VALIDATED_AT: data[VALIDATED_AT]}
|
|
479
|
+
if how:
|
|
480
|
+
out["validated_auth"] = how
|
|
481
|
+
return out
|