From 6e33e05ede21b98c0088139e9bc4c049498c4d41 Mon Sep 17 00:00:00 2001 From: Digital Drosophila Archive Date: Thu, 1 Oct 2026 03:42:51 +0800 Subject: [PATCH] Publish licensed data snapshots with LAN LFS transfer and content audits --- .../celltype-explorer/catalog.json | 52 ++ .../celltype-explorer/exclusions.jsonl.gz | 3 + .../celltype-explorer/members.jsonl.gz | 3 + .../celltype-explorer/payload-000000.bin | 3 + .../celltype-explorer/payload-000001.bin | 3 + .../door-data/catalog.json | 51 ++ .../door-data/exclusions.jsonl.gz | 3 + .../door-data/members.jsonl.gz | 3 + .../door-data/payload-000000.bin | 3 + .../malecns-processed/catalog.json | 102 ++++ .../malecns-processed/exclusions.jsonl.gz | 3 + .../malecns-processed/members.jsonl.gz | 3 + .../malecns-processed/payload-000000.bin | 3 + .../malecns-processed/payload-000001.bin | 3 + .../malecns-processed/payload-000002.bin | 3 + .../malecns-processed/payload-000003.bin | 3 + .../malecns-processed/payload-000004.bin | 3 + .../malecns-processed/payload-000005.bin | 3 + .../malecns-processed/payload-000006.bin | 3 + .../malecns-processed/payload-000007.bin | 3 + .../malecns-processed/payload-000008.bin | 3 + .../malecns-processed/payload-000009.bin | 3 + .../malecns-swc/catalog.json | 291 ++++++++++ .../malecns-swc/exclusions.jsonl.gz | 3 + .../malecns-swc/members.jsonl.gz | 3 + .../malecns-swc/payload-000000.bin | 3 + .../malecns-swc/payload-000001.bin | 3 + .../malecns-swc/payload-000002.bin | 3 + .../malecns-swc/payload-000003.bin | 3 + .../malecns-swc/payload-000004.bin | 3 + .../malecns-swc/payload-000005.bin | 3 + .../malecns-swc/payload-000006.bin | 3 + .../malecns-swc/payload-000007.bin | 3 + .../malecns-swc/payload-000008.bin | 3 + .../malecns-swc/payload-000009.bin | 3 + .../malecns-swc/payload-000010.bin | 3 + .../malecns-swc/payload-000011.bin | 3 + .../malecns-swc/payload-000012.bin | 3 + .../malecns-swc/payload-000013.bin | 3 + .../malecns-swc/payload-000014.bin | 3 + .../malecns-swc/payload-000015.bin | 3 + .../malecns-swc/payload-000016.bin | 3 + .../malecns-swc/payload-000017.bin | 3 + .../malecns-swc/payload-000018.bin | 3 + .../malecns-swc/payload-000019.bin | 3 + .../malecns-swc/payload-000020.bin | 3 + .../malecns-swc/payload-000021.bin | 3 + .../malecns-swc/payload-000022.bin | 3 + .../malecns-swc/payload-000023.bin | 3 + .../malecns-swc/payload-000024.bin | 3 + .../malecns-swc/payload-000025.bin | 3 + .../malecns-swc/payload-000026.bin | 3 + .../malecns-swc/payload-000027.bin | 3 + .../malecns-swc/payload-000028.bin | 3 + .../malecns-swc/payload-000029.bin | 3 + .../malecns-swc/payload-000030.bin | 3 + .../malecns-swc/payload-000031.bin | 3 + .../malecns-swc/payload-000032.bin | 3 + .../malecns-swc/payload-000033.bin | 3 + .../malecns-swc/payload-000034.bin | 3 + .../malecns-swc/payload-000035.bin | 3 + .../malecns-swc/payload-000036.bin | 3 + .../malecns-swc/payload-000037.bin | 3 + .../malecns-swc/payload-000038.bin | 3 + .../malecns-swc/payload-000039.bin | 3 + .../malecns-swc/payload-000040.bin | 3 + .../malecns-swc/payload-000041.bin | 3 + .../malecns-synaptic-partners/catalog.json | 496 ++++++++++++++++++ .../exclusions.jsonl.gz | 3 + .../members.jsonl.gz | 3 + .../payload-000000.bin | 3 + .../payload-000001.bin | 3 + .../payload-000002.bin | 3 + .../payload-000003.bin | 3 + .../payload-000004.bin | 3 + .../payload-000005.bin | 3 + .../payload-000006.bin | 3 + .../payload-000007.bin | 3 + .../payload-000008.bin | 3 + .../payload-000009.bin | 3 + .../payload-000010.bin | 3 + .../payload-000011.bin | 3 + .../payload-000012.bin | 3 + .../payload-000013.bin | 3 + .../payload-000014.bin | 3 + .../payload-000015.bin | 3 + .../payload-000016.bin | 3 + .../payload-000017.bin | 3 + .../payload-000018.bin | 3 + .../payload-000019.bin | 3 + .../payload-000020.bin | 3 + .../payload-000021.bin | 3 + .../payload-000022.bin | 3 + .../payload-000023.bin | 3 + .../payload-000024.bin | 3 + .../payload-000025.bin | 3 + .../payload-000026.bin | 3 + .../payload-000027.bin | 3 + .../payload-000028.bin | 3 + .../payload-000029.bin | 3 + .../payload-000030.bin | 3 + .../payload-000031.bin | 3 + .../payload-000032.bin | 3 + .../payload-000033.bin | 3 + .../payload-000034.bin | 3 + .../payload-000035.bin | 3 + .../payload-000036.bin | 3 + .../payload-000037.bin | 3 + .../payload-000038.bin | 3 + .../payload-000039.bin | 3 + .../payload-000040.bin | 3 + .../payload-000041.bin | 3 + .../payload-000042.bin | 3 + .../payload-000043.bin | 3 + .../payload-000044.bin | 3 + .../payload-000045.bin | 3 + .../payload-000046.bin | 3 + .../payload-000047.bin | 3 + .../payload-000048.bin | 3 + .../payload-000049.bin | 3 + .../payload-000050.bin | 3 + .../payload-000051.bin | 3 + .../payload-000052.bin | 3 + .../payload-000053.bin | 3 + .../payload-000054.bin | 3 + .../payload-000055.bin | 3 + .../payload-000056.bin | 3 + .../payload-000057.bin | 3 + .../payload-000058.bin | 3 + .../payload-000059.bin | 3 + .../payload-000060.bin | 3 + .../payload-000061.bin | 3 + .../payload-000062.bin | 3 + .../payload-000063.bin | 3 + .../payload-000064.bin | 3 + .../payload-000065.bin | 3 + .../payload-000066.bin | 3 + .../payload-000067.bin | 3 + .../payload-000068.bin | 3 + .../payload-000069.bin | 3 + .../payload-000070.bin | 3 + .../payload-000071.bin | 3 + .../payload-000072.bin | 3 + .../payload-000073.bin | 3 + .../payload-000074.bin | 3 + .../payload-000075.bin | 3 + .../pack-summary.json | 73 +++ .../shiu-author-model-source/catalog.json | 46 ++ .../exclusions.jsonl.gz | 3 + .../shiu-author-model-source/members.jsonl.gz | 3 + .../payload-000000.bin | 3 + .../visualpathways/catalog.json | 82 +++ .../visualpathways/exclusions.jsonl.gz | 3 + .../visualpathways/members.jsonl.gz | 3 + .../visualpathways/payload-000000.bin | 3 + .../visualpathways/payload-000001.bin | 3 + .../visualpathways/payload-000002.bin | 3 + .../visualpathways/payload-000003.bin | 3 + .../visualpathways/payload-000004.bin | 3 + .../visualpathways/payload-000005.bin | 3 + .../visualpathways/payload-000006.bin | 3 + registry/publication-20261001/README.md | 10 + .../lan-roundtrip-smoke.json | 40 ++ .../local-content-verification.json | 206 ++++++++ .../source-guard-after-pack.json | 123 +++++ registry/publication-20261001/tool-tests.json | 15 + tools/lfs-publication/download_verify.py | 232 ++++++++ tools/lfs-publication/lan_lfs_transfer.py | 336 ++++++++++++ tools/lfs-publication/run_lan_smoke.py | 52 ++ tools/lfs-publication/test_download_verify.py | 245 +++++++++ .../lfs-publication/test_lan_lfs_transfer.py | 286 ++++++++++ .../test_verify_publication.py | 184 +++++++ tools/lfs-publication/verify_publication.py | 233 ++++++++ 173 files changed, 3614 insertions(+) create mode 100644 artifacts/public-resources-20261001/celltype-explorer/catalog.json create mode 100644 artifacts/public-resources-20261001/celltype-explorer/exclusions.jsonl.gz create mode 100644 artifacts/public-resources-20261001/celltype-explorer/members.jsonl.gz create mode 100644 artifacts/public-resources-20261001/celltype-explorer/payload-000000.bin create mode 100644 artifacts/public-resources-20261001/celltype-explorer/payload-000001.bin create mode 100644 artifacts/public-resources-20261001/door-data/catalog.json create mode 100644 artifacts/public-resources-20261001/door-data/exclusions.jsonl.gz create mode 100644 artifacts/public-resources-20261001/door-data/members.jsonl.gz create mode 100644 artifacts/public-resources-20261001/door-data/payload-000000.bin create mode 100644 artifacts/public-resources-20261001/malecns-processed/catalog.json create mode 100644 artifacts/public-resources-20261001/malecns-processed/exclusions.jsonl.gz create mode 100644 artifacts/public-resources-20261001/malecns-processed/members.jsonl.gz create mode 100644 artifacts/public-resources-20261001/malecns-processed/payload-000000.bin create mode 100644 artifacts/public-resources-20261001/malecns-processed/payload-000001.bin create mode 100644 artifacts/public-resources-20261001/malecns-processed/payload-000002.bin create mode 100644 artifacts/public-resources-20261001/malecns-processed/payload-000003.bin create mode 100644 artifacts/public-resources-20261001/malecns-processed/payload-000004.bin create mode 100644 artifacts/public-resources-20261001/malecns-processed/payload-000005.bin create mode 100644 artifacts/public-resources-20261001/malecns-processed/payload-000006.bin create mode 100644 artifacts/public-resources-20261001/malecns-processed/payload-000007.bin create mode 100644 artifacts/public-resources-20261001/malecns-processed/payload-000008.bin create mode 100644 artifacts/public-resources-20261001/malecns-processed/payload-000009.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/catalog.json create mode 100644 artifacts/public-resources-20261001/malecns-swc/exclusions.jsonl.gz create mode 100644 artifacts/public-resources-20261001/malecns-swc/members.jsonl.gz create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000000.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000001.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000002.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000003.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000004.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000005.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000006.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000007.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000008.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000009.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000010.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000011.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000012.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000013.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000014.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000015.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000016.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000017.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000018.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000019.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000020.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000021.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000022.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000023.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000024.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000025.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000026.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000027.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000028.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000029.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000030.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000031.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000032.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000033.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000034.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000035.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000036.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000037.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000038.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000039.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000040.bin create mode 100644 artifacts/public-resources-20261001/malecns-swc/payload-000041.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/catalog.json create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/exclusions.jsonl.gz create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/members.jsonl.gz create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000000.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000001.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000002.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000003.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000004.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000005.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000006.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000007.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000008.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000009.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000010.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000011.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000012.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000013.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000014.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000015.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000016.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000017.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000018.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000019.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000020.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000021.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000022.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000023.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000024.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000025.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000026.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000027.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000028.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000029.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000030.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000031.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000032.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000033.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000034.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000035.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000036.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000037.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000038.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000039.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000040.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000041.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000042.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000043.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000044.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000045.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000046.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000047.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000048.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000049.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000050.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000051.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000052.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000053.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000054.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000055.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000056.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000057.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000058.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000059.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000060.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000061.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000062.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000063.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000064.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000065.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000066.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000067.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000068.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000069.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000070.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000071.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000072.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000073.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000074.bin create mode 100644 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000075.bin create mode 100644 artifacts/public-resources-20261001/pack-summary.json create mode 100644 artifacts/public-resources-20261001/shiu-author-model-source/catalog.json create mode 100644 artifacts/public-resources-20261001/shiu-author-model-source/exclusions.jsonl.gz create mode 100644 artifacts/public-resources-20261001/shiu-author-model-source/members.jsonl.gz create mode 100644 artifacts/public-resources-20261001/shiu-author-model-source/payload-000000.bin create mode 100644 artifacts/public-resources-20261001/visualpathways/catalog.json create mode 100644 artifacts/public-resources-20261001/visualpathways/exclusions.jsonl.gz create mode 100644 artifacts/public-resources-20261001/visualpathways/members.jsonl.gz create mode 100644 artifacts/public-resources-20261001/visualpathways/payload-000000.bin create mode 100644 artifacts/public-resources-20261001/visualpathways/payload-000001.bin create mode 100644 artifacts/public-resources-20261001/visualpathways/payload-000002.bin create mode 100644 artifacts/public-resources-20261001/visualpathways/payload-000003.bin create mode 100644 artifacts/public-resources-20261001/visualpathways/payload-000004.bin create mode 100644 artifacts/public-resources-20261001/visualpathways/payload-000005.bin create mode 100644 artifacts/public-resources-20261001/visualpathways/payload-000006.bin create mode 100644 registry/publication-20261001/lan-roundtrip-smoke.json create mode 100644 registry/publication-20261001/local-content-verification.json create mode 100644 registry/publication-20261001/source-guard-after-pack.json create mode 100644 registry/publication-20261001/tool-tests.json create mode 100644 tools/lfs-publication/download_verify.py create mode 100644 tools/lfs-publication/lan_lfs_transfer.py create mode 100644 tools/lfs-publication/run_lan_smoke.py create mode 100644 tools/lfs-publication/test_download_verify.py create mode 100644 tools/lfs-publication/test_lan_lfs_transfer.py create mode 100644 tools/lfs-publication/test_verify_publication.py create mode 100644 tools/lfs-publication/verify_publication.py diff --git a/artifacts/public-resources-20261001/celltype-explorer/catalog.json b/artifacts/public-resources-20261001/celltype-explorer/catalog.json new file mode 100644 index 0000000..e3e339f --- /dev/null +++ b/artifacts/public-resources-20261001/celltype-explorer/catalog.json @@ -0,0 +1,52 @@ +{ + "archive_bytes": 77971754, + "archive_format": "tar.pax+zstd", + "archive_sha256": "2366caef95fb5ad038639a6ae2ad25139a14c42492bc19640c20af46fefa0bc7", + "chunk_bytes": 67108864, + "chunks": [ + { + "bytes": 67108864, + "index": 0, + "path": "payload-000000.bin", + "sha256": "6f5830463b8a0077ae89e550ca45275d57cf7e81813c42bf66f89d13a42c03ee" + }, + { + "bytes": 10862890, + "index": 1, + "path": "payload-000001.bin", + "sha256": "6b80b0133af06279bd30561f35042b679bd392b9236ee519d1e7ed9c4e85fb6a" + } + ], + "exclusion_records": 1, + "exclusions": { + "bytes": 144, + "sha256": "c1bca109b61e53327fa7e01128a411d8ea328972593168c3ad6e1202dfdddc9c" + }, + "group_id": "celltype-explorer", + "license": { + "evidence_file": "LICENSE", + "evidence_sha256": "9ba9550ad48438d0836ddab3da480b3b69ffa0aac7b7878b5a0039e7ab429411", + "upstream": "CC-BY-4.0", + "url": "https://creativecommons.org/licenses/by/4.0/" + }, + "members": { + "bytes": 421593, + "sha256": "8a51d3b4138bad12a520f8d1a12d54673416017d15fd1b1bcc49ed385da005bb" + }, + "plan_sha256": "a20a61821c504e8315171a5fd14afbac011b934709af344045175bdda9fcba71", + "provenance": { + "attribution": "Reiser Lab and Male CNS Cell Type Explorer contributors; retain upstream notices", + "changes": "Unchanged pinned working-tree file bytes; .git, environments, caches and credentials excluded. A source snapshot, not a full Git clone.", + "commit": "789cc6c105798ce2fd70ba85dab394f90899616b", + "repository": "https://github.com/reiserlab/celltype-explorer-drosophila-male-cns" + }, + "schema": "lfs-publication-group-v1", + "secret_scan": "UTF-8 files <=2 MiB, known binary suffixes excluded; fail closed on matching rules", + "source_bytes": 3957079583, + "source_files": 8973, + "source_paths": [ + "experiments/phase4f-retinotopic-vision/external-resources/celltype-explorer" + ], + "source_root": "/data/digital-drosophila", + "verification_scope": "content snapshot, not a license grant or nested-archive secret audit" +} diff --git a/artifacts/public-resources-20261001/celltype-explorer/exclusions.jsonl.gz b/artifacts/public-resources-20261001/celltype-explorer/exclusions.jsonl.gz new file mode 100644 index 0000000..09e234a --- /dev/null +++ b/artifacts/public-resources-20261001/celltype-explorer/exclusions.jsonl.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1bca109b61e53327fa7e01128a411d8ea328972593168c3ad6e1202dfdddc9c +size 144 diff --git a/artifacts/public-resources-20261001/celltype-explorer/members.jsonl.gz b/artifacts/public-resources-20261001/celltype-explorer/members.jsonl.gz new file mode 100644 index 0000000..cd56075 --- /dev/null +++ b/artifacts/public-resources-20261001/celltype-explorer/members.jsonl.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a51d3b4138bad12a520f8d1a12d54673416017d15fd1b1bcc49ed385da005bb +size 421593 diff --git a/artifacts/public-resources-20261001/celltype-explorer/payload-000000.bin b/artifacts/public-resources-20261001/celltype-explorer/payload-000000.bin new file mode 100644 index 0000000..bd8c136 --- /dev/null +++ b/artifacts/public-resources-20261001/celltype-explorer/payload-000000.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f5830463b8a0077ae89e550ca45275d57cf7e81813c42bf66f89d13a42c03ee +size 67108864 diff --git a/artifacts/public-resources-20261001/celltype-explorer/payload-000001.bin b/artifacts/public-resources-20261001/celltype-explorer/payload-000001.bin new file mode 100644 index 0000000..8b27137 --- /dev/null +++ b/artifacts/public-resources-20261001/celltype-explorer/payload-000001.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b80b0133af06279bd30561f35042b679bd392b9236ee519d1e7ed9c4e85fb6a +size 10862890 diff --git a/artifacts/public-resources-20261001/door-data/catalog.json b/artifacts/public-resources-20261001/door-data/catalog.json new file mode 100644 index 0000000..49f4b20 --- /dev/null +++ b/artifacts/public-resources-20261001/door-data/catalog.json @@ -0,0 +1,51 @@ +{ + "archive_bytes": 901984, + "archive_format": "tar.pax+zstd", + "archive_sha256": "64d415a1ea9f5c2fe09005ce1c2bb27eb45510fad27ad3c39cf0001e6f525fd1", + "chunk_bytes": 67108864, + "chunks": [ + { + "bytes": 901984, + "index": 0, + "path": "payload-000000.bin", + "sha256": "64d415a1ea9f5c2fe09005ce1c2bb27eb45510fad27ad3c39cf0001e6f525fd1" + } + ], + "exclusion_records": 1, + "exclusions": { + "bytes": 147, + "sha256": "82627a482fd6adfc3abf4f83a30158fd8371b4532f425f7eb3b03044eb7e1367" + }, + "group_id": "door-data", + "license": { + "evidence_file": "DESCRIPTION", + "evidence_sha256": "27db2a92eb651d67969de94959990d51668a5857a33c4750a3b6ef49c5880504", + "upstream": "CC-BY-SA-4.0", + "url": "https://creativecommons.org/licenses/by-sa/4.0/" + }, + "members": { + "bytes": 9486, + "sha256": "ef13db49577b3b3d1c7c31aab117d911a2decc5a80ead66b6a350c43d16374b4" + }, + "plan_sha256": "a20a61821c504e8315171a5fd14afbac011b934709af344045175bdda9fcba71", + "provenance": { + "attribution": "Daniel Münch, C. Giovanni Galizia, Shouwen Ma, Martin Strauch, Anja Nissler; see upstream DESCRIPTION and data-source references", + "changes": "Unchanged pinned data package; .git omitted. ShareAlike terms remain attached to this package, not asserted over unrelated repository content.", + "commit": "eea72d64b42a4e91dafe822cf0b5204de33f8d34", + "papers": [ + "https://doi.org/10.1038/srep21841", + "https://doi.org/10.1093/chemse/bjq042" + ], + "repository": "https://github.com/ropensci/DoOR.data", + "version": "2.0.1" + }, + "schema": "lfs-publication-group-v1", + "secret_scan": "UTF-8 files <=2 MiB, known binary suffixes excluded; fail closed on matching rules", + "source_bytes": 6534522, + "source_files": 189, + "source_paths": [ + "experiments/phase4l-olfactory-grounding/external-resources/DoOR.data" + ], + "source_root": "/data/digital-drosophila", + "verification_scope": "content snapshot, not a license grant or nested-archive secret audit" +} diff --git a/artifacts/public-resources-20261001/door-data/exclusions.jsonl.gz b/artifacts/public-resources-20261001/door-data/exclusions.jsonl.gz new file mode 100644 index 0000000..42e4206 --- /dev/null +++ b/artifacts/public-resources-20261001/door-data/exclusions.jsonl.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82627a482fd6adfc3abf4f83a30158fd8371b4532f425f7eb3b03044eb7e1367 +size 147 diff --git a/artifacts/public-resources-20261001/door-data/members.jsonl.gz b/artifacts/public-resources-20261001/door-data/members.jsonl.gz new file mode 100644 index 0000000..ab7591b --- /dev/null +++ b/artifacts/public-resources-20261001/door-data/members.jsonl.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef13db49577b3b3d1c7c31aab117d911a2decc5a80ead66b6a350c43d16374b4 +size 9486 diff --git a/artifacts/public-resources-20261001/door-data/payload-000000.bin b/artifacts/public-resources-20261001/door-data/payload-000000.bin new file mode 100644 index 0000000..19555f6 --- /dev/null +++ b/artifacts/public-resources-20261001/door-data/payload-000000.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64d415a1ea9f5c2fe09005ce1c2bb27eb45510fad27ad3c39cf0001e6f525fd1 +size 901984 diff --git a/artifacts/public-resources-20261001/malecns-processed/catalog.json b/artifacts/public-resources-20261001/malecns-processed/catalog.json new file mode 100644 index 0000000..64716b1 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-processed/catalog.json @@ -0,0 +1,102 @@ +{ + "archive_bytes": 635332131, + "archive_format": "tar.pax+zstd", + "archive_sha256": "a5d8ac0e6eebd5c6235078e9a9ac5a5c224bc86185bb77dd38248833c6b946f1", + "chunk_bytes": 67108864, + "chunks": [ + { + "bytes": 67108864, + "index": 0, + "path": "payload-000000.bin", + "sha256": "a65619004cdc36e594bdca344d1fe51ac86fb719159f70a2ba0fb21c763f9c04" + }, + { + "bytes": 67108864, + "index": 1, + "path": "payload-000001.bin", + "sha256": "cca9eedbc44b20be736317745ee12e8c06bf0e1aafc7815b74bc6aa27cef5be5" + }, + { + "bytes": 67108864, + "index": 2, + "path": "payload-000002.bin", + "sha256": "e395b23867e74b7579aed8eeb927e373c86d77433962a0f89ac198aeca4f8470" + }, + { + "bytes": 67108864, + "index": 3, + "path": "payload-000003.bin", + "sha256": "e47d83eba2875f963add02ab697cb6386dd8fe4a5f33b96db5a321986a276774" + }, + { + "bytes": 67108864, + "index": 4, + "path": "payload-000004.bin", + "sha256": "4d4bdff46071f05c29ac34cd9081204739317bef5ab862d612d2c7a82c3d5bca" + }, + { + "bytes": 67108864, + "index": 5, + "path": "payload-000005.bin", + "sha256": "4f82611c41e868faa6ea06d7bd275df90f712e3f5eb14296117e39c3bf6c95c0" + }, + { + "bytes": 67108864, + "index": 6, + "path": "payload-000006.bin", + "sha256": "4cbfb164c194db8c54eadef4d039240d98b0f5be8e20e4005be08bd2d2f6ab5d" + }, + { + "bytes": 67108864, + "index": 7, + "path": "payload-000007.bin", + "sha256": "9ba4adfe64d73d0ceb249ab25215734f58b0d8b38d11f22676fd93f68e83df68" + }, + { + "bytes": 67108864, + "index": 8, + "path": "payload-000008.bin", + "sha256": "8f388376c6e9d3b7abaff219b00d669ea88db1bf5cd48381db9354598102b345" + }, + { + "bytes": 31352355, + "index": 9, + "path": "payload-000009.bin", + "sha256": "e1ac638f1d640de9e85b82d9526d6f729f78239e66c5c024e0037144adf7f003" + } + ], + "exclusion_records": 6, + "exclusions": { + "bytes": 219, + "sha256": "0909f401f73ca15301ea2be92a5e7c66cf79d9d4f8bbe5449f82c2980d6d3e80" + }, + "group_id": "malecns-processed", + "license": { + "derived_data": "CC-BY-4.0", + "local_scripts_reports": "Project-authored processing and provenance; no new blanket software license", + "url": "https://creativecommons.org/licenses/by/4.0/" + }, + "members": { + "bytes": 3639, + "sha256": "fe399bea661cdd018e53a5ea58bc46a64d2f94fb09d1dec40f8a956789204627" + }, + "plan_sha256": "a20a61821c504e8315171a5fd14afbac011b934709af344045175bdda9fcba71", + "provenance": { + "attribution": "Original Male CNS collaboration; Digital Drosophila project for local processing", + "canonical_edges": 25582938, + "canonical_neurons": 166700, + "canonical_synaptic_weight_sum": 124177617, + "changes": "Existing Phase 3 all-body and Phase 3B neuron-only tables, index mappings, CSR and audit reports, copied byte-for-byte. These were previously derived by filtering/reindexing official data, not new preprocessing. Phase 3 historical outputs are not the approved SNN input; use neuron-only for current runtime.", + "dataset": "male-cns:v1.0", + "source_page": "https://male-cns.janelia.org/download/" + }, + "schema": "lfs-publication-group-v1", + "secret_scan": "UTF-8 files <=2 MiB, known binary suffixes excluded; fail closed on matching rules", + "source_bytes": 1140025370, + "source_files": 64, + "source_paths": [ + "datasets/male-cns-v1.0/processed" + ], + "source_root": "/data/digital-drosophila", + "verification_scope": "content snapshot, not a license grant or nested-archive secret audit" +} diff --git a/artifacts/public-resources-20261001/malecns-processed/exclusions.jsonl.gz b/artifacts/public-resources-20261001/malecns-processed/exclusions.jsonl.gz new file mode 100644 index 0000000..d9c5518 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-processed/exclusions.jsonl.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0909f401f73ca15301ea2be92a5e7c66cf79d9d4f8bbe5449f82c2980d6d3e80 +size 219 diff --git a/artifacts/public-resources-20261001/malecns-processed/members.jsonl.gz b/artifacts/public-resources-20261001/malecns-processed/members.jsonl.gz new file mode 100644 index 0000000..1ba7548 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-processed/members.jsonl.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe399bea661cdd018e53a5ea58bc46a64d2f94fb09d1dec40f8a956789204627 +size 3639 diff --git a/artifacts/public-resources-20261001/malecns-processed/payload-000000.bin b/artifacts/public-resources-20261001/malecns-processed/payload-000000.bin new file mode 100644 index 0000000..b69d887 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-processed/payload-000000.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a65619004cdc36e594bdca344d1fe51ac86fb719159f70a2ba0fb21c763f9c04 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-processed/payload-000001.bin b/artifacts/public-resources-20261001/malecns-processed/payload-000001.bin new file mode 100644 index 0000000..7aced7b --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-processed/payload-000001.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cca9eedbc44b20be736317745ee12e8c06bf0e1aafc7815b74bc6aa27cef5be5 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-processed/payload-000002.bin b/artifacts/public-resources-20261001/malecns-processed/payload-000002.bin new file mode 100644 index 0000000..ef37328 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-processed/payload-000002.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e395b23867e74b7579aed8eeb927e373c86d77433962a0f89ac198aeca4f8470 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-processed/payload-000003.bin b/artifacts/public-resources-20261001/malecns-processed/payload-000003.bin new file mode 100644 index 0000000..ac6d831 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-processed/payload-000003.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e47d83eba2875f963add02ab697cb6386dd8fe4a5f33b96db5a321986a276774 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-processed/payload-000004.bin b/artifacts/public-resources-20261001/malecns-processed/payload-000004.bin new file mode 100644 index 0000000..769b6f7 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-processed/payload-000004.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d4bdff46071f05c29ac34cd9081204739317bef5ab862d612d2c7a82c3d5bca +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-processed/payload-000005.bin b/artifacts/public-resources-20261001/malecns-processed/payload-000005.bin new file mode 100644 index 0000000..bc672ab --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-processed/payload-000005.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f82611c41e868faa6ea06d7bd275df90f712e3f5eb14296117e39c3bf6c95c0 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-processed/payload-000006.bin b/artifacts/public-resources-20261001/malecns-processed/payload-000006.bin new file mode 100644 index 0000000..f34f6eb --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-processed/payload-000006.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4cbfb164c194db8c54eadef4d039240d98b0f5be8e20e4005be08bd2d2f6ab5d +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-processed/payload-000007.bin b/artifacts/public-resources-20261001/malecns-processed/payload-000007.bin new file mode 100644 index 0000000..636780a --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-processed/payload-000007.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ba4adfe64d73d0ceb249ab25215734f58b0d8b38d11f22676fd93f68e83df68 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-processed/payload-000008.bin b/artifacts/public-resources-20261001/malecns-processed/payload-000008.bin new file mode 100644 index 0000000..11b4bd2 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-processed/payload-000008.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f388376c6e9d3b7abaff219b00d669ea88db1bf5cd48381db9354598102b345 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-processed/payload-000009.bin b/artifacts/public-resources-20261001/malecns-processed/payload-000009.bin new file mode 100644 index 0000000..75cc67b --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-processed/payload-000009.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1ac638f1d640de9e85b82d9526d6f729f78239e66c5c024e0037144adf7f003 +size 31352355 diff --git a/artifacts/public-resources-20261001/malecns-swc/catalog.json b/artifacts/public-resources-20261001/malecns-swc/catalog.json new file mode 100644 index 0000000..0c70831 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/catalog.json @@ -0,0 +1,291 @@ +{ + "archive_bytes": 2760276945, + "archive_format": "tar.pax+zstd", + "archive_sha256": "537644b322747b821580818aaa4154ab15714f0ddbcebc3183b587682760f57e", + "chunk_bytes": 67108864, + "chunks": [ + { + "bytes": 67108864, + "index": 0, + "path": "payload-000000.bin", + "sha256": "1f21099a6411dec6c0b1f5eba48618de749ac6ec7f18b18d7521fe75b7fe32e9" + }, + { + "bytes": 67108864, + "index": 1, + "path": "payload-000001.bin", + "sha256": "a749bcac2abeb5f8621603d81a069a96b63cc5e12dbb87b51744b5838c25bab5" + }, + { + "bytes": 67108864, + "index": 2, + "path": "payload-000002.bin", + "sha256": "8bacba0b7452c99f2a8e57b17f72604671d78faed5dbc39cf800b148a9a3476b" + }, + { + "bytes": 67108864, + "index": 3, + "path": "payload-000003.bin", + "sha256": "0e226842328b68a4ce86bdb612379047c44a535c6d4b5eb8aa97ed0fccccede4" + }, + { + "bytes": 67108864, + "index": 4, + "path": "payload-000004.bin", + "sha256": "19559779bbd8f305c690ccb1c5a2a03b53bdee0e2afe3f6dca1faf2926ae1143" + }, + { + "bytes": 67108864, + "index": 5, + "path": "payload-000005.bin", + "sha256": "f9441d9484184e90d3b962b9b32ef80e8daa1944ca67d11e691fda715eb4908f" + }, + { + "bytes": 67108864, + "index": 6, + "path": "payload-000006.bin", + "sha256": "c022c80fe76fbbe69602755de5ea74b97db9ee56db280d6c9ec863ba3c1ff332" + }, + { + "bytes": 67108864, + "index": 7, + "path": "payload-000007.bin", + "sha256": "12370abe8bbe6fee58be01d6b2204b64c54a7eada3988a367de9451b910ae3e1" + }, + { + "bytes": 67108864, + "index": 8, + "path": "payload-000008.bin", + "sha256": "f7d5d2b8f699f15466e6fabcefc398b21f142d23c5ad173020add2461e32d27e" + }, + { + "bytes": 67108864, + "index": 9, + "path": "payload-000009.bin", + "sha256": "4e70530845d6e86b037cd7dc7d0d7a5bf544263f99893a6836525b92a5b142d4" + }, + { + "bytes": 67108864, + "index": 10, + "path": "payload-000010.bin", + "sha256": "9ce176c8fcaef8671815c5b4f3366c233632be1ac313ab6f351f7f93cd2f0072" + }, + { + "bytes": 67108864, + "index": 11, + "path": "payload-000011.bin", + "sha256": "12f4d9d507494cd85f17583fa9665f20b68f928db1125668d9bfc462fc0f66a5" + }, + { + "bytes": 67108864, + "index": 12, + "path": "payload-000012.bin", + "sha256": "39e8403e3fd8ea71e281034b346da33511d1ec1c236b1f16929113d4cec53e6d" + }, + { + "bytes": 67108864, + "index": 13, + "path": "payload-000013.bin", + "sha256": "979bb9d50a5b44608ce6ace417dec67236072d027fab79cf9b0255ed39c08020" + }, + { + "bytes": 67108864, + "index": 14, + "path": "payload-000014.bin", + "sha256": "b029a7948ae6c23916fcd81c3b9bf1a260f2c9d8659b53b7f5e556384349f21f" + }, + { + "bytes": 67108864, + "index": 15, + "path": "payload-000015.bin", + "sha256": "c26d6139d8e1a51ffabe1a06a13c2061a5928e168a961930d9d195a25b6ab620" + }, + { + "bytes": 67108864, + "index": 16, + "path": "payload-000016.bin", + "sha256": "98b5853bc02c4bd0bf1598fdfd1c52f55628660047fb4977f1f8eaf02e70b603" + }, + { + "bytes": 67108864, + "index": 17, + "path": "payload-000017.bin", + "sha256": "789d6ad66acddd2aaa750d4c27d55be897f0c9a935c0c1837d9e46c2f916d0b3" + }, + { + "bytes": 67108864, + "index": 18, + "path": "payload-000018.bin", + "sha256": "907c4ae7690a13663e8a489ec229f436e329823b7fb1c1e68228338388754ec7" + }, + { + "bytes": 67108864, + "index": 19, + "path": "payload-000019.bin", + "sha256": "c28d51fdf23a630eaf2506276da19d34c609a6b5448afdedd2efea25e4602b06" + }, + { + "bytes": 67108864, + "index": 20, + "path": "payload-000020.bin", + "sha256": "2d1be9e0abfd4604b55bfd0c8e740ee58bb153d126a81aa08126fecdc0057150" + }, + { + "bytes": 67108864, + "index": 21, + "path": "payload-000021.bin", + "sha256": "f9725762b7fb5e0cc5a896c8b63ceb816faa246aeba4a3082b9eaf492cbe97c5" + }, + { + "bytes": 67108864, + "index": 22, + "path": "payload-000022.bin", + "sha256": "72e90497e9e6fbf586e3659d4e023f47a8f3942ac10bce1fe314659f16568160" + }, + { + "bytes": 67108864, + "index": 23, + "path": "payload-000023.bin", + "sha256": "2fd9ba58a4f2acbb5fbbb023cb100a1bcc0079c7c490d25c2c63bd46441aa08e" + }, + { + "bytes": 67108864, + "index": 24, + "path": "payload-000024.bin", + "sha256": "ead438094c5a9d4b5550ebc95ec583d8e7cd1d84b601e549d50c4ab9a5e9818b" + }, + { + "bytes": 67108864, + "index": 25, + "path": "payload-000025.bin", + "sha256": "97b32a95ca08c4b69908c93a7ce40606a9597cd9f2eb47f9447cc4a93cb6eab2" + }, + { + "bytes": 67108864, + "index": 26, + "path": "payload-000026.bin", + "sha256": "6f985c609b0f1f3538b7b7407da46c2983781552cec9e12e5ca9b5ba5d1ceca9" + }, + { + "bytes": 67108864, + "index": 27, + "path": "payload-000027.bin", + "sha256": "7465e4aff8c0ad68fcbb201815828a5198611c18c8fb2cdfdaf4ba7b2a6b2456" + }, + { + "bytes": 67108864, + "index": 28, + "path": "payload-000028.bin", + "sha256": "7a3ba5b63ac70b19e54cce3e9f90038caae01e992fe81a45b7ddb370dcbf125e" + }, + { + "bytes": 67108864, + "index": 29, + "path": "payload-000029.bin", + "sha256": "c9fafa0218befdebb42d19ff7f720e18b392c742ff45e39b64018c41a31a1530" + }, + { + "bytes": 67108864, + "index": 30, + "path": "payload-000030.bin", + "sha256": "aac2f55805490cfa5e42bbd7cc169a83a40132f269d64315ebb2aec6dafc5a96" + }, + { + "bytes": 67108864, + "index": 31, + "path": "payload-000031.bin", + "sha256": "c362980ebf871332f8fc05f5f72ccce8ed13319c596039a960cd0450e7f09a78" + }, + { + "bytes": 67108864, + "index": 32, + "path": "payload-000032.bin", + "sha256": "52272e69c6b23bc0951f6cd4e824c357ccb13d3bb781cd68591a8a5476540229" + }, + { + "bytes": 67108864, + "index": 33, + "path": "payload-000033.bin", + "sha256": "c3ada974de03b55ce956d6af4f5d9238f2e1ab7ad2bd81265eb9a7bf883e65e1" + }, + { + "bytes": 67108864, + "index": 34, + "path": "payload-000034.bin", + "sha256": "7aa8cf11b2d356a45e2608295deeb6443bdcf83427a8b71e6da758e2cfed9e2d" + }, + { + "bytes": 67108864, + "index": 35, + "path": "payload-000035.bin", + "sha256": "0edc84c74eebcc6d1375bfe5e09e8933221b025cfd4ce98539a574c1b26c6cf4" + }, + { + "bytes": 67108864, + "index": 36, + "path": "payload-000036.bin", + "sha256": "ad237a494101cd4a392d0a29406b217673ecdfe1ac999f9ee76bcb99dd449840" + }, + { + "bytes": 67108864, + "index": 37, + "path": "payload-000037.bin", + "sha256": "fa89d550c2b9674ed8e01a1443d355c01cfebae2394a92f21999e09598159249" + }, + { + "bytes": 67108864, + "index": 38, + "path": "payload-000038.bin", + "sha256": "c22cd72daba6848f000d39c6c9e0f500c47c2a97c59bf4d01cb485c4542504af" + }, + { + "bytes": 67108864, + "index": 39, + "path": "payload-000039.bin", + "sha256": "9c3cb5c9db5915ec11ddd25f01c09a68bd493f2fa7e01a2832cf6b13bd034169" + }, + { + "bytes": 67108864, + "index": 40, + "path": "payload-000040.bin", + "sha256": "52f9bf010556a9c231771c36697c257059d1200f42b021811568e5ad8aaa81c8" + }, + { + "bytes": 8813521, + "index": 41, + "path": "payload-000041.bin", + "sha256": "3bd8789f041905e31bf669c2e9877dc19e92108dc721fa7db4c6f4a1fea2a850" + } + ], + "exclusion_records": 0, + "exclusions": { + "bytes": 20, + "sha256": "9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64" + }, + "group_id": "malecns-swc", + "license": { + "data": "CC-BY-4.0", + "url": "https://creativecommons.org/licenses/by/4.0/" + }, + "members": { + "bytes": 10023755, + "sha256": "1dcc1bac912889118e2a34211b4c43b2b0af871c8b76b97ede31db88ce67a961" + }, + "plan_sha256": "a20a61821c504e8315171a5fd14afbac011b934709af344045175bdda9fcba71", + "provenance": { + "attribution": "Male CNS collaboration: FlyEM (HHMI Janelia), University of Cambridge Department of Zoology, MRC Laboratory of Molecular Biology, Google Research", + "changes": "Unchanged downloaded SWC bytes; not restricted to the later neuron-only canonical set. No EM images.", + "source_page": "https://male-cns.janelia.org/download/", + "source_prefix": "gs://flyem-male-cns/v1.0/segmentation/skeletons-malecns/skeletons-swc/", + "version": "male-cns:v1.0" + }, + "schema": "lfs-publication-group-v1", + "secret_scan": "UTF-8 files <=2 MiB, known binary suffixes excluded; fail closed on matching rules", + "source_bytes": 9299975999, + "source_files": 211573, + "source_paths": [ + "datasets/male-cns-v1.0/raw/skeletons" + ], + "source_root": "/data/digital-drosophila", + "verification_scope": "content snapshot, not a license grant or nested-archive secret audit" +} diff --git a/artifacts/public-resources-20261001/malecns-swc/exclusions.jsonl.gz b/artifacts/public-resources-20261001/malecns-swc/exclusions.jsonl.gz new file mode 100644 index 0000000..1c35409 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/exclusions.jsonl.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64 +size 20 diff --git a/artifacts/public-resources-20261001/malecns-swc/members.jsonl.gz b/artifacts/public-resources-20261001/malecns-swc/members.jsonl.gz new file mode 100644 index 0000000..e7b5dd5 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/members.jsonl.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1dcc1bac912889118e2a34211b4c43b2b0af871c8b76b97ede31db88ce67a961 +size 10023755 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000000.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000000.bin new file mode 100644 index 0000000..304278d --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000000.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f21099a6411dec6c0b1f5eba48618de749ac6ec7f18b18d7521fe75b7fe32e9 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000001.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000001.bin new file mode 100644 index 0000000..1c0626b --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000001.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a749bcac2abeb5f8621603d81a069a96b63cc5e12dbb87b51744b5838c25bab5 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000002.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000002.bin new file mode 100644 index 0000000..c4ebb41 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000002.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8bacba0b7452c99f2a8e57b17f72604671d78faed5dbc39cf800b148a9a3476b +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000003.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000003.bin new file mode 100644 index 0000000..171a8b1 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000003.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e226842328b68a4ce86bdb612379047c44a535c6d4b5eb8aa97ed0fccccede4 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000004.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000004.bin new file mode 100644 index 0000000..ef9c568 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000004.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19559779bbd8f305c690ccb1c5a2a03b53bdee0e2afe3f6dca1faf2926ae1143 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000005.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000005.bin new file mode 100644 index 0000000..f630484 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000005.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9441d9484184e90d3b962b9b32ef80e8daa1944ca67d11e691fda715eb4908f +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000006.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000006.bin new file mode 100644 index 0000000..2fee0e3 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000006.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c022c80fe76fbbe69602755de5ea74b97db9ee56db280d6c9ec863ba3c1ff332 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000007.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000007.bin new file mode 100644 index 0000000..4d2eed4 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000007.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12370abe8bbe6fee58be01d6b2204b64c54a7eada3988a367de9451b910ae3e1 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000008.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000008.bin new file mode 100644 index 0000000..01dfb02 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000008.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7d5d2b8f699f15466e6fabcefc398b21f142d23c5ad173020add2461e32d27e +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000009.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000009.bin new file mode 100644 index 0000000..10623bd --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000009.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e70530845d6e86b037cd7dc7d0d7a5bf544263f99893a6836525b92a5b142d4 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000010.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000010.bin new file mode 100644 index 0000000..520e73d --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000010.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ce176c8fcaef8671815c5b4f3366c233632be1ac313ab6f351f7f93cd2f0072 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000011.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000011.bin new file mode 100644 index 0000000..d1f8fd7 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000011.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12f4d9d507494cd85f17583fa9665f20b68f928db1125668d9bfc462fc0f66a5 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000012.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000012.bin new file mode 100644 index 0000000..3094f06 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000012.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39e8403e3fd8ea71e281034b346da33511d1ec1c236b1f16929113d4cec53e6d +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000013.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000013.bin new file mode 100644 index 0000000..3f451d6 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000013.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:979bb9d50a5b44608ce6ace417dec67236072d027fab79cf9b0255ed39c08020 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000014.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000014.bin new file mode 100644 index 0000000..586190b --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000014.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b029a7948ae6c23916fcd81c3b9bf1a260f2c9d8659b53b7f5e556384349f21f +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000015.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000015.bin new file mode 100644 index 0000000..6dd7054 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000015.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c26d6139d8e1a51ffabe1a06a13c2061a5928e168a961930d9d195a25b6ab620 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000016.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000016.bin new file mode 100644 index 0000000..385371f --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000016.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98b5853bc02c4bd0bf1598fdfd1c52f55628660047fb4977f1f8eaf02e70b603 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000017.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000017.bin new file mode 100644 index 0000000..7542ed3 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000017.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:789d6ad66acddd2aaa750d4c27d55be897f0c9a935c0c1837d9e46c2f916d0b3 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000018.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000018.bin new file mode 100644 index 0000000..e96574b --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000018.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:907c4ae7690a13663e8a489ec229f436e329823b7fb1c1e68228338388754ec7 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000019.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000019.bin new file mode 100644 index 0000000..0bc017c --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000019.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c28d51fdf23a630eaf2506276da19d34c609a6b5448afdedd2efea25e4602b06 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000020.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000020.bin new file mode 100644 index 0000000..4e2f357 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000020.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d1be9e0abfd4604b55bfd0c8e740ee58bb153d126a81aa08126fecdc0057150 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000021.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000021.bin new file mode 100644 index 0000000..3ad329d --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000021.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9725762b7fb5e0cc5a896c8b63ceb816faa246aeba4a3082b9eaf492cbe97c5 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000022.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000022.bin new file mode 100644 index 0000000..14f4c47 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000022.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72e90497e9e6fbf586e3659d4e023f47a8f3942ac10bce1fe314659f16568160 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000023.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000023.bin new file mode 100644 index 0000000..a41e451 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000023.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2fd9ba58a4f2acbb5fbbb023cb100a1bcc0079c7c490d25c2c63bd46441aa08e +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000024.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000024.bin new file mode 100644 index 0000000..6b5e299 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000024.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ead438094c5a9d4b5550ebc95ec583d8e7cd1d84b601e549d50c4ab9a5e9818b +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000025.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000025.bin new file mode 100644 index 0000000..4e323bf --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000025.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97b32a95ca08c4b69908c93a7ce40606a9597cd9f2eb47f9447cc4a93cb6eab2 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000026.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000026.bin new file mode 100644 index 0000000..027ac30 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000026.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f985c609b0f1f3538b7b7407da46c2983781552cec9e12e5ca9b5ba5d1ceca9 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000027.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000027.bin new file mode 100644 index 0000000..ed54f94 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000027.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7465e4aff8c0ad68fcbb201815828a5198611c18c8fb2cdfdaf4ba7b2a6b2456 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000028.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000028.bin new file mode 100644 index 0000000..ba19b75 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000028.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a3ba5b63ac70b19e54cce3e9f90038caae01e992fe81a45b7ddb370dcbf125e +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000029.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000029.bin new file mode 100644 index 0000000..42e7a52 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000029.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9fafa0218befdebb42d19ff7f720e18b392c742ff45e39b64018c41a31a1530 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000030.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000030.bin new file mode 100644 index 0000000..3dca085 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000030.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aac2f55805490cfa5e42bbd7cc169a83a40132f269d64315ebb2aec6dafc5a96 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000031.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000031.bin new file mode 100644 index 0000000..b81af5d --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000031.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c362980ebf871332f8fc05f5f72ccce8ed13319c596039a960cd0450e7f09a78 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000032.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000032.bin new file mode 100644 index 0000000..f897bcb --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000032.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52272e69c6b23bc0951f6cd4e824c357ccb13d3bb781cd68591a8a5476540229 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000033.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000033.bin new file mode 100644 index 0000000..b1018df --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000033.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3ada974de03b55ce956d6af4f5d9238f2e1ab7ad2bd81265eb9a7bf883e65e1 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000034.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000034.bin new file mode 100644 index 0000000..12eb2bc --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000034.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7aa8cf11b2d356a45e2608295deeb6443bdcf83427a8b71e6da758e2cfed9e2d +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000035.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000035.bin new file mode 100644 index 0000000..8b8b235 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000035.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0edc84c74eebcc6d1375bfe5e09e8933221b025cfd4ce98539a574c1b26c6cf4 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000036.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000036.bin new file mode 100644 index 0000000..12e1e2c --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000036.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad237a494101cd4a392d0a29406b217673ecdfe1ac999f9ee76bcb99dd449840 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000037.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000037.bin new file mode 100644 index 0000000..814d377 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000037.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa89d550c2b9674ed8e01a1443d355c01cfebae2394a92f21999e09598159249 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000038.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000038.bin new file mode 100644 index 0000000..d61e72b --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000038.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c22cd72daba6848f000d39c6c9e0f500c47c2a97c59bf4d01cb485c4542504af +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000039.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000039.bin new file mode 100644 index 0000000..e102023 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000039.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c3cb5c9db5915ec11ddd25f01c09a68bd493f2fa7e01a2832cf6b13bd034169 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000040.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000040.bin new file mode 100644 index 0000000..86e9509 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000040.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52f9bf010556a9c231771c36697c257059d1200f42b021811568e5ad8aaa81c8 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-swc/payload-000041.bin b/artifacts/public-resources-20261001/malecns-swc/payload-000041.bin new file mode 100644 index 0000000..84214d1 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-swc/payload-000041.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3bd8789f041905e31bf669c2e9877dc19e92108dc721fa7db4c6f4a1fea2a850 +size 8813521 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/catalog.json b/artifacts/public-resources-20261001/malecns-synaptic-partners/catalog.json new file mode 100644 index 0000000..c41d977 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/catalog.json @@ -0,0 +1,496 @@ +{ + "archive_bytes": 5063205053, + "archive_format": "tar.pax+zstd", + "archive_sha256": "cf2927389ecf3d20cbccaa269941265e8c709544c60068f28a40a0643c6be13d", + "chunk_bytes": 67108864, + "chunks": [ + { + "bytes": 67108864, + "index": 0, + "path": "payload-000000.bin", + "sha256": "a507fb9917a63f6221d97780727831735bcf419bb6d36b17546f2be04e8f6b6b" + }, + { + "bytes": 67108864, + "index": 1, + "path": "payload-000001.bin", + "sha256": "1d804d88517d49483b02b6136f155730bc886939872208dfe9afadc9d4ae154c" + }, + { + "bytes": 67108864, + "index": 2, + "path": "payload-000002.bin", + "sha256": "506edaf9d3b21358da114e736e36eb2467d9e465e02e22b9844e2ef6d1125606" + }, + { + "bytes": 67108864, + "index": 3, + "path": "payload-000003.bin", + "sha256": "a49499b604f9769bea207ec2ec73ca65cc692389cf093eb2b206f8f355a40883" + }, + { + "bytes": 67108864, + "index": 4, + "path": "payload-000004.bin", + "sha256": "cb0d6ee2cd988a45ac198653aa01883d79b62f178ce68284f66633f89623d05f" + }, + { + "bytes": 67108864, + "index": 5, + "path": "payload-000005.bin", + "sha256": "33736340ba66093bc66c94981e517c223e46b6853d3b688f609abd6656c1b64a" + }, + { + "bytes": 67108864, + "index": 6, + "path": "payload-000006.bin", + "sha256": "1cec62f5de3779beddc26800d99a8e0263c171cf3a0796a8775e083ad72a5267" + }, + { + "bytes": 67108864, + "index": 7, + "path": "payload-000007.bin", + "sha256": "ff9ca8cb58c6566ab39b955649bd599919f93f65d241979f78852ba6bd45f465" + }, + { + "bytes": 67108864, + "index": 8, + "path": "payload-000008.bin", + "sha256": "c2710524d019452db8832dbe8f258fcca38bea899400342056f2646a75c1540d" + }, + { + "bytes": 67108864, + "index": 9, + "path": "payload-000009.bin", + "sha256": "ccdffd7293b05ed912e3acc749f8ed8c7769c135c4fa20db2f4fef4783157c6e" + }, + { + "bytes": 67108864, + "index": 10, + "path": "payload-000010.bin", + "sha256": "ebccfe2d5b5c3b60ef0b5bb9503d7849d2693ec82138ac937a585eef1654dd6b" + }, + { + "bytes": 67108864, + "index": 11, + "path": "payload-000011.bin", + "sha256": "66f265f69bc110d28e679e0aa6390cdc28cff00cafc863a9055acd91daea8b66" + }, + { + "bytes": 67108864, + "index": 12, + "path": "payload-000012.bin", + "sha256": "f9e3084ccee597a8d6163dbf8452a53a5f74ee8bd2c26e0c7017be7d33ebf562" + }, + { + "bytes": 67108864, + "index": 13, + "path": "payload-000013.bin", + "sha256": "d07691bd973949900c41fb4c2e4cc4d6b10eeef256ff8b128fc5dbfadd875d1c" + }, + { + "bytes": 67108864, + "index": 14, + "path": "payload-000014.bin", + "sha256": "ac78fa1d2882bbee5727993d29a7bce7f2a163ad6d8d74125b98b7a0c09c4c76" + }, + { + "bytes": 67108864, + "index": 15, + "path": "payload-000015.bin", + "sha256": "b2b14acffeff84cdcc8c4cac4b1725eb63666f67c4aa42e324743aad471251d2" + }, + { + "bytes": 67108864, + "index": 16, + "path": "payload-000016.bin", + "sha256": "5c903aeb8cf971578901c19e5656143e66ed34e5b39207f11a811652f99ec8b2" + }, + { + "bytes": 67108864, + "index": 17, + "path": "payload-000017.bin", + "sha256": "0f249896dd016c094e02a7e031d381835536add9f48d34a2d71085f79fdcb988" + }, + { + "bytes": 67108864, + "index": 18, + "path": "payload-000018.bin", + "sha256": "3124cdac2b3cbd389e7d1970be7ab67ebeb420290bb19901fa65a75410cf86ee" + }, + { + "bytes": 67108864, + "index": 19, + "path": "payload-000019.bin", + "sha256": "178eb19d998fd2196b60820fcc8b31ddc250163c4df0d1502f7b4b99d98cd469" + }, + { + "bytes": 67108864, + "index": 20, + "path": "payload-000020.bin", + "sha256": "fa6b1a53f097da8386bb68af7ce3cc30f03278a1f4d8f7239808b201cd7a749c" + }, + { + "bytes": 67108864, + "index": 21, + "path": "payload-000021.bin", + "sha256": "131d6da773eee65ca0f1c7428c08482f79221081aacdee26ec0007459978ab16" + }, + { + "bytes": 67108864, + "index": 22, + "path": "payload-000022.bin", + "sha256": "8d1154d7162a57d0f57468d504b8f130772ef8559eb841d99d00bac02405535c" + }, + { + "bytes": 67108864, + "index": 23, + "path": "payload-000023.bin", + "sha256": "d797d536a090d75a979e142e8b3d7a253692ba4f279582c3dbbcf574e94642fd" + }, + { + "bytes": 67108864, + "index": 24, + "path": "payload-000024.bin", + "sha256": "e28242563a376b4edecda075b9ba24ff1f7c372321ea5820bc362be6bddfa3dd" + }, + { + "bytes": 67108864, + "index": 25, + "path": "payload-000025.bin", + "sha256": "6d66b8a69f3c6c1ef5fd2f6dd635a1d405fb6999adb28fb51bf376fbf91ad292" + }, + { + "bytes": 67108864, + "index": 26, + "path": "payload-000026.bin", + "sha256": "f4da405b1b1834faf55e94c49e557ecffbbd3455104d3d3d956bf23da6e74550" + }, + { + "bytes": 67108864, + "index": 27, + "path": "payload-000027.bin", + "sha256": "bd88c43e8e8f27b6d40d17eb7b2b43fc33b09fb2b2a49eb089a59daabcaa1483" + }, + { + "bytes": 67108864, + "index": 28, + "path": "payload-000028.bin", + "sha256": "087c13ee0798fb19382ecf652512b59d8bc4e0092ef1bd24fec6bc638475cb68" + }, + { + "bytes": 67108864, + "index": 29, + "path": "payload-000029.bin", + "sha256": "026226ebc7d0e57df8871078cfe878c6464ad5abd676face2e0d35c8e736807b" + }, + { + "bytes": 67108864, + "index": 30, + "path": "payload-000030.bin", + "sha256": "94a6b0ad920335163651eac7b016ff3e918680c9108a28a270dc28092f322fc3" + }, + { + "bytes": 67108864, + "index": 31, + "path": "payload-000031.bin", + "sha256": "b433bd088cb2bf076e962192be72700ff6ba6127b357bf0e7f5793e6a8edba56" + }, + { + "bytes": 67108864, + "index": 32, + "path": "payload-000032.bin", + "sha256": "01991f0a6738ade443755b67a5ad3dccc07ff6ac70a1553fe671ad6560b15909" + }, + { + "bytes": 67108864, + "index": 33, + "path": "payload-000033.bin", + "sha256": "11c0f36233a8b8256139235f57acef96297180946e0ad6ff7645f61fe4c79559" + }, + { + "bytes": 67108864, + "index": 34, + "path": "payload-000034.bin", + "sha256": "13c2d2d78eb40c7324d9bc42cabe17a5f60dca49e6f5fe5fb17c4960edbec039" + }, + { + "bytes": 67108864, + "index": 35, + "path": "payload-000035.bin", + "sha256": "ab813823e7faa5c4f972c8fe774695d90dc0c778115afd1420c1d40897a152b0" + }, + { + "bytes": 67108864, + "index": 36, + "path": "payload-000036.bin", + "sha256": "c1c5f242a17d885118a4c601b8b233632c53355916584c4b9fc600e0c3115ff2" + }, + { + "bytes": 67108864, + "index": 37, + "path": "payload-000037.bin", + "sha256": "a65e7d1a0ed2a2b3320e2af65ae72b2f523298f59f05f9ba917c0d2ba57fe528" + }, + { + "bytes": 67108864, + "index": 38, + "path": "payload-000038.bin", + "sha256": "47605ee88b47821758f28b25b3912c25397fd32239c972243004d14457f72c82" + }, + { + "bytes": 67108864, + "index": 39, + "path": "payload-000039.bin", + "sha256": "2290a53b9cfffaa1a0ebb6cab41ec195c3d16c1d1b347941d21e4fe8f9998627" + }, + { + "bytes": 67108864, + "index": 40, + "path": "payload-000040.bin", + "sha256": "256844cea01953996a0ac87f18979cf6d35ed56786a5485f48ad2cb3c1360ece" + }, + { + "bytes": 67108864, + "index": 41, + "path": "payload-000041.bin", + "sha256": "3dc3f7b6d3303d91e350057dc27ecf0d02b857d33d8eaa2eef3a4bfe7f40eeab" + }, + { + "bytes": 67108864, + "index": 42, + "path": "payload-000042.bin", + "sha256": "def2c14f8c533dc0baf4426ff32de64e2f26272403462d3ed014b2b74b3fb52d" + }, + { + "bytes": 67108864, + "index": 43, + "path": "payload-000043.bin", + "sha256": "6110a1367894ddd26909ddca5c4568f6bb5545b4468e40811b02c3a696b3f151" + }, + { + "bytes": 67108864, + "index": 44, + "path": "payload-000044.bin", + "sha256": "b0742985cb8f65d244b9ce49cb14f777d0daee4d75b79193d73f94dd2fc50345" + }, + { + "bytes": 67108864, + "index": 45, + "path": "payload-000045.bin", + "sha256": "1d8671e30380134313dedac85e6ea51a47ff7de3ba9b5f235208c913a3d28672" + }, + { + "bytes": 67108864, + "index": 46, + "path": "payload-000046.bin", + "sha256": "3157bce6ca069dada4f95ca8149a0ca431b72423bb2a2c182409b72c1b143b80" + }, + { + "bytes": 67108864, + "index": 47, + "path": "payload-000047.bin", + "sha256": "c00cf2634c0f50c1abe4502192d541ff6bd9169acca2d6bc8fe50100efcff9bd" + }, + { + "bytes": 67108864, + "index": 48, + "path": "payload-000048.bin", + "sha256": "fd836db27d1f3906cf6514596cbdeab7290643660614ad7e449ac95d79bd0082" + }, + { + "bytes": 67108864, + "index": 49, + "path": "payload-000049.bin", + "sha256": "05d52812c5b77ff9a3441a5e72fe7ed0ceb6d236981b2d4cc85c98ce91d866e8" + }, + { + "bytes": 67108864, + "index": 50, + "path": "payload-000050.bin", + "sha256": "018ba52c09e1105bbf2c828cac95fd544a94ce7b464c8000d1a6c9609e3cf0dc" + }, + { + "bytes": 67108864, + "index": 51, + "path": "payload-000051.bin", + "sha256": "c18f6dff39bb44a210f3e05281a8780f9130d83680cd1d3ad4456335f25b9c0a" + }, + { + "bytes": 67108864, + "index": 52, + "path": "payload-000052.bin", + "sha256": "c888efc1ef75dd48c41bb2ec18cc4d223b5a12f3a7fe83a0abff6c99ebf1407c" + }, + { + "bytes": 67108864, + "index": 53, + "path": "payload-000053.bin", + "sha256": "6f9cd36795720489c8ef52e600394eb92fc8d4d9dcb5049bfcc89914acfa20af" + }, + { + "bytes": 67108864, + "index": 54, + "path": "payload-000054.bin", + "sha256": "90421f2d11d14f8004c592664921437ff64001cfe929e6de0bcbd0e24e9610ee" + }, + { + "bytes": 67108864, + "index": 55, + "path": "payload-000055.bin", + "sha256": "73a1a0eb0b473e842e5bae81331257ef89090b9af6538676375bb5757ae3c589" + }, + { + "bytes": 67108864, + "index": 56, + "path": "payload-000056.bin", + "sha256": "7b4fb640cc128ac0438186012b622db4246359cdf098c3e874e1af5b4add28f1" + }, + { + "bytes": 67108864, + "index": 57, + "path": "payload-000057.bin", + "sha256": "acd914306dce998276452979904e04d405a492a8c81340f209f3224def906722" + }, + { + "bytes": 67108864, + "index": 58, + "path": "payload-000058.bin", + "sha256": "f15627615ef7579d01f21e5a35c321bbc6599d66847e11e37440c12dbfb7b676" + }, + { + "bytes": 67108864, + "index": 59, + "path": "payload-000059.bin", + "sha256": "df6d02884bb8b3c313b279cb1f63f00c2ebc39340f6a298b17be6a1d4b9b5fc1" + }, + { + "bytes": 67108864, + "index": 60, + "path": "payload-000060.bin", + "sha256": "3f0a9827926d381ef0eb09569de9c133a24f88b6c4e2e07bbf582e7259a261b3" + }, + { + "bytes": 67108864, + "index": 61, + "path": "payload-000061.bin", + "sha256": "2419ad28f6dce0b26b34432f6f9933a7850755a68c1d19191cc13e590bc3689f" + }, + { + "bytes": 67108864, + "index": 62, + "path": "payload-000062.bin", + "sha256": "03b39ee51f20fa8d801e0b6606fda6c1be8625de19a30cc28efa4e60a52ef1be" + }, + { + "bytes": 67108864, + "index": 63, + "path": "payload-000063.bin", + "sha256": "bbb58825d3b6b18f9c120d3abaf8729f694ddf8e3d00ea7cd831bdc9ae3f63fb" + }, + { + "bytes": 67108864, + "index": 64, + "path": "payload-000064.bin", + "sha256": "835c49d7ad41c233d0e20e59f5ad87deb31c7dff3662db996a52f3c60a4ca616" + }, + { + "bytes": 67108864, + "index": 65, + "path": "payload-000065.bin", + "sha256": "53129c4320559e8dc1959a8fdcd7d756f68b2d82acc8ca6681f4aa691969f906" + }, + { + "bytes": 67108864, + "index": 66, + "path": "payload-000066.bin", + "sha256": "6a03395293e454e95163444c04a77961bfde9f71daf902911906566b7df4eab1" + }, + { + "bytes": 67108864, + "index": 67, + "path": "payload-000067.bin", + "sha256": "419e60c582a4c8f119f9a958f33ef88164fa334c38e7c47163f03d761d89e4dd" + }, + { + "bytes": 67108864, + "index": 68, + "path": "payload-000068.bin", + "sha256": "26222b3988412e52c10bd2a8cddd5b0a54409f16aa5e2367f9e6c3606760221d" + }, + { + "bytes": 67108864, + "index": 69, + "path": "payload-000069.bin", + "sha256": "661e862287f8283794e812d5484dfc77651e6a9c44be2122f10b25e702dbf52d" + }, + { + "bytes": 67108864, + "index": 70, + "path": "payload-000070.bin", + "sha256": "71de14c9a34cfed409f74d825c88a8b473cd509b1dd2619fe8d5a11da131bee0" + }, + { + "bytes": 67108864, + "index": 71, + "path": "payload-000071.bin", + "sha256": "7c8b878109bae512ed7f411055d974e0669a31da88b561e87e4fbacbadb96375" + }, + { + "bytes": 67108864, + "index": 72, + "path": "payload-000072.bin", + "sha256": "c75a839c07a242aa09dc0603b46cefd87ac79bfc6776dd4707f425f4afd143df" + }, + { + "bytes": 67108864, + "index": 73, + "path": "payload-000073.bin", + "sha256": "af98e9729afc0d1406b7531e135ab4d932c34f9c38df81636026fdfe461fc400" + }, + { + "bytes": 67108864, + "index": 74, + "path": "payload-000074.bin", + "sha256": "8de906c2956b66594902536069870c6f4bfaa8221cae561a6f7a00ea9b3ab338" + }, + { + "bytes": 30040253, + "index": 75, + "path": "payload-000075.bin", + "sha256": "98714008fee0cffd305c8e7b45d74d224033d013f7ea7a1759eb160ca0fff2f1" + } + ], + "exclusion_records": 0, + "exclusions": { + "bytes": 20, + "sha256": "9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64" + }, + "group_id": "malecns-synaptic-partners", + "license": { + "data": "CC-BY-4.0", + "local_provenance": "Project-authored", + "url": "https://creativecommons.org/licenses/by/4.0/" + }, + "members": { + "bytes": 512, + "sha256": "cfe2adcc93576eeea4100b847016bd5484338f449d4755dc7071c4c621d4d6df" + }, + "plan_sha256": "a20a61821c504e8315171a5fd14afbac011b934709af344045175bdda9fcba71", + "provenance": { + "attribution": "Male CNS collaboration: FlyEM (HHMI Janelia), University of Cambridge Department of Zoology, MRC Laboratory of Molecular Biology, Google Research", + "changes": "Unchanged downloaded paired-synapse file and provenance; syn-points and EM were not downloaded.", + "registered_file_sha256": "959d8ef4173b35382a3e6acfaf5167c795b6d10b877572d146af04e1b487bc07", + "source_page": "https://male-cns.janelia.org/download/", + "source_url": "https://storage.googleapis.com/flyem-male-cns/v1.0/connectome-data/flat-connectome/syn-partners-male-cns-v1.0-minconf-0.5.feather?generation=1780494942562468" + }, + "schema": "lfs-publication-group-v1", + "secret_scan": "UTF-8 files <=2 MiB, known binary suffixes excluded; fail closed on matching rules", + "source_bytes": 6777184219, + "source_files": 6, + "source_paths": [ + "experiments/phase4aa-apl-pn-scope/external-resources" + ], + "source_root": "/data/digital-drosophila", + "verification_scope": "content snapshot, not a license grant or nested-archive secret audit" +} diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/exclusions.jsonl.gz b/artifacts/public-resources-20261001/malecns-synaptic-partners/exclusions.jsonl.gz new file mode 100644 index 0000000..1c35409 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/exclusions.jsonl.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64 +size 20 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/members.jsonl.gz b/artifacts/public-resources-20261001/malecns-synaptic-partners/members.jsonl.gz new file mode 100644 index 0000000..59b601e --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/members.jsonl.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfe2adcc93576eeea4100b847016bd5484338f449d4755dc7071c4c621d4d6df +size 512 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000000.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000000.bin new file mode 100644 index 0000000..dedf1b5 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000000.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a507fb9917a63f6221d97780727831735bcf419bb6d36b17546f2be04e8f6b6b +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000001.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000001.bin new file mode 100644 index 0000000..2b84019 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000001.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d804d88517d49483b02b6136f155730bc886939872208dfe9afadc9d4ae154c +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000002.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000002.bin new file mode 100644 index 0000000..2606fbc --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000002.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:506edaf9d3b21358da114e736e36eb2467d9e465e02e22b9844e2ef6d1125606 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000003.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000003.bin new file mode 100644 index 0000000..02d1b47 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000003.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a49499b604f9769bea207ec2ec73ca65cc692389cf093eb2b206f8f355a40883 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000004.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000004.bin new file mode 100644 index 0000000..de80491 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000004.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb0d6ee2cd988a45ac198653aa01883d79b62f178ce68284f66633f89623d05f +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000005.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000005.bin new file mode 100644 index 0000000..2eb94b4 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000005.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33736340ba66093bc66c94981e517c223e46b6853d3b688f609abd6656c1b64a +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000006.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000006.bin new file mode 100644 index 0000000..f87bb82 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000006.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cec62f5de3779beddc26800d99a8e0263c171cf3a0796a8775e083ad72a5267 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000007.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000007.bin new file mode 100644 index 0000000..e48868a --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000007.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff9ca8cb58c6566ab39b955649bd599919f93f65d241979f78852ba6bd45f465 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000008.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000008.bin new file mode 100644 index 0000000..a3b972b --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000008.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2710524d019452db8832dbe8f258fcca38bea899400342056f2646a75c1540d +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000009.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000009.bin new file mode 100644 index 0000000..4fbe561 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000009.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ccdffd7293b05ed912e3acc749f8ed8c7769c135c4fa20db2f4fef4783157c6e +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000010.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000010.bin new file mode 100644 index 0000000..0e780b8 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000010.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebccfe2d5b5c3b60ef0b5bb9503d7849d2693ec82138ac937a585eef1654dd6b +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000011.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000011.bin new file mode 100644 index 0000000..efea0bd --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000011.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66f265f69bc110d28e679e0aa6390cdc28cff00cafc863a9055acd91daea8b66 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000012.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000012.bin new file mode 100644 index 0000000..c058a6c --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000012.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9e3084ccee597a8d6163dbf8452a53a5f74ee8bd2c26e0c7017be7d33ebf562 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000013.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000013.bin new file mode 100644 index 0000000..84cc7bc --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000013.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d07691bd973949900c41fb4c2e4cc4d6b10eeef256ff8b128fc5dbfadd875d1c +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000014.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000014.bin new file mode 100644 index 0000000..0e3a11a --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000014.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac78fa1d2882bbee5727993d29a7bce7f2a163ad6d8d74125b98b7a0c09c4c76 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000015.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000015.bin new file mode 100644 index 0000000..fd82938 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000015.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b2b14acffeff84cdcc8c4cac4b1725eb63666f67c4aa42e324743aad471251d2 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000016.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000016.bin new file mode 100644 index 0000000..2cff826 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000016.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c903aeb8cf971578901c19e5656143e66ed34e5b39207f11a811652f99ec8b2 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000017.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000017.bin new file mode 100644 index 0000000..370f1e8 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000017.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f249896dd016c094e02a7e031d381835536add9f48d34a2d71085f79fdcb988 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000018.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000018.bin new file mode 100644 index 0000000..138c59e --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000018.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3124cdac2b3cbd389e7d1970be7ab67ebeb420290bb19901fa65a75410cf86ee +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000019.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000019.bin new file mode 100644 index 0000000..6b91c64 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000019.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:178eb19d998fd2196b60820fcc8b31ddc250163c4df0d1502f7b4b99d98cd469 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000020.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000020.bin new file mode 100644 index 0000000..28e684e --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000020.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa6b1a53f097da8386bb68af7ce3cc30f03278a1f4d8f7239808b201cd7a749c +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000021.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000021.bin new file mode 100644 index 0000000..c5228a3 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000021.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:131d6da773eee65ca0f1c7428c08482f79221081aacdee26ec0007459978ab16 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000022.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000022.bin new file mode 100644 index 0000000..817e11f --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000022.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d1154d7162a57d0f57468d504b8f130772ef8559eb841d99d00bac02405535c +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000023.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000023.bin new file mode 100644 index 0000000..3426934 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000023.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d797d536a090d75a979e142e8b3d7a253692ba4f279582c3dbbcf574e94642fd +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000024.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000024.bin new file mode 100644 index 0000000..d525da0 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000024.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e28242563a376b4edecda075b9ba24ff1f7c372321ea5820bc362be6bddfa3dd +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000025.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000025.bin new file mode 100644 index 0000000..d440eed --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000025.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d66b8a69f3c6c1ef5fd2f6dd635a1d405fb6999adb28fb51bf376fbf91ad292 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000026.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000026.bin new file mode 100644 index 0000000..3299d17 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000026.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4da405b1b1834faf55e94c49e557ecffbbd3455104d3d3d956bf23da6e74550 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000027.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000027.bin new file mode 100644 index 0000000..1f2a49e --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000027.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd88c43e8e8f27b6d40d17eb7b2b43fc33b09fb2b2a49eb089a59daabcaa1483 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000028.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000028.bin new file mode 100644 index 0000000..8af8e27 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000028.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:087c13ee0798fb19382ecf652512b59d8bc4e0092ef1bd24fec6bc638475cb68 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000029.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000029.bin new file mode 100644 index 0000000..5d37fdf --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000029.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:026226ebc7d0e57df8871078cfe878c6464ad5abd676face2e0d35c8e736807b +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000030.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000030.bin new file mode 100644 index 0000000..97bd90c --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000030.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94a6b0ad920335163651eac7b016ff3e918680c9108a28a270dc28092f322fc3 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000031.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000031.bin new file mode 100644 index 0000000..4509a57 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000031.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b433bd088cb2bf076e962192be72700ff6ba6127b357bf0e7f5793e6a8edba56 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000032.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000032.bin new file mode 100644 index 0000000..c89addd --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000032.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01991f0a6738ade443755b67a5ad3dccc07ff6ac70a1553fe671ad6560b15909 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000033.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000033.bin new file mode 100644 index 0000000..fd07c6f --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000033.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11c0f36233a8b8256139235f57acef96297180946e0ad6ff7645f61fe4c79559 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000034.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000034.bin new file mode 100644 index 0000000..98fcf85 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000034.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13c2d2d78eb40c7324d9bc42cabe17a5f60dca49e6f5fe5fb17c4960edbec039 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000035.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000035.bin new file mode 100644 index 0000000..09f2bdc --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000035.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab813823e7faa5c4f972c8fe774695d90dc0c778115afd1420c1d40897a152b0 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000036.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000036.bin new file mode 100644 index 0000000..5bd6a82 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000036.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1c5f242a17d885118a4c601b8b233632c53355916584c4b9fc600e0c3115ff2 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000037.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000037.bin new file mode 100644 index 0000000..928a33d --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000037.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a65e7d1a0ed2a2b3320e2af65ae72b2f523298f59f05f9ba917c0d2ba57fe528 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000038.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000038.bin new file mode 100644 index 0000000..feaa0d5 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000038.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47605ee88b47821758f28b25b3912c25397fd32239c972243004d14457f72c82 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000039.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000039.bin new file mode 100644 index 0000000..ea6c8d5 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000039.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2290a53b9cfffaa1a0ebb6cab41ec195c3d16c1d1b347941d21e4fe8f9998627 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000040.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000040.bin new file mode 100644 index 0000000..11477a4 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000040.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:256844cea01953996a0ac87f18979cf6d35ed56786a5485f48ad2cb3c1360ece +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000041.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000041.bin new file mode 100644 index 0000000..e42fe72 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000041.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3dc3f7b6d3303d91e350057dc27ecf0d02b857d33d8eaa2eef3a4bfe7f40eeab +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000042.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000042.bin new file mode 100644 index 0000000..1738c3a --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000042.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:def2c14f8c533dc0baf4426ff32de64e2f26272403462d3ed014b2b74b3fb52d +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000043.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000043.bin new file mode 100644 index 0000000..f4c6568 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000043.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6110a1367894ddd26909ddca5c4568f6bb5545b4468e40811b02c3a696b3f151 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000044.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000044.bin new file mode 100644 index 0000000..5cbc2d4 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000044.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b0742985cb8f65d244b9ce49cb14f777d0daee4d75b79193d73f94dd2fc50345 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000045.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000045.bin new file mode 100644 index 0000000..5ddcfff --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000045.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d8671e30380134313dedac85e6ea51a47ff7de3ba9b5f235208c913a3d28672 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000046.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000046.bin new file mode 100644 index 0000000..de832d3 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000046.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3157bce6ca069dada4f95ca8149a0ca431b72423bb2a2c182409b72c1b143b80 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000047.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000047.bin new file mode 100644 index 0000000..a4995f5 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000047.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c00cf2634c0f50c1abe4502192d541ff6bd9169acca2d6bc8fe50100efcff9bd +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000048.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000048.bin new file mode 100644 index 0000000..19a22b1 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000048.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd836db27d1f3906cf6514596cbdeab7290643660614ad7e449ac95d79bd0082 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000049.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000049.bin new file mode 100644 index 0000000..cfe7d68 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000049.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05d52812c5b77ff9a3441a5e72fe7ed0ceb6d236981b2d4cc85c98ce91d866e8 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000050.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000050.bin new file mode 100644 index 0000000..b59f4ad --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000050.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:018ba52c09e1105bbf2c828cac95fd544a94ce7b464c8000d1a6c9609e3cf0dc +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000051.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000051.bin new file mode 100644 index 0000000..1c16519 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000051.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c18f6dff39bb44a210f3e05281a8780f9130d83680cd1d3ad4456335f25b9c0a +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000052.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000052.bin new file mode 100644 index 0000000..a9b24d3 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000052.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c888efc1ef75dd48c41bb2ec18cc4d223b5a12f3a7fe83a0abff6c99ebf1407c +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000053.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000053.bin new file mode 100644 index 0000000..17a77ed --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000053.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f9cd36795720489c8ef52e600394eb92fc8d4d9dcb5049bfcc89914acfa20af +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000054.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000054.bin new file mode 100644 index 0000000..56b6cbc --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000054.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90421f2d11d14f8004c592664921437ff64001cfe929e6de0bcbd0e24e9610ee +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000055.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000055.bin new file mode 100644 index 0000000..1c09152 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000055.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73a1a0eb0b473e842e5bae81331257ef89090b9af6538676375bb5757ae3c589 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000056.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000056.bin new file mode 100644 index 0000000..c8a9c1f --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000056.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b4fb640cc128ac0438186012b622db4246359cdf098c3e874e1af5b4add28f1 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000057.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000057.bin new file mode 100644 index 0000000..d047893 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000057.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acd914306dce998276452979904e04d405a492a8c81340f209f3224def906722 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000058.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000058.bin new file mode 100644 index 0000000..2234cf7 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000058.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f15627615ef7579d01f21e5a35c321bbc6599d66847e11e37440c12dbfb7b676 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000059.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000059.bin new file mode 100644 index 0000000..ac82167 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000059.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df6d02884bb8b3c313b279cb1f63f00c2ebc39340f6a298b17be6a1d4b9b5fc1 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000060.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000060.bin new file mode 100644 index 0000000..7f367ab --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000060.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f0a9827926d381ef0eb09569de9c133a24f88b6c4e2e07bbf582e7259a261b3 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000061.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000061.bin new file mode 100644 index 0000000..ec9ca6d --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000061.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2419ad28f6dce0b26b34432f6f9933a7850755a68c1d19191cc13e590bc3689f +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000062.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000062.bin new file mode 100644 index 0000000..d6e03d7 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000062.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03b39ee51f20fa8d801e0b6606fda6c1be8625de19a30cc28efa4e60a52ef1be +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000063.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000063.bin new file mode 100644 index 0000000..be21eaa --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000063.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bbb58825d3b6b18f9c120d3abaf8729f694ddf8e3d00ea7cd831bdc9ae3f63fb +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000064.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000064.bin new file mode 100644 index 0000000..44bb6a4 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000064.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:835c49d7ad41c233d0e20e59f5ad87deb31c7dff3662db996a52f3c60a4ca616 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000065.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000065.bin new file mode 100644 index 0000000..f1720e5 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000065.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53129c4320559e8dc1959a8fdcd7d756f68b2d82acc8ca6681f4aa691969f906 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000066.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000066.bin new file mode 100644 index 0000000..dec6ee7 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000066.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a03395293e454e95163444c04a77961bfde9f71daf902911906566b7df4eab1 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000067.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000067.bin new file mode 100644 index 0000000..c823ccd --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000067.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:419e60c582a4c8f119f9a958f33ef88164fa334c38e7c47163f03d761d89e4dd +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000068.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000068.bin new file mode 100644 index 0000000..090228b --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000068.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26222b3988412e52c10bd2a8cddd5b0a54409f16aa5e2367f9e6c3606760221d +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000069.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000069.bin new file mode 100644 index 0000000..92f0328 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000069.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:661e862287f8283794e812d5484dfc77651e6a9c44be2122f10b25e702dbf52d +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000070.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000070.bin new file mode 100644 index 0000000..a340111 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000070.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71de14c9a34cfed409f74d825c88a8b473cd509b1dd2619fe8d5a11da131bee0 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000071.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000071.bin new file mode 100644 index 0000000..7bb6a29 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000071.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c8b878109bae512ed7f411055d974e0669a31da88b561e87e4fbacbadb96375 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000072.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000072.bin new file mode 100644 index 0000000..2cbf313 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000072.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c75a839c07a242aa09dc0603b46cefd87ac79bfc6776dd4707f425f4afd143df +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000073.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000073.bin new file mode 100644 index 0000000..80754a7 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000073.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af98e9729afc0d1406b7531e135ab4d932c34f9c38df81636026fdfe461fc400 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000074.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000074.bin new file mode 100644 index 0000000..3b5e339 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000074.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8de906c2956b66594902536069870c6f4bfaa8221cae561a6f7a00ea9b3ab338 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000075.bin b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000075.bin new file mode 100644 index 0000000..819495f --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000075.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98714008fee0cffd305c8e7b45d74d224033d013f7ea7a1759eb160ca0fff2f1 +size 30040253 diff --git a/artifacts/public-resources-20261001/pack-summary.json b/artifacts/public-resources-20261001/pack-summary.json new file mode 100644 index 0000000..af5d45f --- /dev/null +++ b/artifacts/public-resources-20261001/pack-summary.json @@ -0,0 +1,73 @@ +{ + "complete": true, + "groups": [ + { + "archive_bytes": 834266158, + "catalog_sha256": "8a7ea9abe5f75ce31318d207a1dbb491d5e151af27bd607dc1b59fb29d4aacf8", + "chunks": 13, + "files": 17, + "group": "malecns-raw-core", + "source_bytes": 1207032031 + }, + { + "archive_bytes": 2760276945, + "catalog_sha256": "efc330317e2f74272e233634e5652982232ef9d3b6762f8e3cbd9eeaf05487cf", + "chunks": 42, + "files": 211573, + "group": "malecns-swc", + "source_bytes": 9299975999 + }, + { + "archive_bytes": 635332131, + "catalog_sha256": "e1e42f654cb005d2f073d4e84c808af50f50c3feeb9cbcb0b0c1c51746bfdb47", + "chunks": 10, + "files": 64, + "group": "malecns-processed", + "source_bytes": 1140025370 + }, + { + "archive_bytes": 5063205053, + "catalog_sha256": "bdbc0354abdad63a9c256a2841fdf9df4c32258647b8de03d066afc89fa61053", + "chunks": 76, + "files": 6, + "group": "malecns-synaptic-partners", + "source_bytes": 6777184219 + }, + { + "archive_bytes": 77971754, + "catalog_sha256": "4dc6be6091b273312a1dd61f621654f05e4c12118bdd13c22905d588e378889c", + "chunks": 2, + "files": 8973, + "group": "celltype-explorer", + "source_bytes": 3957079583 + }, + { + "archive_bytes": 434458454, + "catalog_sha256": "bd824a656235ba08a35a67ad6d865467a946145cf985677226412280380939fc", + "chunks": 7, + "files": 6033, + "group": "visualpathways", + "source_bytes": 1652696750 + }, + { + "archive_bytes": 901984, + "catalog_sha256": "6d0fcbe747dae7b38bcf335572b173e0112f6aabd10aa0040b84cfd81a8a390c", + "chunks": 1, + "files": 189, + "group": "door-data", + "source_bytes": 6534522 + }, + { + "archive_bytes": 6828, + "catalog_sha256": "95c69e6e9e07625a1f9b273db67aa9ab480c66bb3bbb273c39c430aeedb9b910", + "chunks": 1, + "files": 4, + "group": "shiu-author-model-source", + "source_bytes": 17567 + } + ], + "plan_sha256": "a20a61821c504e8315171a5fd14afbac011b934709af344045175bdda9fcba71", + "schema": "lfs-publication-pack-v1", + "source_bytes": 24040546041, + "source_files": 226859 +} diff --git a/artifacts/public-resources-20261001/shiu-author-model-source/catalog.json b/artifacts/public-resources-20261001/shiu-author-model-source/catalog.json new file mode 100644 index 0000000..8d245eb --- /dev/null +++ b/artifacts/public-resources-20261001/shiu-author-model-source/catalog.json @@ -0,0 +1,46 @@ +{ + "archive_bytes": 6828, + "archive_format": "tar.pax+zstd", + "archive_sha256": "4da352d80e4bf251dfec771935da93f5a9f3cef302c85e90991fafa14a072e2b", + "chunk_bytes": 67108864, + "chunks": [ + { + "bytes": 6828, + "index": 0, + "path": "payload-000000.bin", + "sha256": "4da352d80e4bf251dfec771935da93f5a9f3cef302c85e90991fafa14a072e2b" + } + ], + "exclusion_records": 0, + "exclusions": { + "bytes": 20, + "sha256": "9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64" + }, + "group_id": "shiu-author-model-source", + "license": { + "evidence_file": "LICENSE", + "evidence_sha256": "3621f6d6476189190e2960fa43f11b275ba4eca848fdac50a1ba2925de6223e8", + "upstream": "MIT" + }, + "members": { + "bytes": 349, + "sha256": "2907be4f7d1a8f1017f91bda6e5ead381b8c67b85498f5378765d696f89d4b0c" + }, + "plan_sha256": "a20a61821c504e8315171a5fd14afbac011b934709af344045175bdda9fcba71", + "provenance": { + "attribution": "Philip Shiu and Drosophila_brain_model contributors; original MIT copyright and permission notice retained", + "changes": "The previously downloaded model.py, environment_full.yml, LICENSE and local provenance only. This is model source, not pretrained weights, and not a strict original-model reproduction claim.", + "commit": "91bdd1e7dcf193f3e7ca5a8933497fcef63b7960", + "paper": "https://www.nature.com/articles/s41586-024-07763-9", + "repository": "https://github.com/philshiu/Drosophila_brain_model" + }, + "schema": "lfs-publication-group-v1", + "secret_scan": "UTF-8 files <=2 MiB, known binary suffixes excluded; fail closed on matching rules", + "source_bytes": 17567, + "source_files": 4, + "source_paths": [ + "experiments/phase4ac-lif-semantics/external-resources" + ], + "source_root": "/data/digital-drosophila", + "verification_scope": "content snapshot, not a license grant or nested-archive secret audit" +} diff --git a/artifacts/public-resources-20261001/shiu-author-model-source/exclusions.jsonl.gz b/artifacts/public-resources-20261001/shiu-author-model-source/exclusions.jsonl.gz new file mode 100644 index 0000000..1c35409 --- /dev/null +++ b/artifacts/public-resources-20261001/shiu-author-model-source/exclusions.jsonl.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64 +size 20 diff --git a/artifacts/public-resources-20261001/shiu-author-model-source/members.jsonl.gz b/artifacts/public-resources-20261001/shiu-author-model-source/members.jsonl.gz new file mode 100644 index 0000000..5255a1c --- /dev/null +++ b/artifacts/public-resources-20261001/shiu-author-model-source/members.jsonl.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2907be4f7d1a8f1017f91bda6e5ead381b8c67b85498f5378765d696f89d4b0c +size 349 diff --git a/artifacts/public-resources-20261001/shiu-author-model-source/payload-000000.bin b/artifacts/public-resources-20261001/shiu-author-model-source/payload-000000.bin new file mode 100644 index 0000000..f232dbe --- /dev/null +++ b/artifacts/public-resources-20261001/shiu-author-model-source/payload-000000.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4da352d80e4bf251dfec771935da93f5a9f3cef302c85e90991fafa14a072e2b +size 6828 diff --git a/artifacts/public-resources-20261001/visualpathways/catalog.json b/artifacts/public-resources-20261001/visualpathways/catalog.json new file mode 100644 index 0000000..7bc6f56 --- /dev/null +++ b/artifacts/public-resources-20261001/visualpathways/catalog.json @@ -0,0 +1,82 @@ +{ + "archive_bytes": 434458454, + "archive_format": "tar.pax+zstd", + "archive_sha256": "683b85394fb44e42704c275fbda93c95072f9f64c16a84e47ce2821c060cc39f", + "chunk_bytes": 67108864, + "chunks": [ + { + "bytes": 67108864, + "index": 0, + "path": "payload-000000.bin", + "sha256": "7f8bb35dcb565c16ff1bf642e079c54c71e27e05cccaa5915c1d1e3c9e7d0700" + }, + { + "bytes": 67108864, + "index": 1, + "path": "payload-000001.bin", + "sha256": "7181f79ec2615a84f33b394abf22454b72d2fddfb0e40e9c5e1590fe1ba64d7a" + }, + { + "bytes": 67108864, + "index": 2, + "path": "payload-000002.bin", + "sha256": "9dc076afd8cd8ebbbdda6f1ef24a41598e5db9fb0a98de8b5b765b4b0a8d2934" + }, + { + "bytes": 67108864, + "index": 3, + "path": "payload-000003.bin", + "sha256": "be03beac2472e6dc76a5705440296f88a8f6e15ea43f541df402c7b6c85cfdc6" + }, + { + "bytes": 67108864, + "index": 4, + "path": "payload-000004.bin", + "sha256": "0c801486169d0594471518a75b11b040acb1a2dd8904e9365fa7b7b667fc4a09" + }, + { + "bytes": 67108864, + "index": 5, + "path": "payload-000005.bin", + "sha256": "4f387b9e6b47f06871ce1b32e265b3a1ae2d78e06d7955a3fa8ed7cfc1d2a0a7" + }, + { + "bytes": 31805270, + "index": 6, + "path": "payload-000006.bin", + "sha256": "edb0ffa74e646712485a0d5fd2819ef14345c637beeaa5ca811ae3e71a06ea82" + } + ], + "exclusion_records": 4, + "exclusions": { + "bytes": 218, + "sha256": "9c029262724580ef20981316c6f7e9c99d345e1171067f16c5d580c742809a8c" + }, + "group_id": "visualpathways", + "license": { + "evidence_file": "LICENSE", + "evidence_sha256": "3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986", + "third_party_notices": "Retained; no relicensing of third-party components", + "upstream": "GPL-3.0 as supplied in upstream LICENSE; no assertion of only/or-later option" + }, + "members": { + "bytes": 292178, + "sha256": "335401c3f6cb5b3868b899599bcd7b439c1983a627d97a598a95e9c8d44ad81c" + }, + "plan_sha256": "a20a61821c504e8315171a5fd14afbac011b934709af344045175bdda9fcba71", + "provenance": { + "attribution": "Reiser Lab and visualpathways contributors; original copyright notices and source retained", + "changes": "Unchanged source/resource file bytes from pinned checkout; .git, credentials, environments and caches omitted; explicit exclusions recorded. No software execution or model alteration.", + "commit": "23f6ac131529b5f56894c6eeb9b88b17894fc00d", + "repository": "https://github.com/reiserlab/visualpathways" + }, + "schema": "lfs-publication-group-v1", + "secret_scan": "UTF-8 files <=2 MiB, known binary suffixes excluded; fail closed on matching rules", + "source_bytes": 1652696750, + "source_files": 6033, + "source_paths": [ + "experiments/phase4f-retinotopic-vision/external-resources/visualpathways" + ], + "source_root": "/data/digital-drosophila", + "verification_scope": "content snapshot, not a license grant or nested-archive secret audit" +} diff --git a/artifacts/public-resources-20261001/visualpathways/exclusions.jsonl.gz b/artifacts/public-resources-20261001/visualpathways/exclusions.jsonl.gz new file mode 100644 index 0000000..ba39cbc --- /dev/null +++ b/artifacts/public-resources-20261001/visualpathways/exclusions.jsonl.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c029262724580ef20981316c6f7e9c99d345e1171067f16c5d580c742809a8c +size 218 diff --git a/artifacts/public-resources-20261001/visualpathways/members.jsonl.gz b/artifacts/public-resources-20261001/visualpathways/members.jsonl.gz new file mode 100644 index 0000000..d5426fb --- /dev/null +++ b/artifacts/public-resources-20261001/visualpathways/members.jsonl.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:335401c3f6cb5b3868b899599bcd7b439c1983a627d97a598a95e9c8d44ad81c +size 292178 diff --git a/artifacts/public-resources-20261001/visualpathways/payload-000000.bin b/artifacts/public-resources-20261001/visualpathways/payload-000000.bin new file mode 100644 index 0000000..d04ed63 --- /dev/null +++ b/artifacts/public-resources-20261001/visualpathways/payload-000000.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f8bb35dcb565c16ff1bf642e079c54c71e27e05cccaa5915c1d1e3c9e7d0700 +size 67108864 diff --git a/artifacts/public-resources-20261001/visualpathways/payload-000001.bin b/artifacts/public-resources-20261001/visualpathways/payload-000001.bin new file mode 100644 index 0000000..b4bba7c --- /dev/null +++ b/artifacts/public-resources-20261001/visualpathways/payload-000001.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7181f79ec2615a84f33b394abf22454b72d2fddfb0e40e9c5e1590fe1ba64d7a +size 67108864 diff --git a/artifacts/public-resources-20261001/visualpathways/payload-000002.bin b/artifacts/public-resources-20261001/visualpathways/payload-000002.bin new file mode 100644 index 0000000..88a361a --- /dev/null +++ b/artifacts/public-resources-20261001/visualpathways/payload-000002.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9dc076afd8cd8ebbbdda6f1ef24a41598e5db9fb0a98de8b5b765b4b0a8d2934 +size 67108864 diff --git a/artifacts/public-resources-20261001/visualpathways/payload-000003.bin b/artifacts/public-resources-20261001/visualpathways/payload-000003.bin new file mode 100644 index 0000000..5fde6ec --- /dev/null +++ b/artifacts/public-resources-20261001/visualpathways/payload-000003.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be03beac2472e6dc76a5705440296f88a8f6e15ea43f541df402c7b6c85cfdc6 +size 67108864 diff --git a/artifacts/public-resources-20261001/visualpathways/payload-000004.bin b/artifacts/public-resources-20261001/visualpathways/payload-000004.bin new file mode 100644 index 0000000..1f00ec9 --- /dev/null +++ b/artifacts/public-resources-20261001/visualpathways/payload-000004.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c801486169d0594471518a75b11b040acb1a2dd8904e9365fa7b7b667fc4a09 +size 67108864 diff --git a/artifacts/public-resources-20261001/visualpathways/payload-000005.bin b/artifacts/public-resources-20261001/visualpathways/payload-000005.bin new file mode 100644 index 0000000..16d9b62 --- /dev/null +++ b/artifacts/public-resources-20261001/visualpathways/payload-000005.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f387b9e6b47f06871ce1b32e265b3a1ae2d78e06d7955a3fa8ed7cfc1d2a0a7 +size 67108864 diff --git a/artifacts/public-resources-20261001/visualpathways/payload-000006.bin b/artifacts/public-resources-20261001/visualpathways/payload-000006.bin new file mode 100644 index 0000000..7314b8a --- /dev/null +++ b/artifacts/public-resources-20261001/visualpathways/payload-000006.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:edb0ffa74e646712485a0d5fd2819ef14345c637beeaa5ca811ae3e71a06ea82 +size 31805270 diff --git a/registry/publication-20261001/README.md b/registry/publication-20261001/README.md index 3977248..f50dc4d 100644 --- a/registry/publication-20261001/README.md +++ b/registry/publication-20261001/README.md @@ -34,8 +34,18 @@ DoOR 作者为 Daniel Münch、C. Giovanni Galizia、Shouwen Ma、Martin Strauch `pack-summary.json` 存在且 complete=true 仅表示本地打包完成,不等于上传/远程恢复成功。上传后使用独立 clone 和新的 LFS object store 实际下载,再逐块、逐归档、逐内部文件流式校验。对应 receipt 只有在真实校验完成后才会提交。 +本批实际范围:8 组、226,859 个原文件、24,040,546,041 字节;tar+zstd 分块总计 9,806,419,307 字节(不含小型目录/成员清单)。本地完整内容校验已通过。226,849 个文件与 2026-09-29 历史索引逐 SHA/大小吻合,另 10 个后增参考文件不在该旧索引,明确记为部分历史覆盖;其中 synaptic-partners 登记 SHA、作者模型 LICENSE pin 另有校验,来源原记录随包保留。不得把这次检查描述为所有历史科学阶段重新通过。 + 本次不是服务器所有内容的完整灾备。Gitea LFS 与 Git 仓库数据目录均需另有服务端备份;删除服务端 LFS 对象会破坏恢复能力。尚未核验 Gitea 主机磁盘容量和备份策略。 +### 本次内网传输 + +Git SSH 本来使用 `192.168.10.31:2222`,但服务器返回的 LFS HTTPS 域名在本机解析到代理地址,导致大对象传输很慢。本次使用仓库本地的 `malecns-lan-https` transfer adapter:TCP 只连接 `192.168.10.31:443`,TLS SNI/证书验证仍使用 `git.lain.asia`,不关闭证书检查、不修改 hosts、系统代理或 Gitea 服务配置。通过原 SSH key 获取短期鉴权,凭据只保留在内存并经标准输入交给 curl,不写入提交或命令行参数。 + +adapter 遵循 [Git LFS 官方 custom-transfer 协议](https://github.com/git-lfs/git-lfs/blob/main/docs/custom-transfers.md),只允许该仓库的 HTTPS API/object 路径;Gitea 的 `Transfer-Encoding: chunked` 只在上传 PUT 场景被精确处理。它仍上传标准 LFS 对象,其他电脑可以继续使用普通 Git LFS 下载,不依赖这个内网 adapter。并发为 2,分块可重试;科学实验不得因此重启或重试。 + +最初通过代理的核心数据 push 为切换路线而主动停止,未完成的远端分支更新不计为成功。Git 提交和已传对象保留,后续按内容地址续传;严格 header 校验曾在开始 PUT 前拒绝服务器 chunked header,适配后再测试,未改变任何源文件。最终状态以独立下载回执为准,不把这些准备动作记为完成。 + ## 安全恢复(Linux 示例) 先安装 Git LFS、Python 3 和 zstd。只在新目录恢复,不要覆盖运行中的 `/data/digital-drosophila`。 diff --git a/registry/publication-20261001/lan-roundtrip-smoke.json b/registry/publication-20261001/lan-roundtrip-smoke.json new file mode 100644 index 0000000..940c9e6 --- /dev/null +++ b/registry/publication-20261001/lan-roundtrip-smoke.json @@ -0,0 +1,40 @@ +{ + "adapter": { + "bytes": 16661, + "sha256": "21241d6a75d84108e720b4a051504fff00158b327f15c0ee06e5c57c6ad1c263" + }, + "certificate_verification": true, + "hostname": "git.lain.asia", + "ip": "192.168.10.31", + "observed_utc": "2026-09-30T19:40:34.704953+00:00", + "pass_all": true, + "port": 443, + "proxy_used": false, + "schema": "lfs-lan-roundtrip-smoke-v1", + "transfers": [ + { + "bytes": 67108864, + "complete": true, + "methods": [ + "POST", + "PUT", + "POST" + ], + "operation": "upload", + "seconds": 0.9692029840080068, + "sha256": "a507fb9917a63f6221d97780727831735bcf419bb6d36b17546f2be04e8f6b6b" + }, + { + "bytes": 67108864, + "complete": true, + "methods": [ + "POST", + "GET" + ], + "new_download_file": "/tmp/malecns-lfs-publication-20261001-bI1u07/repo/.git/lfs/lan-transfer-tmp/a507fb9917a63f6221d97780727831735bcf419bb6d36b17546f2be04e8f6b6b.0vvk_cw4.partial", + "operation": "download", + "seconds": 0.6818166430020938, + "sha256": "a507fb9917a63f6221d97780727831735bcf419bb6d36b17546f2be04e8f6b6b" + } + ] +} diff --git a/registry/publication-20261001/local-content-verification.json b/registry/publication-20261001/local-content-verification.json new file mode 100644 index 0000000..96948d6 --- /dev/null +++ b/registry/publication-20261001/local-content-verification.json @@ -0,0 +1,206 @@ +{ + "aggregate_inventory_sha256": "88814458c772fc0e5b1708bc05e6c478097fc10b55271a83d538855ccfa81c84", + "archive_bytes": 9806419307, + "fresh_download_proven": false, + "git": { + "cwd": "/tmp/malecns-lfs-publication-20261001-bI1u07/repo", + "head": "13cd0e0be7a24ca9d7c036876bc48f9b22652968", + "scope": "HEAD observed at invocation cwd; not a clean-tree or payload-to-commit proof" + }, + "groups": [ + { + "archive_bytes": 834266158, + "archive_sha256": "feebf3fe3f3c2c9fea3db96fab8267330de49af7ab37008b84caeeea8dc272ed", + "catalog_path": "/tmp/malecns-lfs-publication-20261001-bI1u07/repo/artifacts/public-resources-20261001/malecns-raw-core/catalog.json", + "catalog_sha256": "8a7ea9abe5f75ce31318d207a1dbb491d5e151af27bd607dc1b59fb29d4aacf8", + "group": "malecns-raw-core", + "historical_matched": 17, + "historical_missing": 0, + "license_evidence_verified": null, + "pass_all": true, + "registered_file_verified": null, + "schema": "lfs-publication-verify-v1", + "scope": "downloaded payload bytes and streamed members; no extraction, no LFS-cache trust; catalog authenticity is caller responsibility", + "source_bytes": 1207032031, + "source_files": 17 + }, + { + "archive_bytes": 2760276945, + "archive_sha256": "537644b322747b821580818aaa4154ab15714f0ddbcebc3183b587682760f57e", + "catalog_path": "/tmp/malecns-lfs-publication-20261001-bI1u07/repo/artifacts/public-resources-20261001/malecns-swc/catalog.json", + "catalog_sha256": "efc330317e2f74272e233634e5652982232ef9d3b6762f8e3cbd9eeaf05487cf", + "group": "malecns-swc", + "historical_matched": 211573, + "historical_missing": 0, + "license_evidence_verified": null, + "pass_all": true, + "registered_file_verified": null, + "schema": "lfs-publication-verify-v1", + "scope": "downloaded payload bytes and streamed members; no extraction, no LFS-cache trust; catalog authenticity is caller responsibility", + "source_bytes": 9299975999, + "source_files": 211573 + }, + { + "archive_bytes": 635332131, + "archive_sha256": "a5d8ac0e6eebd5c6235078e9a9ac5a5c224bc86185bb77dd38248833c6b946f1", + "catalog_path": "/tmp/malecns-lfs-publication-20261001-bI1u07/repo/artifacts/public-resources-20261001/malecns-processed/catalog.json", + "catalog_sha256": "e1e42f654cb005d2f073d4e84c808af50f50c3feeb9cbcb0b0c1c51746bfdb47", + "group": "malecns-processed", + "historical_matched": 64, + "historical_missing": 0, + "license_evidence_verified": null, + "pass_all": true, + "registered_file_verified": null, + "schema": "lfs-publication-verify-v1", + "scope": "downloaded payload bytes and streamed members; no extraction, no LFS-cache trust; catalog authenticity is caller responsibility", + "source_bytes": 1140025370, + "source_files": 64 + }, + { + "archive_bytes": 5063205053, + "archive_sha256": "cf2927389ecf3d20cbccaa269941265e8c709544c60068f28a40a0643c6be13d", + "catalog_path": "/tmp/malecns-lfs-publication-20261001-bI1u07/repo/artifacts/public-resources-20261001/malecns-synaptic-partners/catalog.json", + "catalog_sha256": "bdbc0354abdad63a9c256a2841fdf9df4c32258647b8de03d066afc89fa61053", + "group": "malecns-synaptic-partners", + "historical_matched": 0, + "historical_missing": 6, + "license_evidence_verified": null, + "pass_all": true, + "registered_file_verified": { + "bytes": 6777179098, + "path": "experiments/phase4aa-apl-pn-scope/external-resources/synaptic-partners/syn-partners-male-cns-v1.0-minconf-0.5.feather", + "sha256": "959d8ef4173b35382a3e6acfaf5167c795b6d10b877572d146af04e1b487bc07" + }, + "schema": "lfs-publication-verify-v1", + "scope": "downloaded payload bytes and streamed members; no extraction, no LFS-cache trust; catalog authenticity is caller responsibility", + "source_bytes": 6777184219, + "source_files": 6 + }, + { + "archive_bytes": 77971754, + "archive_sha256": "2366caef95fb5ad038639a6ae2ad25139a14c42492bc19640c20af46fefa0bc7", + "catalog_path": "/tmp/malecns-lfs-publication-20261001-bI1u07/repo/artifacts/public-resources-20261001/celltype-explorer/catalog.json", + "catalog_sha256": "4dc6be6091b273312a1dd61f621654f05e4c12118bdd13c22905d588e378889c", + "group": "celltype-explorer", + "historical_matched": 8973, + "historical_missing": 0, + "license_evidence_verified": { + "bytes": 18657, + "path": "experiments/phase4f-retinotopic-vision/external-resources/celltype-explorer/LICENSE", + "sha256": "9ba9550ad48438d0836ddab3da480b3b69ffa0aac7b7878b5a0039e7ab429411" + }, + "pass_all": true, + "registered_file_verified": null, + "schema": "lfs-publication-verify-v1", + "scope": "downloaded payload bytes and streamed members; no extraction, no LFS-cache trust; catalog authenticity is caller responsibility", + "source_bytes": 3957079583, + "source_files": 8973 + }, + { + "archive_bytes": 434458454, + "archive_sha256": "683b85394fb44e42704c275fbda93c95072f9f64c16a84e47ce2821c060cc39f", + "catalog_path": "/tmp/malecns-lfs-publication-20261001-bI1u07/repo/artifacts/public-resources-20261001/visualpathways/catalog.json", + "catalog_sha256": "bd824a656235ba08a35a67ad6d865467a946145cf985677226412280380939fc", + "group": "visualpathways", + "historical_matched": 6033, + "historical_missing": 0, + "license_evidence_verified": { + "bytes": 35149, + "path": "experiments/phase4f-retinotopic-vision/external-resources/visualpathways/LICENSE", + "sha256": "3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986" + }, + "pass_all": true, + "registered_file_verified": null, + "schema": "lfs-publication-verify-v1", + "scope": "downloaded payload bytes and streamed members; no extraction, no LFS-cache trust; catalog authenticity is caller responsibility", + "source_bytes": 1652696750, + "source_files": 6033 + }, + { + "archive_bytes": 901984, + "archive_sha256": "64d415a1ea9f5c2fe09005ce1c2bb27eb45510fad27ad3c39cf0001e6f525fd1", + "catalog_path": "/tmp/malecns-lfs-publication-20261001-bI1u07/repo/artifacts/public-resources-20261001/door-data/catalog.json", + "catalog_sha256": "6d0fcbe747dae7b38bcf335572b173e0112f6aabd10aa0040b84cfd81a8a390c", + "group": "door-data", + "historical_matched": 189, + "historical_missing": 0, + "license_evidence_verified": { + "bytes": 1042, + "path": "experiments/phase4l-olfactory-grounding/external-resources/DoOR.data/DESCRIPTION", + "sha256": "27db2a92eb651d67969de94959990d51668a5857a33c4750a3b6ef49c5880504" + }, + "pass_all": true, + "registered_file_verified": null, + "schema": "lfs-publication-verify-v1", + "scope": "downloaded payload bytes and streamed members; no extraction, no LFS-cache trust; catalog authenticity is caller responsibility", + "source_bytes": 6534522, + "source_files": 189 + }, + { + "archive_bytes": 6828, + "archive_sha256": "4da352d80e4bf251dfec771935da93f5a9f3cef302c85e90991fafa14a072e2b", + "catalog_path": "/tmp/malecns-lfs-publication-20261001-bI1u07/repo/artifacts/public-resources-20261001/shiu-author-model-source/catalog.json", + "catalog_sha256": "95c69e6e9e07625a1f9b273db67aa9ab480c66bb3bbb273c39c430aeedb9b910", + "group": "shiu-author-model-source", + "historical_matched": 0, + "historical_missing": 4, + "license_evidence_verified": { + "bytes": 1085, + "path": "experiments/phase4ac-lif-semantics/external-resources/LICENSE", + "sha256": "3621f6d6476189190e2960fa43f11b275ba4eca848fdac50a1ba2925de6223e8" + }, + "pass_all": true, + "registered_file_verified": null, + "schema": "lfs-publication-verify-v1", + "scope": "downloaded payload bytes and streamed members; no extraction, no LFS-cache trust; catalog authenticity is caller responsibility", + "source_bytes": 17567, + "source_files": 4 + } + ], + "historical_inventory": { + "all_current_members_historically_matched": false, + "bytes": 12285260, + "current_members_matched": 226849, + "current_members_with_nonfile_history": 0, + "current_members_without_regular_history": 10, + "historical_regular_files_outside_publication": 3390, + "missing_sample": [ + "experiments/phase4aa-apl-pn-scope/external-resources/evidence-and-limitations.json", + "experiments/phase4aa-apl-pn-scope/external-resources/official-data-access.json", + "experiments/phase4aa-apl-pn-scope/external-resources/synaptic-partners/authorization-and-source.json", + "experiments/phase4aa-apl-pn-scope/external-resources/synaptic-partners/download-verification.json", + "experiments/phase4aa-apl-pn-scope/external-resources/synaptic-partners/syn-partners-male-cns-v1.0-minconf-0.5.feather", + "experiments/phase4aa-apl-pn-scope/external-resources/synaptic-partners/upstream-object.json", + "experiments/phase4ac-lif-semantics/external-resources/LICENSE", + "experiments/phase4ac-lif-semantics/external-resources/environment_full.yml", + "experiments/phase4ac-lif-semantics/external-resources/model.py", + "experiments/phase4ac-lif-semantics/external-resources/provenance.json" + ], + "missing_sample_truncated": false, + "nonfile_records_skipped": 0, + "path": "/data/digital-drosophila/registry/snapshots/bootstrap-20260929/files.jsonl.gz", + "records": 230239, + "regular_file_records": 230239, + "scope": "Only publication members with regular-file history compared; not a full historical source-tree audit", + "sha256": "6f186112e6102f2f7969de7442fa7ee4432200a3678586cfc4e10c490b31bca4", + "status": "PARTIAL_CURRENT_MEMBER_COVERAGE" + }, + "pack_summary": { + "bytes": 2183, + "path": "/tmp/malecns-lfs-publication-20261001-bI1u07/repo/artifacts/public-resources-20261001/pack-summary.json", + "sha256": "a097651a8f61009ec99a8bf6d1c3fcfaebd65fae16d6b0a14ebc2db841ae53cb" + }, + "pass_all": true, + "payload_root": "/tmp/malecns-lfs-publication-20261001-bI1u07/repo/artifacts/public-resources-20261001", + "plan": { + "bytes": 7181, + "path": "/tmp/malecns-lfs-publication-20261001-bI1u07/repo/artifacts/public-resources-20261001/plan.json", + "sha256": "a20a61821c504e8315171a5fd14afbac011b934709af344045175bdda9fcba71" + }, + "receipt": "/tmp/malecns-lfs-publication-20261001-bI1u07/repo/registry/publication-20261001/local-content-verification.json", + "schema": "lfs-publication-aggregate-verification-v1", + "scope": "Given payload bytes verified against plan/catalog/members and optional historical overlap; provenance/plan authenticity and fresh-clone transfer evidence are caller responsibilities", + "source_bytes": 24040546041, + "source_files": 226859, + "verified_utc": "2026-09-30T19:36:33.592474+00:00" +} diff --git a/registry/publication-20261001/source-guard-after-pack.json b/registry/publication-20261001/source-guard-after-pack.json new file mode 100644 index 0000000..05bbb9d --- /dev/null +++ b/registry/publication-20261001/source-guard-after-pack.json @@ -0,0 +1,123 @@ +{ + "disk_free_bytes": { + "/data/digital-drosophila": 645520629760, + "/tmp/malecns-lfs-publication-20261001-bI1u07/repo/registry/publication-20261001": 876361818112 + }, + "license_evidence": [ + { + "bytes": 18657, + "group": "celltype-explorer", + "path": "/data/digital-drosophila/experiments/phase4f-retinotopic-vision/external-resources/celltype-explorer/LICENSE", + "sha256": "9ba9550ad48438d0836ddab3da480b3b69ffa0aac7b7878b5a0039e7ab429411" + }, + { + "bytes": 35149, + "group": "visualpathways", + "path": "/data/digital-drosophila/experiments/phase4f-retinotopic-vision/external-resources/visualpathways/LICENSE", + "sha256": "3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986" + }, + { + "bytes": 1042, + "group": "door-data", + "path": "/data/digital-drosophila/experiments/phase4l-olfactory-grounding/external-resources/DoOR.data/DESCRIPTION", + "sha256": "27db2a92eb651d67969de94959990d51668a5857a33c4750a3b6ef49c5880504" + }, + { + "bytes": 1085, + "group": "shiu-author-model-source", + "path": "/data/digital-drosophila/experiments/phase4ac-lif-semantics/external-resources/LICENSE", + "sha256": "3621f6d6476189190e2960fa43f11b275ba4eca848fdac50a1ba2925de6223e8" + } + ], + "observed_utc": "2026-09-30T19:39:32.468575+00:00", + "original_checkout_branch": "codex/lif-author-semantics-lab", + "original_checkout_head": "09187e4d4d67badf1b418c5f211258ca5d8fb328", + "original_checkout_status": "", + "pass_all": true, + "phase4ar_registered_sources": [ + { + "bytes": 5374, + "path": "/data/digital-drosophila/models/male-cns-lif/normal-conditioning-v1/PROTOCOL.md", + "sha256": "d61d2cb6a6bff31b5762edb78bb6406ac7d53b1e5eff30aad26eb0eea99fc313" + }, + { + "bytes": 29087, + "path": "/data/digital-drosophila/models/male-cns-lif/normal-conditioning-v1/append_ledger.py", + "sha256": "1f981f61cd26950e7d4b5393be70b82753ea7e721c0bb75d05f8fd1e92a453fb" + }, + { + "bytes": 7813, + "path": "/data/digital-drosophila/models/male-cns-lif/normal-conditioning-v1/normal_inputs.py", + "sha256": "df8f346b8fba54bb54f0b1a3f81c1511d54987684064094d0dfa46043be03e0d" + }, + { + "bytes": 3317, + "path": "/data/digital-drosophila/models/male-cns-lif/normal-conditioning-v1/normal_io.py", + "sha256": "fe6eee89ae98392a28120b69a966d7967916be94376cb7494ef3ce77e63506e0" + }, + { + "bytes": 37143, + "path": "/data/digital-drosophila/models/male-cns-lif/normal-conditioning-v1/normal_metrics.py", + "sha256": "82af63d8fadd5a6b67083f5e303ebe88674b76f9a2a8a8fff082b5c828483533" + }, + { + "bytes": 11254, + "path": "/data/digital-drosophila/models/male-cns-lif/normal-conditioning-v1/normal_plan.py", + "sha256": "d1a6b840a547cb10b00df40f4d8b287867d09f355c9777e5f7a8b9489f5555ea" + }, + { + "bytes": 15006, + "path": "/data/digital-drosophila/models/male-cns-lif/normal-conditioning-v1/normal_prepare.py", + "sha256": "9c8568a3d8c1049ada8737b71192952f72cdd27ccb3b470195e30d6a4b1cea68" + }, + { + "bytes": 24699, + "path": "/data/digital-drosophila/models/male-cns-lif/normal-conditioning-v1/normal_runner.py", + "sha256": "41a0c71508d0b39c9488bddeaa4ac2a669312c632f16d5f9b5de24dff2eb14c1" + }, + { + "bytes": 1534, + "path": "/data/digital-drosophila/models/male-cns-lif/normal-conditioning-v1/run_cpu_tests.py", + "sha256": "10ed189053731e1661284cf890ca3504a272af05b4531bdb3655b6e88cab6ff9" + }, + { + "bytes": 3043, + "path": "/data/digital-drosophila/models/male-cns-lif/normal-conditioning-v1/run_normal.py", + "sha256": "707b6be41caef7af83aa68ea1f102f10c9a4ba81a22c564e54eddf63857e81f3" + }, + { + "bytes": 15199, + "path": "/data/digital-drosophila/models/male-cns-lif/normal-conditioning-v1/test_append_ledger.py", + "sha256": "0f638c7b83117410d7fa074ec9f2ef865d9810171b73991c73a78414be581bc6" + }, + { + "bytes": 4292, + "path": "/data/digital-drosophila/models/male-cns-lif/normal-conditioning-v1/test_normal_inputs.py", + "sha256": "7aea6a3bcbbf78c3b3d671b33b83cd4d992b2a8ae9c888e29cdf13f9fa420a45" + }, + { + "bytes": 17862, + "path": "/data/digital-drosophila/models/male-cns-lif/normal-conditioning-v1/test_normal_metrics.py", + "sha256": "204586b30edbe57bb294c1d8f8ad309863e5bcb3baad32118955ac3d4adcdefb" + }, + { + "bytes": 9184, + "path": "/data/digital-drosophila/models/male-cns-lif/normal-conditioning-v1/test_normal_plan.py", + "sha256": "790bca529c58e5214c19a6dcaf07511fca11c07fb9b05ca5d71d3f06160bbef4" + }, + { + "bytes": 25798, + "path": "/data/digital-drosophila/models/male-cns-lif/normal-conditioning-v1/test_normal_runner.py", + "sha256": "ca9f69c731e56c50534d864d0ce780f286b5ab2d786a1a85fadb22dc09c0ccf5" + }, + { + "bytes": 2076, + "path": "/data/digital-drosophila/models/male-cns-lif/normal-conditioning-v1/test_run_normal.py", + "sha256": "2ee3ad3c58c0dfd83aaaa4c4c9bd01e84eb245c61048c105ed8f3031db74cb40" + } + ], + "registered_scientific_commit": "80aeb2093db655329774eff7b32fb6e417b8b40b", + "registration_sha256": "b63e6281b6505ca3b60acb467dd0b3fae274cf513dcbfd653649ba52e9ba9740", + "schema": "lfs-publication-source-guard-v1", + "scope": "16 registered Phase 4AR source files, registration, pinned upstream checkout and license evidence; not a scientific rerun or full historical checksum audit" +} diff --git a/registry/publication-20261001/tool-tests.json b/registry/publication-20261001/tool-tests.json new file mode 100644 index 0000000..6bf9f35 --- /dev/null +++ b/registry/publication-20261001/tool-tests.json @@ -0,0 +1,15 @@ +{ + "schema": "lfs-publication-tool-tests-v1", + "observed_utc": "2026-09-30T19:40:34Z", + "environment": "isolated Linux publication checkout; system python3 -B, installed zstd", + "command": "python3 -B -m unittest discover -s tools/lfs-publication -p test_*.py", + "exit_code": 0, + "tests_run": 66, + "skipped": 0, + "failures": 0, + "errors": 0, + "reported_wall_seconds": 0.992, + "suites": {"archive": 18, "aggregate": 14, "download_wrapper": 12, "lan_adapter": 22}, + "scope": "Archive suite includes real zstd integration. Transport/config failure tests use synthetic fixtures and mocks; actual LAN transfer is independently recorded in lan-roundtrip-smoke.json.", + "scientific_trials_executed": false +} diff --git a/tools/lfs-publication/download_verify.py b/tools/lfs-publication/download_verify.py new file mode 100644 index 0000000..64cdf0f --- /dev/null +++ b/tools/lfs-publication/download_verify.py @@ -0,0 +1,232 @@ +"""Fresh-cache transport verification for one independent publication checkout. + +Run only from its top level. This is not a scientific audit or authorization to +publish. Failed attempts retain their cache/partial files and are never retried. +Git/LFS output is suppressed; receipts contain no environment or auth headers. +The caller supplies the trusted commit. Tool source SHA pins are observations, +not signatures; executable versions are not executable-byte identity proofs. +""" +from __future__ import annotations + +import argparse +from datetime import datetime, timezone +import hashlib +import json +from pathlib import Path +import re +import stat +import subprocess +import sys + +import publish_archives as archives +import verify_publication as content + +REMOTE = "ssh://git@192.168.10.31:2222/qishizhe/digital-drosophila.git" +PAYLOAD = "artifacts/public-resources-20261001" +PROTECTED = Path("/data/digital-drosophila") +TRANSFER_OVERRIDES = (r"^(lfs\.(url|pushurl|standalonetransferagent|customtransfer\..*|" + r"remote\.(autodetect|searchall))|remote\.(lfsdefault|origin\.lfsurl))$") + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def within(path, root): + return path == root or root in path.parents + + +def command(args, *, text=False, bytes_output=False): + """Never return or print command diagnostics, which may contain credentials.""" + result = subprocess.run(args, stdin=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + stdout=subprocess.PIPE if text or bytes_output else subprocess.DEVNULL, + check=False) + if text or bytes_output: + require(result.returncode == 0, "Read-only Git/tool identity command failed") + if bytes_output: + return result.stdout + return result.stdout.decode("utf-8", errors="strict").strip() + return result.returncode + + +def identity(expected, checkout): + require(command(["git", "rev-parse", "--verify", "HEAD"], text=True) == expected, + "HEAD differs from expected commit") + require(archives.no_links(command(["git", "rev-parse", "--show-toplevel"], text=True)) == checkout, + "Run from the independent checkout top level") + require(archives.no_links(command(["git", "rev-parse", "--absolute-git-dir"], text=True)) == checkout / ".git", + "External/linked Git directory refused") + require(command(["git", "remote", "get-url", "--all", "origin"], text=True) == REMOTE, + "Origin must exactly match the approved remote") + + +def transfer_policy(checkout, expected_commit, allow_lan_adapter=False): + require(not (checkout / ".lfsconfig").exists() and not (checkout / ".lfsconfig").is_symlink(), + "Repository LFS endpoint overrides refused") + if not allow_lan_adapter: + # Exit 1 means no matches; potential credential values are never read. + require(command(["git", "config", "--get-regexp", TRANSFER_OVERRIDES]) == 1, + "LFS endpoint/custom-transfer override or unreadable configuration refused") + return None + relative = "tools/lfs-publication/lan_lfs_transfer.py" + adapter = archives.no_links(checkout / relative) + require(not any(c.isspace() for c in str(adapter)), "LAN adapter path must not require argument quoting") + prefix = "lfs.customtransfer.malecns-lan-https." + allowed = {"lfs.standalonetransferagent": "malecns-lan-https", + prefix + "path": "/usr/bin/python3", prefix + "args": "-B " + str(adapter), + prefix + "concurrent": "true", prefix + "direction": "both"} + keys = command(["git", "config", "--name-only", "--get-regexp", TRANSFER_OVERRIDES], text=True).splitlines() + require(len(keys) == len(allowed) and set(keys) == set(allowed), + "Only the exact approved LAN adapter configuration is permitted") + for key, value in allowed.items(): + require(command(["git", "config", "--local", "--get-all", key], text=True) == value + and command(["git", "config", "--get-all", key], text=True) == value, + "LAN adapter configuration must be exact and exclusively repository-local") + pin = archives.sha_file(adapter) + blob = command(["git", "show", expected_commit + ":" + relative], bytes_output=True) + require(len(blob) == pin["bytes"] and hashlib.sha256(blob).hexdigest() == pin["sha256"], + "LAN adapter must exactly match the expected HEAD blob") + return {"path": str(adapter), **pin} + + +def new_output(path, checkout, cache, payload): + p = archives.no_links(path) + require(not within(p, PROTECTED.absolute()), "Output under original project refused") + require(within(p, checkout.parent), "Output must stay in the independent workspace") + require(not within(p, payload) and not within(p, checkout / ".git") + and not within(p, checkout / "artifacts") and not within(p, cache), + "Receipt must be outside payload, artifacts, Git and cache trees") + require(not p.exists() and p.parent.is_dir(), "Receipt must be new with an existing parent") + return p + + +def cache_inventory(cache): + count = total = 0 + objects = cache / "objects" + if not objects.exists(): + return {"objects": 0, "bytes": 0} + archives.no_links(objects) + require(objects.is_dir(), "LFS objects must be a directory") + for p in objects.rglob("*"): + archives.no_links(p) + s = p.lstat() + if stat.S_ISDIR(s.st_mode): + continue + require(stat.S_ISREG(s.st_mode), "Nonregular cache object refused") + parts = p.relative_to(objects).parts + require(len(parts) == 3 and archives.HEX.fullmatch(parts[2]) is not None + and parts[0] == parts[2][:2] and parts[1] == parts[2][2:4], + "Unexpected LFS object layout") + count += 1 + total += s.st_size + return {"objects": count, "bytes": total} + + +def source_pins(adapter=None): + result = {name: {"path": str(Path(path).absolute()), **archives.sha_file(path)} + for name, path in (("download_verify.py", __file__), + ("verify_publication.py", content.__file__), + ("publish_archives.py", archives.__file__))} + if adapter is not None: + result["lan_lfs_transfer.py"] = {"path": adapter["path"], **archives.sha_file(adapter["path"])} + return result + + +def run(expected_commit, cache, receipt, content_receipt, historical_inventory, *, allow_lan_adapter=False): + require(isinstance(expected_commit, str) and re.fullmatch(r"[0-9a-f]{40}", expected_commit), + "Expected commit must be a complete lowercase SHA-1") + checkout = archives.no_links(Path.cwd()) + require(not within(checkout, PROTECTED.absolute()), "Original project checkout refused") + gitdir = archives.no_links(checkout / ".git") + require(gitdir.is_dir(), "Only an independent clone with its own .git directory is accepted") + identity(expected_commit, checkout) + adapter = transfer_policy(checkout, expected_commit, allow_lan_adapter) + require(not command(["git", "status", "--porcelain", "--untracked-files=no"], text=True), + "Tracked checkout changes refused") + cache = archives.no_links(cache) + require(not within(cache, PROTECTED.absolute()), "Cache under original project refused") + require(within(cache, gitdir) or (within(cache, checkout.parent) and not within(cache, checkout)), + "Cache must be inside this .git or outside checkout in the independent workspace") + require(not cache.exists() and cache.parent.is_dir(), "Cache must never have existed for this attempt") + payload = archives.no_links(checkout / PAYLOAD) + receipt = new_output(receipt, checkout, cache, payload) + content_receipt = new_output(content_receipt, checkout, cache, payload) + history = archives.no_links(historical_inventory) + require(len({receipt, content_receipt, history, cache}) == 4, "Inputs/outputs must be distinct") + history_pin = archives.sha_file(history) + pins = source_pins(adapter) + versions = {"git": command(["git", "--version"], text=True), + "git_lfs": command(["git", "lfs", "version"], text=True), + "zstd": command(["zstd", "--version"], text=True), + "python": sys.version.split()[0]} + started = datetime.now(timezone.utc).isoformat() + cache.mkdir(exist_ok=False) + initial = cache_inventory(cache) + require(initial == {"objects": 0, "bytes": 0}, "New cache is not empty") + print(json.dumps({"stage": "fresh-cache-created", "objects": 0, "bytes": 0}), flush=True) + git = ["git", "-c", "lfs.storage=" + str(cache), "-c", "lfs.concurrenttransfers=2"] + pull = command(git + ["lfs", "pull", "--include=artifacts/**", "--exclude=", "origin"]) + require(pull == 0, "LFS pull failed; cache retained, no automatic retry") + print(json.dumps({"stage": "pull-exited", "exit_code": pull}), flush=True) + fsck = command(git + ["lfs", "fsck", "--dry-run"]) + require(fsck == 0, "LFS fsck failed; cache retained, no automatic retry") + print(json.dumps({"stage": "fsck-exited", "exit_code": fsck}), flush=True) + objects = cache_inventory(cache) + require(objects["objects"] > 0 and objects["bytes"] > 0, "Fresh LFS cache contains no objects") + verified = content.verify_publication(payload, content_receipt, history) + require(verified.get("pass_all") is True + and archives.HEX.fullmatch(str(verified.get("aggregate_inventory_sha256", ""))) is not None, + "Content verification did not report success") + content_pin = archives.sha_file(content_receipt) + require(content_pin["sha256"] == verified.get("receipt_sha256"), "Content receipt SHA mismatch") + require(archives.sha_file(history) == history_pin and source_pins(adapter) == pins, + "History or verification tool changed during attempt") + identity(expected_commit, checkout) + require(transfer_policy(checkout, expected_commit, allow_lan_adapter) == adapter, + "LAN adapter identity/configuration changed during attempt") + require(cache_inventory(cache) == objects, "Cache object inventory changed during content verification") + report = {"schema": "lfs-publication-download-verification-v1", "pass_all": True, + "started_utc": started, "verified_utc": datetime.now(timezone.utc).isoformat(), + "checkout": str(checkout), "expected_commit": expected_commit, + "head": expected_commit, "origin": REMOTE, + "explicit_pull_remote": "origin", "lfs_endpoint_overrides_refused": True, + "lan_adapter": {"enabled": adapter is not None, "source": adapter, + "configuration_scope": "repository-local only" if adapter else None, + "temporary_download_directory": str(gitdir / "lfs/lan-transfer-tmp") if adapter else None}, + "cache": {"path": str(cache), "initially_absent": True, + "before": initial, "after": objects}, + "pull_exit_code": pull, "fsck_dry_run_exit_code": fsck, + "include": "artifacts/**", "exclude": "", "concurrent_transfers": 2, + "content_receipt": {"path": str(content_receipt), **content_pin}, + "aggregate_inventory_sha256": verified["aggregate_inventory_sha256"], + "historical_inventory": {"path": str(history), **history_pin, + "status": verified.get("historical_status")}, + "tool_sources": pins, "tool_versions": versions, "fresh_download_proven": True, + "learning_pass_claimed": False, "original_project_write_requested": False, + "scope": "Fresh isolated LFS storage, actual pull/fsck exits and complete publication member verification; smoke covered by pull/fsck. Not a scientific gate, all-history audit, or executable-byte identity proof."} + archives.write_new(receipt, archives.canonical(report)) + return report + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--expected-commit", required=True) + parser.add_argument("--cache", required=True) + parser.add_argument("--receipt", required=True) + parser.add_argument("--content-receipt", required=True) + parser.add_argument("--historical-inventory", required=True) + parser.add_argument("--allow-lan-adapter", action="store_true") + args = parser.parse_args() + try: + run(args.expected_commit, args.cache, args.receipt, args.content_receipt, args.historical_inventory, + allow_lan_adapter=args.allow_lan_adapter) + except (Exception, KeyboardInterrupt) as exc: + print(json.dumps({"status": "FAILED-NOT-RETRIED", "error_type": type(exc).__name__}), flush=True) + return 1 + print(json.dumps({"status": "PASS", "receipt": str(Path(args.receipt).absolute())}), flush=True) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/lfs-publication/lan_lfs_transfer.py b/tools/lfs-publication/lan_lfs_transfer.py new file mode 100644 index 0000000..ad35eeb --- /dev/null +++ b/tools/lfs-publication/lan_lfs_transfer.py @@ -0,0 +1,336 @@ +"""Repository-local, LAN-pinned Git LFS standalone transfer agent. + +Protocol: https://github.com/git-lfs/git-lfs/blob/main/docs/custom-transfers.md +Only fixed-origin SSH authentication and HTTPS basic transfers are supported. +No config/network changes, retries, redirects, credential files, or cache-based +download substitution. Credentials are passed to curl exclusively on stdin. +""" +from __future__ import annotations + +import hashlib +import json +import os +from pathlib import Path +import re +import stat +import subprocess +import sys +import tempfile +from urllib.parse import urlsplit + +ORIGIN = "ssh://git@192.168.10.31:2222/qishizhe/digital-drosophila.git" +HOST = "git.lain.asia" +IP = "192.168.10.31" +PREFIX = "/qishizhe/digital-drosophila.git/info/lfs" +SOURCE = Path("/data/digital-drosophila") +OID = re.compile(r"^[0-9a-f]{64}$") +HEADER = re.compile(r"^[!#$%&'*+.^_`|~0-9A-Za-z-]+$") +MAX_JSON = 2 * 1024 * 1024 +BLOCK = 1024 * 1024 + + +class TransferError(Exception): + """Only fixed, non-secret messages may be passed to this class.""" + + +def require(ok, code): + if not ok: + raise TransferError(code) + + +def decode_json(data): + def unique(pairs): + result = {} + for key, value in pairs: + require(key not in result, "duplicate-json-key") + result[key] = value + return result + require(len(data) <= MAX_JSON, "json-response-too-large") + try: + return json.loads(data, object_pairs_hook=unique) + except (UnicodeError, ValueError): + raise TransferError("invalid-json") from None + + +def safe_path(value): + require(isinstance(value, (str, Path)), "invalid-file-path") + p = Path(value) + require(p.is_absolute() and ".." not in p.parts, "absolute-safe-path-required") + for component in (p, *p.parents): + if component.exists() or component.is_symlink(): + s = component.lstat() + require(not stat.S_ISLNK(s.st_mode) and not + (getattr(s, "st_file_attributes", 0) & getattr(stat, "FILE_ATTRIBUTE_REPARSE_POINT", 0)), + "symlink-or-reparse-refused") + return p + + +def safe_url(value): + require(isinstance(value, str) and len(value) <= 16384 and + not any(ord(c) <= 32 or ord(c) == 127 for c in value), "invalid-action-url") + try: + p = urlsplit(value) + valid = (p.scheme == "https" and p.netloc in (HOST, HOST + ":443") and + p.hostname == HOST and p.port in (None, 443) and + p.username is None and p.password is None and not p.fragment) + except ValueError: + raise TransferError("url-authority-refused") from None + require(valid, "url-authority-refused") + require(p.path == PREFIX or p.path.startswith(PREFIX + "/"), "url-repository-prefix-refused") + require("%" not in p.path and "\\" not in p.path and + all(x not in ("", ".", "..") for x in p.path.split("/")[1:]), "url-path-refused") + return value + + +def safe_headers(value, *, allow_upload_chunked=False): + require(isinstance(value, dict) and len(value) <= 32, "invalid-action-headers") + result, seen = {}, set() + denied = {"host", "connection", "content-length", "transfer-encoding", "te", + "trailer", "upgrade", "proxy-authorization", "proxy-connection", "range"} + for key, item in value.items(): + upload_chunked = (allow_upload_chunked is True and isinstance(key, str) and + key.lower() == "transfer-encoding" and item == "chunked") + require(isinstance(key, str) and HEADER.fullmatch(key) is not None and + key.lower() not in seen and (key.lower() not in denied or upload_chunked), + "header-name-refused") + require(isinstance(item, str) and len(item) <= 16384 and + not any(ord(c) < 32 or ord(c) == 127 for c in item), "header-value-refused") + seen.add(key.lower()) + result[key] = item + return result + + +def quote(value): + require(isinstance(value, str) and not any(ord(c) < 32 or ord(c) == 127 for c in value), + "curl-config-value-refused") + return '"' + value.replace("\\", "\\\\").replace('"', '\\"') + '"' + + +def fingerprint(s): + return (s.st_dev, s.st_ino, s.st_mode, s.st_size, s.st_mtime_ns, s.st_ctime_ns) + + +def verify_file(path, oid, size): + path = safe_path(path) + before = fingerprint(path.lstat()) + require(stat.S_ISREG(before[2]) and before[3] == size, "object-file-type-or-size-mismatch") + digest, count = hashlib.sha256(), 0 + with path.open("rb") as handle: + opened = fingerprint(os.fstat(handle.fileno())) + # Windows path stat and fstat can expose different ctime definitions. + require(opened[:-1] == before[:-1] if os.name == "nt" else opened == before, + "object-changed-at-open") + while data := handle.read(BLOCK): + digest.update(data) + count += len(data) + require(fingerprint(os.fstat(handle.fileno())) == opened, "object-changed-during-read") + require(fingerprint(path.lstat()) == before and count == size and digest.hexdigest() == oid, + "object-sha-or-stability-mismatch") + return before + + +def git_output(cwd, *args): + try: + result = subprocess.run(["git", "-C", str(cwd), *args], capture_output=True, + timeout=15, check=False) + require(result.returncode == 0, "git-inspection-failed") + return result.stdout.decode("utf-8").strip() + except (OSError, UnicodeError, subprocess.TimeoutExpired): + raise TransferError("git-inspection-failed") from None + + +class Agent: + def __init__(self, message, emit, cwd=None): + require(message.get("event") == "init" and message.get("operation") in ("upload", "download"), + "invalid-init") + require(message.get("remote") in ("origin", ORIGIN), "remote-refused") + concurrency = message.get("concurrenttransfers") + require(type(concurrency) is int and 1 <= concurrency <= 2 and + type(message.get("concurrent")) is bool, "concurrency-must-be-at-most-two") + cwd = safe_path(Path.cwd() if cwd is None else cwd) + require(cwd != SOURCE and SOURCE not in cwd.parents, "scientific-source-cwd-refused") + self.root = safe_path(git_output(cwd, "rev-parse", "--show-toplevel")) + require(self.root != SOURCE and SOURCE not in self.root.parents, "scientific-source-repository-refused") + require(git_output(cwd, "config", "--get", "remote.origin.url") == ORIGIN, "origin-refused") + self.git_dir = safe_path(git_output(cwd, "rev-parse", "--absolute-git-dir")) + require(self.git_dir == self.root / ".git" and self.git_dir.is_dir(), "ordinary-isolated-clone-required") + self.operation, self.emit = message["operation"], emit + + def authenticate(self): + command = ["ssh", "-o", "BatchMode=yes", "-o", "StrictHostKeyChecking=yes", + "-o", "ConnectTimeout=15", "-o", "ConnectionAttempts=1", + "-o", "ServerAliveInterval=10", "-o", "ServerAliveCountMax=2", + "-p", "2222", "git@192.168.10.31", "git-lfs-authenticate", + "qishizhe/digital-drosophila.git", self.operation] + try: + result = subprocess.run(command, capture_output=True, timeout=45, check=False) + require(result.returncode == 0, "ssh-authentication-failed") + auth = decode_json(result.stdout) + except (OSError, subprocess.TimeoutExpired): + raise TransferError("ssh-authentication-failed") from None + require(isinstance(auth, dict), "invalid-ssh-authentication-response") + href = safe_url(auth.get("href")) + parsed = urlsplit(href) + require(parsed.path == PREFIX and not parsed.query, "authentication-base-url-refused") + return href, safe_headers(auth.get("header", {})) + + def curl(self, method, url, headers, *, body=None, upload=None, download=None, size=None): + safe_url(url) + headers = safe_headers(headers, allow_upload_chunked=(self.operation == "upload" and + method == "PUT" and upload is not None and body is None and download is None)) + require(method in ("GET", "POST", "PUT"), "unsupported-http-method") + present = {name.lower() for name in headers} + if "accept" not in present: + headers["Accept"] = "application/vnd.git-lfs+json" + if method == "PUT" and "content-type" not in present: + headers["Content-Type"] = "application/octet-stream" + if body is not None and "content-type" not in present: + headers["Content-Type"] = "application/vnd.git-lfs+json" + lines = ["url = " + quote(url), "request = " + quote(method), + 'noproxy = "*"', 'resolve = "' + HOST + ':443:' + IP + '"', + 'proto = "=https"', 'proto-redir = "=https"', "max-redirs = 0", + "connect-timeout = 15", "max-time = 1800", "fail", "silent", "show-error", + 'write-out = "\\n%{http_code}"'] + for name, value in headers.items(): + lines.append("header = " + quote(name + ": " + value)) + if body is not None: + encoded = json.dumps(body, separators=(",", ":"), allow_nan=False) + lines.append("data-binary = " + quote(encoded)) + if upload is not None: + lines.append("upload-file = " + quote(str(safe_path(upload)))) + if download is not None: + lines.append("output = " + quote(str(safe_path(download)))) + require(type(size) is int and size >= 0, "invalid-download-limit") + # A zero-byte object still needs a full HTTP fetch, not a cache hit. + lines.append("max-filesize = " + str(max(size, 1))) + else: + lines.append("max-filesize = " + str(MAX_JSON)) + config = ("\n".join(lines) + "\n").encode("utf-8") + try: + result = subprocess.run(["curl", "-q", "--config", "-"], input=config, + capture_output=True, timeout=1830, check=False) + except (OSError, subprocess.TimeoutExpired): + raise TransferError("curl-execution-failed") from None + # Never print stderr, response data, URLs, configuration, or headers. + require(result.returncode == 0, "curl-request-failed") + require(len(result.stdout) <= MAX_JSON + 32, "http-response-too-large") + content, separator, status = result.stdout.rpartition(b"\n") + require(separator and len(status) == 3 and status.isdigit() and 200 <= int(status) < 300, + "non-success-http-status") + return content + + def batch(self, oid, size): + href, headers = self.authenticate() + headers = {k: v for k, v in headers.items() if k.lower() not in ("content-type", "accept")} + headers.update({"Content-Type": "application/vnd.git-lfs+json", "Accept": "application/vnd.git-lfs+json"}) + response = decode_json(self.curl("POST", href + "/objects/batch", headers, + body={"operation": self.operation, "transfers": ["basic"], + "objects": [{"oid": oid, "size": size}]})) + require(isinstance(response, dict) and response.get("transfer", "basic") == "basic", + "non-basic-batch-response") + objects = response.get("objects") + require(isinstance(objects, list) and len(objects) == 1 and isinstance(objects[0], dict), + "invalid-batch-object-count") + item = objects[0] + require(item.get("oid") == oid and type(item.get("size")) is int and item["size"] == size, + "batch-object-identity-mismatch") + require("error" not in item, "batch-object-rejected") + actions = item.get("actions", {}) + require(isinstance(actions, dict), "invalid-batch-actions") + allowed = {"upload", "verify"} if self.operation == "upload" else {"download"} + require(set(actions) <= allowed, "unexpected-batch-action") + for name, action in actions.items(): + require(isinstance(action, dict), "invalid-batch-action") + safe_url(action.get("href")) + safe_headers(action.get("header", {}), allow_upload_chunked=(self.operation == "upload" and name == "upload")) + return actions + + def progress(self, oid, size, previous=0): + self.emit({"event": "progress", "oid": oid, "bytesSoFar": size, "bytesSinceLast": size - previous}) + + def transfer(self, message): + require(message.get("event") == self.operation and message.get("action") is None, + "standalone-operation-required") + oid, size = message.get("oid"), message.get("size") + require(isinstance(oid, str) and OID.fullmatch(oid) is not None and + type(size) is int and 0 <= size <= 2**63 - 1, "invalid-object-identity") + source, before = None, None + if self.operation == "upload": + source = safe_path(message.get("path")) + require(source == self.git_dir / "lfs" / "objects" / oid[:2] / oid[2:4] / oid, + "upload-outside-current-lfs-object-store") + before = verify_file(source, oid, size) + actions = self.batch(oid, size) + self.progress(oid, 0) + if self.operation == "upload": + if "upload" in actions: + action = actions["upload"] + self.curl("PUT", action["href"], action.get("header", {}), upload=source) + require(fingerprint(source.lstat()) == before, "upload-source-changed") + if "verify" in actions: + action = actions["verify"] + headers = {k: v for k, v in action.get("header", {}).items() if k.lower() != "content-type"} + headers["Content-Type"] = "application/vnd.git-lfs+json" + self.curl("POST", action["href"], headers, body={"oid": oid, "size": size}) + else: + require(not actions, "verify-without-upload-refused") + require(fingerprint(source.lstat()) == before, "upload-source-changed") + self.progress(oid, size) + return {"event": "complete", "oid": oid} + require("download" in actions, "download-action-missing") + directory = safe_path(self.git_dir / "lfs" / "lan-transfer-tmp") + directory.mkdir(parents=True, exist_ok=True) + safe_path(directory) + fd, name = tempfile.mkstemp(prefix=oid + ".", suffix=".partial", dir=directory) + os.close(fd) + target = Path(name) + action = actions["download"] + # On failure the uniquely created partial remains for investigation; + # it is never used as a fallback/cache input on a later transfer. + self.curl("GET", action["href"], action.get("header", {}), download=target, size=size) + verify_file(target, oid, size) + self.progress(oid, size) + return {"event": "complete", "oid": oid, "path": str(target)} + + +def emit(value): + sys.stdout.write(json.dumps(value, separators=(",", ":"), allow_nan=False) + "\n") + sys.stdout.flush() + + +def serve(inp=None, send=None, factory=Agent): + inp, send = sys.stdin if inp is None else inp, emit if send is None else send + agent = None + while True: + line = inp.readline(MAX_JSON + 1) + if not line: + return 0 + try: + message = decode_json(line) + require(isinstance(message, dict), "protocol-object-required") + if agent is None: + agent = factory(message, send) + send({}) + elif message.get("event") == "terminate": + return 0 + else: + oid = message.get("oid") + safe_oid = oid if isinstance(oid, str) and OID.fullmatch(oid) else "" + try: + send(agent.transfer(message)) + except Exception as exc: + code = str(exc) if isinstance(exc, TransferError) else "transfer-internal-failure" + send({"event": "complete", "oid": safe_oid, + "error": {"code": 2, "message": code}}) + except Exception as exc: + code = str(exc) if isinstance(exc, TransferError) else "agent-initialization-or-protocol-failure" + if agent is None: + send({"error": {"code": 32, "message": code}}) + else: + # No attacker-supplied raw line or exception text is printed. + sys.stderr.write("lan-lfs: invalid protocol; stopping\n") + return 1 + + +if __name__ == "__main__": + raise SystemExit(serve()) diff --git a/tools/lfs-publication/run_lan_smoke.py b/tools/lfs-publication/run_lan_smoke.py new file mode 100644 index 0000000..8bbb112 --- /dev/null +++ b/tools/lfs-publication/run_lan_smoke.py @@ -0,0 +1,52 @@ +"""One real archive chunk upload and fresh download; never modifies source data.""" +import argparse +import json +from pathlib import Path +import time +from datetime import datetime, timezone + +import lan_lfs_transfer as lan +import publish_archives as archives + + +def run(output): + root = Path.cwd() + receipt = archives.no_links(output) + if receipt.exists() or root / 'registry/publication-20261001' not in receipt.parents: + raise ValueError('New publication receipt required') + catalog = archives.json_read(root / 'artifacts/public-resources-20261001/malecns-synaptic-partners/catalog.json') + chunk = catalog['chunks'][0] + oid, size = chunk['sha256'], chunk['bytes'] + source = root / '.git/lfs/objects' / oid[:2] / oid[2:4] / oid + records = [] + for operation in ('upload', 'download'): + agent = lan.Agent(dict(event='init', operation=operation, remote='origin', + concurrent=True, concurrenttransfers=2), lambda value: None) + original = agent.curl + methods = [] + def observe(method, url, headers, **kwargs): + result = original(method, url, headers, **kwargs) + methods.append(method) + return result + agent.curl = observe + start = time.perf_counter() + result = agent.transfer(dict(event=operation, action=None, oid=oid, size=size, + **({'path': str(source)} if operation == 'upload' else {}))) + record = dict(operation=operation, seconds=time.perf_counter()-start, methods=methods, + sha256=oid, bytes=size, complete=result['event'] == 'complete') + if operation == 'download': + record['new_download_file'] = result['path'] + records.append(record) + report = dict(schema='lfs-lan-roundtrip-smoke-v1', pass_all=True, + observed_utc=datetime.now(timezone.utc).isoformat(), + ip=lan.IP, hostname=lan.HOST, port=443, certificate_verification=True, + proxy_used=False, transfers=records, + adapter=archives.sha_file(lan.__file__)) + archives.write_new(receipt, archives.canonical(report)) + print(json.dumps(report), flush=True) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--receipt', required=True) + run(parser.parse_args().receipt) diff --git a/tools/lfs-publication/test_download_verify.py b/tools/lfs-publication/test_download_verify.py new file mode 100644 index 0000000..a2467c8 --- /dev/null +++ b/tools/lfs-publication/test_download_verify.py @@ -0,0 +1,245 @@ +"""Synthetic temporary fixtures and mocked Git/content operations; no transfer.""" +import contextlib +import io +import json +from pathlib import Path +import tempfile +import unittest +from unittest.mock import patch + +import download_verify as D + + +class DownloadTests(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory() + self.addCleanup(self.temp.cleanup) + self.base = Path(self.temp.name) + self.checkout = self.base / "verification" + (self.checkout / ".git").mkdir(parents=True) + (self.checkout / "registry").mkdir() + (self.checkout / D.PAYLOAD).mkdir(parents=True) + self.cache = self.checkout / ".git" / "brand-new-lfs" + self.receipt = self.checkout / "registry" / "transport.json" + self.content_receipt = self.checkout / "registry" / "content.json" + self.history = self.base / "history.gz" + self.history.write_bytes(b"synthetic history placeholder") + self.commit = "a" * 40 + self.calls = [] + self.pull_code = self.fsck_code = 0 + self.remote = D.REMOTE + self.head = self.commit + self.dirty = "" + self.content_failure = False + self.config_exit = 1 + self.adapter_config = {} + self.local_adapter_config = {} + self.adapter_blob = b"# Synthetic LAN adapter fixture; never executed.\n" + self.addCleanup(patch.stopall) + patch.object(D.Path, "cwd", return_value=self.checkout).start() + patch.object(D, "command", side_effect=self.command).start() + self.verifier = patch.object(D.content, "verify_publication", side_effect=self.verify).start() + self.capture = contextlib.redirect_stdout(io.StringIO()) + self.capture.__enter__() + self.addCleanup(self.capture.__exit__, None, None, None) + + def command(self, args, *, text=False, bytes_output=False): + self.calls.append(args) + if "rev-parse" in args: + if "HEAD" in args: + return self.head + return str(self.checkout / ".git") if "--absolute-git-dir" in args else str(self.checkout) + if "remote" in args: + return self.remote + if "status" in args: + return self.dirty + if "--get-regexp" in args: + if "--name-only" in args: + return "\n".join(self.adapter_config) + return self.config_exit + if "--get-all" in args: + values = self.local_adapter_config if "--local" in args else self.adapter_config + return values.get(args[-1], "") + if "show" in args: + return self.adapter_blob + if "pull" in args: + oid = "f" * 64 + obj = self.cache / "objects" / oid[:2] / oid[2:4] / oid + obj.parent.mkdir(parents=True) + obj.write_bytes(b"synthetic object") + return self.pull_code + if "fsck" in args: + return self.fsck_code + return "synthetic-version" + + def verify(self, root, receipt, history): + self.assertEqual(root, self.checkout / D.PAYLOAD) + self.assertEqual(history, self.history) + if self.content_failure: + raise ValueError("synthetic failure") + D.archives.write_new(receipt, b'{"synthetic":true}\n') + return {"pass_all": True, "receipt_sha256": D.archives.sha_file(receipt)["sha256"], + "aggregate_inventory_sha256": "b" * 64, "historical_status": "FULL_CURRENT_MEMBER_MATCH"} + + def run_attempt(self): + return D.run(self.commit, self.cache, self.receipt, self.content_receipt, self.history) + + def prepare_adapter(self): + adapter = self.checkout / "tools/lfs-publication/lan_lfs_transfer.py" + adapter.parent.mkdir(parents=True) + adapter.write_bytes(self.adapter_blob) + prefix = "lfs.customtransfer.malecns-lan-https." + self.adapter_config = {"lfs.standalonetransferagent": "malecns-lan-https", + prefix + "path": "/usr/bin/python3", prefix + "args": "-B " + str(adapter), + prefix + "concurrent": "true", prefix + "direction": "both"} + self.local_adapter_config = self.adapter_config.copy() + self.config_exit = 0 + return adapter + + def assert_not_started(self): + self.assertFalse(self.cache.exists()) + self.assertFalse(self.receipt.exists()) + self.assertFalse(any("pull" in args for args in self.calls)) + + def test_success_binds_new_cache_exits_content_and_source_sha(self): + result = self.run_attempt() + self.assertEqual(json.loads(self.receipt.read_bytes()), result) + self.assertTrue(result["cache"]["initially_absent"]) + self.assertEqual(result["cache"]["before"], {"objects": 0, "bytes": 0}) + self.assertEqual(result["cache"]["after"], {"objects": 1, "bytes": 16}) + self.assertEqual(result["content_receipt"]["sha256"], D.archives.sha_file(self.content_receipt)["sha256"]) + self.assertEqual(len(result["tool_sources"]), 3) + self.assertFalse(result["learning_pass_claimed"]) + pull = next(args for args in self.calls if "pull" in args) + fsck = next(args for args in self.calls if "fsck" in args) + self.assertIn("--include=artifacts/**", pull) + self.assertIn("--exclude=", pull) + self.assertEqual(pull[-1], "origin") + self.assertIn("--dry-run", fsck) + for args in (pull, fsck): + self.assertIn("lfs.storage=" + str(self.cache), args) + self.assertIn("lfs.concurrenttransfers=2", args) + + def test_existing_cache_receipt_and_content_receipt_are_never_reused(self): + for path in (self.cache, self.receipt, self.content_receipt): + with self.subTest(path=path): + path.write_bytes(b"keep") + with self.assertRaises(ValueError): + self.run_attempt() + self.assertEqual(path.read_bytes(), b"keep") + self.assertFalse(any("pull" in args for args in self.calls)) + path.unlink() + + def test_wrong_head_or_remote_or_dirty_tree_refused(self): + for attr, value in (("head", "c" * 40), ("remote", "https://wrong.invalid/repo.git"), ("dirty", " M file")): + original = getattr(self, attr) + setattr(self, attr, value) + with self.subTest(attr=attr), self.assertRaises(ValueError): + self.run_attempt() + self.assert_not_started() + setattr(self, attr, original) + + def test_unsafe_paths_refused_before_transfer(self): + original = self.cache + for unsafe in (self.checkout / "payload-cache", self.base / ".." / "escape", + D.PROTECTED / "should-never-create"): + self.cache = unsafe + with self.subTest(path=unsafe), self.assertRaises(ValueError): + self.run_attempt() + self.assertFalse(any("pull" in args for args in self.calls)) + self.cache = original + self.receipt = self.checkout / D.PAYLOAD / "receipt.json" + with self.assertRaises(ValueError): + self.run_attempt() + self.assert_not_started() + + def test_pull_failure_retains_partial_and_never_fscks_or_retries(self): + self.pull_code = 9 + with self.assertRaises(ValueError): + self.run_attempt() + self.assertTrue(self.cache.exists()) + self.assertFalse(self.receipt.exists()) + self.assertFalse(self.content_receipt.exists()) + self.assertFalse(any("fsck" in args for args in self.calls)) + with self.assertRaises(ValueError): + self.run_attempt() + self.assertEqual(sum("pull" in args for args in self.calls), 1) + + def test_endpoint_and_custom_transfer_overrides_fail_closed(self): + for code in (0, 2): + self.config_exit = code + with self.subTest(code=code), self.assertRaises(ValueError): + self.run_attempt() + self.assert_not_started() + self.config_exit = 1 + (self.checkout / ".lfsconfig").write_text("[lfs]\nurl = https://not-approved.invalid\n") + with self.assertRaises(ValueError): + self.run_attempt() + self.assert_not_started() + + def test_optional_lan_adapter_is_exact_local_and_head_bound(self): + adapter = self.prepare_adapter() + with self.assertRaises(ValueError): + self.run_attempt() + self.assert_not_started() + report = D.run(self.commit, self.cache, self.receipt, self.content_receipt, + self.history, allow_lan_adapter=True) + self.assertTrue(report["lan_adapter"]["enabled"]) + self.assertEqual(report["tool_sources"]["lan_lfs_transfer.py"]["sha256"], + D.archives.sha_file(adapter)["sha256"]) + + def test_lan_wrong_blob_global_override_or_other_endpoint_rejected(self): + self.prepare_adapter() + self.adapter_blob = b"not the actual file" + with self.assertRaises(ValueError): + D.transfer_policy(self.checkout, self.commit, True) + self.adapter_blob = (self.checkout / "tools/lfs-publication/lan_lfs_transfer.py").read_bytes() + original = self.local_adapter_config["lfs.standalonetransferagent"] + self.local_adapter_config["lfs.standalonetransferagent"] = "" + with self.assertRaises(ValueError): + D.transfer_policy(self.checkout, self.commit, True) + self.local_adapter_config["lfs.standalonetransferagent"] = original + self.adapter_config["lfs.url"] = "https://wrong.invalid" + with self.assertRaises(ValueError): + D.transfer_policy(self.checkout, self.commit, True) + self.assert_not_started() + + def test_fsck_failure_does_not_call_content_or_publish_receipt(self): + self.fsck_code = 8 + with self.assertRaises(ValueError): + self.run_attempt() + self.verifier.assert_not_called() + self.assertTrue(self.cache.exists()) + self.assertFalse(self.receipt.exists()) + + def test_content_failure_leaves_no_transport_pass(self): + self.content_failure = True + with self.assertRaises(ValueError): + self.run_attempt() + self.assertFalse(self.receipt.exists()) + self.assertEqual(sum("pull" in args for args in self.calls), 1) + + def test_head_changed_during_verification_preserves_content_but_no_transport_pass(self): + def changed(*args): + result = self.verify(*args) + self.head = "d" * 40 + return result + self.verifier.side_effect = changed + with self.assertRaises(ValueError): + self.run_attempt() + self.assertTrue(self.content_receipt.exists()) + self.assertFalse(self.receipt.exists()) + + def test_cli_failure_never_prints_exception_diagnostics(self): + with patch.object(D, "run", side_effect=RuntimeError("secret should not escape")), \ + patch.object(D.sys, "argv", ["download_verify", "--expected-commit", self.commit, + "--cache", str(self.cache), "--receipt", str(self.receipt), + "--content-receipt", str(self.content_receipt), "--historical-inventory", str(self.history)]), \ + contextlib.redirect_stdout(io.StringIO()) as output: + self.assertEqual(D.main(), 1) + self.assertNotIn("secret should not escape", output.getvalue()) + self.assertIn("FAILED-NOT-RETRIED", output.getvalue()) + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/lfs-publication/test_lan_lfs_transfer.py b/tools/lfs-publication/test_lan_lfs_transfer.py new file mode 100644 index 0000000..48fcbc2 --- /dev/null +++ b/tools/lfs-publication/test_lan_lfs_transfer.py @@ -0,0 +1,286 @@ +"""Pure temporary/mocked protocol tests: never SSH, curl, GPU, or real Git.""" +import contextlib +import hashlib +import io +import json +from pathlib import Path +import subprocess +import tempfile +import unittest +from unittest.mock import patch + +import lan_lfs_transfer as M + +BASE = "https://" + M.HOST + M.PREFIX +TOKEN = "synthetic-fixture-" + "credential-value" + + +class AdapterTests(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory() + self.addCleanup(self.temp.cleanup) + self.root = Path(self.temp.name) / "clone" + self.git = self.root / ".git" + self.git.mkdir(parents=True) + self.data = b"synthetic content\x00\xff\n" + self.oid = hashlib.sha256(self.data).hexdigest() + self.size = len(self.data) + self.events = [] + self.agent = object.__new__(M.Agent) + self.agent.root, self.agent.git_dir = self.root, self.git + self.agent.operation, self.agent.emit = "upload", self.events.append + self.source = self.git / "lfs" / "objects" / self.oid[:2] / self.oid[2:4] / self.oid + self.source.parent.mkdir(parents=True) + self.source.write_bytes(self.data) + + def request(self, operation="upload", **extra): + value = {"event": operation, "oid": self.oid, "size": self.size, "action": None} + if operation == "upload": + value["path"] = str(self.source) + value.update(extra) + return value + + def init_message(self, **extra): + return dict(event="init", operation="upload", remote="origin", concurrent=True, + concurrenttransfers=2, **extra) + + def action(self, suffix="objects/" ): + return {"href": BASE + "/" + suffix + self.oid, + "header": {"Authorization": "Bearer " + TOKEN}} + + def test_strict_url_policy(self): + self.assertEqual(M.safe_url(BASE + "/objects/" + self.oid + "?signed=opaque"), + BASE + "/objects/" + self.oid + "?signed=opaque") + invalid = [BASE.replace("https:", "http:"), BASE.replace(M.HOST, M.IP), + BASE.replace(M.HOST, "other.example"), BASE.replace(M.HOST, M.HOST + ":444"), + BASE.replace(M.HOST, "user:opaque@" + M.HOST), BASE + "-other/objects/x", + BASE + "/../other", BASE + "/%2e%2e/other", BASE + "/objects/x#fragment", + BASE + "//objects/x", BASE + "/objects\\x", BASE + "\n"] + for url in invalid: + with self.subTest(url=url), self.assertRaises(M.TransferError): + M.safe_url(url) + + def test_headers_reject_injection_and_routing_overrides(self): + for headers in ({"Authorization": "x\r\nHost: bad"}, {"Host": "bad"}, + {"Authorization": "a", "authorization": "b"}, + {"Range": "bytes=1-"}, {"bad\nkey": "x"}, {"X": "\x00"}): + with self.subTest(headers=headers), self.assertRaises(M.TransferError): + M.safe_headers(headers) + + def test_init_checks_origin_and_isolated_git_directory(self): + values = [str(self.root), M.ORIGIN, str(self.git)] + with patch.object(M, "git_output", side_effect=values): + actual = M.Agent(self.init_message(), self.events.append, cwd=self.root) + self.assertEqual(actual.git_dir, self.git) + with patch.object(M, "git_output", side_effect=[str(self.root), "ssh://other/repo"]): + with self.assertRaisesRegex(M.TransferError, "origin-refused"): + M.Agent(self.init_message(), self.events.append, cwd=self.root) + + def test_original_source_and_excess_concurrency_refused(self): + with patch.object(M, "SOURCE", self.root): + with self.assertRaisesRegex(M.TransferError, "scientific-source-cwd"): + M.Agent(self.init_message(), self.events.append, cwd=self.root) + message = self.init_message() + message["concurrenttransfers"] = 3 + with self.assertRaisesRegex(M.TransferError, "concurrency"): + M.Agent(message, self.events.append, cwd=self.root) + + def test_ssh_authentication_is_strict_and_operation_scoped(self): + response = {"href": BASE, "header": {"Authorization": "Bearer " + TOKEN}} + result = subprocess.CompletedProcess([], 0, stdout=json.dumps(response).encode(), stderr=b"") + with patch.object(M.subprocess, "run", return_value=result) as call: + href, headers = self.agent.authenticate() + args = call.call_args.args[0] + self.assertIn("BatchMode=yes", args) + self.assertIn("StrictHostKeyChecking=yes", args) + self.assertEqual(args[-3:], ["git-lfs-authenticate", "qishizhe/digital-drosophila.git", "upload"]) + self.assertEqual(href, BASE) + self.assertIn(TOKEN, headers["Authorization"]) + self.assertNotIn(TOKEN, json.dumps(args)) + + def test_curl_secrets_only_in_stdin_and_secure_defaults(self): + result = subprocess.CompletedProcess([], 0, stdout=b"{}\n200", stderr=b"") + with patch.object(M.subprocess, "run", return_value=result) as call: + body = self.agent.curl("PUT", BASE + "/objects/" + self.oid + "?signature=" + TOKEN, + {"Authorization": "Bearer " + TOKEN}, upload=self.source) + self.assertEqual(body, b"{}") + self.assertEqual(call.call_args.args[0], ["curl", "-q", "--config", "-"]) + self.assertNotIn(TOKEN, json.dumps(call.call_args.args[0])) + config = call.call_args.kwargs["input"].decode() + for wanted in ('noproxy = "*"', M.HOST + ":443:" + M.IP, 'proto = "=https"', + "max-redirs = 0", "Accept: application/vnd.git-lfs+json", + "Content-Type: application/octet-stream", TOKEN): + self.assertIn(wanted, config) + self.assertNotIn("insecure", config) + self.assertNotIn("location", config) + self.assertNotIn("retry", config) + + def test_redirect_or_curl_error_is_sanitized(self): + for rc, output in ((0, b"redirect body\n302"), (22, b"")): + result = subprocess.CompletedProcess([], rc, stdout=output, stderr=TOKEN.encode()) + with patch.object(M.subprocess, "run", return_value=result): + with self.assertRaises(M.TransferError) as caught: + self.agent.curl("GET", BASE + "/objects/" + self.oid, {}) + self.assertNotIn(TOKEN, str(caught.exception)) + + def test_post_json_sets_both_gitea_headers(self): + result = subprocess.CompletedProcess([], 0, stdout=b"\n204", stderr=b"") + with patch.object(M.subprocess, "run", return_value=result) as call: + self.agent.curl("POST", BASE + "/verify", {}, body={"oid": self.oid, "size": self.size}) + config = call.call_args.kwargs["input"].decode() + self.assertIn("Accept: application/vnd.git-lfs+json", config) + self.assertIn("Content-Type: application/vnd.git-lfs+json", config) + + def test_batch_requests_basic_and_checks_exact_identity(self): + response = {"objects": [{"oid": self.oid, "size": self.size, "actions": {"upload": self.action()}}]} + with patch.object(self.agent, "authenticate", return_value=(BASE, {"Authorization": TOKEN})), \ + patch.object(self.agent, "curl", return_value=json.dumps(response).encode()) as call: + self.assertIn("upload", self.agent.batch(self.oid, self.size)) + args, kwargs = call.call_args + self.assertEqual(args[1], BASE + "/objects/batch") + self.assertEqual(args[2]["Accept"], "application/vnd.git-lfs+json") + self.assertEqual(kwargs["body"]["transfers"], ["basic"]) + response["objects"][0]["size"] += 1 + with patch.object(self.agent, "authenticate", return_value=(BASE, {})), \ + patch.object(self.agent, "curl", return_value=json.dumps(response).encode()): + with self.assertRaisesRegex(M.TransferError, "identity"): + self.agent.batch(self.oid, self.size) + + def test_batch_action_host_rejected(self): + action = self.action() + action["href"] = action["href"].replace(M.HOST, "other.example") + response = {"objects": [{"oid": self.oid, "size": self.size, "actions": {"upload": action}}]} + with patch.object(self.agent, "authenticate", return_value=(BASE, {})), \ + patch.object(self.agent, "curl", return_value=json.dumps(response).encode()): + with self.assertRaisesRegex(M.TransferError, "authority"): + self.agent.batch(self.oid, self.size) + + def test_upload_chunked_exact_value_allowed_in_action_and_put(self): + action = self.action() + action["header"]["Transfer-Encoding"] = "chunked" + response = {"objects": [{"oid": self.oid, "size": self.size, "actions": {"upload": action}}]} + with patch.object(self.agent, "authenticate", return_value=(BASE, {})), \ + patch.object(self.agent, "curl", return_value=json.dumps(response).encode()): + self.assertEqual(self.agent.batch(self.oid, self.size)["upload"]["header"]["Transfer-Encoding"], "chunked") + result = subprocess.CompletedProcess([], 0, stdout=b"\n200", stderr=b"") + with patch.object(M.subprocess, "run", return_value=result) as call: + self.agent.curl("PUT", action["href"], action["header"], upload=self.source) + config = call.call_args.kwargs["input"].decode() + self.assertIn('header = "Transfer-Encoding: chunked"', config) + self.assertIn('request = "PUT"', config) + self.assertIn("upload-file = ", config) + + def test_chunked_forbidden_outside_upload_or_for_other_values(self): + for value in ("gzip", "CHUNKED", "chunked, gzip", "chunked\r\nX: y", " chunked"): + with self.subTest(value=value), self.assertRaises(M.TransferError): + self.agent.curl("PUT", BASE + "/objects/" + self.oid, + {"Transfer-Encoding": value}, upload=self.source) + for method, kwargs in (("GET", {}), ("POST", {"body": {}}), ("PUT", {})): + with self.subTest(method=method, kwargs=kwargs), self.assertRaises(M.TransferError): + self.agent.curl(method, BASE + "/objects/" + self.oid, + {"Transfer-Encoding": "chunked"}, **kwargs) + with self.assertRaises(M.TransferError): + M.safe_headers({"Transfer-Encoding": "chunked"}) + for operation, name in (("upload", "verify"), ("download", "download")): + self.agent.operation = operation + action = self.action() + action["header"]["Transfer-Encoding"] = "chunked" + response = {"objects": [{"oid": self.oid, "size": self.size, "actions": {name: action}}]} + with patch.object(self.agent, "authenticate", return_value=(BASE, {})), \ + patch.object(self.agent, "curl", return_value=json.dumps(response).encode()): + with self.subTest(operation=operation, action=name), self.assertRaises(M.TransferError): + self.agent.batch(self.oid, self.size) + + def test_upload_existing_object_needs_no_put(self): + with patch.object(self.agent, "batch", return_value={}) as batch, patch.object(self.agent, "curl") as curl: + result = self.agent.transfer(self.request()) + self.assertEqual(result, {"event": "complete", "oid": self.oid}) + batch.assert_called_once() + curl.assert_not_called() + self.assertEqual(self.events[-1]["bytesSoFar"], self.size) + + def test_upload_put_then_verification_post(self): + actions = {"upload": self.action(), "verify": self.action("verify/")} + with patch.object(self.agent, "batch", return_value=actions), \ + patch.object(self.agent, "curl", return_value=b"") as curl: + self.agent.transfer(self.request()) + self.assertEqual([c.args[0] for c in curl.call_args_list], ["PUT", "POST"]) + self.assertEqual(curl.call_args_list[1].kwargs["body"], {"oid": self.oid, "size": self.size}) + + def test_upload_wrong_sha_fails_before_network(self): + self.source.write_bytes(b"x" * self.size) + with patch.object(self.agent, "batch") as batch: + with self.assertRaisesRegex(M.TransferError, "sha"): + self.agent.transfer(self.request()) + batch.assert_not_called() + + def test_upload_outside_lfs_store_refused(self): + other = self.root / self.oid + other.write_bytes(self.data) + with self.assertRaisesRegex(M.TransferError, "outside-current-lfs"): + self.agent.transfer(self.request(path=str(other))) + + def test_upload_source_mutation_detected(self): + def change(*args, **kwargs): + self.source.write_bytes(b"changed") + with patch.object(self.agent, "batch", return_value={"upload": self.action()}), \ + patch.object(self.agent, "curl", side_effect=change): + with self.assertRaisesRegex(M.TransferError, "upload-source-changed"): + self.agent.transfer(self.request()) + + def test_download_is_fresh_unique_and_verified(self): + self.agent.operation = "download" + def fetch(*args, **kwargs): + kwargs["download"].write_bytes(self.data) + return b"" + with patch.object(self.agent, "batch", return_value={"download": self.action()}), \ + patch.object(self.agent, "curl", side_effect=fetch) as curl: + first = self.agent.transfer(self.request("download")) + second = self.agent.transfer(self.request("download")) + self.assertNotEqual(first["path"], second["path"]) + self.assertEqual(Path(first["path"]).read_bytes(), self.data) + self.assertEqual(curl.call_count, 2) + self.assertEqual(self.source.read_bytes(), self.data) + + def test_download_hash_failure_retains_partial(self): + self.agent.operation = "download" + def fetch(*args, **kwargs): + kwargs["download"].write_bytes(b"x" * self.size) + with patch.object(self.agent, "batch", return_value={"download": self.action()}), \ + patch.object(self.agent, "curl", side_effect=fetch): + with self.assertRaisesRegex(M.TransferError, "sha"): + self.agent.transfer(self.request("download")) + partials = list((self.git / "lfs" / "lan-transfer-tmp").glob("*.partial")) + self.assertEqual(len(partials), 1) + self.assertEqual(partials[0].read_bytes(), b"x" * self.size) + + def test_protocol_init_progress_completion_terminate(self): + requests = [self.init_message(), self.request(), {"event": "terminate"}] + incoming = io.StringIO("".join(json.dumps(x) + "\n" for x in requests)) + with patch.object(self.agent, "batch", return_value={}): + code = M.serve(incoming, self.events.append, factory=lambda message, send: self.agent) + self.assertEqual(code, 0) + self.assertEqual(self.events[0], {}) + self.assertEqual(self.events[-1], {"event": "complete", "oid": self.oid}) + + def test_transfer_error_continues_and_never_echoes_exception_secret(self): + incoming = io.StringIO("\n".join(json.dumps(x) for x in + [self.init_message(), self.request(), self.request(), {"event": "terminate"}]) + "\n") + with patch.object(self.agent, "transfer", side_effect=[RuntimeError(TOKEN), {"event": "complete", "oid": self.oid}]): + code = M.serve(incoming, self.events.append, factory=lambda message, send: self.agent) + self.assertEqual(code, 0) + self.assertIn("error", self.events[1]) + self.assertNotIn(TOKEN, json.dumps(self.events)) + self.assertNotIn("error", self.events[2]) + + def test_bad_initialization_uses_init_error_schema(self): + incoming = io.StringIO(json.dumps(self.init_message()) + "\n") + with patch.object(M, "git_output", side_effect=RuntimeError(TOKEN)): + code = M.serve(incoming, self.events.append) + self.assertEqual(code, 1) + self.assertEqual(self.events[0]["error"]["code"], 32) + self.assertNotIn(TOKEN, json.dumps(self.events)) + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/lfs-publication/test_verify_publication.py b/tools/lfs-publication/test_verify_publication.py new file mode 100644 index 0000000..30bd575 --- /dev/null +++ b/tools/lfs-publication/test_verify_publication.py @@ -0,0 +1,184 @@ +"""Aggregate verification tests: temporary files and an identity codec only. + +These test metadata/content binding, not zstd itself. The separate archive-tool +suite includes its optional real-zstd integration test. No real project data, +network, Git mutation, GPU, or persistent outputs are used here. +""" +import contextlib +import gzip +import io +import json +from pathlib import Path +import subprocess +import sys +import tempfile +import unittest +from unittest.mock import patch + +import publish_archives as P +import verify_publication as V + + +def identity_codec(*args, **kwargs): + return [sys.executable, "-c", + "import sys,shutil;shutil.copyfileobj(sys.stdin.buffer,sys.stdout.buffer)"] + + +class AggregateTests(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory() + self.addCleanup(self.temp.cleanup) + self.base = Path(self.temp.name) + self.source = self.base / "source" + self.data = self.source / "data" + self.data.mkdir(parents=True) + (self.data / "LICENSE").write_bytes(b"Synthetic license\n") + (self.data / "one.feather").write_bytes(b"fake binary bytes\x00") + self.pins = { + p.relative_to(self.source).as_posix(): dict( + path=p.relative_to(self.source).as_posix(), kind="file", **P.sha_file(p)) + for p in sorted(self.data.iterdir()) + } + self.plan = { + "schema": "lfs-publication-plan-v1", "source_root": str(self.source), + "groups": [{ + "id": "malecns-synaptic-partners", "paths": ["data"], + "license": {"evidence_file": "LICENSE", + "evidence_sha256": self.pins["data/LICENSE"]["sha256"]}, + "provenance": {"registered_file_sha256": self.pins["data/one.feather"]["sha256"]}, + }], + "exclude_paths": [], + } + self.plan_file = self.base / "plan.json" + self.root, self.work = self.base / "payload", self.base / "work" + self.receipt = self.base / "receipt.json" + self.history_file = self.base / "history.jsonl.gz" + for item in (patch.object(P, "SOURCE_ROOT", str(self.source)), + patch.object(P, "CHUNK_BYTES", 4096), + patch.object(P, "zstd_command", identity_codec)): + item.start() + self.addCleanup(item.stop) + + def pack(self): + self.plan_file.write_bytes(P.canonical(self.plan)) + with contextlib.redirect_stdout(io.StringIO()): + P.pack(self.plan_file, self.root, self.work) + + def verify(self, history=False): + with contextlib.redirect_stdout(io.StringIO()): + return V.verify_publication(self.root, self.receipt, + self.history_file if history else None) + + def write_history(self, rows): + with gzip.open(self.history_file, "wt", encoding="utf-8") as handle: + for row in rows: + handle.write(json.dumps(row) + "\n") + + def test_full_without_history_and_exclusive_receipt(self): + self.pack() + result = self.verify() + self.assertTrue(result["pass_all"]) + self.assertFalse(result["fresh_download_proven"]) + self.assertEqual(result["historical_status"], "NOT_REQUESTED") + self.assertEqual(result["source_files"], 2) + with self.assertRaises(ValueError): + self.verify() + + def test_full_history_absolute_path_and_skipped_nonfile(self): + self.pack() + rows = [dict(row) for row in self.pins.values()] + # Use the exact registered source_root prefix on either Windows/Linux. + rows[0]["path"] = str(self.source) + "/" + rows[0]["path"] + rows.append({"path": "outside/link", "kind": "symlink"}) + self.write_history(rows) + result = self.verify(history=True) + report = json.loads(self.receipt.read_bytes()) + self.assertEqual(result["historical_status"], "FULL_CURRENT_MEMBER_MATCH") + self.assertEqual(report["historical_inventory"]["nonfile_records_skipped"], 1) + + def test_partial_history_is_not_full_historical_pass(self): + self.pack() + self.write_history([self.pins["data/LICENSE"], + {"path": "data/one.feather", "kind": "symlink"}]) + self.verify(history=True) + history = json.loads(self.receipt.read_bytes())["historical_inventory"] + self.assertEqual(history["status"], "PARTIAL_CURRENT_MEMBER_COVERAGE") + self.assertFalse(history["all_current_members_historically_matched"]) + self.assertEqual(history["current_members_without_regular_history"], 1) + self.assertEqual(history["current_members_with_nonfile_history"], 1) + + def test_history_mismatch_writes_no_receipt(self): + self.pack() + self.write_history([dict(self.pins["data/LICENSE"], sha256="0" * 64)]) + with self.assertRaisesRegex(ValueError, "Historical member mismatch"): + self.verify(history=True) + self.assertFalse(self.receipt.exists()) + + def test_registered_feather_sha_mismatch(self): + self.plan["groups"][0]["provenance"]["registered_file_sha256"] = "0" * 64 + self.pack() + with self.assertRaisesRegex(ValueError, "Registered feather SHA"): + self.verify() + + def test_multiple_feather_members_refused(self): + (self.data / "two.feather").write_bytes(b"another fixture") + self.pack() + with self.assertRaisesRegex(ValueError, "exactly one feather"): + self.verify() + + def test_license_evidence_sha_mismatch(self): + self.plan["groups"][0]["license"]["evidence_sha256"] = "0" * 64 + self.pack() + with self.assertRaisesRegex(ValueError, "License evidence SHA"): + self.verify() + + def test_extra_root_entry_refused(self): + self.pack() + (self.root / "unlisted").write_bytes(b"x") + with self.assertRaisesRegex(ValueError, "extra/missing"): + self.verify() + + def test_wrong_catalog_pin_refused(self): + self.pack() + summary = P.json_read(self.root / "pack-summary.json") + summary["groups"][0]["catalog_sha256"] = "0" * 64 + (self.root / "pack-summary.json").write_bytes(P.canonical(summary)) + with self.assertRaisesRegex(ValueError, "Catalog SHA"): + self.verify() + + def test_root_file_count_mismatch(self): + self.pack() + summary = P.json_read(self.root / "pack-summary.json") + summary["source_files"] = 3 + (self.root / "pack-summary.json").write_bytes(P.canonical(summary)) + with self.assertRaisesRegex(ValueError, "Root source file count"): + self.verify() + + def test_receipt_inside_payload_refused(self): + self.pack() + self.receipt = self.root / "receipt.json" + with self.assertRaisesRegex(ValueError, "outside"): + self.verify() + + def test_plan_raw_sha_mismatch(self): + self.pack() + path = self.root / "plan.json" + path.write_bytes(path.read_bytes() + b"\n") + with self.assertRaisesRegex(ValueError, "plan SHA"): + self.verify() + + +class GitMetadataTests(unittest.TestCase): + def test_ascii_head_with_non_ascii_stderr(self): + result = subprocess.CompletedProcess([], 0, stdout=b"a" * 40 + b"\n", stderr=bytes([255])) + with patch.object(V.subprocess, "run", return_value=result): + self.assertEqual(V.git_identity()["head"], "a" * 40) + + def test_failed_git_with_non_ascii_stderr_is_optional(self): + result = subprocess.CompletedProcess([], 128, stdout=b"", stderr=bytes([255])) + with patch.object(V.subprocess, "run", return_value=result): + self.assertIsNone(V.git_identity()["head"]) + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/lfs-publication/verify_publication.py b/tools/lfs-publication/verify_publication.py new file mode 100644 index 0000000..87fbe4d --- /dev/null +++ b/tools/lfs-publication/verify_publication.py @@ -0,0 +1,233 @@ +"""Verify a complete downloaded publication and exclusively write a new receipt. + +This verifies the supplied bytes, not how they arrived or their external trust +anchor. No extraction, LFS-cache lookup, source modification, or Git mutation. +""" +from __future__ import annotations + +import argparse +from datetime import datetime, timezone +import gzip +import hashlib +import json +from pathlib import Path +import subprocess + +import publish_archives as archives + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def equal(left, right): + return archives.canonical(left) == archives.canonical(right) + + +def history_path(value, source_root): + require(isinstance(value, str), "Historical path must be text") + prefix = source_root.rstrip("/") + "/" + if value.startswith(prefix): + value = value[len(prefix):] + return archives.relpath(value) + + +def load_history(path, source_root): + files, nonfiles, seen = {}, {}, set() + total = 0 + with gzip.open(path, "rt", encoding="utf-8") as inp: + for line in inp: + row = archives.json_bytes(line) + require(isinstance(row, dict), "Historical row must be an object") + relative = history_path(row.get("path"), source_root) + require(relative not in seen, "Duplicate historical path: " + relative) + seen.add(relative) + total += 1 + if row.get("kind", "file") != "file": + nonfiles[relative] = row.get("kind") + continue + archives.check_digest_row(row) + files[relative] = {"bytes": row["bytes"], "sha256": row["sha256"]} + return files, nonfiles, total + + +def git_identity(): + try: + process = subprocess.run(["git", "rev-parse", "--verify", "HEAD"], + capture_output=True, check=False) + head = process.stdout.decode("ascii").strip() + if process.returncode == 0 and len(head) in (40, 64) and all(x in "0123456789abcdef" for x in head): + return {"cwd": str(Path.cwd()), "head": head, + "scope": "HEAD observed at invocation cwd; not a clean-tree or payload-to-commit proof"} + except (OSError, UnicodeError): + pass + return {"cwd": str(Path.cwd()), "head": None, "scope": "Git HEAD unavailable"} + + +def verify_publication(payload_root, receipt, historical_inventory=None): + root, receipt = archives.no_links(payload_root), archives.no_links(receipt) + require(root.is_dir(), "Payload root is not a directory") + require(receipt != root and root not in receipt.parents, + "Receipt must be outside the immutable payload tree") + require(not receipt.exists(), "Receipt already exists; refusing overwrite/retry") + require(receipt.parent.is_dir(), "Receipt parent must already exist") + controls = {name: archives.sha_file(root / name) for name in ("plan.json", "pack-summary.json")} + plan = archives.json_read(root / "plan.json") + summary = archives.json_read(root / "pack-summary.json") + archives.validate_plan(plan) + require(summary.get("schema") == "lfs-publication-pack-v1" and summary.get("complete") is True, + "Pack summary is not complete") + require(summary.get("plan_sha256") == controls["plan.json"]["sha256"], "Root plan SHA mismatch") + plan_groups = {g["id"]: g for g in plan["groups"]} + summary_groups = summary.get("groups") + require(isinstance(summary_groups, list), "Missing summary groups") + require(all(isinstance(g, dict) and isinstance(g.get("group"), str) for g in summary_groups), + "Invalid summary group") + listed = [g["group"] for g in summary_groups] + require(listed == list(plan_groups), "Summary group inventory/order differs from plan") + require({p.name for p in root.iterdir()} == set(plan_groups) | {"plan.json", "pack-summary.json"}, + "Payload root has extra/missing entries; preserve and investigate") + for p in root.iterdir(): + archives.no_links(p) + historical = None + if historical_inventory is not None: + hpath = archives.no_links(historical_inventory) + require(hpath != receipt, "Receipt cannot replace historical inventory") + hpin = archives.sha_file(hpath) + hfiles, hnonfiles, htotal = load_history(hpath, plan["source_root"]) + historical = {"path": str(hpath), "sha256": hpin["sha256"], "bytes": hpin["bytes"], + "records": htotal, "regular_file_records": len(hfiles), + "nonfile_records_skipped": len(hnonfiles)} + else: + hfiles, hnonfiles = {}, {} + matched, missing, nonfile_current = 0, [], 0 + publication_paths, results, manifest_controls = set(), [], {} + for group_summary in summary_groups: + group_id = group_summary["group"] + group, directory = plan_groups[group_id], root / group_id + require(directory.is_dir(), "Missing group directory: " + group_id) + cat_path = directory / "catalog.json" + cat_pin = archives.sha_file(cat_path) + require(cat_pin["sha256"] == group_summary.get("catalog_sha256"), "Catalog SHA mismatch: " + group_id) + catalog = archives.json_read(cat_path) + require(catalog.get("group_id") == group_id and catalog.get("source_root") == plan["source_root"] + and catalog.get("plan_sha256") == controls["plan.json"]["sha256"], + "Catalog identity/plan differs: " + group_id) + for key, wanted in (("source_paths", group["paths"]), ("license", group["license"]), + ("provenance", group["provenance"])): + require(equal(catalog.get(key), wanted), "Catalog plan metadata mismatch: " + group_id + "/" + key) + actual = archives.verify(directory) + expected_summary = {"group": group_id, "files": actual["source_files"], + "source_bytes": actual["source_bytes"], "archive_bytes": actual["archive_bytes"], + "chunks": len(catalog["chunks"]), "catalog_sha256": cat_pin["sha256"]} + require(equal(group_summary, expected_summary), "Group summary differs from actual payload: " + group_id) + members_path = directory / "members.jsonl.gz" + manifest_controls[str(members_path)] = catalog["members"] + manifest_controls[str(cat_path)] = cat_pin + manifest_controls[str(directory / "exclusions.jsonl.gz")] = catalog["exclusions"] + feather, member_lookup, group_matched, group_missing = [], {}, 0, 0 + for row in archives.iter_members(members_path): + name = row["path"] + require(name not in publication_paths, "Duplicate member across groups: " + name) + require(any(name == p or name.startswith(p + "/") for p in group["paths"]), + "Member outside group whitelist: " + name) + require(not any(name == p or name.startswith(p + "/") for p in plan.get("exclude_paths", [])), + "Excluded path appears in payload: " + name) + publication_paths.add(name) + member_lookup[name] = row + if name.lower().endswith(".feather"): + feather.append(row) + if historical is not None: + if name in hfiles: + require(equal(hfiles[name], {"bytes": row["bytes"], "sha256": row["sha256"]}), + "Historical member mismatch: " + name) + matched += 1 + group_matched += 1 + else: + missing.append(name) + group_missing += 1 + nonfile_current += int(name in hnonfiles) + require(len(member_lookup) == actual["source_files"], "Member inventory count changed") + provenance = group["provenance"] + registered = provenance.get("registered_file_sha256") if isinstance(provenance, dict) else None + if group_id == "malecns-synaptic-partners": + require(registered is not None, "Synaptic-partners registered file SHA missing") + file_anchor = None + if registered is not None: + require(isinstance(registered, str) and archives.HEX.fullmatch(registered) is not None, + "Invalid registered file SHA") + require(len(feather) == 1, "Registered-file group must contain exactly one feather: " + group_id) + require(feather[0]["sha256"] == registered, "Registered feather SHA mismatch: " + group_id) + file_anchor = feather[0] + license_anchor = None + license_meta = group["license"] + if isinstance(license_meta, dict) and "evidence_file" in license_meta: + relative = archives.relpath(license_meta["evidence_file"]) + path = group["paths"][0] + "/" + relative + require(path in member_lookup, "License evidence absent from payload: " + path) + require(member_lookup[path]["sha256"] == license_meta.get("evidence_sha256"), + "License evidence SHA mismatch: " + path) + license_anchor = member_lookup[path] + result = dict(actual, catalog_path=str(cat_path), registered_file_verified=file_anchor, + license_evidence_verified=license_anchor, + historical_matched=group_matched if historical is not None else None, + historical_missing=group_missing if historical is not None else None) + results.append(result) + print(json.dumps({"group_verified": group_id, "source_files": actual["source_files"], + "source_bytes": actual["source_bytes"], "archive_bytes": actual["archive_bytes"]}), flush=True) + files = sum(r["source_files"] for r in results) + source_bytes = sum(r["source_bytes"] for r in results) + archive_bytes = sum(r["archive_bytes"] for r in results) + require(type(summary.get("source_files")) is int and summary["source_files"] == files, + "Root source file count mismatch") + require(type(summary.get("source_bytes")) is int and summary["source_bytes"] == source_bytes, + "Root source byte count mismatch") + for name, pin in controls.items(): + require(archives.sha_file(root / name) == pin, "Root control changed during verification: " + name) + for path, pin in manifest_controls.items(): + require(archives.sha_file(path) == pin, "Group control changed during verification: " + path) + require({p.name for p in root.iterdir()} == set(plan_groups) | {"plan.json", "pack-summary.json"}, + "Payload root inventory changed during verification") + if historical is not None: + require(archives.sha_file(hpath) == hpin, "Historical inventory changed during verification") + historical.update(status="FULL_CURRENT_MEMBER_MATCH" if not missing else "PARTIAL_CURRENT_MEMBER_COVERAGE", + all_current_members_historically_matched=not missing, + current_members_matched=matched, current_members_without_regular_history=len(missing), + current_members_with_nonfile_history=nonfile_current, + missing_sample=missing[:20], missing_sample_truncated=len(missing) > 20, + historical_regular_files_outside_publication=len(set(hfiles) - publication_paths), + scope="Only publication members with regular-file history compared; not a full historical source-tree audit") + else: + historical = {"status": "NOT_REQUESTED", "all_current_members_historically_matched": None} + aggregate = [{"group": r["group"], "catalog_sha256": r["catalog_sha256"], + "archive_sha256": r["archive_sha256"], "source_files": r["source_files"], + "source_bytes": r["source_bytes"], "archive_bytes": r["archive_bytes"]} for r in results] + report = {"schema": "lfs-publication-aggregate-verification-v1", "pass_all": True, + "verified_utc": datetime.now(timezone.utc).isoformat(), "payload_root": str(root), + "receipt": str(receipt), "plan": {"path": str(root / "plan.json"), **controls["plan.json"]}, + "pack_summary": {"path": str(root / "pack-summary.json"), **controls["pack-summary.json"]}, + "groups": results, "source_files": files, "source_bytes": source_bytes, + "archive_bytes": archive_bytes, "aggregate_inventory_sha256": hashlib.sha256(archives.canonical(aggregate)).hexdigest(), + "historical_inventory": historical, "git": git_identity(), + "fresh_download_proven": False, + "scope": "Given payload bytes verified against plan/catalog/members and optional historical overlap; provenance/plan authenticity and fresh-clone transfer evidence are caller responsibilities"} + archives.write_new(receipt, archives.canonical(report)) + return {"pass_all": True, "receipt": str(receipt), "receipt_sha256": archives.sha_file(receipt)["sha256"], + "groups": len(results), "source_files": files, "source_bytes": source_bytes, + "archive_bytes": archive_bytes, "aggregate_inventory_sha256": report["aggregate_inventory_sha256"], + "historical_status": historical["status"], "fresh_download_proven": False} + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--payload-root", required=True) + parser.add_argument("--receipt", required=True) + parser.add_argument("--historical-inventory") + args = parser.parse_args() + print(json.dumps(verify_publication(args.payload_root, args.receipt, args.historical_inventory), + sort_keys=True, ensure_ascii=False, allow_nan=False), flush=True) + + +if __name__ == "__main__": + main()