From be41af186c3e1831dbda0dd8d5f151bf3901552f Mon Sep 17 00:00:00 2001 From: Digital Drosophila Archive Date: Thu, 1 Oct 2026 02:58:18 +0800 Subject: [PATCH 1/5] Enable scoped LFS publication and add synthetic round-trip probe --- .gitattributes | 2 ++ .gitignore | 2 ++ artifacts/lfs-smoke/publication-probe.bin | 3 +++ 3 files changed, 7 insertions(+) create mode 100644 artifacts/lfs-smoke/publication-probe.bin diff --git a/.gitattributes b/.gitattributes index cfc7ca6..9d3eeb5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,5 @@ # Preserve historical source bytes and SHA-256 across platforms. No EOL conversion. * -text *.jsonl.gz binary +artifacts/**/*.tar.zst filter=lfs diff=lfs merge=lfs -text +artifacts/lfs-smoke/*.bin filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore index e43b590..1a790b1 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,5 @@ id_ed25519* /registry/verification-runs/ # Historical learned deltas/checkpoints are not source files. /models/learned/ +# Explicit publication exports only; original scientific directories stay ignored. +!/artifacts/**/*.tar.zst diff --git a/artifacts/lfs-smoke/publication-probe.bin b/artifacts/lfs-smoke/publication-probe.bin new file mode 100644 index 0000000..14e7590 --- /dev/null +++ b/artifacts/lfs-smoke/publication-probe.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:93e0e6c4ca4fdc123c21b859ba97d8bd73670eb9c90d04ce9a431d822b5393c5 +size 263 From 7dc85baea9f0431a1abce50a5a17dafadeb98775 Mon Sep 17 00:00:00 2001 From: Digital Drosophila Archive Date: Thu, 1 Oct 2026 03:21:48 +0800 Subject: [PATCH 2/5] Add licensed public-resource archive plan and verified LFS tooling --- .gitattributes | 2 + NOTICE.md | 8 + registry/publication-20261001/README.md | 55 ++ .../lfs-smoke-receipt.json | 21 + registry/publication-20261001/plan.json | 60 ++ .../source-guard-before.json | 123 ++++ tools/lfs-publication/capture_source_guard.py | 85 +++ tools/lfs-publication/publish_archives.py | 534 ++++++++++++++++++ .../lfs-publication/test_publish_archives.py | 245 ++++++++ 9 files changed, 1133 insertions(+) create mode 100644 registry/publication-20261001/README.md create mode 100644 registry/publication-20261001/lfs-smoke-receipt.json create mode 100644 registry/publication-20261001/plan.json create mode 100644 registry/publication-20261001/source-guard-before.json create mode 100644 tools/lfs-publication/capture_source_guard.py create mode 100644 tools/lfs-publication/publish_archives.py create mode 100644 tools/lfs-publication/test_publish_archives.py diff --git a/.gitattributes b/.gitattributes index 9d3eeb5..9a31a11 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,3 +3,5 @@ *.jsonl.gz binary artifacts/**/*.tar.zst filter=lfs diff=lfs merge=lfs -text artifacts/lfs-smoke/*.bin filter=lfs diff=lfs merge=lfs -text +artifacts/public-resources-20261001/**/payload-*.bin filter=lfs diff=lfs merge=lfs -text +artifacts/public-resources-20261001/**/*.jsonl.gz filter=lfs diff=lfs merge=lfs -text diff --git a/NOTICE.md b/NOTICE.md index 2da1a53..ca4b7bd 100644 --- a/NOTICE.md +++ b/NOTICE.md @@ -2,6 +2,14 @@ 本仓库整理既有项目,不改变原始数据和软件的权属。尚未为本项目原创代码选定统一公开许可证;不得将“可访问此 Git 仓库”等同于取得任意再分发授权。 +## 2026-10-01 公开资源发布补充 + +用户已确认保留公开仓库,仅上传明确允许公开再分发的资源。[MaleCNS 官方下载页](https://male-cns.janelia.org/download/)已核实指向 [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)。据此,独立发布分支现在归档其已下载的数据及明确标注变更来源的既有派生数据;Cell Type Explorer、visualpathways、DoOR.data 和 Shiu 作者模型源码按各自原许可处理。作者署名、固定 commit、许可证据 SHA、排除项和恢复方法见 [本次发布说明](registry/publication-20261001/README.md)。FlyVis 不明确许可的资源、活动实验、环境和凭据不纳入。 + +下表保留初始化时的历史审查状态,不代表本次已核实许可仍然未知。新发布只在 `artifacts/` 增加只读快照,不覆盖原始数据或此前冻结索引;不为整个仓库补授统一许可证。 + +## 初始化审查记录(2026-09-29) + | 外部资源 | 冻结副本中的许可证据 | 本仓库处理 | |---|---|---| | MaleCNS v1.0 官方数据 | 来源文件、原下载脚本和校验清单;统一再分发许可本次未确证 | 只登记路径、来源、大小、SHA-256;不上传数据 | diff --git a/registry/publication-20261001/README.md b/registry/publication-20261001/README.md new file mode 100644 index 0000000..3977248 --- /dev/null +++ b/registry/publication-20261001/README.md @@ -0,0 +1,55 @@ +# 2026-10-01 公开 LFS 资源发布 + +这是现有下载资源的归档发布,不是新的科学实验,不表示 Phase 4AR 已完成或学习通过。用户明确选择保留公开仓库,仅上传确认可公开再分发的资源。活动项目工作树和 Phase 1–4AQ 冻结文件不参与写入。 + +## 范围与许可 + +| 资源 | 许可/依据 | 本次处理 | +|---|---|---| +| MaleCNS v1.0 annotations、neurotransmitters、connectome、SWC、synaptic partners | [官方数据页](https://male-cns.janelia.org/download/)明确指向 [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) | 逐文件原字节归档、署名、来源与 SHA-256 | +| 原有 Phase 3 / 3B processed 数据 | 基于上述 CC BY 4.0 数据的本项目派生物 | 保留原有过滤/重编号/CSR 转换说明;不重新计算、不更改科学含义 | +| Cell Type Explorer | 固定 commit 的 LICENSE,CC BY 4.0 | 原字节源码/数据快照,保留 LICENSE | +| visualpathways | 固定 commit 的 LICENSE 为 GPL v3 文本 | 原字节源码及 companion resources,保留 notices;不替上游判断 only/or-later | +| DoOR.data 2.0.1 | 固定 commit 的 DESCRIPTION:CC BY-SA 4.0 | 保留作者、原数据来源、ShareAlike 条件 | +| Shiu Drosophila_brain_model | 固定 commit 的 MIT LICENSE | 已下载作者模型源码与环境描述,不称预训练权重 | + +每组精确来源、commit、许可证据 SHA 和修改说明见 `plan.json` 及资源 `catalog.json`;许可证原文随对应上游副本保留。MaleCNS 原数据署名:FlyEM/HHMI Janelia、University of Cambridge Department of Zoology、MRC Laboratory of Molecular Biology、Google Research 及原论文作者。归档封装不意味着这些机构认可本项目模型或结论。 + +DoOR 作者为 Daniel Münch、C. Giovanni Galizia、Shouwen Ma、Martin Strauch、Anja Nissler;[DoOR 2.0 论文](https://doi.org/10.1038/srep21841)及[原始 DoOR 论文](https://doi.org/10.1093/chemse/bjq042)只引用,不另外打包出版商全文。各第三方资源维持原许可,本项目没有给整个仓库强行统一换证。 + +## 明确不上传 + +- FlyVis:冻结 checkout 仅见 MIT classifier,缺独立 LICENSE;数据和预训练权重的再分发权未确认。实际盘点未发现独立下载的预训练 checkpoint/ZIP;不得把源码、几何坐标或功能通道桥接称为下载权重。 +- `datasets/male-cns-v1.0/backups/` 的既有 Phase 1/2 备份包:保留原地;本次已直接归档其 raw 数据,不再重复上传整份备份。 +- Phase 4AD 重复的 Shiu 作者源码:本次仅归档 Phase 4AC 副本;既有目录及历史索引保留。 +- 历史本项目 learned delta、当前 Phase 4AR 正在写入的结果/账本、虚拟环境、缓存、Git 内部目录、凭据、下载日志。 +- ComfyUI 及其他项目、原始 EM 图像、未下载的 syn-points、许可不明的出版商论文全文。 +- visualpathways 的 `pdfversion/` 及 `docs/column_coord.pdf`:已识别为作者图集/配套说明而非一般论文集合,但本次保守等待输出 PDF 的明确许可范围,不把生成程序的 GPL 自动视作所有输出的许可;源码和其余已明确仓库许可的资源仍保留。 + +未列入 plan 的目录默认不发布。额外路径剔除及环境/缓存规则的实际命中保存在各组 `exclusions.jsonl.gz`;文件内容未被改写或“脱敏后替代原件”。 + +## 存储及校验 + +归档位于 `artifacts/public-resources-20261001//`。每组为独立 tar+zstd,切成最多 64 MiB 的有序 LFS 分块,方便大文件传输中断后重试未完成对象。`members.jsonl.gz` 对每个原始相对路径记录大小和 SHA-256;`catalog.json` 记录每块及拼接归档 SHA、源总数、源字节数、来源和许可。分块改变的是存储容器,不是内部文件内容。 + +`pack-summary.json` 存在且 complete=true 仅表示本地打包完成,不等于上传/远程恢复成功。上传后使用独立 clone 和新的 LFS object store 实际下载,再逐块、逐归档、逐内部文件流式校验。对应 receipt 只有在真实校验完成后才会提交。 + +本次不是服务器所有内容的完整灾备。Gitea LFS 与 Git 仓库数据目录均需另有服务端备份;删除服务端 LFS 对象会破坏恢复能力。尚未核验 Gitea 主机磁盘容量和备份策略。 + +## 安全恢复(Linux 示例) + +先安装 Git LFS、Python 3 和 zstd。只在新目录恢复,不要覆盖运行中的 `/data/digital-drosophila`。 + +```sh +GIT_LFS_SKIP_SMUDGE=1 git clone --branch codex/lfs-public-resources ssh://git@192.168.10.31:2222/qishizhe/digital-drosophila.git digital-drosophila-restore +cd digital-drosophila-restore +git lfs install --local +git lfs pull --include='artifacts/public-resources-20261001/**' +python3 -B tools/lfs-publication/publish_archives.py verify --group-dir artifacts/public-resources-20261001/malecns-swc +``` + +对每组运行 verify 并全部通过后,按 catalog 顺序拼接 `payload-000000.bin` 等文件,可用 `zstd -d` 和 tar 在**新建的空恢复目录**解包。归档路径从 `datasets/` 或 `experiments/` 起,无绝对路径。不要运行归档中模型/下载脚本来“验证”,本轮只验证内容。正式使用前仍需检查对应科学阶段 manifest;旧 all-body Phase 3 不能替代已批准的 neuron-only SNN 输入。 + +## 限制 + +快照通过源文件前后 inode/size/mtime/ctime 和枚举一致性检查,不是文件系统原子快照。秘密扫描是有限的 UTF-8 小文本规则,不是对所有二进制、内嵌归档及第三方资源的安全担保。工具内容校验不独立证明 catalog 的真实性;应固定仓库 commit 和 catalog SHA。源码只读校验不能被表述为重新执行全历史科学 gate。 diff --git a/registry/publication-20261001/lfs-smoke-receipt.json b/registry/publication-20261001/lfs-smoke-receipt.json new file mode 100644 index 0000000..36ad58b --- /dev/null +++ b/registry/publication-20261001/lfs-smoke-receipt.json @@ -0,0 +1,21 @@ +{ + "schema": "lfs-smoke-roundtrip-v1", + "fixture": "artifacts/lfs-smoke/publication-probe.bin", + "bytes": 263, + "sha256": "93e0e6c4ca4fdc123c21b859ba97d8bd73670eb9c90d04ce9a431d822b5393c5", + "uploaded_commit": "be41af186c3e1831dbda0dd8d5f151bf3901552f", + "branch": "codex/lfs-public-resources", + "upload_exit_code": 0, + "fresh_clone_independent_lfs_cache": true, + "download_exit_code": 0, + "download_sha256_match": true, + "lfs_fsck_dry_run_exit_code": 0, + "lfs_client_version": "3.8.0", + "client_archive_url": "https://github.com/git-lfs/git-lfs/releases/download/v3.8.0/git-lfs-linux-amd64-v3.8.0.tar.gz", + "client_archive_sha256": "e455e00f15d9b95661b8d53498ffb0c3367962cf1ec73c31ab7369516cd6ab8d", + "client_verification": "SHA-256 matched official GitHub release asset API digest; no PGP verification claimed", + "server_version_observed": "1.26.2", + "repository_private_observed": false, + "secret_headers_saved": false, + "scope": "Synthetic 263-byte fixture only; not evidence that scientific payloads have been uploaded" +} diff --git a/registry/publication-20261001/plan.json b/registry/publication-20261001/plan.json new file mode 100644 index 0000000..01d3567 --- /dev/null +++ b/registry/publication-20261001/plan.json @@ -0,0 +1,60 @@ +{ + "schema": "lfs-publication-plan-v1", + "source_root": "/data/digital-drosophila", + "groups": [ + { + "id": "malecns-raw-core", + "paths": ["datasets/male-cns-v1.0/raw/annotations", "datasets/male-cns-v1.0/raw/connectivity", "datasets/male-cns-v1.0/raw/_manifests"], + "license": {"data": "CC-BY-4.0", "url": "https://creativecommons.org/licenses/by/4.0/", "local_manifests_scripts": "Project-authored provenance; no new blanket software license"}, + "provenance": {"version": "male-cns:v1.0", "source_page": "https://male-cns.janelia.org/download/", "source_prefix": "gs://flyem-male-cns/v1.0/connectome-data/flat-connectome/", "attribution": "Male CNS collaboration: FlyEM (HHMI Janelia), University of Cambridge Department of Zoology, MRC Laboratory of Molecular Biology, Google Research; retain original dataset author credits", "changes": "Data file bytes unchanged; archival compression and path manifest only. Download logs excluded."} + }, + { + "id": "malecns-swc", + "paths": ["datasets/male-cns-v1.0/raw/skeletons"], + "license": {"data": "CC-BY-4.0", "url": "https://creativecommons.org/licenses/by/4.0/"}, + "provenance": {"version": "male-cns:v1.0", "source_page": "https://male-cns.janelia.org/download/", "source_prefix": "gs://flyem-male-cns/v1.0/segmentation/skeletons-malecns/skeletons-swc/", "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."} + }, + { + "id": "malecns-processed", + "paths": ["datasets/male-cns-v1.0/processed"], + "license": {"derived_data": "CC-BY-4.0", "url": "https://creativecommons.org/licenses/by/4.0/", "local_scripts_reports": "Project-authored processing and provenance; no new blanket software license"}, + "provenance": {"dataset": "male-cns:v1.0", "source_page": "https://male-cns.janelia.org/download/", "attribution": "Original Male CNS collaboration; Digital Drosophila project for local processing", "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.", "canonical_neurons": 166700, "canonical_edges": 25582938, "canonical_synaptic_weight_sum": 124177617} + }, + { + "id": "malecns-synaptic-partners", + "paths": ["experiments/phase4aa-apl-pn-scope/external-resources"], + "license": {"data": "CC-BY-4.0", "url": "https://creativecommons.org/licenses/by/4.0/", "local_provenance": "Project-authored"}, + "provenance": {"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", "registered_file_sha256": "959d8ef4173b35382a3e6acfaf5167c795b6d10b877572d146af04e1b487bc07", "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."} + }, + { + "id": "celltype-explorer", + "paths": ["experiments/phase4f-retinotopic-vision/external-resources/celltype-explorer"], + "license": {"upstream": "CC-BY-4.0", "url": "https://creativecommons.org/licenses/by/4.0/", "evidence_file": "LICENSE", "evidence_sha256": "9ba9550ad48438d0836ddab3da480b3b69ffa0aac7b7878b5a0039e7ab429411"}, + "provenance": {"repository": "https://github.com/reiserlab/celltype-explorer-drosophila-male-cns", "commit": "789cc6c105798ce2fd70ba85dab394f90899616b", "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."} + }, + { + "id": "visualpathways", + "paths": ["experiments/phase4f-retinotopic-vision/external-resources/visualpathways"], + "license": {"upstream": "GPL-3.0 as supplied in upstream LICENSE; no assertion of only/or-later option", "evidence_file": "LICENSE", "evidence_sha256": "3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986", "third_party_notices": "Retained; no relicensing of third-party components"}, + "provenance": {"repository": "https://github.com/reiserlab/visualpathways", "commit": "23f6ac131529b5f56894c6eeb9b88b17894fc00d", "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."} + }, + { + "id": "door-data", + "paths": ["experiments/phase4l-olfactory-grounding/external-resources/DoOR.data"], + "license": {"upstream": "CC-BY-SA-4.0", "url": "https://creativecommons.org/licenses/by-sa/4.0/", "evidence_file": "DESCRIPTION", "evidence_sha256": "27db2a92eb651d67969de94959990d51668a5857a33c4750a3b6ef49c5880504"}, + "provenance": {"repository": "https://github.com/ropensci/DoOR.data", "commit": "eea72d64b42a4e91dafe822cf0b5204de33f8d34", "version": "2.0.1", "attribution": "Daniel Münch, C. Giovanni Galizia, Shouwen Ma, Martin Strauch, Anja Nissler; see upstream DESCRIPTION and data-source references", "papers": ["https://doi.org/10.1038/srep21841", "https://doi.org/10.1093/chemse/bjq042"], "changes": "Unchanged pinned data package; .git omitted. ShareAlike terms remain attached to this package, not asserted over unrelated repository content."} + }, + { + "id": "shiu-author-model-source", + "paths": ["experiments/phase4ac-lif-semantics/external-resources"], + "license": {"upstream": "MIT", "evidence_file": "LICENSE", "evidence_sha256": "3621f6d6476189190e2960fa43f11b275ba4eca848fdac50a1ba2925de6223e8"}, + "provenance": {"repository": "https://github.com/philshiu/Drosophila_brain_model", "commit": "91bdd1e7dcf193f3e7ca5a8933497fcef63b7960", "attribution": "Philip Shiu and Drosophila_brain_model contributors; original MIT copyright and permission notice retained", "paper": "https://www.nature.com/articles/s41586-024-07763-9", "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."} + } + ], + "exclude_paths": [ + "datasets/male-cns-v1.0/processed/_staging", + "experiments/phase4f-retinotopic-vision/external-resources/visualpathways/.env_sample", + "experiments/phase4f-retinotopic-vision/external-resources/visualpathways/pdfversion", + "experiments/phase4f-retinotopic-vision/external-resources/visualpathways/docs/column_coord.pdf" + ] +} diff --git a/registry/publication-20261001/source-guard-before.json b/registry/publication-20261001/source-guard-before.json new file mode 100644 index 0000000..e9833ed --- /dev/null +++ b/registry/publication-20261001/source-guard-before.json @@ -0,0 +1,123 @@ +{ + "disk_free_bytes": { + "/data/digital-drosophila": 645731733504, + "/tmp/malecns-lfs-publication-20261001-bI1u07/repo/registry/publication-20261001": 905806151680 + }, + "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:12:34.846175+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/tools/lfs-publication/capture_source_guard.py b/tools/lfs-publication/capture_source_guard.py new file mode 100644 index 0000000..1903769 --- /dev/null +++ b/tools/lfs-publication/capture_source_guard.py @@ -0,0 +1,85 @@ +"""Read-only source guard; write receipt only to a new publication path.""" +import argparse +from datetime import datetime, timezone +import hashlib +import json +from pathlib import Path +import shutil +import subprocess + +from publish_archives import no_links, sha_file, canonical + +ROOT = Path('/data/digital-drosophila') +REGISTERED = 'b63e6281b6505ca3b60acb467dd0b3fae274cf513dcbfd653649ba52e9ba9740' +SOURCE_COMMIT = '80aeb2093db655329774eff7b32fb6e417b8b40b' + + +def git(*args, cwd=ROOT): + return subprocess.check_output(['git', '-C', str(cwd), *args], text=True).strip() + + +def capture(plan_path, output): + output = no_links(output) + if output == ROOT or ROOT in output.parents or output.exists(): + raise ValueError('Receipt must be new and outside the scientific source') + plan = json.loads(Path(plan_path).read_bytes()) + path = ROOT / 'experiments/phase4ar-normal-conditioning/protocol/preregistered.json' + raw = path.read_bytes() + if hashlib.sha256(raw).hexdigest() != REGISTERED: + raise ValueError('Phase 4AR registration hash mismatch') + registration = json.loads(raw) + records = [] + for filename, expected in sorted(registration['source_sha256'].items()): + source = no_links(filename) + if ROOT not in source.parents: + raise ValueError('Registered source outside project') + actual = sha_file(source) + if actual['sha256'] != expected: + raise ValueError('Phase 4AR source mismatch: ' + filename) + records.append(dict(path=filename, **actual)) + if len(records) != 16: + raise ValueError('Registered source inventory differs from reviewed scope') + if git('cat-file', '-t', SOURCE_COMMIT) != 'commit': + raise ValueError('Registered scientific commit unavailable') + evidence = [] + for group in plan['groups']: + licence = group['license'] + if 'evidence_file' in licence: + source = ROOT / group['paths'][0] / licence['evidence_file'] + actual = sha_file(source) + if actual['sha256'] != licence['evidence_sha256']: + raise ValueError('License evidence hash mismatch: ' + group['id']) + evidence.append(dict(group=group['id'], path=str(source), **actual)) + provenance = group['provenance'] + source = ROOT / group['paths'][0] + if (source / '.git').exists(): + if git('rev-parse', 'HEAD', cwd=source) != provenance['commit']: + raise ValueError('Upstream commit mismatch: ' + group['id']) + if git('status', '--porcelain', cwd=source): + raise ValueError('Upstream checkout changed: ' + group['id']) + result = dict(schema='lfs-publication-source-guard-v1', + observed_utc=datetime.now(timezone.utc).isoformat(), + registration_sha256=REGISTERED, registered_scientific_commit=SOURCE_COMMIT, + phase4ar_registered_sources=records, license_evidence=evidence, + original_checkout_head=git('rev-parse', 'HEAD'), + original_checkout_status=git('status', '--porcelain'), + original_checkout_branch=git('branch', '--show-current'), + disk_free_bytes={str(p): shutil.disk_usage(p).free for p in (ROOT, output.parent)}, + pass_all=True, + scope='16 registered Phase 4AR source files, registration, pinned upstream checkout and license evidence; not a scientific rerun or full historical checksum audit') + if result['original_checkout_status']: + raise ValueError('Original checkout is no longer clean; preserve and investigate') + if any(x < 100 * 1024**3 for x in result['disk_free_bytes'].values()): + raise ValueError('Less than 100 GiB free reserve') + with output.open('xb') as handle: + handle.write(canonical(result)) + return dict(pass_all=True, receipt=str(output), registered_sources=len(records), + original_checkout_head=result['original_checkout_head']) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--plan', required=True) + parser.add_argument('--out', required=True) + args = parser.parse_args() + print(json.dumps(capture(args.plan, args.out), sort_keys=True)) diff --git a/tools/lfs-publication/publish_archives.py b/tools/lfs-publication/publish_archives.py new file mode 100644 index 0000000..cfe09c8 --- /dev/null +++ b/tools/lfs-publication/publish_archives.py @@ -0,0 +1,534 @@ +"""Whitelist-only LFS archives; content verification, not a redistribution grant. + +No source writes, cache-based trust, extraction, or Git operations. Failed packs +remain incomplete and cannot be retried into the same output/work directories. +File stability checks are observations, not an atomic filesystem snapshot. +""" +from __future__ import annotations + +import argparse +import gzip +import hashlib +import io +import json +import os +from pathlib import Path, PurePosixPath +import re +import stat +import subprocess +import tarfile +import tempfile +import threading + +SOURCE_ROOT = "/data/digital-drosophila" +CHUNK_BYTES = 64 * 1024 * 1024 +BUFFER = 1024 * 1024 +DENIED_DIRS = {".git", ".venv", "venv", "env", "__pycache__", ".cache", + "node_modules", ".pytest_cache", ".mypy_cache", "extension-build"} +LOG_DIRS = {"logs", "_logs"} +BINARY_SUFFIXES = {".npy", ".npz", ".feather", ".parquet", ".gz", ".zst", ".zip", + ".tar", ".png", ".jpg", ".jpeg", ".gif", ".webp", ".pdf", + ".woff", ".woff2", ".ttf", ".ico", ".so", ".o", ".a", ".bin"} +HEX = re.compile(r"^[0-9a-f]{64}$") +SECRET_RULES = ( + ("private-key", re.compile(r"-----BEGIN (?:[A-Z ]+ )?PRIVATE KEY-----")), + ("github-token", re.compile(r"\b(?:ghp_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,})\b")), + ("aws-access-key", re.compile(r"\bAKIA[0-9A-Z]{16}\b")), + ("url-user-password", re.compile(r"\b[a-zA-Z][a-zA-Z0-9+.-]*://[^\s/:@]+:[^\s/@]+@")), + ("secret-literal", re.compile(r'''(?ix)\b(?:password|passwd|api[_-]?key|secret[_-]?key)\b["']?\s*[:=]\s*(?:["']([^"'\r\n]+)["']|([A-Za-z0-9_+/@.-]{4,}))''')), +) + + +def canonical(value): + return (json.dumps(value, sort_keys=True, indent=2, ensure_ascii=False, allow_nan=False) + "\n").encode() + + +def json_bytes(data): + def unique(pairs): + value = {} + for key, item in pairs: + if key in value: + raise ValueError("Duplicate JSON key") + value[key] = item + return value + return json.loads(data, object_pairs_hook=unique) + + +def json_read(path): + return json_bytes(Path(path).read_bytes()) + + +def relpath(value): + if not isinstance(value, str) or not value or "\\" in value or "\x00" in value: + raise ValueError("Invalid relative path") + p = PurePosixPath(value) + if p.is_absolute() or any(x in ("", ".", "..") for x in value.split("/")) or ":" in value: + raise ValueError("Unsafe relative path") + return p.as_posix() + + +def forbidden(relative): + parts = PurePosixPath(relative).parts + lower = [x.lower() for x in parts] + if any(x in DENIED_DIRS or x.startswith(".venv") for x in lower): + return "git-environment-or-cache" + if any(x.startswith("phase4ar") for x in lower): + return "active-phase4ar" + if any(x in LOG_DIRS for x in lower) or lower[-1].endswith((".log", ".log.gz")): + return "log" + name = lower[-1] + if (name == ".env" or name.startswith(".env.") or name in + {"id_rsa", "id_ed25519", "id_dsa", ".git-credentials", ".netrc"} + or any(x in name for x in ("credentials", "secrets")) + or name.endswith((".pem", ".key", ".p12", ".pfx"))): + return "credential-file" + return None + + +def no_links(path): + if ".." in Path(path).parts: + raise ValueError("Parent path components refused") + p = Path(path).absolute() + for part in (p, *p.parents): + if part.exists() or part.is_symlink(): + s = part.lstat() + if (stat.S_ISLNK(s.st_mode) or + getattr(s, "st_file_attributes", 0) & getattr(stat, "FILE_ATTRIBUTE_REPARSE_POINT", 0)): + raise ValueError("Symlink refused: " + str(part)) + return p + + +def identity(s): + return (s.st_dev, s.st_ino, s.st_mode, s.st_size, s.st_mtime_ns, s.st_ctime_ns) + + +def opened_identity(handle, expected): + actual = identity(os.fstat(handle.fileno())) + # Some Windows Python builds expose birth time via stat().ctime but change + # time via fstat().ctime. Check each clock against itself before/after; never + # omit ctime from either endpoint's stability check. Linux uses all fields. + same = actual[:-1] == expected[:-1] if os.name == "nt" else actual == expected + if not same: + raise ValueError("File changed while opening") + return actual + + +def sha_file(path): + p = no_links(path) + before = p.stat() + if not stat.S_ISREG(before.st_mode): + raise ValueError("Not a regular file: " + str(p)) + h = hashlib.sha256() + size = 0 + with p.open("rb") as f: + opened = opened_identity(f, identity(before)) + while block := f.read(BUFFER): + h.update(block) + size += len(block) + if identity(os.fstat(f.fileno())) != opened: + raise ValueError("File changed while hashing: " + str(p)) + if identity(p.lstat()) != identity(before) or size != before.st_size: + raise ValueError("File changed while hashing: " + str(p)) + return {"sha256": h.hexdigest(), "bytes": size} + + +def write_new(path, data): + with Path(path).open("xb") as f: + f.write(data) + + +def validate_plan(plan): + if not isinstance(plan, dict) or set(plan) - {"schema", "source_root", "groups", "exclude_paths"}: + raise ValueError("Unknown plan fields") + if plan.get("schema") != "lfs-publication-plan-v1" or plan.get("source_root") != SOURCE_ROOT: + raise ValueError("Wrong plan schema/source_root") + groups = plan.get("groups") + if not isinstance(groups, list) or not groups: + raise ValueError("Nonempty groups required") + seen, all_paths = set(), [] + for g in groups: + if not isinstance(g, dict) or set(g) != {"id", "paths", "license", "provenance"}: + raise ValueError("Group requires id/paths/license/provenance only") + group_id = g["id"] + if not isinstance(group_id, str) or not re.fullmatch(r"[a-z0-9][a-z0-9._-]{0,99}", group_id) or group_id in seen: + raise ValueError("Invalid or duplicate group id") + seen.add(group_id) + if not isinstance(g["paths"], list) or not g["paths"] or not g["license"] or not g["provenance"]: + raise ValueError("Nonempty paths/license/provenance required") + for value in g["paths"]: + p = relpath(value) + if forbidden(p): + raise ValueError("Explicit forbidden path: " + p) + if any(p == old or p.startswith(old + "/") or old.startswith(p + "/") for old in all_paths): + raise ValueError("Overlapping whitelist paths") + all_paths.append(p) + excludes = plan.get("exclude_paths", []) + if not isinstance(excludes, list): + raise ValueError("exclude_paths must be a list") + for p in excludes: + relpath(p) + canonical(plan) + + +def enumerate_group(root, group, excludes): + files, omitted = [], [] + + def visit(p): + relative = p.relative_to(root).as_posix() + s = p.lstat() + if stat.S_ISLNK(s.st_mode): + raise ValueError("Symlink refused: " + relative) + reason = forbidden(relative) + if any(relative == x or relative.startswith(x + "/") for x in excludes): + reason = "plan-exclusion" + if reason: + omitted.append({"path": relative, "reason": reason, + "scope": "subtree" if stat.S_ISDIR(s.st_mode) else "file", + "bytes": s.st_size if stat.S_ISREG(s.st_mode) else None}) + elif stat.S_ISDIR(s.st_mode): + for child in sorted(p.iterdir(), key=lambda x: x.name): + visit(child) + elif stat.S_ISREG(s.st_mode): + files.append((relative, identity(s))) + else: + raise ValueError("Nonregular source refused: " + relative) + + for relative in group["paths"]: + path = no_links(root / relative) + visit(path) + files.sort(key=lambda x: x[0]) + omitted.sort(key=lambda x: x["path"]) + if not files: + raise ValueError("Empty group refused") + return files, omitted + + +def scan_secrets(root, files): + for relative, original in files: + p = root / relative + if original[3] > 2 * 1024 * 1024 or p.suffix.lower() in BINARY_SUFFIXES: + continue + data = p.read_bytes() + if identity(p.lstat()) != original: + raise ValueError("Source changed during secret scan: " + relative) + try: + text = data.decode("utf-8") + except UnicodeDecodeError: + continue + if "\x00" in text: + continue + # Per-rule ASCII necessary fragments avoid repeated scans of numeric SWC + # bodies (their header includes a public URL). Non-ASCII text still uses + # every regex because Unicode IGNORECASE has broader equivalences. + lower = text.lower() + fragments = { + "private-key": ("private key",), + "github-token": ("ghp_", "github_pat_"), + "aws-access-key": ("akia",), + "url-user-password": ("://",), + "secret-literal": ("password", "passwd", "api", "secret"), + } + for rule, pattern in SECRET_RULES: + if text.isascii() and not any(x in lower for x in fragments[rule]): + continue + for match in pattern.finditer(text): + if rule == "secret-literal": + literal = match.group(1) or match.group(2) + if literal.lower() in {"none", "null", "false", "true"}: + continue + raise ValueError("Secret scan refused: " + relative + " [" + rule + "]") + + +def gzip_rows(path, rows): + with Path(path).open("xb") as raw: + with gzip.GzipFile(filename="", mode="wb", fileobj=raw, mtime=0) as out: + for row in rows: + out.write((json.dumps(row, sort_keys=True, ensure_ascii=False, allow_nan=False) + "\n").encode()) + + +class HashReader: + def __init__(self, handle): + self.handle, self.hash, self.size = handle, hashlib.sha256(), 0 + + def read(self, count=-1): + data = self.handle.read(count) + self.hash.update(data) + self.size += len(data) + return data + + +def zstd_command(decompress=False, threads=2): + return ["zstd", "-q", "-d", "-c"] if decompress else ["zstd", "-q", "-3", "-T" + str(threads), "-c"] + + +def make_archive(root, files, destination, threads): + rows = [] + with destination.open("xb") as output, tempfile.TemporaryFile() as errors: + proc = subprocess.Popen(zstd_command(threads=threads), stdin=subprocess.PIPE, + stdout=output, stderr=errors) + try: + with tarfile.open(fileobj=proc.stdin, mode="w|", format=tarfile.PAX_FORMAT) as archive: + for relative, original in files: + p = no_links(root / relative) + if identity(p.lstat()) != original: + raise ValueError("Source changed before archive: " + relative) + with p.open("rb") as source: + opened = opened_identity(source, original) + reader = HashReader(source) + info = tarfile.TarInfo(relative) + info.size, info.mode, info.mtime = original[3], stat.S_IMODE(original[2]) & 0o777, 0 + archive.addfile(info, reader) + if (reader.size != original[3] or identity(os.fstat(source.fileno())) != opened + or identity(p.lstat()) != original): + raise ValueError("Source changed during archive: " + relative) + rows.append({"path": relative, "bytes": reader.size, "sha256": reader.hash.hexdigest()}) + proc.stdin.close() + if proc.wait() != 0: + raise RuntimeError("zstd compression failed; no complete catalog published") + except BaseException: + proc.kill() + proc.wait() + raise + finally: + proc.stdin.close() + return rows + + +def split_archive(archive, group_dir): + chunks, full = [], hashlib.sha256() + with archive.open("rb") as source: + index = 0 + while first := source.read(min(BUFFER, CHUNK_BYTES)): + name = "payload-%06d.bin" % index + h, size = hashlib.sha256(), 0 + with (group_dir / name).open("xb") as out: + block = first + while block: + out.write(block) + full.update(block) + h.update(block) + size += len(block) + if size == CHUNK_BYTES: + break + block = source.read(min(BUFFER, CHUNK_BYTES - size)) + chunks.append({"path": name, "bytes": size, "sha256": h.hexdigest(), "index": index}) + index += 1 + if not chunks: + raise ValueError("Empty compressed archive") + return chunks, full.hexdigest() + + +def pack(plan_path, out, work, *, threads=2): + if type(threads) is not int or not 1 <= threads <= 64: + raise ValueError("threads must be 1..64") + plan_bytes = Path(plan_path).read_bytes() + plan = json_bytes(plan_bytes) + validate_plan(plan) + root, out, work = map(no_links, (Path(plan["source_root"]), Path(out), Path(work))) + for a, b in ((root, out), (root, work), (out, work)): + if a == b or a in b.parents or b in a.parents: + raise ValueError("source, out and work must be disjoint trees") + if out.exists() or work.exists(): + raise FileExistsError("out/work must both be new exclusive paths") + out.mkdir(parents=True, exist_ok=False) + work.mkdir(parents=True, exist_ok=False) + write_new(out / "plan.json", plan_bytes) + plan_sha = hashlib.sha256(plan_bytes).hexdigest() + results = [] + for group in plan["groups"]: + files, exclusions = enumerate_group(root, group, plan.get("exclude_paths", [])) + scan_secrets(root, files) + group_dir = out / group["id"] + group_dir.mkdir() + archive = work / (group["id"] + ".tar.zst") + members = make_archive(root, files, archive, threads) + # A second metadata enumeration catches file additions/removals during pack. + after_files, after_exclusions = enumerate_group(root, group, plan.get("exclude_paths", [])) + if after_files != files or after_exclusions != exclusions: + raise ValueError("Source inventory changed during pack") + gzip_rows(group_dir / "members.jsonl.gz", members) + gzip_rows(group_dir / "exclusions.jsonl.gz", exclusions) + chunks, combined = split_archive(archive, group_dir) + catalog = dict(schema="lfs-publication-group-v1", group_id=group["id"], source_root=str(root), + source_paths=group["paths"], source_files=len(members), + source_bytes=sum(x["bytes"] for x in members), license=group["license"], + provenance=group["provenance"], plan_sha256=plan_sha, + archive_format="tar.pax+zstd", archive_sha256=combined, + archive_bytes=sum(x["bytes"] for x in chunks), chunk_bytes=CHUNK_BYTES, + chunks=chunks, members=sha_file(group_dir / "members.jsonl.gz"), + exclusions=sha_file(group_dir / "exclusions.jsonl.gz"), + exclusion_records=len(exclusions), + verification_scope="content snapshot, not a license grant or nested-archive secret audit", + secret_scan="UTF-8 files <=2 MiB, known binary suffixes excluded; fail closed on matching rules") + write_new(group_dir / "catalog.json", canonical(catalog)) + result = {"group": group["id"], "files": len(members), "source_bytes": catalog["source_bytes"], + "archive_bytes": catalog["archive_bytes"], "chunks": len(chunks), + "catalog_sha256": sha_file(group_dir / "catalog.json")["sha256"]} + results.append(result) + print(json.dumps({"group_complete": result}), flush=True) + summary = {"schema": "lfs-publication-pack-v1", "complete": True, "plan_sha256": plan_sha, + "groups": results, "source_files": sum(x["files"] for x in results), + "source_bytes": sum(x["source_bytes"] for x in results)} + write_new(out / "pack-summary.json", canonical(summary)) + return summary + + +def check_digest_row(row): + if not isinstance(row, dict) or type(row.get("bytes")) is not int or row["bytes"] < 0 or not HEX.fullmatch(str(row.get("sha256", ""))): + raise ValueError("Invalid SHA/size metadata") + + +def iter_members(path): + previous = None + with gzip.open(path, "rt", encoding="utf-8") as inp: + for line in inp: + row = json.loads(line) + if set(row) != {"path", "bytes", "sha256"}: + raise ValueError("Invalid member row") + check_digest_row(row) + p = relpath(row["path"]) + if forbidden(p) or (previous is not None and p <= previous): + raise ValueError("Forbidden/duplicate/unsorted member: " + p) + previous = p + yield row + + +def verify(group_dir): + group_dir = no_links(group_dir) + controls_before = {name: sha_file(group_dir / name) for name in + ("catalog.json", "members.jsonl.gz", "exclusions.jsonl.gz")} + catalog = json_read(group_dir / "catalog.json") + if catalog.get("schema") != "lfs-publication-group-v1" or catalog.get("chunk_bytes") != CHUNK_BYTES or catalog.get("archive_format") != "tar.pax+zstd": + raise ValueError("Wrong catalog schema/format/chunk size") + chunks = catalog.get("chunks") + if not isinstance(chunks, list) or not chunks: + raise ValueError("Missing payload chunks") + expected = {"catalog.json", "members.jsonl.gz", "exclusions.jsonl.gz"} + for i, row in enumerate(chunks): + check_digest_row(row) + if set(row) != {"path", "bytes", "sha256", "index"} or type(row["index"]) is not int or row["index"] != i or row["path"] != "payload-%06d.bin" % i: + raise ValueError("Wrong chunk name/order") + if not 0 < row["bytes"] <= CHUNK_BYTES or (i < len(chunks) - 1 and row["bytes"] != CHUNK_BYTES): + raise ValueError("Wrong chunk size") + expected.add(row["path"]) + if {p.name for p in group_dir.iterdir()} != expected: + raise ValueError("Extra/missing downloaded files") + for p in group_dir.iterdir(): + no_links(p) + if not p.is_file(): + raise ValueError("Nonfile downloaded entry") + for name, key in (("members.jsonl.gz", "members"), ("exclusions.jsonl.gz", "exclusions")): + check_digest_row(catalog[key]) + if controls_before[name] != catalog[key]: + raise ValueError("Metadata digest mismatch: " + name) + with gzip.open(group_dir / "exclusions.jsonl.gz", "rt", encoding="utf-8") as source: + omitted = list(map(json.loads, source)) + if len(omitted) != catalog.get("exclusion_records"): + raise ValueError("Exclusion inventory mismatch") + for row in omitted: + relpath(row["path"]) + errors, combined, compressed = [], hashlib.sha256(), [0] + with tempfile.TemporaryFile() as diagnostics: + proc = subprocess.Popen(zstd_command(decompress=True), stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=diagnostics) + + def feed(): + try: + for row in chunks: + p = group_dir / row["path"] + before = identity(p.lstat()) + h, size = hashlib.sha256(), 0 + with p.open("rb") as source: + opened = opened_identity(source, before) + while data := source.read(BUFFER): + h.update(data) + combined.update(data) + size += len(data) + compressed[0] += len(data) + proc.stdin.write(data) + if identity(os.fstat(source.fileno())) != opened or identity(p.lstat()) != before: + raise ValueError("Chunk changed during read") + if size != row["bytes"] or h.hexdigest() != row["sha256"]: + raise ValueError("Payload digest mismatch: " + row["path"]) + except BaseException as exc: + errors.append(exc) + finally: + try: + proc.stdin.close() + except OSError: + pass + + producer = threading.Thread(target=feed, daemon=True) + producer.start() + count, total = 0, 0 + expected_rows = iter(iter_members(group_dir / "members.jsonl.gz")) + try: + with tarfile.open(fileobj=proc.stdout, mode="r|") as archive: + for member in archive: + row = next(expected_rows, None) + if not member.isreg() or member.linkname or member.sparse is not None: + raise ValueError("Nonregular/sparse/link tar member refused") + path = relpath(member.name) + if forbidden(path) or row is None or path != row["path"] or member.size != row["bytes"]: + raise ValueError("Tar member set/size/path mismatch: " + path) + reader = HashReader(archive.extractfile(member)) + while reader.read(BUFFER): + pass + if reader.size != row["bytes"] or reader.hash.hexdigest() != row["sha256"]: + raise ValueError("Tar member content mismatch: " + path) + count += 1 + total += reader.size + # tarfile stops at the first end marker; reject a hidden second + # archive/nonzero trailer, including bytes in its read-ahead buf. + while trailer := archive.fileobj.read(BUFFER): + if any(trailer): + raise ValueError("Nonzero data after tar end marker") + if next(expected_rows, None) is not None: + raise ValueError("Missing tar members") + # Drain to validate zstd's complete stream/checksum and finish the feeder. + while proc.stdout.read(BUFFER): + pass + producer.join() + code = proc.wait() + if errors: + raise ValueError("Payload streaming failed: " + str(errors[0])) + if code != 0: + raise ValueError("zstd decompression failed") + except BaseException: + proc.kill() + proc.wait() + producer.join(timeout=10) + raise + finally: + proc.stdout.close() + expected_rows.close() + if (count != catalog.get("source_files") or total != catalog.get("source_bytes") + or compressed[0] != catalog.get("archive_bytes") or combined.hexdigest() != catalog.get("archive_sha256")): + raise ValueError("Final inventory/archive digest mismatch") + for name, before in controls_before.items(): + if sha_file(group_dir / name) != before: + raise ValueError("Downloaded control changed during verification: " + name) + return {"schema": "lfs-publication-verify-v1", "pass_all": True, "group": catalog["group_id"], + "source_files": count, "source_bytes": total, "archive_bytes": compressed[0], + "archive_sha256": combined.hexdigest(), "catalog_sha256": controls_before["catalog.json"]["sha256"], + "scope": "downloaded payload bytes and streamed members; no extraction, no LFS-cache trust; catalog authenticity is caller responsibility"} + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + sub = parser.add_subparsers(dest="command", required=True) + command = sub.add_parser("pack") + command.add_argument("--plan", required=True) + command.add_argument("--out", required=True) + command.add_argument("--work", required=True) + command.add_argument("--threads", type=int, default=2) + command = sub.add_parser("verify") + command.add_argument("--group-dir", required=True) + args = parser.parse_args() + result = (pack(args.plan, args.out, args.work, threads=args.threads) if args.command == "pack" + else verify(args.group_dir)) + print(json.dumps(result, sort_keys=True, ensure_ascii=False, allow_nan=False), flush=True) + + +if __name__ == "__main__": + main() diff --git a/tools/lfs-publication/test_publish_archives.py b/tools/lfs-publication/test_publish_archives.py new file mode 100644 index 0000000..ff64262 --- /dev/null +++ b/tools/lfs-publication/test_publish_archives.py @@ -0,0 +1,245 @@ +"""Temporary local fixtures only. Identity codec tests do not certify zstd. + +The optional real-zstd test automatically runs when the executable is present. +""" +import contextlib +import gzip +import hashlib +import importlib.util +import io +import json +import os +from pathlib import Path +import shutil +import sys +import tarfile +import tempfile +import unittest +from unittest.mock import patch + +SPEC = importlib.util.spec_from_file_location("lfs_archive_tested", Path(__file__).with_name("publish_archives.py")) +M = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(M) + + +def codec(*args, **kwargs): + return [sys.executable, "-c", "import sys,shutil;shutil.copyfileobj(sys.stdin.buffer,sys.stdout.buffer)"] + + +class ArchiveTests(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory() + self.addCleanup(self.temp.cleanup) + self.base = Path(self.temp.name) + self.root = self.base / "source" + (self.root / "data").mkdir(parents=True) + (self.root / "data" / "a.txt").write_text("public source\n", encoding="utf-8") + (self.root / "data" / "b.bin").write_bytes(bytes(range(256)) * 80) + (self.root / "data" / "zero.txt").write_bytes(b"") + self.plan = {"schema": "lfs-publication-plan-v1", "source_root": str(self.root), + "groups": [{"id": "data", "paths": ["data"], "license": "test-only", + "provenance": {"source": "synthetic"}}], "exclude_paths": []} + self.plan_path = self.base / "plan.json" + self.plan_path.write_bytes(M.canonical(self.plan)) + self.out, self.work = self.base / "out", self.base / "work" + self.addCleanup(patch.stopall) + patch.object(M, "SOURCE_ROOT", str(self.root)).start() + patch.object(M, "CHUNK_BYTES", 4096).start() + self.codec_patch = patch.object(M, "zstd_command", codec) + self.codec_patch.start() + + def pack(self): + with contextlib.redirect_stdout(io.StringIO()): + return M.pack(self.plan_path, self.out, self.work) + + def catalog(self): + return json.loads((self.out / "data" / "catalog.json").read_bytes()) + + def save_catalog(self, cat): + (self.out / "data" / "catalog.json").write_bytes(M.canonical(cat)) + + def rewrite_archive(self, data): + group = self.out / "data" + cat = self.catalog() + for row in cat["chunks"]: + (group / row["path"]).unlink() + new = self.base / "mutant.tar" + new.write_bytes(data) + cat["chunks"], cat["archive_sha256"] = M.split_archive(new, group) + cat["archive_bytes"] = len(data) + self.save_catalog(cat) + + def test_pack_verify_full_member_content_and_no_extraction(self): + before = {p.relative_to(self.root).as_posix(): p.read_bytes() for p in self.root.rglob("*") if p.is_file()} + summary = self.pack() + result = M.verify(self.out / "data") + self.assertTrue(result["pass_all"]) + self.assertEqual(result["source_files"], 3) + self.assertEqual(result["source_bytes"], sum(map(len, before.values()))) + self.assertGreater(summary["groups"][0]["chunks"], 1) + self.assertEqual(before, {p.relative_to(self.root).as_posix(): p.read_bytes() for p in self.root.rglob("*") if p.is_file()}) + self.assertFalse((self.out / "data" / "a.txt").exists()) + + def test_plan_executes_first_read_bytes_only(self): + with patch.object(M, "json_read", side_effect=AssertionError("Must not read plan a second time")): + self.pack() + self.assertEqual(self.catalog()["plan_sha256"], hashlib.sha256(self.plan_path.read_bytes()).hexdigest()) + + def test_exclusions_logged_without_descending(self): + for name in (".git", "venv", "__pycache__", ".cache", "node_modules", "logs", "phase4ar-normal-conditioning"): + d = self.root / "data" / name + d.mkdir() + (d / "hidden.txt").write_text("skip") + (self.root / "data" / "private.pem").write_text("private") + (self.root / "data" / "run.log").write_text("log") + self.pack() + with gzip.open(self.out / "data" / "exclusions.jsonl.gz", "rt") as f: + rows = [json.loads(x) for x in f] + self.assertEqual(len(rows), 9) + self.assertEqual(self.catalog()["source_files"], 3) + self.assertTrue(M.verify(self.out / "data")["pass_all"]) + + def test_unsafe_explicit_paths(self): + for name in ("../data", "/data", "data/../data", "data//x", "data\\x", "data/.git", "data/phase4ar-normal-conditioning"): + plan = json.loads(json.dumps(self.plan)) + plan["groups"][0]["paths"] = [name] + with self.subTest(name=name), self.assertRaises(ValueError): + M.validate_plan(plan) + + def test_overlapping_groups_refused(self): + self.plan["groups"].append({"id": "nested", "paths": ["data/a.txt"], "license": "test", "provenance": "test"}) + with self.assertRaisesRegex(ValueError, "Overlapping"): + M.validate_plan(self.plan) + + def test_symlink_refused(self): + try: + (self.root / "data" / "link").symlink_to(self.root / "data" / "a.txt") + except OSError: + self.skipTest("OS does not permit temporary symlinks") + with self.assertRaisesRegex(ValueError, "Symlink"): + self.pack() + + def test_exclusive_and_disjoint_outputs(self): + self.out.mkdir() + with self.assertRaises(FileExistsError): + self.pack() + with self.assertRaisesRegex(ValueError, "disjoint"): + M.pack(self.plan_path, self.root / "output", self.work) + + def test_parent_components_cannot_bypass_disjoint_gate(self): + malicious = self.base / "unused" / ".." / "source" / "new-output" + with self.assertRaisesRegex(ValueError, "Parent path components"): + M.pack(self.plan_path, malicious, self.work) + self.assertFalse((self.root / "new-output").exists()) + + def test_secret_rules_hide_values(self): + # Build synthetic fixtures at runtime; keep actual credential-like + # strings out of Git blobs so the repository secret guard stays useful. + examples = ["-----BEGIN " + "OPENSSH PRIVATE " + "KEY-----", "ghp_" + "a" * 36, + "github_pat_" + "b" * 40, "AKIA" + "A" * 16, + "https://" + "account:" + "privatevalue" + "@example.org/", + 'password' + ' = "privatevalue"', + 'api_key' + ': "privatevalue"', 'secret_key' + '=ABCDEF123456', + 'pa\u017f\u017fword' + '="privatevalue"', + 'ap\u0131_key' + '="privatevalue"', + '\u017fecret_key' + '="privatevalue"'] + path = self.root / "data" / "literal.txt" + for value in examples: + path.write_text(value) + files, _ = M.enumerate_group(self.root, self.plan["groups"][0], []) + with self.subTest(rule=value[:8]), self.assertRaisesRegex(ValueError, "Secret scan refused") as caught: + M.scan_secrets(self.root, files) + self.assertNotIn(value, str(caught.exception)) + self.assertNotIn("privatevalue", str(caught.exception)) + + def test_mutated_source_metadata_refused(self): + files, _ = M.enumerate_group(self.root, self.plan["groups"][0], []) + (self.root / "data" / "a.txt").write_text("changed bytes") + with self.assertRaisesRegex(ValueError, "Source changed"): + M.make_archive(self.root, files, self.base / "bad.tar", 1) + + def test_payload_corruption_refused(self): + self.pack() + p = self.out / "data" / self.catalog()["chunks"][0]["path"] + data = bytearray(p.read_bytes()) + data[-1] ^= 1 + p.write_bytes(data) + with self.assertRaises((ValueError, tarfile.TarError)): + M.verify(self.out / "data") + + def test_missing_extra_or_reordered_payload_refused(self): + self.pack() + extra = self.out / "data" / "extra.bin" + extra.write_bytes(b"x") + with self.assertRaisesRegex(ValueError, "Extra/missing"): + M.verify(self.out / "data") + extra.unlink() + cat = self.catalog() + cat["chunks"] = list(reversed(cat["chunks"])) + self.save_catalog(cat) + with self.assertRaisesRegex(ValueError, "chunk name/order"): + M.verify(self.out / "data") + + def test_tar_traversal_rejected_even_with_rehashed_chunks(self): + self.pack() + buf = io.BytesIO() + with tarfile.open(fileobj=buf, mode="w") as archive: + info = tarfile.TarInfo("../escape") + info.size = 1 + archive.addfile(info, io.BytesIO(b"x")) + self.rewrite_archive(buf.getvalue()) + with self.assertRaisesRegex(ValueError, "Unsafe relative path"): + M.verify(self.out / "data") + + def test_tar_link_rejected_even_with_rehashed_chunks(self): + self.pack() + buf = io.BytesIO() + with tarfile.open(fileobj=buf, mode="w") as archive: + info = tarfile.TarInfo("data/a.txt") + info.type, info.linkname = tarfile.SYMTYPE, "/tmp/escape" + archive.addfile(info) + self.rewrite_archive(buf.getvalue()) + with self.assertRaisesRegex(ValueError, "Nonregular"): + M.verify(self.out / "data") + + def test_hidden_tar_after_end_refused(self): + self.pack() + raw = (self.work / "data.tar.zst").read_bytes() + self.rewrite_archive(raw + b"nonzero hidden second archive") + with self.assertRaisesRegex(ValueError, "Nonzero data after tar"): + M.verify(self.out / "data") + + def test_second_tar_after_end_refused(self): + self.pack() + buf = io.BytesIO() + with tarfile.open(fileobj=buf, mode="w") as archive: + info = tarfile.TarInfo("unlisted-secret.txt") + info.size = 1 + archive.addfile(info, io.BytesIO(b"x")) + self.rewrite_archive((self.work / "data.tar.zst").read_bytes() + buf.getvalue()) + with self.assertRaisesRegex(ValueError, "Nonzero data after tar"): + M.verify(self.out / "data") + + def test_member_hash_mutation_refused(self): + self.pack() + p = self.out / "data" / "members.jsonl.gz" + with gzip.open(p, "rt") as f: + rows = [json.loads(x) for x in f] + rows[0]["sha256"] = "0" * 64 + p.unlink() + M.gzip_rows(p, rows) + cat = self.catalog() + cat["members"] = M.sha_file(p) + self.save_catalog(cat) + with self.assertRaisesRegex(ValueError, "member content mismatch"): + M.verify(self.out / "data") + + @unittest.skipUnless(shutil.which("zstd"), "Real zstd unavailable; run this integration test on Linux") + def test_real_zstd_roundtrip(self): + self.codec_patch.stop() + self.pack() + self.assertTrue(M.verify(self.out / "data")["pass_all"]) + + +if __name__ == "__main__": + unittest.main() From 13cd0e0be7a24ca9d7c036876bc48f9b22652968 Mon Sep 17 00:00:00 2001 From: Digital Drosophila Archive Date: Thu, 1 Oct 2026 03:24:21 +0800 Subject: [PATCH 3/5] Archive licensed MaleCNS core data as verified LFS chunks --- .../malecns-raw-core/catalog.json | 120 ++++++++++++++++++ .../malecns-raw-core/exclusions.jsonl.gz | 3 + .../malecns-raw-core/members.jsonl.gz | 3 + .../malecns-raw-core/payload-000000.bin | 3 + .../malecns-raw-core/payload-000001.bin | 3 + .../malecns-raw-core/payload-000002.bin | 3 + .../malecns-raw-core/payload-000003.bin | 3 + .../malecns-raw-core/payload-000004.bin | 3 + .../malecns-raw-core/payload-000005.bin | 3 + .../malecns-raw-core/payload-000006.bin | 3 + .../malecns-raw-core/payload-000007.bin | 3 + .../malecns-raw-core/payload-000008.bin | 3 + .../malecns-raw-core/payload-000009.bin | 3 + .../malecns-raw-core/payload-000010.bin | 3 + .../malecns-raw-core/payload-000011.bin | 3 + .../malecns-raw-core/payload-000012.bin | 3 + artifacts/public-resources-20261001/plan.json | 60 +++++++++ 17 files changed, 225 insertions(+) create mode 100644 artifacts/public-resources-20261001/malecns-raw-core/catalog.json create mode 100644 artifacts/public-resources-20261001/malecns-raw-core/exclusions.jsonl.gz create mode 100644 artifacts/public-resources-20261001/malecns-raw-core/members.jsonl.gz create mode 100644 artifacts/public-resources-20261001/malecns-raw-core/payload-000000.bin create mode 100644 artifacts/public-resources-20261001/malecns-raw-core/payload-000001.bin create mode 100644 artifacts/public-resources-20261001/malecns-raw-core/payload-000002.bin create mode 100644 artifacts/public-resources-20261001/malecns-raw-core/payload-000003.bin create mode 100644 artifacts/public-resources-20261001/malecns-raw-core/payload-000004.bin create mode 100644 artifacts/public-resources-20261001/malecns-raw-core/payload-000005.bin create mode 100644 artifacts/public-resources-20261001/malecns-raw-core/payload-000006.bin create mode 100644 artifacts/public-resources-20261001/malecns-raw-core/payload-000007.bin create mode 100644 artifacts/public-resources-20261001/malecns-raw-core/payload-000008.bin create mode 100644 artifacts/public-resources-20261001/malecns-raw-core/payload-000009.bin create mode 100644 artifacts/public-resources-20261001/malecns-raw-core/payload-000010.bin create mode 100644 artifacts/public-resources-20261001/malecns-raw-core/payload-000011.bin create mode 100644 artifacts/public-resources-20261001/malecns-raw-core/payload-000012.bin create mode 100644 artifacts/public-resources-20261001/plan.json diff --git a/artifacts/public-resources-20261001/malecns-raw-core/catalog.json b/artifacts/public-resources-20261001/malecns-raw-core/catalog.json new file mode 100644 index 0000000..9fe8a31 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-raw-core/catalog.json @@ -0,0 +1,120 @@ +{ + "archive_bytes": 834266158, + "archive_format": "tar.pax+zstd", + "archive_sha256": "feebf3fe3f3c2c9fea3db96fab8267330de49af7ab37008b84caeeea8dc272ed", + "chunk_bytes": 67108864, + "chunks": [ + { + "bytes": 67108864, + "index": 0, + "path": "payload-000000.bin", + "sha256": "5527fc251d23c23209cf16c8831aedefcceb6d1e927a4eaf9ebed182fd5481ff" + }, + { + "bytes": 67108864, + "index": 1, + "path": "payload-000001.bin", + "sha256": "4793d00b3d6b3506d16e21f3f3775bc70c23c70cd5be03b6733350328519a3c0" + }, + { + "bytes": 67108864, + "index": 2, + "path": "payload-000002.bin", + "sha256": "a78930db08134f72e97306df7256bd8b0b533611fe9a08459f1c6289eb47624e" + }, + { + "bytes": 67108864, + "index": 3, + "path": "payload-000003.bin", + "sha256": "54fc4943c3d644e1765a7cbdacf0629db1ddefde4f17035729417242930064a9" + }, + { + "bytes": 67108864, + "index": 4, + "path": "payload-000004.bin", + "sha256": "7bb2deb3dd7d3f7064c096c8915bb3eff7f880a009628f6ee6c5e14dce939668" + }, + { + "bytes": 67108864, + "index": 5, + "path": "payload-000005.bin", + "sha256": "d1aac9ec93c77f901c98c7343fd3713c746faf855096e9d7e6da897491c513df" + }, + { + "bytes": 67108864, + "index": 6, + "path": "payload-000006.bin", + "sha256": "29f40919b04405609643b3a5a2beb749aacbf5525cf90a60d75fa3f0a283435e" + }, + { + "bytes": 67108864, + "index": 7, + "path": "payload-000007.bin", + "sha256": "b3936a86da8636e5ba6d7a25f4d8d3b34eadc769e74817d67c7aefe2e9879e68" + }, + { + "bytes": 67108864, + "index": 8, + "path": "payload-000008.bin", + "sha256": "47e2e7cfde2bc01d41de53ba933683faf4fa4dc57c3d80f07d8edb75dc1916d3" + }, + { + "bytes": 67108864, + "index": 9, + "path": "payload-000009.bin", + "sha256": "ab37af43abeeb3434b0660fb5bfb185e7c0db07916b2a2233a2db083f66ea2b9" + }, + { + "bytes": 67108864, + "index": 10, + "path": "payload-000010.bin", + "sha256": "bdbf00683b8940fb513fef121559e8e449d84972e03df2d4698d06e0dcc28efa" + }, + { + "bytes": 67108864, + "index": 11, + "path": "payload-000011.bin", + "sha256": "a3ee35cae393b29d0366aebcad7f63a8ad578b61e0a93e773595dfdfe6848bbe" + }, + { + "bytes": 28959790, + "index": 12, + "path": "payload-000012.bin", + "sha256": "7fbe5733e328f5a989fec3ffd78819c62ac53a32e099579492cd82766322e82a" + } + ], + "exclusion_records": 1, + "exclusions": { + "bytes": 135, + "sha256": "887492a8f75af6be4e71b6f5aa12506cef3d8e3a7363b3c6a50064da93b9b4a1" + }, + "group_id": "malecns-raw-core", + "license": { + "data": "CC-BY-4.0", + "local_manifests_scripts": "Project-authored provenance; no new blanket software license", + "url": "https://creativecommons.org/licenses/by/4.0/" + }, + "members": { + "bytes": 1009, + "sha256": "e963adede9d937effbf5519ae9717938a2b3324aecc1c28338800007f7003404" + }, + "plan_sha256": "a20a61821c504e8315171a5fd14afbac011b934709af344045175bdda9fcba71", + "provenance": { + "attribution": "Male CNS collaboration: FlyEM (HHMI Janelia), University of Cambridge Department of Zoology, MRC Laboratory of Molecular Biology, Google Research; retain original dataset author credits", + "changes": "Data file bytes unchanged; archival compression and path manifest only. Download logs excluded.", + "source_page": "https://male-cns.janelia.org/download/", + "source_prefix": "gs://flyem-male-cns/v1.0/connectome-data/flat-connectome/", + "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": 1207032031, + "source_files": 17, + "source_paths": [ + "datasets/male-cns-v1.0/raw/annotations", + "datasets/male-cns-v1.0/raw/connectivity", + "datasets/male-cns-v1.0/raw/_manifests" + ], + "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-raw-core/exclusions.jsonl.gz b/artifacts/public-resources-20261001/malecns-raw-core/exclusions.jsonl.gz new file mode 100644 index 0000000..65ee80d --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-raw-core/exclusions.jsonl.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:887492a8f75af6be4e71b6f5aa12506cef3d8e3a7363b3c6a50064da93b9b4a1 +size 135 diff --git a/artifacts/public-resources-20261001/malecns-raw-core/members.jsonl.gz b/artifacts/public-resources-20261001/malecns-raw-core/members.jsonl.gz new file mode 100644 index 0000000..f1d777d --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-raw-core/members.jsonl.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e963adede9d937effbf5519ae9717938a2b3324aecc1c28338800007f7003404 +size 1009 diff --git a/artifacts/public-resources-20261001/malecns-raw-core/payload-000000.bin b/artifacts/public-resources-20261001/malecns-raw-core/payload-000000.bin new file mode 100644 index 0000000..1d7b75a --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-raw-core/payload-000000.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5527fc251d23c23209cf16c8831aedefcceb6d1e927a4eaf9ebed182fd5481ff +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-raw-core/payload-000001.bin b/artifacts/public-resources-20261001/malecns-raw-core/payload-000001.bin new file mode 100644 index 0000000..1f0f13f --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-raw-core/payload-000001.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4793d00b3d6b3506d16e21f3f3775bc70c23c70cd5be03b6733350328519a3c0 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-raw-core/payload-000002.bin b/artifacts/public-resources-20261001/malecns-raw-core/payload-000002.bin new file mode 100644 index 0000000..fa31a68 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-raw-core/payload-000002.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a78930db08134f72e97306df7256bd8b0b533611fe9a08459f1c6289eb47624e +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-raw-core/payload-000003.bin b/artifacts/public-resources-20261001/malecns-raw-core/payload-000003.bin new file mode 100644 index 0000000..748f911 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-raw-core/payload-000003.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:54fc4943c3d644e1765a7cbdacf0629db1ddefde4f17035729417242930064a9 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-raw-core/payload-000004.bin b/artifacts/public-resources-20261001/malecns-raw-core/payload-000004.bin new file mode 100644 index 0000000..e192089 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-raw-core/payload-000004.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7bb2deb3dd7d3f7064c096c8915bb3eff7f880a009628f6ee6c5e14dce939668 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-raw-core/payload-000005.bin b/artifacts/public-resources-20261001/malecns-raw-core/payload-000005.bin new file mode 100644 index 0000000..d510b5c --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-raw-core/payload-000005.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1aac9ec93c77f901c98c7343fd3713c746faf855096e9d7e6da897491c513df +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-raw-core/payload-000006.bin b/artifacts/public-resources-20261001/malecns-raw-core/payload-000006.bin new file mode 100644 index 0000000..004c1d6 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-raw-core/payload-000006.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29f40919b04405609643b3a5a2beb749aacbf5525cf90a60d75fa3f0a283435e +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-raw-core/payload-000007.bin b/artifacts/public-resources-20261001/malecns-raw-core/payload-000007.bin new file mode 100644 index 0000000..b330586 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-raw-core/payload-000007.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3936a86da8636e5ba6d7a25f4d8d3b34eadc769e74817d67c7aefe2e9879e68 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-raw-core/payload-000008.bin b/artifacts/public-resources-20261001/malecns-raw-core/payload-000008.bin new file mode 100644 index 0000000..f9ffc16 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-raw-core/payload-000008.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47e2e7cfde2bc01d41de53ba933683faf4fa4dc57c3d80f07d8edb75dc1916d3 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-raw-core/payload-000009.bin b/artifacts/public-resources-20261001/malecns-raw-core/payload-000009.bin new file mode 100644 index 0000000..233a14c --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-raw-core/payload-000009.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab37af43abeeb3434b0660fb5bfb185e7c0db07916b2a2233a2db083f66ea2b9 +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-raw-core/payload-000010.bin b/artifacts/public-resources-20261001/malecns-raw-core/payload-000010.bin new file mode 100644 index 0000000..2296a32 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-raw-core/payload-000010.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bdbf00683b8940fb513fef121559e8e449d84972e03df2d4698d06e0dcc28efa +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-raw-core/payload-000011.bin b/artifacts/public-resources-20261001/malecns-raw-core/payload-000011.bin new file mode 100644 index 0000000..884ecf3 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-raw-core/payload-000011.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3ee35cae393b29d0366aebcad7f63a8ad578b61e0a93e773595dfdfe6848bbe +size 67108864 diff --git a/artifacts/public-resources-20261001/malecns-raw-core/payload-000012.bin b/artifacts/public-resources-20261001/malecns-raw-core/payload-000012.bin new file mode 100644 index 0000000..fdf9e40 --- /dev/null +++ b/artifacts/public-resources-20261001/malecns-raw-core/payload-000012.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7fbe5733e328f5a989fec3ffd78819c62ac53a32e099579492cd82766322e82a +size 28959790 diff --git a/artifacts/public-resources-20261001/plan.json b/artifacts/public-resources-20261001/plan.json new file mode 100644 index 0000000..01d3567 --- /dev/null +++ b/artifacts/public-resources-20261001/plan.json @@ -0,0 +1,60 @@ +{ + "schema": "lfs-publication-plan-v1", + "source_root": "/data/digital-drosophila", + "groups": [ + { + "id": "malecns-raw-core", + "paths": ["datasets/male-cns-v1.0/raw/annotations", "datasets/male-cns-v1.0/raw/connectivity", "datasets/male-cns-v1.0/raw/_manifests"], + "license": {"data": "CC-BY-4.0", "url": "https://creativecommons.org/licenses/by/4.0/", "local_manifests_scripts": "Project-authored provenance; no new blanket software license"}, + "provenance": {"version": "male-cns:v1.0", "source_page": "https://male-cns.janelia.org/download/", "source_prefix": "gs://flyem-male-cns/v1.0/connectome-data/flat-connectome/", "attribution": "Male CNS collaboration: FlyEM (HHMI Janelia), University of Cambridge Department of Zoology, MRC Laboratory of Molecular Biology, Google Research; retain original dataset author credits", "changes": "Data file bytes unchanged; archival compression and path manifest only. Download logs excluded."} + }, + { + "id": "malecns-swc", + "paths": ["datasets/male-cns-v1.0/raw/skeletons"], + "license": {"data": "CC-BY-4.0", "url": "https://creativecommons.org/licenses/by/4.0/"}, + "provenance": {"version": "male-cns:v1.0", "source_page": "https://male-cns.janelia.org/download/", "source_prefix": "gs://flyem-male-cns/v1.0/segmentation/skeletons-malecns/skeletons-swc/", "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."} + }, + { + "id": "malecns-processed", + "paths": ["datasets/male-cns-v1.0/processed"], + "license": {"derived_data": "CC-BY-4.0", "url": "https://creativecommons.org/licenses/by/4.0/", "local_scripts_reports": "Project-authored processing and provenance; no new blanket software license"}, + "provenance": {"dataset": "male-cns:v1.0", "source_page": "https://male-cns.janelia.org/download/", "attribution": "Original Male CNS collaboration; Digital Drosophila project for local processing", "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.", "canonical_neurons": 166700, "canonical_edges": 25582938, "canonical_synaptic_weight_sum": 124177617} + }, + { + "id": "malecns-synaptic-partners", + "paths": ["experiments/phase4aa-apl-pn-scope/external-resources"], + "license": {"data": "CC-BY-4.0", "url": "https://creativecommons.org/licenses/by/4.0/", "local_provenance": "Project-authored"}, + "provenance": {"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", "registered_file_sha256": "959d8ef4173b35382a3e6acfaf5167c795b6d10b877572d146af04e1b487bc07", "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."} + }, + { + "id": "celltype-explorer", + "paths": ["experiments/phase4f-retinotopic-vision/external-resources/celltype-explorer"], + "license": {"upstream": "CC-BY-4.0", "url": "https://creativecommons.org/licenses/by/4.0/", "evidence_file": "LICENSE", "evidence_sha256": "9ba9550ad48438d0836ddab3da480b3b69ffa0aac7b7878b5a0039e7ab429411"}, + "provenance": {"repository": "https://github.com/reiserlab/celltype-explorer-drosophila-male-cns", "commit": "789cc6c105798ce2fd70ba85dab394f90899616b", "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."} + }, + { + "id": "visualpathways", + "paths": ["experiments/phase4f-retinotopic-vision/external-resources/visualpathways"], + "license": {"upstream": "GPL-3.0 as supplied in upstream LICENSE; no assertion of only/or-later option", "evidence_file": "LICENSE", "evidence_sha256": "3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986", "third_party_notices": "Retained; no relicensing of third-party components"}, + "provenance": {"repository": "https://github.com/reiserlab/visualpathways", "commit": "23f6ac131529b5f56894c6eeb9b88b17894fc00d", "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."} + }, + { + "id": "door-data", + "paths": ["experiments/phase4l-olfactory-grounding/external-resources/DoOR.data"], + "license": {"upstream": "CC-BY-SA-4.0", "url": "https://creativecommons.org/licenses/by-sa/4.0/", "evidence_file": "DESCRIPTION", "evidence_sha256": "27db2a92eb651d67969de94959990d51668a5857a33c4750a3b6ef49c5880504"}, + "provenance": {"repository": "https://github.com/ropensci/DoOR.data", "commit": "eea72d64b42a4e91dafe822cf0b5204de33f8d34", "version": "2.0.1", "attribution": "Daniel Münch, C. Giovanni Galizia, Shouwen Ma, Martin Strauch, Anja Nissler; see upstream DESCRIPTION and data-source references", "papers": ["https://doi.org/10.1038/srep21841", "https://doi.org/10.1093/chemse/bjq042"], "changes": "Unchanged pinned data package; .git omitted. ShareAlike terms remain attached to this package, not asserted over unrelated repository content."} + }, + { + "id": "shiu-author-model-source", + "paths": ["experiments/phase4ac-lif-semantics/external-resources"], + "license": {"upstream": "MIT", "evidence_file": "LICENSE", "evidence_sha256": "3621f6d6476189190e2960fa43f11b275ba4eca848fdac50a1ba2925de6223e8"}, + "provenance": {"repository": "https://github.com/philshiu/Drosophila_brain_model", "commit": "91bdd1e7dcf193f3e7ca5a8933497fcef63b7960", "attribution": "Philip Shiu and Drosophila_brain_model contributors; original MIT copyright and permission notice retained", "paper": "https://www.nature.com/articles/s41586-024-07763-9", "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."} + } + ], + "exclude_paths": [ + "datasets/male-cns-v1.0/processed/_staging", + "experiments/phase4f-retinotopic-vision/external-resources/visualpathways/.env_sample", + "experiments/phase4f-retinotopic-vision/external-resources/visualpathways/pdfversion", + "experiments/phase4f-retinotopic-vision/external-resources/visualpathways/docs/column_coord.pdf" + ] +} From 6e33e05ede21b98c0088139e9bc4c049498c4d41 Mon Sep 17 00:00:00 2001 From: Digital Drosophila Archive Date: Thu, 1 Oct 2026 03:42:51 +0800 Subject: [PATCH 4/5] 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() From 5b1d1b72d7683b5c3dcc1f78b408e1d9dd2832ac Mon Sep 17 00:00:00 2001 From: Digital Drosophila Archive Date: Thu, 1 Oct 2026 03:51:01 +0800 Subject: [PATCH 5/5] Record fresh LFS restore verification and final publication checksums --- registry/publication-20261001/README.md | 4 + registry/publication-20261001/SHA256SUMS | 205 ++++ .../fresh-content-verification.json | 206 ++++ .../fresh-download-verification.json | 83 ++ .../publication-manifest.json | 1035 +++++++++++++++++ .../source-guard-final.json | 123 ++ .../seal_publication_manifest.py | 50 + 7 files changed, 1706 insertions(+) create mode 100644 registry/publication-20261001/SHA256SUMS create mode 100644 registry/publication-20261001/fresh-content-verification.json create mode 100644 registry/publication-20261001/fresh-download-verification.json create mode 100644 registry/publication-20261001/publication-manifest.json create mode 100644 registry/publication-20261001/source-guard-final.json create mode 100644 tools/lfs-publication/seal_publication_manifest.py diff --git a/registry/publication-20261001/README.md b/registry/publication-20261001/README.md index f50dc4d..bdaa085 100644 --- a/registry/publication-20261001/README.md +++ b/registry/publication-20261001/README.md @@ -2,6 +2,10 @@ 这是现有下载资源的归档发布,不是新的科学实验,不表示 Phase 4AR 已完成或学习通过。用户明确选择保留公开仓库,仅上传确认可公开再分发的资源。活动项目工作树和 Phase 1–4AQ 冻结文件不参与写入。 +**本次发布完成:PASS。** 数据提交 `6e33e05ede21b98c0088139e9bc4c049498c4d41` 已推送到 `codex/lfs-public-resources`,并从该远端提交使用独立空 LFS store 实际重新下载;pull、fsck 及 8 组全部内部成员校验通过。详见 [实际下载回执](fresh-download-verification.json)、[逐组内容核验](fresh-content-verification.json)及[源保护检查](source-guard-final.json)。默认分支未更改,也未自动合并。 + +最终完整性入口为 [publication-manifest.json](publication-manifest.json) 和 [SHA256SUMS](SHA256SUMS)。下载所有 LFS 对象后,可在仓库根目录运行 `sha256sum -c registry/publication-20261001/SHA256SUMS`;它不应在仅有 LFS pointer 的 checkout 中运行。最终文档提交只附加核验记录,不更改上述数据提交的 payload。 + ## 范围与许可 | 资源 | 许可/依据 | 本次处理 | diff --git a/registry/publication-20261001/SHA256SUMS b/registry/publication-20261001/SHA256SUMS new file mode 100644 index 0000000..c1109b3 --- /dev/null +++ b/registry/publication-20261001/SHA256SUMS @@ -0,0 +1,205 @@ +aef53fc7554c50e0a456e58105d683a1dd3323c78cdde822b32eae5ba88b9b6a .gitattributes +4e51bf524b3b0e696b5dc0319b2bbcd92cac456bad72971c629fd7d42c6730aa .gitignore +09a67fa17c5b5a3c4c71cfd6b1789aac517064e3ca160b6fbf6f3bf038d83a73 NOTICE.md +93e0e6c4ca4fdc123c21b859ba97d8bd73670eb9c90d04ce9a431d822b5393c5 artifacts/lfs-smoke/publication-probe.bin +4dc6be6091b273312a1dd61f621654f05e4c12118bdd13c22905d588e378889c artifacts/public-resources-20261001/celltype-explorer/catalog.json +c1bca109b61e53327fa7e01128a411d8ea328972593168c3ad6e1202dfdddc9c artifacts/public-resources-20261001/celltype-explorer/exclusions.jsonl.gz +8a51d3b4138bad12a520f8d1a12d54673416017d15fd1b1bcc49ed385da005bb artifacts/public-resources-20261001/celltype-explorer/members.jsonl.gz +6f5830463b8a0077ae89e550ca45275d57cf7e81813c42bf66f89d13a42c03ee artifacts/public-resources-20261001/celltype-explorer/payload-000000.bin +6b80b0133af06279bd30561f35042b679bd392b9236ee519d1e7ed9c4e85fb6a artifacts/public-resources-20261001/celltype-explorer/payload-000001.bin +6d0fcbe747dae7b38bcf335572b173e0112f6aabd10aa0040b84cfd81a8a390c artifacts/public-resources-20261001/door-data/catalog.json +82627a482fd6adfc3abf4f83a30158fd8371b4532f425f7eb3b03044eb7e1367 artifacts/public-resources-20261001/door-data/exclusions.jsonl.gz +ef13db49577b3b3d1c7c31aab117d911a2decc5a80ead66b6a350c43d16374b4 artifacts/public-resources-20261001/door-data/members.jsonl.gz +64d415a1ea9f5c2fe09005ce1c2bb27eb45510fad27ad3c39cf0001e6f525fd1 artifacts/public-resources-20261001/door-data/payload-000000.bin +e1e42f654cb005d2f073d4e84c808af50f50c3feeb9cbcb0b0c1c51746bfdb47 artifacts/public-resources-20261001/malecns-processed/catalog.json +0909f401f73ca15301ea2be92a5e7c66cf79d9d4f8bbe5449f82c2980d6d3e80 artifacts/public-resources-20261001/malecns-processed/exclusions.jsonl.gz +fe399bea661cdd018e53a5ea58bc46a64d2f94fb09d1dec40f8a956789204627 artifacts/public-resources-20261001/malecns-processed/members.jsonl.gz +a65619004cdc36e594bdca344d1fe51ac86fb719159f70a2ba0fb21c763f9c04 artifacts/public-resources-20261001/malecns-processed/payload-000000.bin +cca9eedbc44b20be736317745ee12e8c06bf0e1aafc7815b74bc6aa27cef5be5 artifacts/public-resources-20261001/malecns-processed/payload-000001.bin +e395b23867e74b7579aed8eeb927e373c86d77433962a0f89ac198aeca4f8470 artifacts/public-resources-20261001/malecns-processed/payload-000002.bin +e47d83eba2875f963add02ab697cb6386dd8fe4a5f33b96db5a321986a276774 artifacts/public-resources-20261001/malecns-processed/payload-000003.bin +4d4bdff46071f05c29ac34cd9081204739317bef5ab862d612d2c7a82c3d5bca artifacts/public-resources-20261001/malecns-processed/payload-000004.bin +4f82611c41e868faa6ea06d7bd275df90f712e3f5eb14296117e39c3bf6c95c0 artifacts/public-resources-20261001/malecns-processed/payload-000005.bin +4cbfb164c194db8c54eadef4d039240d98b0f5be8e20e4005be08bd2d2f6ab5d artifacts/public-resources-20261001/malecns-processed/payload-000006.bin +9ba4adfe64d73d0ceb249ab25215734f58b0d8b38d11f22676fd93f68e83df68 artifacts/public-resources-20261001/malecns-processed/payload-000007.bin +8f388376c6e9d3b7abaff219b00d669ea88db1bf5cd48381db9354598102b345 artifacts/public-resources-20261001/malecns-processed/payload-000008.bin +e1ac638f1d640de9e85b82d9526d6f729f78239e66c5c024e0037144adf7f003 artifacts/public-resources-20261001/malecns-processed/payload-000009.bin +8a7ea9abe5f75ce31318d207a1dbb491d5e151af27bd607dc1b59fb29d4aacf8 artifacts/public-resources-20261001/malecns-raw-core/catalog.json +887492a8f75af6be4e71b6f5aa12506cef3d8e3a7363b3c6a50064da93b9b4a1 artifacts/public-resources-20261001/malecns-raw-core/exclusions.jsonl.gz +e963adede9d937effbf5519ae9717938a2b3324aecc1c28338800007f7003404 artifacts/public-resources-20261001/malecns-raw-core/members.jsonl.gz +5527fc251d23c23209cf16c8831aedefcceb6d1e927a4eaf9ebed182fd5481ff artifacts/public-resources-20261001/malecns-raw-core/payload-000000.bin +4793d00b3d6b3506d16e21f3f3775bc70c23c70cd5be03b6733350328519a3c0 artifacts/public-resources-20261001/malecns-raw-core/payload-000001.bin +a78930db08134f72e97306df7256bd8b0b533611fe9a08459f1c6289eb47624e artifacts/public-resources-20261001/malecns-raw-core/payload-000002.bin +54fc4943c3d644e1765a7cbdacf0629db1ddefde4f17035729417242930064a9 artifacts/public-resources-20261001/malecns-raw-core/payload-000003.bin +7bb2deb3dd7d3f7064c096c8915bb3eff7f880a009628f6ee6c5e14dce939668 artifacts/public-resources-20261001/malecns-raw-core/payload-000004.bin +d1aac9ec93c77f901c98c7343fd3713c746faf855096e9d7e6da897491c513df artifacts/public-resources-20261001/malecns-raw-core/payload-000005.bin +29f40919b04405609643b3a5a2beb749aacbf5525cf90a60d75fa3f0a283435e artifacts/public-resources-20261001/malecns-raw-core/payload-000006.bin +b3936a86da8636e5ba6d7a25f4d8d3b34eadc769e74817d67c7aefe2e9879e68 artifacts/public-resources-20261001/malecns-raw-core/payload-000007.bin +47e2e7cfde2bc01d41de53ba933683faf4fa4dc57c3d80f07d8edb75dc1916d3 artifacts/public-resources-20261001/malecns-raw-core/payload-000008.bin +ab37af43abeeb3434b0660fb5bfb185e7c0db07916b2a2233a2db083f66ea2b9 artifacts/public-resources-20261001/malecns-raw-core/payload-000009.bin +bdbf00683b8940fb513fef121559e8e449d84972e03df2d4698d06e0dcc28efa artifacts/public-resources-20261001/malecns-raw-core/payload-000010.bin +a3ee35cae393b29d0366aebcad7f63a8ad578b61e0a93e773595dfdfe6848bbe artifacts/public-resources-20261001/malecns-raw-core/payload-000011.bin +7fbe5733e328f5a989fec3ffd78819c62ac53a32e099579492cd82766322e82a artifacts/public-resources-20261001/malecns-raw-core/payload-000012.bin +efc330317e2f74272e233634e5652982232ef9d3b6762f8e3cbd9eeaf05487cf artifacts/public-resources-20261001/malecns-swc/catalog.json +9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64 artifacts/public-resources-20261001/malecns-swc/exclusions.jsonl.gz +1dcc1bac912889118e2a34211b4c43b2b0af871c8b76b97ede31db88ce67a961 artifacts/public-resources-20261001/malecns-swc/members.jsonl.gz +1f21099a6411dec6c0b1f5eba48618de749ac6ec7f18b18d7521fe75b7fe32e9 artifacts/public-resources-20261001/malecns-swc/payload-000000.bin +a749bcac2abeb5f8621603d81a069a96b63cc5e12dbb87b51744b5838c25bab5 artifacts/public-resources-20261001/malecns-swc/payload-000001.bin +8bacba0b7452c99f2a8e57b17f72604671d78faed5dbc39cf800b148a9a3476b artifacts/public-resources-20261001/malecns-swc/payload-000002.bin +0e226842328b68a4ce86bdb612379047c44a535c6d4b5eb8aa97ed0fccccede4 artifacts/public-resources-20261001/malecns-swc/payload-000003.bin +19559779bbd8f305c690ccb1c5a2a03b53bdee0e2afe3f6dca1faf2926ae1143 artifacts/public-resources-20261001/malecns-swc/payload-000004.bin +f9441d9484184e90d3b962b9b32ef80e8daa1944ca67d11e691fda715eb4908f artifacts/public-resources-20261001/malecns-swc/payload-000005.bin +c022c80fe76fbbe69602755de5ea74b97db9ee56db280d6c9ec863ba3c1ff332 artifacts/public-resources-20261001/malecns-swc/payload-000006.bin +12370abe8bbe6fee58be01d6b2204b64c54a7eada3988a367de9451b910ae3e1 artifacts/public-resources-20261001/malecns-swc/payload-000007.bin +f7d5d2b8f699f15466e6fabcefc398b21f142d23c5ad173020add2461e32d27e artifacts/public-resources-20261001/malecns-swc/payload-000008.bin +4e70530845d6e86b037cd7dc7d0d7a5bf544263f99893a6836525b92a5b142d4 artifacts/public-resources-20261001/malecns-swc/payload-000009.bin +9ce176c8fcaef8671815c5b4f3366c233632be1ac313ab6f351f7f93cd2f0072 artifacts/public-resources-20261001/malecns-swc/payload-000010.bin +12f4d9d507494cd85f17583fa9665f20b68f928db1125668d9bfc462fc0f66a5 artifacts/public-resources-20261001/malecns-swc/payload-000011.bin +39e8403e3fd8ea71e281034b346da33511d1ec1c236b1f16929113d4cec53e6d artifacts/public-resources-20261001/malecns-swc/payload-000012.bin +979bb9d50a5b44608ce6ace417dec67236072d027fab79cf9b0255ed39c08020 artifacts/public-resources-20261001/malecns-swc/payload-000013.bin +b029a7948ae6c23916fcd81c3b9bf1a260f2c9d8659b53b7f5e556384349f21f artifacts/public-resources-20261001/malecns-swc/payload-000014.bin +c26d6139d8e1a51ffabe1a06a13c2061a5928e168a961930d9d195a25b6ab620 artifacts/public-resources-20261001/malecns-swc/payload-000015.bin +98b5853bc02c4bd0bf1598fdfd1c52f55628660047fb4977f1f8eaf02e70b603 artifacts/public-resources-20261001/malecns-swc/payload-000016.bin +789d6ad66acddd2aaa750d4c27d55be897f0c9a935c0c1837d9e46c2f916d0b3 artifacts/public-resources-20261001/malecns-swc/payload-000017.bin +907c4ae7690a13663e8a489ec229f436e329823b7fb1c1e68228338388754ec7 artifacts/public-resources-20261001/malecns-swc/payload-000018.bin +c28d51fdf23a630eaf2506276da19d34c609a6b5448afdedd2efea25e4602b06 artifacts/public-resources-20261001/malecns-swc/payload-000019.bin +2d1be9e0abfd4604b55bfd0c8e740ee58bb153d126a81aa08126fecdc0057150 artifacts/public-resources-20261001/malecns-swc/payload-000020.bin +f9725762b7fb5e0cc5a896c8b63ceb816faa246aeba4a3082b9eaf492cbe97c5 artifacts/public-resources-20261001/malecns-swc/payload-000021.bin +72e90497e9e6fbf586e3659d4e023f47a8f3942ac10bce1fe314659f16568160 artifacts/public-resources-20261001/malecns-swc/payload-000022.bin +2fd9ba58a4f2acbb5fbbb023cb100a1bcc0079c7c490d25c2c63bd46441aa08e artifacts/public-resources-20261001/malecns-swc/payload-000023.bin +ead438094c5a9d4b5550ebc95ec583d8e7cd1d84b601e549d50c4ab9a5e9818b artifacts/public-resources-20261001/malecns-swc/payload-000024.bin +97b32a95ca08c4b69908c93a7ce40606a9597cd9f2eb47f9447cc4a93cb6eab2 artifacts/public-resources-20261001/malecns-swc/payload-000025.bin +6f985c609b0f1f3538b7b7407da46c2983781552cec9e12e5ca9b5ba5d1ceca9 artifacts/public-resources-20261001/malecns-swc/payload-000026.bin +7465e4aff8c0ad68fcbb201815828a5198611c18c8fb2cdfdaf4ba7b2a6b2456 artifacts/public-resources-20261001/malecns-swc/payload-000027.bin +7a3ba5b63ac70b19e54cce3e9f90038caae01e992fe81a45b7ddb370dcbf125e artifacts/public-resources-20261001/malecns-swc/payload-000028.bin +c9fafa0218befdebb42d19ff7f720e18b392c742ff45e39b64018c41a31a1530 artifacts/public-resources-20261001/malecns-swc/payload-000029.bin +aac2f55805490cfa5e42bbd7cc169a83a40132f269d64315ebb2aec6dafc5a96 artifacts/public-resources-20261001/malecns-swc/payload-000030.bin +c362980ebf871332f8fc05f5f72ccce8ed13319c596039a960cd0450e7f09a78 artifacts/public-resources-20261001/malecns-swc/payload-000031.bin +52272e69c6b23bc0951f6cd4e824c357ccb13d3bb781cd68591a8a5476540229 artifacts/public-resources-20261001/malecns-swc/payload-000032.bin +c3ada974de03b55ce956d6af4f5d9238f2e1ab7ad2bd81265eb9a7bf883e65e1 artifacts/public-resources-20261001/malecns-swc/payload-000033.bin +7aa8cf11b2d356a45e2608295deeb6443bdcf83427a8b71e6da758e2cfed9e2d artifacts/public-resources-20261001/malecns-swc/payload-000034.bin +0edc84c74eebcc6d1375bfe5e09e8933221b025cfd4ce98539a574c1b26c6cf4 artifacts/public-resources-20261001/malecns-swc/payload-000035.bin +ad237a494101cd4a392d0a29406b217673ecdfe1ac999f9ee76bcb99dd449840 artifacts/public-resources-20261001/malecns-swc/payload-000036.bin +fa89d550c2b9674ed8e01a1443d355c01cfebae2394a92f21999e09598159249 artifacts/public-resources-20261001/malecns-swc/payload-000037.bin +c22cd72daba6848f000d39c6c9e0f500c47c2a97c59bf4d01cb485c4542504af artifacts/public-resources-20261001/malecns-swc/payload-000038.bin +9c3cb5c9db5915ec11ddd25f01c09a68bd493f2fa7e01a2832cf6b13bd034169 artifacts/public-resources-20261001/malecns-swc/payload-000039.bin +52f9bf010556a9c231771c36697c257059d1200f42b021811568e5ad8aaa81c8 artifacts/public-resources-20261001/malecns-swc/payload-000040.bin +3bd8789f041905e31bf669c2e9877dc19e92108dc721fa7db4c6f4a1fea2a850 artifacts/public-resources-20261001/malecns-swc/payload-000041.bin +bdbc0354abdad63a9c256a2841fdf9df4c32258647b8de03d066afc89fa61053 artifacts/public-resources-20261001/malecns-synaptic-partners/catalog.json +9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64 artifacts/public-resources-20261001/malecns-synaptic-partners/exclusions.jsonl.gz +cfe2adcc93576eeea4100b847016bd5484338f449d4755dc7071c4c621d4d6df artifacts/public-resources-20261001/malecns-synaptic-partners/members.jsonl.gz +a507fb9917a63f6221d97780727831735bcf419bb6d36b17546f2be04e8f6b6b artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000000.bin +1d804d88517d49483b02b6136f155730bc886939872208dfe9afadc9d4ae154c artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000001.bin +506edaf9d3b21358da114e736e36eb2467d9e465e02e22b9844e2ef6d1125606 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000002.bin +a49499b604f9769bea207ec2ec73ca65cc692389cf093eb2b206f8f355a40883 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000003.bin +cb0d6ee2cd988a45ac198653aa01883d79b62f178ce68284f66633f89623d05f artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000004.bin +33736340ba66093bc66c94981e517c223e46b6853d3b688f609abd6656c1b64a artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000005.bin +1cec62f5de3779beddc26800d99a8e0263c171cf3a0796a8775e083ad72a5267 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000006.bin +ff9ca8cb58c6566ab39b955649bd599919f93f65d241979f78852ba6bd45f465 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000007.bin +c2710524d019452db8832dbe8f258fcca38bea899400342056f2646a75c1540d artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000008.bin +ccdffd7293b05ed912e3acc749f8ed8c7769c135c4fa20db2f4fef4783157c6e artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000009.bin +ebccfe2d5b5c3b60ef0b5bb9503d7849d2693ec82138ac937a585eef1654dd6b artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000010.bin +66f265f69bc110d28e679e0aa6390cdc28cff00cafc863a9055acd91daea8b66 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000011.bin +f9e3084ccee597a8d6163dbf8452a53a5f74ee8bd2c26e0c7017be7d33ebf562 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000012.bin +d07691bd973949900c41fb4c2e4cc4d6b10eeef256ff8b128fc5dbfadd875d1c artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000013.bin +ac78fa1d2882bbee5727993d29a7bce7f2a163ad6d8d74125b98b7a0c09c4c76 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000014.bin +b2b14acffeff84cdcc8c4cac4b1725eb63666f67c4aa42e324743aad471251d2 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000015.bin +5c903aeb8cf971578901c19e5656143e66ed34e5b39207f11a811652f99ec8b2 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000016.bin +0f249896dd016c094e02a7e031d381835536add9f48d34a2d71085f79fdcb988 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000017.bin +3124cdac2b3cbd389e7d1970be7ab67ebeb420290bb19901fa65a75410cf86ee artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000018.bin +178eb19d998fd2196b60820fcc8b31ddc250163c4df0d1502f7b4b99d98cd469 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000019.bin +fa6b1a53f097da8386bb68af7ce3cc30f03278a1f4d8f7239808b201cd7a749c artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000020.bin +131d6da773eee65ca0f1c7428c08482f79221081aacdee26ec0007459978ab16 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000021.bin +8d1154d7162a57d0f57468d504b8f130772ef8559eb841d99d00bac02405535c artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000022.bin +d797d536a090d75a979e142e8b3d7a253692ba4f279582c3dbbcf574e94642fd artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000023.bin +e28242563a376b4edecda075b9ba24ff1f7c372321ea5820bc362be6bddfa3dd artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000024.bin +6d66b8a69f3c6c1ef5fd2f6dd635a1d405fb6999adb28fb51bf376fbf91ad292 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000025.bin +f4da405b1b1834faf55e94c49e557ecffbbd3455104d3d3d956bf23da6e74550 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000026.bin +bd88c43e8e8f27b6d40d17eb7b2b43fc33b09fb2b2a49eb089a59daabcaa1483 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000027.bin +087c13ee0798fb19382ecf652512b59d8bc4e0092ef1bd24fec6bc638475cb68 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000028.bin +026226ebc7d0e57df8871078cfe878c6464ad5abd676face2e0d35c8e736807b artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000029.bin +94a6b0ad920335163651eac7b016ff3e918680c9108a28a270dc28092f322fc3 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000030.bin +b433bd088cb2bf076e962192be72700ff6ba6127b357bf0e7f5793e6a8edba56 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000031.bin +01991f0a6738ade443755b67a5ad3dccc07ff6ac70a1553fe671ad6560b15909 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000032.bin +11c0f36233a8b8256139235f57acef96297180946e0ad6ff7645f61fe4c79559 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000033.bin +13c2d2d78eb40c7324d9bc42cabe17a5f60dca49e6f5fe5fb17c4960edbec039 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000034.bin +ab813823e7faa5c4f972c8fe774695d90dc0c778115afd1420c1d40897a152b0 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000035.bin +c1c5f242a17d885118a4c601b8b233632c53355916584c4b9fc600e0c3115ff2 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000036.bin +a65e7d1a0ed2a2b3320e2af65ae72b2f523298f59f05f9ba917c0d2ba57fe528 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000037.bin +47605ee88b47821758f28b25b3912c25397fd32239c972243004d14457f72c82 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000038.bin +2290a53b9cfffaa1a0ebb6cab41ec195c3d16c1d1b347941d21e4fe8f9998627 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000039.bin +256844cea01953996a0ac87f18979cf6d35ed56786a5485f48ad2cb3c1360ece artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000040.bin +3dc3f7b6d3303d91e350057dc27ecf0d02b857d33d8eaa2eef3a4bfe7f40eeab artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000041.bin +def2c14f8c533dc0baf4426ff32de64e2f26272403462d3ed014b2b74b3fb52d artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000042.bin +6110a1367894ddd26909ddca5c4568f6bb5545b4468e40811b02c3a696b3f151 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000043.bin +b0742985cb8f65d244b9ce49cb14f777d0daee4d75b79193d73f94dd2fc50345 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000044.bin +1d8671e30380134313dedac85e6ea51a47ff7de3ba9b5f235208c913a3d28672 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000045.bin +3157bce6ca069dada4f95ca8149a0ca431b72423bb2a2c182409b72c1b143b80 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000046.bin +c00cf2634c0f50c1abe4502192d541ff6bd9169acca2d6bc8fe50100efcff9bd artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000047.bin +fd836db27d1f3906cf6514596cbdeab7290643660614ad7e449ac95d79bd0082 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000048.bin +05d52812c5b77ff9a3441a5e72fe7ed0ceb6d236981b2d4cc85c98ce91d866e8 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000049.bin +018ba52c09e1105bbf2c828cac95fd544a94ce7b464c8000d1a6c9609e3cf0dc artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000050.bin +c18f6dff39bb44a210f3e05281a8780f9130d83680cd1d3ad4456335f25b9c0a artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000051.bin +c888efc1ef75dd48c41bb2ec18cc4d223b5a12f3a7fe83a0abff6c99ebf1407c artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000052.bin +6f9cd36795720489c8ef52e600394eb92fc8d4d9dcb5049bfcc89914acfa20af artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000053.bin +90421f2d11d14f8004c592664921437ff64001cfe929e6de0bcbd0e24e9610ee artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000054.bin +73a1a0eb0b473e842e5bae81331257ef89090b9af6538676375bb5757ae3c589 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000055.bin +7b4fb640cc128ac0438186012b622db4246359cdf098c3e874e1af5b4add28f1 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000056.bin +acd914306dce998276452979904e04d405a492a8c81340f209f3224def906722 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000057.bin +f15627615ef7579d01f21e5a35c321bbc6599d66847e11e37440c12dbfb7b676 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000058.bin +df6d02884bb8b3c313b279cb1f63f00c2ebc39340f6a298b17be6a1d4b9b5fc1 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000059.bin +3f0a9827926d381ef0eb09569de9c133a24f88b6c4e2e07bbf582e7259a261b3 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000060.bin +2419ad28f6dce0b26b34432f6f9933a7850755a68c1d19191cc13e590bc3689f artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000061.bin +03b39ee51f20fa8d801e0b6606fda6c1be8625de19a30cc28efa4e60a52ef1be artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000062.bin +bbb58825d3b6b18f9c120d3abaf8729f694ddf8e3d00ea7cd831bdc9ae3f63fb artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000063.bin +835c49d7ad41c233d0e20e59f5ad87deb31c7dff3662db996a52f3c60a4ca616 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000064.bin +53129c4320559e8dc1959a8fdcd7d756f68b2d82acc8ca6681f4aa691969f906 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000065.bin +6a03395293e454e95163444c04a77961bfde9f71daf902911906566b7df4eab1 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000066.bin +419e60c582a4c8f119f9a958f33ef88164fa334c38e7c47163f03d761d89e4dd artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000067.bin +26222b3988412e52c10bd2a8cddd5b0a54409f16aa5e2367f9e6c3606760221d artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000068.bin +661e862287f8283794e812d5484dfc77651e6a9c44be2122f10b25e702dbf52d artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000069.bin +71de14c9a34cfed409f74d825c88a8b473cd509b1dd2619fe8d5a11da131bee0 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000070.bin +7c8b878109bae512ed7f411055d974e0669a31da88b561e87e4fbacbadb96375 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000071.bin +c75a839c07a242aa09dc0603b46cefd87ac79bfc6776dd4707f425f4afd143df artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000072.bin +af98e9729afc0d1406b7531e135ab4d932c34f9c38df81636026fdfe461fc400 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000073.bin +8de906c2956b66594902536069870c6f4bfaa8221cae561a6f7a00ea9b3ab338 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000074.bin +98714008fee0cffd305c8e7b45d74d224033d013f7ea7a1759eb160ca0fff2f1 artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000075.bin +a097651a8f61009ec99a8bf6d1c3fcfaebd65fae16d6b0a14ebc2db841ae53cb artifacts/public-resources-20261001/pack-summary.json +a20a61821c504e8315171a5fd14afbac011b934709af344045175bdda9fcba71 artifacts/public-resources-20261001/plan.json +95c69e6e9e07625a1f9b273db67aa9ab480c66bb3bbb273c39c430aeedb9b910 artifacts/public-resources-20261001/shiu-author-model-source/catalog.json +9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64 artifacts/public-resources-20261001/shiu-author-model-source/exclusions.jsonl.gz +2907be4f7d1a8f1017f91bda6e5ead381b8c67b85498f5378765d696f89d4b0c artifacts/public-resources-20261001/shiu-author-model-source/members.jsonl.gz +4da352d80e4bf251dfec771935da93f5a9f3cef302c85e90991fafa14a072e2b artifacts/public-resources-20261001/shiu-author-model-source/payload-000000.bin +bd824a656235ba08a35a67ad6d865467a946145cf985677226412280380939fc artifacts/public-resources-20261001/visualpathways/catalog.json +9c029262724580ef20981316c6f7e9c99d345e1171067f16c5d580c742809a8c artifacts/public-resources-20261001/visualpathways/exclusions.jsonl.gz +335401c3f6cb5b3868b899599bcd7b439c1983a627d97a598a95e9c8d44ad81c artifacts/public-resources-20261001/visualpathways/members.jsonl.gz +7f8bb35dcb565c16ff1bf642e079c54c71e27e05cccaa5915c1d1e3c9e7d0700 artifacts/public-resources-20261001/visualpathways/payload-000000.bin +7181f79ec2615a84f33b394abf22454b72d2fddfb0e40e9c5e1590fe1ba64d7a artifacts/public-resources-20261001/visualpathways/payload-000001.bin +9dc076afd8cd8ebbbdda6f1ef24a41598e5db9fb0a98de8b5b765b4b0a8d2934 artifacts/public-resources-20261001/visualpathways/payload-000002.bin +be03beac2472e6dc76a5705440296f88a8f6e15ea43f541df402c7b6c85cfdc6 artifacts/public-resources-20261001/visualpathways/payload-000003.bin +0c801486169d0594471518a75b11b040acb1a2dd8904e9365fa7b7b667fc4a09 artifacts/public-resources-20261001/visualpathways/payload-000004.bin +4f387b9e6b47f06871ce1b32e265b3a1ae2d78e06d7955a3fa8ed7cfc1d2a0a7 artifacts/public-resources-20261001/visualpathways/payload-000005.bin +edb0ffa74e646712485a0d5fd2819ef14345c637beeaa5ca811ae3e71a06ea82 artifacts/public-resources-20261001/visualpathways/payload-000006.bin +e83a32a0d9d5c86ee12d9910bfc0214fdf393b253d022e33fe3228b8ec6828bd registry/publication-20261001/README.md +d5e6cfab8fd157a9adf25a131fcf432887944cad65fa0aee68878baff8a819bd registry/publication-20261001/fresh-content-verification.json +b5f195a4d16e01e033b995072bbc4e28adfb4bd9d9656763f4fc58578cb891a0 registry/publication-20261001/fresh-download-verification.json +d1864b3ba92dfcda9ee1cee78af0fdcc55815238cfaef5b53f5ff90f83edd148 registry/publication-20261001/lan-roundtrip-smoke.json +b70fce68c61a7b1ccacf5fc55f91a36c9d4a76fdda51c9456098b296d8cf5f91 registry/publication-20261001/lfs-smoke-receipt.json +ba475fa8de2011e7c24ce36e602a4d4d3b9d1747cc564d439e279d3c8c104d8b registry/publication-20261001/local-content-verification.json +a20a61821c504e8315171a5fd14afbac011b934709af344045175bdda9fcba71 registry/publication-20261001/plan.json +1f051dcf90da06970503376f1228c174ca38c30d280ee5d8e43c4756294f1916 registry/publication-20261001/publication-manifest.json +4e47c0e8920970beac7765e038dc7f66c441a853349800556031503866c15d96 registry/publication-20261001/source-guard-after-pack.json +b2fcfc66501e2d095a1fe3a178a97aa12e6e6b44dd4660b74af0b1826b75b150 registry/publication-20261001/source-guard-before.json +3ed158d80af05736943e524ae001be69720ab0e8c05d2deac7f1c8308d7acd40 registry/publication-20261001/source-guard-final.json +4ec43be10d8ebc439c1033693f41c8c5c03efbc82856c3a1699bcf8fddd4b200 registry/publication-20261001/tool-tests.json +2308284e203c672de92a8924249815aa9999e50b67493a4129835b5577f3f33b tools/lfs-publication/capture_source_guard.py +abc2b83e8f4b8f7b82ad4e46db8d9fc3329c16b5b525f7c9e233ef77aef62211 tools/lfs-publication/download_verify.py +21241d6a75d84108e720b4a051504fff00158b327f15c0ee06e5c57c6ad1c263 tools/lfs-publication/lan_lfs_transfer.py +d90e113d045dcf0862a93c5b87c383c3ebeafc5ef45c4f1b9348fe49d257dd36 tools/lfs-publication/publish_archives.py +4bad3fe10fdc709cacb4f6faed7c6003bee8a35e23fc25366ad918caf33fd1cb tools/lfs-publication/run_lan_smoke.py +ee5063cca46c67f63cf6eb6648a1fe57d2c7f47e44ed35a4ee40f3927afd9735 tools/lfs-publication/seal_publication_manifest.py +87c4aa51ebc8ae79f1f31bd23a1865186fc06ffa0467bed31f43c464a37def0e tools/lfs-publication/test_download_verify.py +5f77a0d61fada6a4c1cb20d6bda113fadbc8c0bd0acbab7ddeb7dcd90e55ac15 tools/lfs-publication/test_lan_lfs_transfer.py +82e62e0346e6613d71962b66ccca016e669bb4df2537d0743a3067e425ef5054 tools/lfs-publication/test_publish_archives.py +99ad03c223064b9c6711fbb68d84da18d9abf80e6b3b311b7aaebfb6446a37ea tools/lfs-publication/test_verify_publication.py +533df50e615c530ad7e10f1351f3bf89f672c6531176dc758e18069796543ea3 tools/lfs-publication/verify_publication.py diff --git a/registry/publication-20261001/fresh-content-verification.json b/registry/publication-20261001/fresh-content-verification.json new file mode 100644 index 0000000..49282a9 --- /dev/null +++ b/registry/publication-20261001/fresh-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/verification", + "head": "6e33e05ede21b98c0088139e9bc4c049498c4d41", + "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/verification/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/verification/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/verification/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/verification/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/verification/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/verification/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/verification/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/verification/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/verification/artifacts/public-resources-20261001/pack-summary.json", + "sha256": "a097651a8f61009ec99a8bf6d1c3fcfaebd65fae16d6b0a14ebc2db841ae53cb" + }, + "pass_all": true, + "payload_root": "/tmp/malecns-lfs-publication-20261001-bI1u07/verification/artifacts/public-resources-20261001", + "plan": { + "bytes": 7181, + "path": "/tmp/malecns-lfs-publication-20261001-bI1u07/verification/artifacts/public-resources-20261001/plan.json", + "sha256": "a20a61821c504e8315171a5fd14afbac011b934709af344045175bdda9fcba71" + }, + "receipt": "/tmp/malecns-lfs-publication-20261001-bI1u07/verification/registry/publication-20261001/fresh-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:47:22.784318+00:00" +} diff --git a/registry/publication-20261001/fresh-download-verification.json b/registry/publication-20261001/fresh-download-verification.json new file mode 100644 index 0000000..1f471ed --- /dev/null +++ b/registry/publication-20261001/fresh-download-verification.json @@ -0,0 +1,83 @@ +{ + "aggregate_inventory_sha256": "88814458c772fc0e5b1708bc05e6c478097fc10b55271a83d538855ccfa81c84", + "cache": { + "after": { + "bytes": 9817172974, + "objects": 167 + }, + "before": { + "bytes": 0, + "objects": 0 + }, + "initially_absent": true, + "path": "/tmp/malecns-lfs-publication-20261001-bI1u07/verification/.git/lfs-public-full-20261001" + }, + "checkout": "/tmp/malecns-lfs-publication-20261001-bI1u07/verification", + "concurrent_transfers": 2, + "content_receipt": { + "bytes": 11051, + "path": "/tmp/malecns-lfs-publication-20261001-bI1u07/verification/registry/publication-20261001/fresh-content-verification.json", + "sha256": "d5e6cfab8fd157a9adf25a131fcf432887944cad65fa0aee68878baff8a819bd" + }, + "exclude": "", + "expected_commit": "6e33e05ede21b98c0088139e9bc4c049498c4d41", + "explicit_pull_remote": "origin", + "fresh_download_proven": true, + "fsck_dry_run_exit_code": 0, + "head": "6e33e05ede21b98c0088139e9bc4c049498c4d41", + "historical_inventory": { + "bytes": 12285260, + "path": "/data/digital-drosophila/registry/snapshots/bootstrap-20260929/files.jsonl.gz", + "sha256": "6f186112e6102f2f7969de7442fa7ee4432200a3678586cfc4e10c490b31bca4", + "status": "PARTIAL_CURRENT_MEMBER_COVERAGE" + }, + "include": "artifacts/**", + "lan_adapter": { + "configuration_scope": "repository-local only", + "enabled": true, + "source": { + "bytes": 16661, + "path": "/tmp/malecns-lfs-publication-20261001-bI1u07/verification/tools/lfs-publication/lan_lfs_transfer.py", + "sha256": "21241d6a75d84108e720b4a051504fff00158b327f15c0ee06e5c57c6ad1c263" + }, + "temporary_download_directory": "/tmp/malecns-lfs-publication-20261001-bI1u07/verification/.git/lfs/lan-transfer-tmp" + }, + "learning_pass_claimed": false, + "lfs_endpoint_overrides_refused": true, + "origin": "ssh://git@192.168.10.31:2222/qishizhe/digital-drosophila.git", + "original_project_write_requested": false, + "pass_all": true, + "pull_exit_code": 0, + "schema": "lfs-publication-download-verification-v1", + "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.", + "started_utc": "2026-09-30T19:44:32.763233+00:00", + "tool_sources": { + "download_verify.py": { + "bytes": 12992, + "path": "/tmp/malecns-lfs-publication-20261001-bI1u07/verification/tools/lfs-publication/download_verify.py", + "sha256": "abc2b83e8f4b8f7b82ad4e46db8d9fc3329c16b5b525f7c9e233ef77aef62211" + }, + "lan_lfs_transfer.py": { + "bytes": 16661, + "path": "/tmp/malecns-lfs-publication-20261001-bI1u07/verification/tools/lfs-publication/lan_lfs_transfer.py", + "sha256": "21241d6a75d84108e720b4a051504fff00158b327f15c0ee06e5c57c6ad1c263" + }, + "publish_archives.py": { + "bytes": 24578, + "path": "/tmp/malecns-lfs-publication-20261001-bI1u07/verification/tools/lfs-publication/publish_archives.py", + "sha256": "d90e113d045dcf0862a93c5b87c383c3ebeafc5ef45c4f1b9348fe49d257dd36" + }, + "verify_publication.py": { + "bytes": 13711, + "path": "/tmp/malecns-lfs-publication-20261001-bI1u07/verification/tools/lfs-publication/verify_publication.py", + "sha256": "533df50e615c530ad7e10f1351f3bf89f672c6531176dc758e18069796543ea3" + } + }, + "tool_versions": { + "git": "git version 2.34.1", + "git_lfs": "git-lfs/3.8.0 (GitHub; linux amd64; go 1.27.0; git aece9221)", + "python": "3.10.12", + "zstd": "*** zstd command line interface 64-bits v1.4.8, by Yann Collet ***" + }, + "verified_utc": "2026-09-30T19:47:22.969574+00:00" +} diff --git a/registry/publication-20261001/publication-manifest.json b/registry/publication-20261001/publication-manifest.json new file mode 100644 index 0000000..e4921c0 --- /dev/null +++ b/registry/publication-20261001/publication-manifest.json @@ -0,0 +1,1035 @@ +{ + "aggregate_inventory_sha256": "88814458c772fc0e5b1708bc05e6c478097fc10b55271a83d538855ccfa81c84", + "branch": "codex/lfs-public-resources", + "data_commit": "6e33e05ede21b98c0088139e9bc4c049498c4d41", + "files": [ + { + "bytes": 406, + "path": ".gitattributes", + "sha256": "aef53fc7554c50e0a456e58105d683a1dd3323c78cdde822b32eae5ba88b9b6a" + }, + { + "bytes": 564, + "path": ".gitignore", + "sha256": "4e51bf524b3b0e696b5dc0319b2bbcd92cac456bad72971c629fd7d42c6730aa" + }, + { + "bytes": 2540, + "path": "NOTICE.md", + "sha256": "09a67fa17c5b5a3c4c71cfd6b1789aac517064e3ca160b6fbf6f3bf038d83a73" + }, + { + "bytes": 263, + "path": "artifacts/lfs-smoke/publication-probe.bin", + "sha256": "93e0e6c4ca4fdc123c21b859ba97d8bd73670eb9c90d04ce9a431d822b5393c5" + }, + { + "bytes": 2041, + "path": "artifacts/public-resources-20261001/celltype-explorer/catalog.json", + "sha256": "4dc6be6091b273312a1dd61f621654f05e4c12118bdd13c22905d588e378889c" + }, + { + "bytes": 144, + "path": "artifacts/public-resources-20261001/celltype-explorer/exclusions.jsonl.gz", + "sha256": "c1bca109b61e53327fa7e01128a411d8ea328972593168c3ad6e1202dfdddc9c" + }, + { + "bytes": 421593, + "path": "artifacts/public-resources-20261001/celltype-explorer/members.jsonl.gz", + "sha256": "8a51d3b4138bad12a520f8d1a12d54673416017d15fd1b1bcc49ed385da005bb" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/celltype-explorer/payload-000000.bin", + "sha256": "6f5830463b8a0077ae89e550ca45275d57cf7e81813c42bf66f89d13a42c03ee" + }, + { + "bytes": 10862890, + "path": "artifacts/public-resources-20261001/celltype-explorer/payload-000001.bin", + "sha256": "6b80b0133af06279bd30561f35042b679bd392b9236ee519d1e7ed9c4e85fb6a" + }, + { + "bytes": 2014, + "path": "artifacts/public-resources-20261001/door-data/catalog.json", + "sha256": "6d0fcbe747dae7b38bcf335572b173e0112f6aabd10aa0040b84cfd81a8a390c" + }, + { + "bytes": 147, + "path": "artifacts/public-resources-20261001/door-data/exclusions.jsonl.gz", + "sha256": "82627a482fd6adfc3abf4f83a30158fd8371b4532f425f7eb3b03044eb7e1367" + }, + { + "bytes": 9486, + "path": "artifacts/public-resources-20261001/door-data/members.jsonl.gz", + "sha256": "ef13db49577b3b3d1c7c31aab117d911a2decc5a80ead66b6a350c43d16374b4" + }, + { + "bytes": 901984, + "path": "artifacts/public-resources-20261001/door-data/payload-000000.bin", + "sha256": "64d415a1ea9f5c2fe09005ce1c2bb27eb45510fad27ad3c39cf0001e6f525fd1" + }, + { + "bytes": 3617, + "path": "artifacts/public-resources-20261001/malecns-processed/catalog.json", + "sha256": "e1e42f654cb005d2f073d4e84c808af50f50c3feeb9cbcb0b0c1c51746bfdb47" + }, + { + "bytes": 219, + "path": "artifacts/public-resources-20261001/malecns-processed/exclusions.jsonl.gz", + "sha256": "0909f401f73ca15301ea2be92a5e7c66cf79d9d4f8bbe5449f82c2980d6d3e80" + }, + { + "bytes": 3639, + "path": "artifacts/public-resources-20261001/malecns-processed/members.jsonl.gz", + "sha256": "fe399bea661cdd018e53a5ea58bc46a64d2f94fb09d1dec40f8a956789204627" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-processed/payload-000000.bin", + "sha256": "a65619004cdc36e594bdca344d1fe51ac86fb719159f70a2ba0fb21c763f9c04" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-processed/payload-000001.bin", + "sha256": "cca9eedbc44b20be736317745ee12e8c06bf0e1aafc7815b74bc6aa27cef5be5" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-processed/payload-000002.bin", + "sha256": "e395b23867e74b7579aed8eeb927e373c86d77433962a0f89ac198aeca4f8470" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-processed/payload-000003.bin", + "sha256": "e47d83eba2875f963add02ab697cb6386dd8fe4a5f33b96db5a321986a276774" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-processed/payload-000004.bin", + "sha256": "4d4bdff46071f05c29ac34cd9081204739317bef5ab862d612d2c7a82c3d5bca" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-processed/payload-000005.bin", + "sha256": "4f82611c41e868faa6ea06d7bd275df90f712e3f5eb14296117e39c3bf6c95c0" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-processed/payload-000006.bin", + "sha256": "4cbfb164c194db8c54eadef4d039240d98b0f5be8e20e4005be08bd2d2f6ab5d" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-processed/payload-000007.bin", + "sha256": "9ba4adfe64d73d0ceb249ab25215734f58b0d8b38d11f22676fd93f68e83df68" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-processed/payload-000008.bin", + "sha256": "8f388376c6e9d3b7abaff219b00d669ea88db1bf5cd48381db9354598102b345" + }, + { + "bytes": 31352355, + "path": "artifacts/public-resources-20261001/malecns-processed/payload-000009.bin", + "sha256": "e1ac638f1d640de9e85b82d9526d6f729f78239e66c5c024e0037144adf7f003" + }, + { + "bytes": 4082, + "path": "artifacts/public-resources-20261001/malecns-raw-core/catalog.json", + "sha256": "8a7ea9abe5f75ce31318d207a1dbb491d5e151af27bd607dc1b59fb29d4aacf8" + }, + { + "bytes": 135, + "path": "artifacts/public-resources-20261001/malecns-raw-core/exclusions.jsonl.gz", + "sha256": "887492a8f75af6be4e71b6f5aa12506cef3d8e3a7363b3c6a50064da93b9b4a1" + }, + { + "bytes": 1009, + "path": "artifacts/public-resources-20261001/malecns-raw-core/members.jsonl.gz", + "sha256": "e963adede9d937effbf5519ae9717938a2b3324aecc1c28338800007f7003404" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-raw-core/payload-000000.bin", + "sha256": "5527fc251d23c23209cf16c8831aedefcceb6d1e927a4eaf9ebed182fd5481ff" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-raw-core/payload-000001.bin", + "sha256": "4793d00b3d6b3506d16e21f3f3775bc70c23c70cd5be03b6733350328519a3c0" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-raw-core/payload-000002.bin", + "sha256": "a78930db08134f72e97306df7256bd8b0b533611fe9a08459f1c6289eb47624e" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-raw-core/payload-000003.bin", + "sha256": "54fc4943c3d644e1765a7cbdacf0629db1ddefde4f17035729417242930064a9" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-raw-core/payload-000004.bin", + "sha256": "7bb2deb3dd7d3f7064c096c8915bb3eff7f880a009628f6ee6c5e14dce939668" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-raw-core/payload-000005.bin", + "sha256": "d1aac9ec93c77f901c98c7343fd3713c746faf855096e9d7e6da897491c513df" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-raw-core/payload-000006.bin", + "sha256": "29f40919b04405609643b3a5a2beb749aacbf5525cf90a60d75fa3f0a283435e" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-raw-core/payload-000007.bin", + "sha256": "b3936a86da8636e5ba6d7a25f4d8d3b34eadc769e74817d67c7aefe2e9879e68" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-raw-core/payload-000008.bin", + "sha256": "47e2e7cfde2bc01d41de53ba933683faf4fa4dc57c3d80f07d8edb75dc1916d3" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-raw-core/payload-000009.bin", + "sha256": "ab37af43abeeb3434b0660fb5bfb185e7c0db07916b2a2233a2db083f66ea2b9" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-raw-core/payload-000010.bin", + "sha256": "bdbf00683b8940fb513fef121559e8e449d84972e03df2d4698d06e0dcc28efa" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-raw-core/payload-000011.bin", + "sha256": "a3ee35cae393b29d0366aebcad7f63a8ad578b61e0a93e773595dfdfe6848bbe" + }, + { + "bytes": 28959790, + "path": "artifacts/public-resources-20261001/malecns-raw-core/payload-000012.bin", + "sha256": "7fbe5733e328f5a989fec3ffd78819c62ac53a32e099579492cd82766322e82a" + }, + { + "bytes": 8977, + "path": "artifacts/public-resources-20261001/malecns-swc/catalog.json", + "sha256": "efc330317e2f74272e233634e5652982232ef9d3b6762f8e3cbd9eeaf05487cf" + }, + { + "bytes": 20, + "path": "artifacts/public-resources-20261001/malecns-swc/exclusions.jsonl.gz", + "sha256": "9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64" + }, + { + "bytes": 10023755, + "path": "artifacts/public-resources-20261001/malecns-swc/members.jsonl.gz", + "sha256": "1dcc1bac912889118e2a34211b4c43b2b0af871c8b76b97ede31db88ce67a961" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000000.bin", + "sha256": "1f21099a6411dec6c0b1f5eba48618de749ac6ec7f18b18d7521fe75b7fe32e9" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000001.bin", + "sha256": "a749bcac2abeb5f8621603d81a069a96b63cc5e12dbb87b51744b5838c25bab5" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000002.bin", + "sha256": "8bacba0b7452c99f2a8e57b17f72604671d78faed5dbc39cf800b148a9a3476b" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000003.bin", + "sha256": "0e226842328b68a4ce86bdb612379047c44a535c6d4b5eb8aa97ed0fccccede4" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000004.bin", + "sha256": "19559779bbd8f305c690ccb1c5a2a03b53bdee0e2afe3f6dca1faf2926ae1143" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000005.bin", + "sha256": "f9441d9484184e90d3b962b9b32ef80e8daa1944ca67d11e691fda715eb4908f" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000006.bin", + "sha256": "c022c80fe76fbbe69602755de5ea74b97db9ee56db280d6c9ec863ba3c1ff332" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000007.bin", + "sha256": "12370abe8bbe6fee58be01d6b2204b64c54a7eada3988a367de9451b910ae3e1" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000008.bin", + "sha256": "f7d5d2b8f699f15466e6fabcefc398b21f142d23c5ad173020add2461e32d27e" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000009.bin", + "sha256": "4e70530845d6e86b037cd7dc7d0d7a5bf544263f99893a6836525b92a5b142d4" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000010.bin", + "sha256": "9ce176c8fcaef8671815c5b4f3366c233632be1ac313ab6f351f7f93cd2f0072" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000011.bin", + "sha256": "12f4d9d507494cd85f17583fa9665f20b68f928db1125668d9bfc462fc0f66a5" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000012.bin", + "sha256": "39e8403e3fd8ea71e281034b346da33511d1ec1c236b1f16929113d4cec53e6d" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000013.bin", + "sha256": "979bb9d50a5b44608ce6ace417dec67236072d027fab79cf9b0255ed39c08020" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000014.bin", + "sha256": "b029a7948ae6c23916fcd81c3b9bf1a260f2c9d8659b53b7f5e556384349f21f" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000015.bin", + "sha256": "c26d6139d8e1a51ffabe1a06a13c2061a5928e168a961930d9d195a25b6ab620" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000016.bin", + "sha256": "98b5853bc02c4bd0bf1598fdfd1c52f55628660047fb4977f1f8eaf02e70b603" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000017.bin", + "sha256": "789d6ad66acddd2aaa750d4c27d55be897f0c9a935c0c1837d9e46c2f916d0b3" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000018.bin", + "sha256": "907c4ae7690a13663e8a489ec229f436e329823b7fb1c1e68228338388754ec7" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000019.bin", + "sha256": "c28d51fdf23a630eaf2506276da19d34c609a6b5448afdedd2efea25e4602b06" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000020.bin", + "sha256": "2d1be9e0abfd4604b55bfd0c8e740ee58bb153d126a81aa08126fecdc0057150" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000021.bin", + "sha256": "f9725762b7fb5e0cc5a896c8b63ceb816faa246aeba4a3082b9eaf492cbe97c5" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000022.bin", + "sha256": "72e90497e9e6fbf586e3659d4e023f47a8f3942ac10bce1fe314659f16568160" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000023.bin", + "sha256": "2fd9ba58a4f2acbb5fbbb023cb100a1bcc0079c7c490d25c2c63bd46441aa08e" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000024.bin", + "sha256": "ead438094c5a9d4b5550ebc95ec583d8e7cd1d84b601e549d50c4ab9a5e9818b" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000025.bin", + "sha256": "97b32a95ca08c4b69908c93a7ce40606a9597cd9f2eb47f9447cc4a93cb6eab2" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000026.bin", + "sha256": "6f985c609b0f1f3538b7b7407da46c2983781552cec9e12e5ca9b5ba5d1ceca9" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000027.bin", + "sha256": "7465e4aff8c0ad68fcbb201815828a5198611c18c8fb2cdfdaf4ba7b2a6b2456" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000028.bin", + "sha256": "7a3ba5b63ac70b19e54cce3e9f90038caae01e992fe81a45b7ddb370dcbf125e" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000029.bin", + "sha256": "c9fafa0218befdebb42d19ff7f720e18b392c742ff45e39b64018c41a31a1530" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000030.bin", + "sha256": "aac2f55805490cfa5e42bbd7cc169a83a40132f269d64315ebb2aec6dafc5a96" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000031.bin", + "sha256": "c362980ebf871332f8fc05f5f72ccce8ed13319c596039a960cd0450e7f09a78" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000032.bin", + "sha256": "52272e69c6b23bc0951f6cd4e824c357ccb13d3bb781cd68591a8a5476540229" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000033.bin", + "sha256": "c3ada974de03b55ce956d6af4f5d9238f2e1ab7ad2bd81265eb9a7bf883e65e1" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000034.bin", + "sha256": "7aa8cf11b2d356a45e2608295deeb6443bdcf83427a8b71e6da758e2cfed9e2d" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000035.bin", + "sha256": "0edc84c74eebcc6d1375bfe5e09e8933221b025cfd4ce98539a574c1b26c6cf4" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000036.bin", + "sha256": "ad237a494101cd4a392d0a29406b217673ecdfe1ac999f9ee76bcb99dd449840" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000037.bin", + "sha256": "fa89d550c2b9674ed8e01a1443d355c01cfebae2394a92f21999e09598159249" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000038.bin", + "sha256": "c22cd72daba6848f000d39c6c9e0f500c47c2a97c59bf4d01cb485c4542504af" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000039.bin", + "sha256": "9c3cb5c9db5915ec11ddd25f01c09a68bd493f2fa7e01a2832cf6b13bd034169" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000040.bin", + "sha256": "52f9bf010556a9c231771c36697c257059d1200f42b021811568e5ad8aaa81c8" + }, + { + "bytes": 8813521, + "path": "artifacts/public-resources-20261001/malecns-swc/payload-000041.bin", + "sha256": "3bd8789f041905e31bf669c2e9877dc19e92108dc721fa7db4c6f4a1fea2a850" + }, + { + "bytes": 15171, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/catalog.json", + "sha256": "bdbc0354abdad63a9c256a2841fdf9df4c32258647b8de03d066afc89fa61053" + }, + { + "bytes": 20, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/exclusions.jsonl.gz", + "sha256": "9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64" + }, + { + "bytes": 512, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/members.jsonl.gz", + "sha256": "cfe2adcc93576eeea4100b847016bd5484338f449d4755dc7071c4c621d4d6df" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000000.bin", + "sha256": "a507fb9917a63f6221d97780727831735bcf419bb6d36b17546f2be04e8f6b6b" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000001.bin", + "sha256": "1d804d88517d49483b02b6136f155730bc886939872208dfe9afadc9d4ae154c" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000002.bin", + "sha256": "506edaf9d3b21358da114e736e36eb2467d9e465e02e22b9844e2ef6d1125606" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000003.bin", + "sha256": "a49499b604f9769bea207ec2ec73ca65cc692389cf093eb2b206f8f355a40883" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000004.bin", + "sha256": "cb0d6ee2cd988a45ac198653aa01883d79b62f178ce68284f66633f89623d05f" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000005.bin", + "sha256": "33736340ba66093bc66c94981e517c223e46b6853d3b688f609abd6656c1b64a" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000006.bin", + "sha256": "1cec62f5de3779beddc26800d99a8e0263c171cf3a0796a8775e083ad72a5267" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000007.bin", + "sha256": "ff9ca8cb58c6566ab39b955649bd599919f93f65d241979f78852ba6bd45f465" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000008.bin", + "sha256": "c2710524d019452db8832dbe8f258fcca38bea899400342056f2646a75c1540d" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000009.bin", + "sha256": "ccdffd7293b05ed912e3acc749f8ed8c7769c135c4fa20db2f4fef4783157c6e" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000010.bin", + "sha256": "ebccfe2d5b5c3b60ef0b5bb9503d7849d2693ec82138ac937a585eef1654dd6b" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000011.bin", + "sha256": "66f265f69bc110d28e679e0aa6390cdc28cff00cafc863a9055acd91daea8b66" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000012.bin", + "sha256": "f9e3084ccee597a8d6163dbf8452a53a5f74ee8bd2c26e0c7017be7d33ebf562" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000013.bin", + "sha256": "d07691bd973949900c41fb4c2e4cc4d6b10eeef256ff8b128fc5dbfadd875d1c" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000014.bin", + "sha256": "ac78fa1d2882bbee5727993d29a7bce7f2a163ad6d8d74125b98b7a0c09c4c76" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000015.bin", + "sha256": "b2b14acffeff84cdcc8c4cac4b1725eb63666f67c4aa42e324743aad471251d2" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000016.bin", + "sha256": "5c903aeb8cf971578901c19e5656143e66ed34e5b39207f11a811652f99ec8b2" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000017.bin", + "sha256": "0f249896dd016c094e02a7e031d381835536add9f48d34a2d71085f79fdcb988" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000018.bin", + "sha256": "3124cdac2b3cbd389e7d1970be7ab67ebeb420290bb19901fa65a75410cf86ee" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000019.bin", + "sha256": "178eb19d998fd2196b60820fcc8b31ddc250163c4df0d1502f7b4b99d98cd469" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000020.bin", + "sha256": "fa6b1a53f097da8386bb68af7ce3cc30f03278a1f4d8f7239808b201cd7a749c" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000021.bin", + "sha256": "131d6da773eee65ca0f1c7428c08482f79221081aacdee26ec0007459978ab16" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000022.bin", + "sha256": "8d1154d7162a57d0f57468d504b8f130772ef8559eb841d99d00bac02405535c" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000023.bin", + "sha256": "d797d536a090d75a979e142e8b3d7a253692ba4f279582c3dbbcf574e94642fd" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000024.bin", + "sha256": "e28242563a376b4edecda075b9ba24ff1f7c372321ea5820bc362be6bddfa3dd" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000025.bin", + "sha256": "6d66b8a69f3c6c1ef5fd2f6dd635a1d405fb6999adb28fb51bf376fbf91ad292" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000026.bin", + "sha256": "f4da405b1b1834faf55e94c49e557ecffbbd3455104d3d3d956bf23da6e74550" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000027.bin", + "sha256": "bd88c43e8e8f27b6d40d17eb7b2b43fc33b09fb2b2a49eb089a59daabcaa1483" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000028.bin", + "sha256": "087c13ee0798fb19382ecf652512b59d8bc4e0092ef1bd24fec6bc638475cb68" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000029.bin", + "sha256": "026226ebc7d0e57df8871078cfe878c6464ad5abd676face2e0d35c8e736807b" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000030.bin", + "sha256": "94a6b0ad920335163651eac7b016ff3e918680c9108a28a270dc28092f322fc3" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000031.bin", + "sha256": "b433bd088cb2bf076e962192be72700ff6ba6127b357bf0e7f5793e6a8edba56" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000032.bin", + "sha256": "01991f0a6738ade443755b67a5ad3dccc07ff6ac70a1553fe671ad6560b15909" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000033.bin", + "sha256": "11c0f36233a8b8256139235f57acef96297180946e0ad6ff7645f61fe4c79559" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000034.bin", + "sha256": "13c2d2d78eb40c7324d9bc42cabe17a5f60dca49e6f5fe5fb17c4960edbec039" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000035.bin", + "sha256": "ab813823e7faa5c4f972c8fe774695d90dc0c778115afd1420c1d40897a152b0" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000036.bin", + "sha256": "c1c5f242a17d885118a4c601b8b233632c53355916584c4b9fc600e0c3115ff2" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000037.bin", + "sha256": "a65e7d1a0ed2a2b3320e2af65ae72b2f523298f59f05f9ba917c0d2ba57fe528" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000038.bin", + "sha256": "47605ee88b47821758f28b25b3912c25397fd32239c972243004d14457f72c82" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000039.bin", + "sha256": "2290a53b9cfffaa1a0ebb6cab41ec195c3d16c1d1b347941d21e4fe8f9998627" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000040.bin", + "sha256": "256844cea01953996a0ac87f18979cf6d35ed56786a5485f48ad2cb3c1360ece" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000041.bin", + "sha256": "3dc3f7b6d3303d91e350057dc27ecf0d02b857d33d8eaa2eef3a4bfe7f40eeab" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000042.bin", + "sha256": "def2c14f8c533dc0baf4426ff32de64e2f26272403462d3ed014b2b74b3fb52d" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000043.bin", + "sha256": "6110a1367894ddd26909ddca5c4568f6bb5545b4468e40811b02c3a696b3f151" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000044.bin", + "sha256": "b0742985cb8f65d244b9ce49cb14f777d0daee4d75b79193d73f94dd2fc50345" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000045.bin", + "sha256": "1d8671e30380134313dedac85e6ea51a47ff7de3ba9b5f235208c913a3d28672" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000046.bin", + "sha256": "3157bce6ca069dada4f95ca8149a0ca431b72423bb2a2c182409b72c1b143b80" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000047.bin", + "sha256": "c00cf2634c0f50c1abe4502192d541ff6bd9169acca2d6bc8fe50100efcff9bd" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000048.bin", + "sha256": "fd836db27d1f3906cf6514596cbdeab7290643660614ad7e449ac95d79bd0082" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000049.bin", + "sha256": "05d52812c5b77ff9a3441a5e72fe7ed0ceb6d236981b2d4cc85c98ce91d866e8" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000050.bin", + "sha256": "018ba52c09e1105bbf2c828cac95fd544a94ce7b464c8000d1a6c9609e3cf0dc" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000051.bin", + "sha256": "c18f6dff39bb44a210f3e05281a8780f9130d83680cd1d3ad4456335f25b9c0a" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000052.bin", + "sha256": "c888efc1ef75dd48c41bb2ec18cc4d223b5a12f3a7fe83a0abff6c99ebf1407c" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000053.bin", + "sha256": "6f9cd36795720489c8ef52e600394eb92fc8d4d9dcb5049bfcc89914acfa20af" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000054.bin", + "sha256": "90421f2d11d14f8004c592664921437ff64001cfe929e6de0bcbd0e24e9610ee" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000055.bin", + "sha256": "73a1a0eb0b473e842e5bae81331257ef89090b9af6538676375bb5757ae3c589" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000056.bin", + "sha256": "7b4fb640cc128ac0438186012b622db4246359cdf098c3e874e1af5b4add28f1" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000057.bin", + "sha256": "acd914306dce998276452979904e04d405a492a8c81340f209f3224def906722" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000058.bin", + "sha256": "f15627615ef7579d01f21e5a35c321bbc6599d66847e11e37440c12dbfb7b676" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000059.bin", + "sha256": "df6d02884bb8b3c313b279cb1f63f00c2ebc39340f6a298b17be6a1d4b9b5fc1" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000060.bin", + "sha256": "3f0a9827926d381ef0eb09569de9c133a24f88b6c4e2e07bbf582e7259a261b3" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000061.bin", + "sha256": "2419ad28f6dce0b26b34432f6f9933a7850755a68c1d19191cc13e590bc3689f" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000062.bin", + "sha256": "03b39ee51f20fa8d801e0b6606fda6c1be8625de19a30cc28efa4e60a52ef1be" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000063.bin", + "sha256": "bbb58825d3b6b18f9c120d3abaf8729f694ddf8e3d00ea7cd831bdc9ae3f63fb" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000064.bin", + "sha256": "835c49d7ad41c233d0e20e59f5ad87deb31c7dff3662db996a52f3c60a4ca616" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000065.bin", + "sha256": "53129c4320559e8dc1959a8fdcd7d756f68b2d82acc8ca6681f4aa691969f906" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000066.bin", + "sha256": "6a03395293e454e95163444c04a77961bfde9f71daf902911906566b7df4eab1" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000067.bin", + "sha256": "419e60c582a4c8f119f9a958f33ef88164fa334c38e7c47163f03d761d89e4dd" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000068.bin", + "sha256": "26222b3988412e52c10bd2a8cddd5b0a54409f16aa5e2367f9e6c3606760221d" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000069.bin", + "sha256": "661e862287f8283794e812d5484dfc77651e6a9c44be2122f10b25e702dbf52d" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000070.bin", + "sha256": "71de14c9a34cfed409f74d825c88a8b473cd509b1dd2619fe8d5a11da131bee0" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000071.bin", + "sha256": "7c8b878109bae512ed7f411055d974e0669a31da88b561e87e4fbacbadb96375" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000072.bin", + "sha256": "c75a839c07a242aa09dc0603b46cefd87ac79bfc6776dd4707f425f4afd143df" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000073.bin", + "sha256": "af98e9729afc0d1406b7531e135ab4d932c34f9c38df81636026fdfe461fc400" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000074.bin", + "sha256": "8de906c2956b66594902536069870c6f4bfaa8221cae561a6f7a00ea9b3ab338" + }, + { + "bytes": 30040253, + "path": "artifacts/public-resources-20261001/malecns-synaptic-partners/payload-000075.bin", + "sha256": "98714008fee0cffd305c8e7b45d74d224033d013f7ea7a1759eb160ca0fff2f1" + }, + { + "bytes": 2183, + "path": "artifacts/public-resources-20261001/pack-summary.json", + "sha256": "a097651a8f61009ec99a8bf6d1c3fcfaebd65fae16d6b0a14ebc2db841ae53cb" + }, + { + "bytes": 7181, + "path": "artifacts/public-resources-20261001/plan.json", + "sha256": "a20a61821c504e8315171a5fd14afbac011b934709af344045175bdda9fcba71" + }, + { + "bytes": 1898, + "path": "artifacts/public-resources-20261001/shiu-author-model-source/catalog.json", + "sha256": "95c69e6e9e07625a1f9b273db67aa9ab480c66bb3bbb273c39c430aeedb9b910" + }, + { + "bytes": 20, + "path": "artifacts/public-resources-20261001/shiu-author-model-source/exclusions.jsonl.gz", + "sha256": "9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64" + }, + { + "bytes": 349, + "path": "artifacts/public-resources-20261001/shiu-author-model-source/members.jsonl.gz", + "sha256": "2907be4f7d1a8f1017f91bda6e5ead381b8c67b85498f5378765d696f89d4b0c" + }, + { + "bytes": 6828, + "path": "artifacts/public-resources-20261001/shiu-author-model-source/payload-000000.bin", + "sha256": "4da352d80e4bf251dfec771935da93f5a9f3cef302c85e90991fafa14a072e2b" + }, + { + "bytes": 3036, + "path": "artifacts/public-resources-20261001/visualpathways/catalog.json", + "sha256": "bd824a656235ba08a35a67ad6d865467a946145cf985677226412280380939fc" + }, + { + "bytes": 218, + "path": "artifacts/public-resources-20261001/visualpathways/exclusions.jsonl.gz", + "sha256": "9c029262724580ef20981316c6f7e9c99d345e1171067f16c5d580c742809a8c" + }, + { + "bytes": 292178, + "path": "artifacts/public-resources-20261001/visualpathways/members.jsonl.gz", + "sha256": "335401c3f6cb5b3868b899599bcd7b439c1983a627d97a598a95e9c8d44ad81c" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/visualpathways/payload-000000.bin", + "sha256": "7f8bb35dcb565c16ff1bf642e079c54c71e27e05cccaa5915c1d1e3c9e7d0700" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/visualpathways/payload-000001.bin", + "sha256": "7181f79ec2615a84f33b394abf22454b72d2fddfb0e40e9c5e1590fe1ba64d7a" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/visualpathways/payload-000002.bin", + "sha256": "9dc076afd8cd8ebbbdda6f1ef24a41598e5db9fb0a98de8b5b765b4b0a8d2934" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/visualpathways/payload-000003.bin", + "sha256": "be03beac2472e6dc76a5705440296f88a8f6e15ea43f541df402c7b6c85cfdc6" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/visualpathways/payload-000004.bin", + "sha256": "0c801486169d0594471518a75b11b040acb1a2dd8904e9365fa7b7b667fc4a09" + }, + { + "bytes": 67108864, + "path": "artifacts/public-resources-20261001/visualpathways/payload-000005.bin", + "sha256": "4f387b9e6b47f06871ce1b32e265b3a1ae2d78e06d7955a3fa8ed7cfc1d2a0a7" + }, + { + "bytes": 31805270, + "path": "artifacts/public-resources-20261001/visualpathways/payload-000006.bin", + "sha256": "edb0ffa74e646712485a0d5fd2819ef14345c637beeaa5ca811ae3e71a06ea82" + }, + { + "bytes": 8522, + "path": "registry/publication-20261001/README.md", + "sha256": "e83a32a0d9d5c86ee12d9910bfc0214fdf393b253d022e33fe3228b8ec6828bd" + }, + { + "bytes": 11051, + "path": "registry/publication-20261001/fresh-content-verification.json", + "sha256": "d5e6cfab8fd157a9adf25a131fcf432887944cad65fa0aee68878baff8a819bd" + }, + { + "bytes": 3680, + "path": "registry/publication-20261001/fresh-download-verification.json", + "sha256": "b5f195a4d16e01e033b995072bbc4e28adfb4bd9d9656763f4fc58578cb891a0" + }, + { + "bytes": 1135, + "path": "registry/publication-20261001/lan-roundtrip-smoke.json", + "sha256": "d1864b3ba92dfcda9ee1cee78af0fdcc55815238cfaef5b53f5ff90f83edd148" + }, + { + "bytes": 1046, + "path": "registry/publication-20261001/lfs-smoke-receipt.json", + "sha256": "b70fce68c61a7b1ccacf5fc55f91a36c9d4a76fdda51c9456098b296d8cf5f91" + }, + { + "bytes": 10947, + "path": "registry/publication-20261001/local-content-verification.json", + "sha256": "ba475fa8de2011e7c24ce36e602a4d4d3b9d1747cc564d439e279d3c8c104d8b" + }, + { + "bytes": 7181, + "path": "registry/publication-20261001/plan.json", + "sha256": "a20a61821c504e8315171a5fd14afbac011b934709af344045175bdda9fcba71" + }, + { + "bytes": 5488, + "path": "registry/publication-20261001/source-guard-after-pack.json", + "sha256": "4e47c0e8920970beac7765e038dc7f66c441a853349800556031503866c15d96" + }, + { + "bytes": 5488, + "path": "registry/publication-20261001/source-guard-before.json", + "sha256": "b2fcfc66501e2d095a1fe3a178a97aa12e6e6b44dd4660b74af0b1826b75b150" + }, + { + "bytes": 5488, + "path": "registry/publication-20261001/source-guard-final.json", + "sha256": "3ed158d80af05736943e524ae001be69720ab0e8c05d2deac7f1c8308d7acd40" + }, + { + "bytes": 714, + "path": "registry/publication-20261001/tool-tests.json", + "sha256": "4ec43be10d8ebc439c1033693f41c8c5c03efbc82856c3a1699bcf8fddd4b200" + }, + { + "bytes": 4281, + "path": "tools/lfs-publication/capture_source_guard.py", + "sha256": "2308284e203c672de92a8924249815aa9999e50b67493a4129835b5577f3f33b" + }, + { + "bytes": 12992, + "path": "tools/lfs-publication/download_verify.py", + "sha256": "abc2b83e8f4b8f7b82ad4e46db8d9fc3329c16b5b525f7c9e233ef77aef62211" + }, + { + "bytes": 16661, + "path": "tools/lfs-publication/lan_lfs_transfer.py", + "sha256": "21241d6a75d84108e720b4a051504fff00158b327f15c0ee06e5c57c6ad1c263" + }, + { + "bytes": 24578, + "path": "tools/lfs-publication/publish_archives.py", + "sha256": "d90e113d045dcf0862a93c5b87c383c3ebeafc5ef45c4f1b9348fe49d257dd36" + }, + { + "bytes": 2395, + "path": "tools/lfs-publication/run_lan_smoke.py", + "sha256": "4bad3fe10fdc709cacb4f6faed7c6003bee8a35e23fc25366ad918caf33fd1cb" + }, + { + "bytes": 3057, + "path": "tools/lfs-publication/seal_publication_manifest.py", + "sha256": "ee5063cca46c67f63cf6eb6648a1fe57d2c7f47e44ed35a4ee40f3927afd9735" + }, + { + "bytes": 11482, + "path": "tools/lfs-publication/test_download_verify.py", + "sha256": "87c4aa51ebc8ae79f1f31bd23a1865186fc06ffa0467bed31f43c464a37def0e" + }, + { + "bytes": 16156, + "path": "tools/lfs-publication/test_lan_lfs_transfer.py", + "sha256": "5f77a0d61fada6a4c1cb20d6bda113fadbc8c0bd0acbab7ddeb7dcd90e55ac15" + }, + { + "bytes": 10954, + "path": "tools/lfs-publication/test_publish_archives.py", + "sha256": "82e62e0346e6613d71962b66ccca016e669bb4df2537d0743a3067e425ef5054" + }, + { + "bytes": 7791, + "path": "tools/lfs-publication/test_verify_publication.py", + "sha256": "99ad03c223064b9c6711fbb68d84da18d9abf80e6b3b311b7aaebfb6446a37ea" + }, + { + "bytes": 13711, + "path": "tools/lfs-publication/verify_publication.py", + "sha256": "533df50e615c530ad7e10f1351f3bf89f672c6531176dc758e18069796543ea3" + } + ], + "generated_utc": "2026-09-30T19:48:27.801392+00:00", + "logical_bytes": 9817411522, + "logical_files": 204, + "pass_all": true, + "repository_public": true, + "schema": "lfs-publication-final-manifest-v1", + "scope": "Publication payload, tools, notices and evidence only; original file SHA are nested in members.jsonl.gz. Not an entire server backup or scientific pass.", + "self_hash_policy": "Manifest is covered by SHA256SUMS; SHA256SUMS self-hash is omitted and its bytes are bound by the final Git commit." +} diff --git a/registry/publication-20261001/source-guard-final.json b/registry/publication-20261001/source-guard-final.json new file mode 100644 index 0000000..e87acdf --- /dev/null +++ b/registry/publication-20261001/source-guard-final.json @@ -0,0 +1,123 @@ +{ + "disk_free_bytes": { + "/data/digital-drosophila": 645469605888, + "/tmp/malecns-lfs-publication-20261001-bI1u07/repo/registry/publication-20261001": 856655966208 + }, + "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:46:21.491211+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/tools/lfs-publication/seal_publication_manifest.py b/tools/lfs-publication/seal_publication_manifest.py new file mode 100644 index 0000000..219c3eb --- /dev/null +++ b/tools/lfs-publication/seal_publication_manifest.py @@ -0,0 +1,50 @@ +"""Generate checksums for this publication only, after real download success.""" +from datetime import datetime, timezone +import json +from pathlib import Path +import subprocess + +from publish_archives import canonical, no_links, sha_file, write_new + + +def main(): + root = no_links(Path.cwd()) + protected = Path('/data/digital-drosophila') + if root == protected or protected in root.parents or not (root / '.git').is_dir(): + raise ValueError('Only an isolated publication checkout is allowed') + folder = root / 'registry/publication-20261001' + output, checksums = folder / 'publication-manifest.json', folder / 'SHA256SUMS' + if output.exists() or checksums.exists(): + raise ValueError('Never overwrite a publication manifest') + transport = json.loads((folder / 'fresh-download-verification.json').read_bytes()) + guard = json.loads((folder / 'source-guard-final.json').read_bytes()) + head = subprocess.check_output(['git', 'rev-parse', 'HEAD'], text=True).strip() + if not (transport['pass_all'] and transport['fresh_download_proven'] and guard['pass_all'] + and transport['expected_commit'] == head): + raise ValueError('Actual transport/source evidence or commit binding is missing') + files = [root / p for p in ('.gitattributes', '.gitignore', 'NOTICE.md')] + for prefix in ('artifacts/public-resources-20261001', 'artifacts/lfs-smoke', + 'registry/publication-20261001', 'tools/lfs-publication'): + for p in (root / prefix).rglob('*'): + no_links(p) + if '__pycache__' not in p.parts and p.is_file(): + files.append(p) + rows = [dict(path=p.relative_to(root).as_posix(), **sha_file(p)) for p in sorted(files)] + if len({row['path'] for row in rows}) != len(rows): + raise ValueError('Duplicate publication path') + manifest = dict(schema='lfs-publication-final-manifest-v1', pass_all=True, + generated_utc=datetime.now(timezone.utc).isoformat(), data_commit=head, + branch='codex/lfs-public-resources', repository_public=True, + aggregate_inventory_sha256=transport['aggregate_inventory_sha256'], + logical_files=len(rows), logical_bytes=sum(r['bytes'] for r in rows), + files=rows, + scope='Publication payload, tools, notices and evidence only; original file SHA are nested in members.jsonl.gz. Not an entire server backup or scientific pass.', + self_hash_policy='Manifest is covered by SHA256SUMS; SHA256SUMS self-hash is omitted and its bytes are bound by the final Git commit.') + write_new(output, canonical(manifest)) + rows.append(dict(path=output.relative_to(root).as_posix(), **sha_file(output))) + write_new(checksums, ''.join(r['sha256'] + ' ' + r['path'] + '\n' for r in sorted(rows, key=lambda r: r['path'])).encode()) + print(json.dumps(dict(pass_all=True, files=len(rows), manifest=sha_file(output), checksums=sha_file(checksums)))) + + +if __name__ == '__main__': + main()