From 829bbf18b8b257863393a011d074ecd510154a5d Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Fri, 2 Oct 2026 00:23:06 -0400 Subject: [PATCH 1/3] Archive successful original 0.3.1 publisher and matching artifact metadata --- .../PUBLICATION.rst | 74 ++++++++++++++++++ .../github-release-0.3.1.json | 1 + .../original-job-110701039079.log.gz | Bin 0 -> 36715 bytes .../publisher-run-36963152726.json | 1 + .../pypi-0.3.1.json | 1 + .../workflow-artifacts-36963152726.json | 3 + 6 files changed, 80 insertions(+) create mode 100644 docs/validation/publisher-admission-031-20261002/PUBLICATION.rst create mode 100644 docs/validation/publisher-admission-031-20261002/github-release-0.3.1.json create mode 100644 docs/validation/publisher-admission-031-20261002/original-job-110701039079.log.gz create mode 100644 docs/validation/publisher-admission-031-20261002/publisher-run-36963152726.json create mode 100644 docs/validation/publisher-admission-031-20261002/pypi-0.3.1.json create mode 100644 docs/validation/publisher-admission-031-20261002/workflow-artifacts-36963152726.json diff --git a/docs/validation/publisher-admission-031-20261002/PUBLICATION.rst b/docs/validation/publisher-admission-031-20261002/PUBLICATION.rst new file mode 100644 index 0000000..0e9fffb --- /dev/null +++ b/docs/validation/publisher-admission-031-20261002/PUBLICATION.rst @@ -0,0 +1,74 @@ +Original 0.3.1 publication attempt +================================= + +Parent merged PR21 normally at f07da0971947e7b7938503961a7014909e560307. +The original release.py session36811 was resumed once by the parent and +completed. No release invocation, retag, resubmission, rerun, environment install +or scientific operation was performed by this source worker. + +Exact publisher handle: +https://github.com/OpenHCSDev/PolyStore/actions/runs/36963152726 +Job 110701039079, run_attempt 1, event push, created 2026-10-02T04:07:22Z. +The native gh run watch observes this handle only. + +Verified remote tag objects: + +* v0.3.1 annotated tag 57740a8200d27633da81a9e7a7320d5f4ebb1147, + peels to f07da0971947e7b7938503961a7014909e560307. +* Immutable failed v0.3.0 tag 282c13750e40eb96135f6c7072d2b0c540db4309, + still peels to 84f322e46871de5ed47e7fd20976ad03e533c1c4. + +Initial observation: run queued, no GitHub release and PyPI 0.3.1 JSON HTTP404. +This is pending publication, not failure or artifact acceptance. + +Terminal publication acceptance +------------------------------- + +The SAME attempt completed SUCCESS, job start 2026-10-02T04:18:47Z, +job completion 2026-10-02T04:20:22Z. Every build/publish step passed: +editable installation, full release-candidate tests, ordinary distribution build, +immutable declaration validation, twine check, trusted PyPI publication, GitHub +release and original post-job cleanup. No attempt was resubmitted or replayed. + +Actual hosted suite: 570 PASS, 5 SKIP, zero failures in 17.57s. These are the +original full publisher selection plus the two new admission tests. No source +test, assertion or skip was weakened or added to avoid the original nine reds. +Do not substitute the earlier local 572/1skip count for this hosted result. + +PyPI JSON confirms version0.3.1, requires-python >=3.11, and roifile declared +only for the dev extra. Both PyPI distributions are non-yanked. GitHub release +401537625 is public/non-draft/non-prerelease, published 2026-10-02T04:20:19Z: +https://github.com/OpenHCSDev/PolyStore/releases/tag/v0.3.1 +PyPI release: https://pypi.org/project/polystore/0.3.1/ + +Programmatic artifact metadata comparison found BOTH filename/size/SHA256 +identities equal between PyPI JSON and the GitHub release assets. The original +publisher DSSE subject digests in its retained log match these same digests: + +* polystore-0.3.1-py3-none-any.whl, 157342 bytes, + d1c81414f9b5ec1373a68a41bf704ec76c4b1f60a1ea0f00bb031bc8ae264e50. +* polystore-0.3.1.tar.gz, 193442 bytes, + 0d1e78468581ead9c1cb13fcea0bc208ce52ba4e909bbcedf1662604be928dc7. + +GitHub also retains both publish.attestation assets. Workflow artifact inventory +is empty; these are actual GitHub RELEASE assets, not nonexistent Actions +artifact uploads. Package bytes were not downloaded or installed here. The +proof is published metadata/digest agreement, not independent local byte hashing, +fresh installed execution or biological acceptance. + +Full successful job log fetched through original GitHub SDK and archived +losslessly in original-job-110701039079.log.gz. Decoded original bytes169009, +including BOM/final newline, SHA256 +cd1723ac96587309e23dec9144476c0219ae2b2124b0e3c084fe701a8fedfa49. +Raw terminal-run, GitHub-release, PyPI and workflow-artifact JSON replies are +archived alongside it. The v0.3.0/v0.3.1 tag object identities were checked +again after successful publication and remained unchanged. + +Publication blocker is closed. The previously recorded offline uv.lock +limitation remains separate and unchanged; this publisher does not use it. + +The original append-only tool-call authority is linked at +/home/ts/wt/openhcs-issue-batch-20260929/agent-audit-20261002/Dewey/native-session.jsonl. +The existing link resolves to the original Codex session journal; it has not +been copied, edited or replaced. Source/publication work has no microscopy +screenshot claim. Original failed 0.3.0 publisher logs remain preserved. diff --git a/docs/validation/publisher-admission-031-20261002/github-release-0.3.1.json b/docs/validation/publisher-admission-031-20261002/github-release-0.3.1.json new file mode 100644 index 0000000..ca7d879 --- /dev/null +++ b/docs/validation/publisher-admission-031-20261002/github-release-0.3.1.json @@ -0,0 +1 @@ +{"url":"https://api.github.com/repos/OpenHCSDev/PolyStore/releases/401537625","assets_url":"https://api.github.com/repos/OpenHCSDev/PolyStore/releases/401537625/assets","upload_url":"https://uploads.github.com/repos/OpenHCSDev/PolyStore/releases/401537625/assets{?name,label}","html_url":"https://github.com/OpenHCSDev/PolyStore/releases/tag/v0.3.1","id":401537625,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOQ4ptws4X7vpZ","tag_name":"v0.3.1","target_commitish":"main","name":"v0.3.1","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-10-02T04:07:19Z","updated_at":"2026-10-02T04:20:19Z","published_at":"2026-10-02T04:20:19Z","assets":[{"url":"https://api.github.com/repos/OpenHCSDev/PolyStore/releases/assets/604786538","id":604786538,"node_id":"RA_kwDOQ4ptws4kDE9q","name":"polystore-0.3.1-py3-none-any.whl","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":157342,"digest":"sha256:d1c81414f9b5ec1373a68a41bf704ec76c4b1f60a1ea0f00bb031bc8ae264e50","download_count":0,"created_at":"2026-10-02T04:20:18Z","updated_at":"2026-10-02T04:20:18Z","browser_download_url":"https://github.com/OpenHCSDev/PolyStore/releases/download/v0.3.1/polystore-0.3.1-py3-none-any.whl"},{"url":"https://api.github.com/repos/OpenHCSDev/PolyStore/releases/assets/604786536","id":604786536,"node_id":"RA_kwDOQ4ptws4kDE9o","name":"polystore-0.3.1-py3-none-any.whl.publish.attestation","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":9656,"digest":"sha256:fd72367cd42fb01d43e44bafbbc67228a2d2914ca0c7803caca87d9f560c2e0f","download_count":0,"created_at":"2026-10-02T04:20:18Z","updated_at":"2026-10-02T04:20:18Z","browser_download_url":"https://github.com/OpenHCSDev/PolyStore/releases/download/v0.3.1/polystore-0.3.1-py3-none-any.whl.publish.attestation"},{"url":"https://api.github.com/repos/OpenHCSDev/PolyStore/releases/assets/604786537","id":604786537,"node_id":"RA_kwDOQ4ptws4kDE9p","name":"polystore-0.3.1.tar.gz","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/gzip","state":"uploaded","size":193442,"digest":"sha256:0d1e78468581ead9c1cb13fcea0bc208ce52ba4e909bbcedf1662604be928dc7","download_count":0,"created_at":"2026-10-02T04:20:18Z","updated_at":"2026-10-02T04:20:18Z","browser_download_url":"https://github.com/OpenHCSDev/PolyStore/releases/download/v0.3.1/polystore-0.3.1.tar.gz"},{"url":"https://api.github.com/repos/OpenHCSDev/PolyStore/releases/assets/604786534","id":604786534,"node_id":"RA_kwDOQ4ptws4kDE9m","name":"polystore-0.3.1.tar.gz.publish.attestation","label":"","uploader":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"content_type":"application/octet-stream","state":"uploaded","size":9550,"digest":"sha256:616ccdba1ce15293b9af97c593c16d3cf486644987abefe0fc1f3eae83a84a44","download_count":0,"created_at":"2026-10-02T04:20:18Z","updated_at":"2026-10-02T04:20:18Z","browser_download_url":"https://github.com/OpenHCSDev/PolyStore/releases/download/v0.3.1/polystore-0.3.1.tar.gz.publish.attestation"}],"tarball_url":"https://api.github.com/repos/OpenHCSDev/PolyStore/tarball/v0.3.1","zipball_url":"https://api.github.com/repos/OpenHCSDev/PolyStore/zipball/v0.3.1","body":"## What's Changed\n* Fix publisher checkout admission and ROI test dependencies for 0.3.1 by @trissim in https://github.com/OpenHCSDev/PolyStore/pull/21\n\n\n**Full Changelog**: https://github.com/OpenHCSDev/PolyStore/compare/v0.3.0...v0.3.1","mentions_count":1} diff --git a/docs/validation/publisher-admission-031-20261002/original-job-110701039079.log.gz b/docs/validation/publisher-admission-031-20261002/original-job-110701039079.log.gz new file mode 100644 index 0000000000000000000000000000000000000000..42d7d3616ca5df6ab7ecc33a1d24ed085e28070f GIT binary patch literal 36715 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 X1-y7fySP^a{``Ldbf;ygF_Z!T=L`f@ literal 0 HcmV?d00001 diff --git a/docs/validation/publisher-admission-031-20261002/publisher-run-36963152726.json b/docs/validation/publisher-admission-031-20261002/publisher-run-36963152726.json new file mode 100644 index 0000000..dd1c624 --- /dev/null +++ b/docs/validation/publisher-admission-031-20261002/publisher-run-36963152726.json @@ -0,0 +1 @@ +{"conclusion":"success","event":"push","headSha":"f07da0971947e7b7938503961a7014909e560307","jobs":[{"completedAt":"2026-10-02T04:20:22Z","conclusion":"success","databaseId":110701039079,"name":"Build and publish to PyPI","startedAt":"2026-10-02T04:18:47Z","status":"completed","steps":[{"completedAt":"2026-10-02T04:18:50Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-10-02T04:18:48Z","status":"completed"},{"completedAt":"2026-10-02T04:18:52Z","conclusion":"success","name":"Checkout code","number":2,"startedAt":"2026-10-02T04:18:51Z","status":"completed"},{"completedAt":"2026-10-02T04:18:52Z","conclusion":"success","name":"Set up Python","number":3,"startedAt":"2026-10-02T04:18:52Z","status":"completed"},{"completedAt":"2026-10-02T04:19:29Z","conclusion":"success","name":"Install build dependencies","number":4,"startedAt":"2026-10-02T04:18:52Z","status":"completed"},{"completedAt":"2026-10-02T04:19:49Z","conclusion":"success","name":"Test release candidate","number":5,"startedAt":"2026-10-02T04:19:29Z","status":"completed"},{"completedAt":"2026-10-02T04:19:53Z","conclusion":"success","name":"Build package","number":6,"startedAt":"2026-10-02T04:19:49Z","status":"completed"},{"completedAt":"2026-10-02T04:19:54Z","conclusion":"success","name":"Validate immutable release declaration","number":7,"startedAt":"2026-10-02T04:19:53Z","status":"completed"},{"completedAt":"2026-10-02T04:19:54Z","conclusion":"success","name":"Check distribution","number":8,"startedAt":"2026-10-02T04:19:54Z","status":"completed"},{"completedAt":"2026-10-02T04:20:10Z","conclusion":"success","name":"Publish to PyPI","number":9,"startedAt":"2026-10-02T04:19:54Z","status":"completed"},{"completedAt":"2026-10-02T04:20:19Z","conclusion":"success","name":"Create GitHub Release","number":10,"startedAt":"2026-10-02T04:20:10Z","status":"completed"},{"completedAt":"2026-10-02T04:20:19Z","conclusion":"success","name":"Post Publish to PyPI","number":18,"startedAt":"2026-10-02T04:20:19Z","status":"completed"},{"completedAt":"2026-10-02T04:20:19Z","conclusion":"success","name":"Post Set up Python","number":19,"startedAt":"2026-10-02T04:20:19Z","status":"completed"},{"completedAt":"2026-10-02T04:20:20Z","conclusion":"success","name":"Post Checkout code","number":20,"startedAt":"2026-10-02T04:20:19Z","status":"completed"},{"completedAt":"2026-10-02T04:20:20Z","conclusion":"success","name":"Complete job","number":21,"startedAt":"2026-10-02T04:20:20Z","status":"completed"}],"url":"https://github.com/OpenHCSDev/PolyStore/actions/runs/36963152726/job/110701039079"}],"status":"completed","url":"https://github.com/OpenHCSDev/PolyStore/actions/runs/36963152726"} diff --git a/docs/validation/publisher-admission-031-20261002/pypi-0.3.1.json b/docs/validation/publisher-admission-031-20261002/pypi-0.3.1.json new file mode 100644 index 0000000..7cde2ac --- /dev/null +++ b/docs/validation/publisher-admission-031-20261002/pypi-0.3.1.json @@ -0,0 +1 @@ +{"info":{"author":null,"author_email":"Tristan Simas ","bugtrack_url":null,"classifiers":["Development Status :: 3 - Alpha","Intended Audience :: Developers","Intended Audience :: Science/Research","Programming Language :: Python :: 3","Programming Language :: Python :: 3.11","Programming Language :: Python :: 3.12","Topic :: Scientific/Engineering","Topic :: Software Development :: Libraries :: Python Modules"],"description":"# PolyStore\n\nFramework-agnostic storage primitives for scientific applications.\n\n[![PyPI version](https://badge.fury.io/py/polystore.svg)](https://badge.fury.io/py/polystore)\n[![Documentation Status](https://readthedocs.org/projects/polystore/badge/?version=latest)](https://polystore.readthedocs.io/en/latest/)\n[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)\n\nPolyStore owns backend interfaces, execution-local backend registries,\n``FileManager`` routing, storage formats, ROI values, virtual-workspace source\nreferences, and viewer-streaming payload mechanics. Applications retain\nownership of domain artifact names and materialization policy.\n\n## Quick start\n\nPass an explicit mapping of backend names to instances. ``FileManager`` has no\nglobal fallback and does not infer a backend from a path.\n\n```python\nfrom pathlib import Path\nimport numpy as np\n\nfrom polystore import DiskBackend, FileManager, MemoryBackend\n\nregistry = {\n \"disk\": DiskBackend(),\n \"memory\": MemoryBackend(),\n}\nfiles = FileManager(registry)\n\ndata = np.arange(6).reshape(2, 3)\nfiles.save(data, Path(\"output.npy\"), backend=\"disk\")\nloaded = files.load(Path(\"output.npy\"), backend=\"disk\")\n```\n\nFor application startup where every discoverable context-free backend is\nwanted, use the package-owned lazy registry:\n\n```python\nfrom polystore import FileManager, ensure_storage_registry, storage_registry\n\nensure_storage_registry()\nfiles = FileManager(dict(storage_registry))\n```\n\nBackends requiring context-specific construction, including virtual workspaces\nand OMERO, must be instantiated by the application and added to its registry.\n\n## Nominal backend extension\n\nConcrete backends inherit ``DataSource``, ``DataSink``, ``StorageBackend``, or\n``ReadOnlyBackend`` and declare their backend key. The authoritative class\ncatalog is ``BackendBase.__registry__`` (also exported as\n``STORAGE_BACKENDS``). Do not build a second backend class table.\n\n## Installation\n\n```bash\npython -m pip install polystore\n```\n\nThe core install includes NumPy, ArrayBridge, metaclass-registry, file locking,\nplatform-aware cache paths, image I/O, Zarr/OME-Zarr support, and ZMQRuntime.\nFramework and streaming extras add their corresponding optional runtimes.\nInstall ``polystore[bioformats]`` for the package-owned PyImageJ and\nBio-Formats bridge. Its first use materializes a checksummed Fiji, JDK, and\nPyImageJ bridge runtime; later processes reuse that complete local cache\nwithout Maven resolution.\n\nFull documentation: [polystore.readthedocs.io](https://polystore.readthedocs.io)\n","description_content_type":"text/markdown","docs_url":null,"download_url":null,"downloads":{"last_day":-1,"last_month":-1,"last_week":-1},"dynamic":["License-File"],"home_page":null,"keywords":"storage, backend, multi-framework, numpy, pytorch, jax, tensorflow, zarr, io, data","license":null,"license_expression":"MIT","license_files":["LICENSE"],"maintainer":null,"maintainer_email":null,"name":"polystore","package_url":"https://pypi.org/project/polystore/","platform":null,"project_url":"https://pypi.org/project/polystore/","project_urls":{"Bug Reports":"https://github.com/OpenHCSDev/PolyStore/issues","Documentation":"https://polystore.readthedocs.io","Homepage":"https://github.com/OpenHCSDev/PolyStore","Source":"https://github.com/OpenHCSDev/PolyStore"},"provides_extra":["zarr","torch","jax","tensorflow","cupy","streaming","omero","bioformats","all","dev","docs","gpu"],"release_url":"https://pypi.org/project/polystore/0.3.1/","requires_dist":["arraybridge>=0.3.0","numpy>=1.26.0","portalocker>=2.8.0","metaclass-registry>=0.1.5","imageio>=2.37.0","zarr>=3.0.10","numcodecs>=0.14.0","ome-zarr>=0.12.2","zmqruntime<0.4,>=0.3.0","platformdirs>=4.0.0","torch>=2.0.0; extra == \"torch\"","jax>=0.4.0; extra == \"jax\"","tensorflow>=2.12.0; extra == \"tensorflow\"","cupy>=12.0.0; extra == \"cupy\"","pyzmq>=25.0.0; extra == \"streaming\"","pandas>=2.3.1; extra == \"omero\"","omero-py>=5.19.0; extra == \"omero\"","pyimagej==1.7.0; extra == \"bioformats\"","imglyb==2.1.0; extra == \"bioformats\"","scyjava==1.12.5; extra == \"bioformats\"","torch>=2.0.0; extra == \"all\"","jax>=0.4.0; extra == \"all\"","tensorflow>=2.12.0; extra == \"all\"","cupy>=12.0.0; extra == \"all\"","pyzmq>=25.0.0; extra == \"all\"","pyimagej==1.7.0; extra == \"all\"","imglyb==2.1.0; extra == \"all\"","scyjava==1.12.5; extra == \"all\"","pytest>=7.4.0; extra == \"dev\"","pytest-cov>=4.1.0; extra == \"dev\"","coverage>=7.3.2; extra == \"dev\"","genbadge[coverage]; extra == \"dev\"","pandas>=2.3.1; extra == \"dev\"","jpype1>=1.4.0; extra == \"dev\"","roifile; extra == \"dev\"","black>=23.0.0; extra == \"dev\"","ruff>=0.1.0; extra == \"dev\"","sphinx>=4.0.0; extra == \"docs\"","sphinx-rtd-theme>=1.0.0; extra == \"docs\"","sphinx-toolbox>=3.0.0; extra == \"docs\"","sphinx-design>=0.5.0; extra == \"docs\"","torch<2.8.0,>=2.6.0; extra == \"gpu\"","torchvision<0.23.0,>=0.21.0; extra == \"gpu\"","jax<0.6.0,>=0.5.3; extra == \"gpu\"","jaxlib<0.6.0,>=0.5.3; extra == \"gpu\"","jax-cuda12-pjrt<0.6.0,>=0.5.3; extra == \"gpu\"","jax-cuda12-plugin<0.6.0,>=0.5.3; extra == \"gpu\"","cupy-cuda12x<14.0.0,>=13.3.0; extra == \"gpu\"","cucim-cu12<26.0.0,>=25.6.0; extra == \"gpu\"","tensorflow<2.20.0,>=2.19.0; extra == \"gpu\"","tensorflow-probability[tf]<0.26.0,>=0.25.0; extra == \"gpu\"","pyclesperanto>=0.17.1; extra == \"gpu\""],"requires_python":">=3.11","summary":"Framework-agnostic multi-backend storage abstraction for ML and scientific computing","version":"0.3.1","yanked":false,"yanked_reason":null},"last_serial":41716188,"ownership":{"organization":null,"roles":[{"role":"Owner","user":"trissim"}]},"urls":[{"comment_text":null,"core-metadata":{"sha256":"83f0489c548279806d82fc90c7dc2e2e3026ae23064b5a8dd8a7b53f0b8378de"},"digests":{"blake2b_256":"e19519cbd9b8d4c514434471f10e143c65dfacb117088272528e52a5d6e1b664","md5":"6a98df057cb94022461bc1b5844badd3","sha256":"d1c81414f9b5ec1373a68a41bf704ec76c4b1f60a1ea0f00bb031bc8ae264e50"},"downloads":-1,"filename":"polystore-0.3.1-py3-none-any.whl","has_sig":false,"md5_digest":"6a98df057cb94022461bc1b5844badd3","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.11","size":157342,"upload_time":"2026-10-02T04:20:07","upload_time_iso_8601":"2026-10-02T04:20:07.351131Z","url":"https://files.pythonhosted.org/packages/e1/95/19cbd9b8d4c514434471f10e143c65dfacb117088272528e52a5d6e1b664/polystore-0.3.1-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":null,"core-metadata":false,"digests":{"blake2b_256":"10c9be208526be5f7c247a320f1b76e73a6561448fdb1c8e22117e1e3a5879c7","md5":"e1242f24b99e62230f8d9e827425c92a","sha256":"0d1e78468581ead9c1cb13fcea0bc208ce52ba4e909bbcedf1662604be928dc7"},"downloads":-1,"filename":"polystore-0.3.1.tar.gz","has_sig":false,"md5_digest":"e1242f24b99e62230f8d9e827425c92a","packagetype":"sdist","python_version":"source","requires_python":">=3.11","size":193442,"upload_time":"2026-10-02T04:20:09","upload_time_iso_8601":"2026-10-02T04:20:09.166862Z","url":"https://files.pythonhosted.org/packages/10/c9/be208526be5f7c247a320f1b76e73a6561448fdb1c8e22117e1e3a5879c7/polystore-0.3.1.tar.gz","yanked":false,"yanked_reason":null}],"vulnerabilities":[]} diff --git a/docs/validation/publisher-admission-031-20261002/workflow-artifacts-36963152726.json b/docs/validation/publisher-admission-031-20261002/workflow-artifacts-36963152726.json new file mode 100644 index 0000000..08944e0 --- /dev/null +++ b/docs/validation/publisher-admission-031-20261002/workflow-artifacts-36963152726.json @@ -0,0 +1,3 @@ +{ + "artifacts": [] +} From 6d4902bd040b5a301000300a671149ab609f82f1 Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Fri, 2 Oct 2026 00:41:22 -0400 Subject: [PATCH 2/3] Document independent public wheel byte verification and scoped closure --- .../CLEANUP.rst | 34 +++++++++++++++++ .../PUBLIC-WHEEL-BYTE-PROOF.txt | 37 +++++++++++++++++++ .../PUBLICATION.rst | 31 ++++++++++++++-- 3 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 docs/validation/publisher-admission-031-20261002/CLEANUP.rst create mode 100644 docs/validation/publisher-admission-031-20261002/PUBLIC-WHEEL-BYTE-PROOF.txt diff --git a/docs/validation/publisher-admission-031-20261002/CLEANUP.rst b/docs/validation/publisher-admission-031-20261002/CLEANUP.rst new file mode 100644 index 0000000..707396a --- /dev/null +++ b/docs/validation/publisher-admission-031-20261002/CLEANUP.rst @@ -0,0 +1,34 @@ +Owned disposable artifact closure +================================= + +Owner-authorised closure after publication and actual-byte proof archival. +Status: verified targets, deletion pending until the docs-only PR is visible. + +Exact completed synthetic-test targets below +/home/ts/wt/polystore-publisher-admission-031-20261002/docs/validation/publisher-admission-031-20261002/: + +* source-test-temp:466944 allocated bytes. +* admission-test-temp:20480 allocated bytes. +* qualified-test-temp:483328 allocated bytes. + +Exact single public-wheel verification scratch: +/home/ts/.cache/agent-scratch/polystore-031-byte-proof-20261002.t9WrHD: +163840 allocated bytes. + +Total selected allocated bytes1134592 (1.08MiB); this is the du measured amount, +not a claim about system-wide df movement. Targets are exact real directories, +not worktrees, environments, Git backing stores or scientific result roots. +All selected source-test runs completed PASS; their XML/command/resource +evidence is outside these directories. Contents are reconstructable synthetic +unit fixtures, two local editable test wheels and one fetched public wheel. +The published wheel bytes passed the independently archived hash/length check. + +No tracked files, .git directories, .pth files or alternates were found inside +the targets. Pytest current symlinks point inside the same disposable roots; +removal does not follow symlinks. Process inspection found only the inspection +shell, not active source tests. Recursive lsof found no open files in any target. + +Preserved: all source, worktree/Git/branch metadata, both original publisher +logs (including lossless archived copies), raw metadata, test reports, +actual-byte proof, original native journal link, failed/uncertain external +inputs and every biological/scientific artifact. No other tree is in scope. diff --git a/docs/validation/publisher-admission-031-20261002/PUBLIC-WHEEL-BYTE-PROOF.txt b/docs/validation/publisher-admission-031-20261002/PUBLIC-WHEEL-BYTE-PROOF.txt new file mode 100644 index 0000000..e923d6a --- /dev/null +++ b/docs/validation/publisher-admission-031-20261002/PUBLIC-WHEEL-BYTE-PROOF.txt @@ -0,0 +1,37 @@ +PUBLIC_WHEEL_ACTUAL_BYTE_VERIFICATION + +Artifact: polystore-0.3.1-py3-none-any.whl +Expected bytes: 157342 +Expected SHA256: d1c81414f9b5ec1373a68a41bf704ec76c4b1f60a1ea0f00bb031bc8ae264e50 + +Retained lookup: no exact public wheel found by filename under /home/ts/wt, +/home/ts/.cache/agent-scratch, /home/ts/.cache/uv or /home/ts/.cache/pip. +The two local 0.editable wheels were rejected as different artifacts. +One public fetch only; no retry/resubmit, dependency fetch, installation or import. + +Fetch command: +systemd-run --user --scope --quiet -p MemoryMax=512M -p MemorySwapMax=0 -p CPUQuota=100% timeout 25s taskset -c 0 curl --fail --silent --show-error --proto '=https' --max-time 20 --max-filesize 157342 --output /home/ts/.cache/agent-scratch/polystore-031-byte-proof-20261002.t9WrHD/polystore-0.3.1-py3-none-any.whl --write-out 'http_status=%{http_code} downloaded_bytes=%{size_download} elapsed_seconds=%{time_total}\nurl=%{url_effective}\n' https://files.pythonhosted.org/packages/e1/95/19cbd9b8d4c514434471f10e143c65dfacb117088272528e52a5d6e1b664/polystore-0.3.1-py3-none-any.whl + +Original fetch response: +http_status=200 downloaded_bytes=157342 elapsed_seconds=0.086730 +url=https://files.pythonhosted.org/packages/e1/95/19cbd9b8d4c514434471f10e143c65dfacb117088272528e52a5d6e1b664/polystore-0.3.1-py3-none-any.whl + +The first orchestration wrapper failed after the fetch because it tried to +store an absent session_id. Original HTTP200/byte result was already retained; +subsequent verification read that same completed file. Fetch was NOT replayed. + +Independent local-byte command: +systemd-run --user --scope --quiet -p MemoryMax=512M -p MemorySwapMax=0 -p CPUQuota=100% timeout 10s taskset -c 0 /home/ts/wt/openhcs-generated-inputs-installed-parent-20261001/.venv/bin/python -B -c 'import hashlib, pathlib; p=pathlib.Path("/home/ts/.cache/agent-scratch/polystore-031-byte-proof-20261002.t9WrHD/polystore-0.3.1-py3-none-any.whl"); data=p.read_bytes(); digest=hashlib.sha256(data).hexdigest(); print("file="+str(p)); print("actual_bytes="+str(len(data))); print("actual_sha256="+digest); assert len(data)==157342; assert digest=="d1c81414f9b5ec1373a68a41bf704ec76c4b1f60a1ea0f00bb031bc8ae264e50"; print("ACTUAL_BYTE_CHECK=PASS")' + +Independent local-byte result: +file=/home/ts/.cache/agent-scratch/polystore-031-byte-proof-20261002.t9WrHD/polystore-0.3.1-py3-none-any.whl +actual_bytes=157342 +actual_sha256=d1c81414f9b5ec1373a68a41bf704ec76c4b1f60a1ea0f00bb031bc8ae264e50 +ACTUAL_BYTE_CHECK=PASS + +Exit code: 0 + +Bounds: one CPU; 512MiB cgroup; no swap; fetch max20s plus25s command wall; +max response157342B; hash read max10s. Hash computed from actual read_bytes(), +not a cached digest or metadata copy. The frozen scientific environment was +not changed; the readonly Python interpreter executed standard library only. diff --git a/docs/validation/publisher-admission-031-20261002/PUBLICATION.rst b/docs/validation/publisher-admission-031-20261002/PUBLICATION.rst index 0e9fffb..ed30e89 100644 --- a/docs/validation/publisher-admission-031-20261002/PUBLICATION.rst +++ b/docs/validation/publisher-admission-031-20261002/PUBLICATION.rst @@ -52,9 +52,9 @@ publisher DSSE subject digests in its retained log match these same digests: GitHub also retains both publish.attestation assets. Workflow artifact inventory is empty; these are actual GitHub RELEASE assets, not nonexistent Actions -artifact uploads. Package bytes were not downloaded or installed here. The -proof is published metadata/digest agreement, not independent local byte hashing, -fresh installed execution or biological acceptance. +artifact uploads. The initial publication check established metadata agreement +only. The subsequent bounded actual-byte verification below extends that proof; +neither check establishes fresh installed execution or biological acceptance. Full successful job log fetched through original GitHub SDK and archived losslessly in original-job-110701039079.log.gz. Decoded original bytes169009, @@ -67,6 +67,31 @@ again after successful publication and remained unchanged. Publication blocker is closed. The previously recorded offline uv.lock limitation remains separate and unchanged; this publisher does not use it. +Independent public-wheel byte verification +----------------------------------------- + +After the owner authorised one157KB public fetch, no retained exact public wheel +was found under the worktrees, agent scratch or uv/pip caches. Existing local +editable wheels were not substituted for the published artifact. One HTTPS fetch +of the original PyPI wheel URL completed HTTP200 in0.086730s,157342bytes. +An independent local file read and SHA256 calculation asserted: + +* Actual length157342bytes. +* Actual digest + d1c81414f9b5ec1373a68a41bf704ec76c4b1f60a1ea0f00bb031bc8ae264e50. + +Both expected identities matched, exit0. PUBLIC-WHEEL-BYTE-PROOF.txt retains +the original command/results and bounds: oneCPU/512MiB, fetch20s(max25s wall), +response maximum157342B, hash10s. No package installation/import, environment +creation, source change, native/science run or dependency download occurred. +The sdist remains metadata-agreement-only; its bytes were not independently +downloaded/hashed. The wheel byte check does not imply installed acceptance. + +The completed original synthetic-test scratch and single public-wheel scratch +will be closed after proof archival; CLEANUP.rst records the exact targets. +Both original publisher logs, compressed evidence, source, branch history and +native journal remain preserved. + The original append-only tool-call authority is linked at /home/ts/wt/openhcs-issue-batch-20260929/agent-audit-20261002/Dewey/native-session.jsonl. The existing link resolves to the original Codex session journal; it has not From 242e302225e32643f80fe5e64fcce6b779eab469 Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Fri, 2 Oct 2026 00:43:34 -0400 Subject: [PATCH 3/3] Record verified closure of completed publication verification scratch --- .../publisher-admission-031-20261002/CLEANUP.rst | 13 +++++++++++-- .../PUBLICATION.rst | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/validation/publisher-admission-031-20261002/CLEANUP.rst b/docs/validation/publisher-admission-031-20261002/CLEANUP.rst index 707396a..8f1f09d 100644 --- a/docs/validation/publisher-admission-031-20261002/CLEANUP.rst +++ b/docs/validation/publisher-admission-031-20261002/CLEANUP.rst @@ -2,7 +2,8 @@ Owned disposable artifact closure ================================= Owner-authorised closure after publication and actual-byte proof archival. -Status: verified targets, deletion pending until the docs-only PR is visible. +Status: COMPLETE after docs-only PR22 became visible. Exact rm exited0; +all four targets were subsequently checked absent. No worktree was removed. Exact completed synthetic-test targets below /home/ts/wt/polystore-publisher-admission-031-20261002/docs/validation/publisher-admission-031-20261002/: @@ -15,7 +16,7 @@ Exact single public-wheel verification scratch: /home/ts/.cache/agent-scratch/polystore-031-byte-proof-20261002.t9WrHD: 163840 allocated bytes. -Total selected allocated bytes1134592 (1.08MiB); this is the du measured amount, +Total removed allocated bytes1134592 (1.08MiB); this is the du measured amount, not a claim about system-wide df movement. Targets are exact real directories, not worktrees, environments, Git backing stores or scientific result roots. All selected source-test runs completed PASS; their XML/command/resource @@ -32,3 +33,11 @@ Preserved: all source, worktree/Git/branch metadata, both original publisher logs (including lossless archived copies), raw metadata, test reports, actual-byte proof, original native journal link, failed/uncertain external inputs and every biological/scientific artifact. No other tree is in scope. + +Removed synthetic fixtures are reproducible from the unchanged tests; public +wheel bytes remain available from the recorded release URL and digest. These +disposable directories were deleted, not moved to trash. Both preserved gzip +log archives were rehashed afterwards: original failed job +542d75ef00bcd8677526131a1afe195cea6fa63edca7eca5aa8e0b1b4e4b703c, +original successful job +cd1723ac96587309e23dec9144476c0219ae2b2124b0e3c084fe701a8fedfa49. diff --git a/docs/validation/publisher-admission-031-20261002/PUBLICATION.rst b/docs/validation/publisher-admission-031-20261002/PUBLICATION.rst index ed30e89..08420bb 100644 --- a/docs/validation/publisher-admission-031-20261002/PUBLICATION.rst +++ b/docs/validation/publisher-admission-031-20261002/PUBLICATION.rst @@ -88,7 +88,7 @@ The sdist remains metadata-agreement-only; its bytes were not independently downloaded/hashed. The wheel byte check does not imply installed acceptance. The completed original synthetic-test scratch and single public-wheel scratch -will be closed after proof archival; CLEANUP.rst records the exact targets. +are closed after proof archival; CLEANUP.rst records the exact targets/results. Both original publisher logs, compressed evidence, source, branch history and native journal remain preserved.