From 5be359f484b5f5740a3ca629aeebee84a0d53c4d Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Thu, 1 Oct 2026 20:18:35 -0400 Subject: [PATCH 1/4] build: stage selected discovery minimum pending public dependency release --- ...diagnose-selected-discovery-release-022.py | 74 +++++++++++++++++++ .../selected-discovery-release-022.rst | 31 ++++++++ external/metaclass-registry | 2 +- pyproject.toml | 2 +- 4 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 docs/validation/diagnose-selected-discovery-release-022.py create mode 100644 docs/validation/selected-discovery-release-022.rst diff --git a/docs/validation/diagnose-selected-discovery-release-022.py b/docs/validation/diagnose-selected-discovery-release-022.py new file mode 100644 index 0000000000..b0ca6d61c5 --- /dev/null +++ b/docs/validation/diagnose-selected-discovery-release-022.py @@ -0,0 +1,74 @@ +"""Source-only installer/API witness; never installs or publishes a package.""" + +import argparse +import json +import subprocess +import sys +from pathlib import Path +from types import ModuleType + +parser = argparse.ArgumentParser(description=__doc__) +parser.add_argument("dependency", type=Path) +parser.add_argument("--probe-index", action="store_true") +args = parser.parse_args() +root = Path(__file__).resolve().parents[2] +dependency = args.dependency.resolve() +sys.path[:0] = [str(root), str(dependency / "src")] + +import metaclass_registry +from scripts import validate_local_release_floors as floors +from scripts.wait_for_pypi_release import probe_release + +candidate = floors.read_release_candidate(dependency / "pyproject.toml") +project = floors.read_project(root / "pyproject.toml") +requirement = next( + item for item in project.dependencies if item.name == candidate.name +) +compatibility = floors.CandidateRequirementCompatibility(requirement, candidate) +assert compatibility.accepts_candidate +assert compatibility.requires_candidate_floor +assert compatibility.excludes_next_breaking_series +assert not requirement.specifier.contains("0.2.1") +assert str(candidate.version) == metaclass_registry.__version__ == "0.2.2" + +old_commit = subprocess.check_output( + ["git", "-C", str(dependency), "rev-parse", "v0.2.1^{commit}"], text=True +).strip() +old_core_source = subprocess.check_output( + ["git", "-C", str(dependency), "show", "v0.2.1:src/metaclass_registry/core.py"], + text=True, +) +# Execute the original core declaration, not a copied compatibility module. +# Its common imports resolve from the current source package: this is a narrow +# missing-method witness, not an installed old-wheel or whole-old-package proof. +old_core = ModuleType("metaclass_registry._release_021_core_probe") +old_core.__package__ = "metaclass_registry" +sys.modules[old_core.__name__] = old_core +try: + exec(compile(old_core_source, f"git:{old_commit}:core.py", "exec"), vars(old_core)) + old_registry = old_core.LazyDiscoveryDict(enable_cache=False) + try: + old_registry.discover_matching(lambda module: False) + except AttributeError as error: + missing_api_error = str(error) + else: + raise AssertionError("original0.2.1 unexpectedly supplies selected discovery") +finally: + sys.modules.pop(old_core.__name__) + +new_registry = metaclass_registry.LazyDiscoveryDict(enable_cache=False) +new_registry.discover_matching(lambda module: False) +output = { + "interpreter": sys.executable, + "dependency_module": metaclass_registry.__file__, + "candidate_version": str(candidate.version), + "openhcs_requirement": str(requirement), + "original_021_commit": old_commit, + "original_missing_api_error": missing_api_error, + "new_api_call": "passed; unconfigured registry performs no discovery", + "installed_or_published": False, +} +if args.probe_index: + probe = probe_release(candidate.name, str(candidate.version)) + output["index_probe"] = {"available": probe.available, "detail": probe.detail} +print(json.dumps(output, indent=2), flush=True) diff --git a/docs/validation/selected-discovery-release-022.rst b/docs/validation/selected-discovery-release-022.rst new file mode 100644 index 0000000000..f3fe477eca --- /dev/null +++ b/docs/validation/selected-discovery-release-022.rst @@ -0,0 +1,31 @@ +Selected-discovery public installer coordination +================================================ + +Owner: Schrodinger. Base OpenHCS mainf2aabe45a84d9834eef37d1862f0d0290ba73b63. +Draft minimum >=0.2.2,<0.3; DO NOT MERGE before authorized dependency publication +and exact ordinary installer-index/API verification. No artifact publication or +private install is authorized here. Parent owns safe installed retrieval science +closure. Existing issue376 remains open for that10s installed acceptance. + +Paired original metaclass-registry version preparation uses its original Hatch +version source, prepares0.2.2 from mergedmain3294a69 and retains PR2's production +owners/tests. The final gitlink will select the paired prepared source explicitly. +Old >=0.2.1 accepts an actual published source without discover_matching; new +minimum excludes that API-incompatible selection without a shim/default-off path. +Source tests reuse CandidateRequirementCompatibility/read_release_candidate from +the original release-floor owner and selected-discovery tests, not another schema +or discovery/API registry. Original published v0.2.1 source is a retained negative +control, not replay of custom registration or scientific data. + +Merge gate: authorized dependency0.2.2 publication through original tag-triggered +publisher, verified exact wheel/sdist/API and installer visibility using original +scripts.wait_for_pypi_release.probe_release, then fresh normal-install acceptance +by the parent at a safe live slot. This draft alone does not establish that gate. +No new publisher/checker/registry, installed change, build environment or provider +call. Existing declared upper bound remains <0.3. No persisted formats change. + +Ownership check found no active metaclass PR/issue or OpenHCS release claimant for +this seam. Both old376WTs and branches/history are retained; new draft branches +reuse those same owned persistent worktrees, with no new worktree or environment. +NRA MEMB-1/TIME-3 review: version/requirements remain package metadata facts; +original declarative API and cooperative discovery mechanisms remain unchanged. diff --git a/external/metaclass-registry b/external/metaclass-registry index 3294a69dab..9d181724bf 160000 --- a/external/metaclass-registry +++ b/external/metaclass-registry @@ -1 +1 @@ -Subproject commit 3294a69dabc9f99dd646c32571b8f97cc139d378 +Subproject commit 9d181724bf3eac9d06b6bd990312f722911c66fb diff --git a/pyproject.toml b/pyproject.toml index 23f93a2e03..f8381a155c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -100,7 +100,7 @@ dependencies = [ "pycodify>=0.1.3,<0.2", "objectstate>=1.1.8,<2", "python-introspect>=0.1.14,<0.2", - "metaclass-registry>=0.2.1,<0.3", + "metaclass-registry>=0.2.2,<0.3", "arraybridge>=0.3.4,<0.4", "polystore>=0.3.0,<0.4", "pyqt-reactive>=0.3.25,<0.4", From adb675fe78f50b4af64c0e40d44ac14f0ea01a0a Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Thu, 1 Oct 2026 20:24:05 -0400 Subject: [PATCH 2/4] docs: retain installer API red and publication-gated release evidence --- ...diagnose-selected-discovery-release-022.py | 15 ++++ .../selected-discovery-release-022-SHA256SUMS | 5 ++ ...d-discovery-release-022-dependency-r0.json | 86 +++++++++++++++++++ ...ry-release-022-dependency-r0.resources.txt | 24 ++++++ .../selected-discovery-release-022-probe.json | 16 ++++ ...-discovery-release-022-probe.resources.txt | 24 ++++++ .../selected-discovery-release-022-source.log | 41 +++++++++ .../selected-discovery-release-022.rst | 42 +++++++++ external/metaclass-registry | 2 +- 9 files changed, 254 insertions(+), 1 deletion(-) create mode 100644 docs/validation/selected-discovery-release-022-SHA256SUMS create mode 100644 docs/validation/selected-discovery-release-022-dependency-r0.json create mode 100644 docs/validation/selected-discovery-release-022-dependency-r0.resources.txt create mode 100644 docs/validation/selected-discovery-release-022-probe.json create mode 100644 docs/validation/selected-discovery-release-022-probe.resources.txt create mode 100644 docs/validation/selected-discovery-release-022-source.log diff --git a/docs/validation/diagnose-selected-discovery-release-022.py b/docs/validation/diagnose-selected-discovery-release-022.py index b0ca6d61c5..c5436844e7 100644 --- a/docs/validation/diagnose-selected-discovery-release-022.py +++ b/docs/validation/diagnose-selected-discovery-release-022.py @@ -4,8 +4,10 @@ import json import subprocess import sys +import tomllib from pathlib import Path from types import ModuleType +from packaging.requirements import Requirement parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("dependency", type=Path) @@ -25,6 +27,17 @@ item for item in project.dependencies if item.name == candidate.name ) compatibility = floors.CandidateRequirementCompatibility(requirement, candidate) +original_project = tomllib.loads(subprocess.check_output( + ["git", "-C", str(root), "show", "f2aabe45:pyproject.toml"], text=True, +)) +original_requirement = next( + Requirement(item) for item in original_project["project"]["dependencies"] + if Requirement(item).name == candidate.name +) +assert original_requirement.specifier.contains("0.2.1") +assert not floors.CandidateRequirementCompatibility( + original_requirement, candidate, +).requires_candidate_floor assert compatibility.accepts_candidate assert compatibility.requires_candidate_floor assert compatibility.excludes_next_breaking_series @@ -63,6 +76,8 @@ "dependency_module": metaclass_registry.__file__, "candidate_version": str(candidate.version), "openhcs_requirement": str(requirement), + "original_openhcs_requirement": str(original_requirement), + "original_accepts_api_incompatible_021": True, "original_021_commit": old_commit, "original_missing_api_error": missing_api_error, "new_api_call": "passed; unconfigured registry performs no discovery", diff --git a/docs/validation/selected-discovery-release-022-SHA256SUMS b/docs/validation/selected-discovery-release-022-SHA256SUMS new file mode 100644 index 0000000000..2b860575ff --- /dev/null +++ b/docs/validation/selected-discovery-release-022-SHA256SUMS @@ -0,0 +1,5 @@ +7cd9d87e95e6fa126b026c9ebe5318cae6f0db2060fcb1f9b76946d65f65603a docs/validation/selected-discovery-release-022-probe.json +31704c7fafd27915b07fa37fe4ff2860c9fc57a84cae6d29b36b6f990de6d150 docs/validation/selected-discovery-release-022-probe.resources.txt +dc7ae3abeec2d9c22fc02904a2c7cae12e07ee4e82923f49507e9386ee4ebc72 docs/validation/selected-discovery-release-022-source.log +29c7c539e72b2a7ea5eeecc78d0f63e47295ad7481d342f37f2ca054664304fb docs/validation/selected-discovery-release-022-dependency-r0.json +d84918440598f01fec5d398291c0a693a29877fd835181e835ca4fa23984e529 docs/validation/selected-discovery-release-022-dependency-r0.resources.txt diff --git a/docs/validation/selected-discovery-release-022-dependency-r0.json b/docs/validation/selected-discovery-release-022-dependency-r0.json new file mode 100644 index 0000000000..f94be654ce --- /dev/null +++ b/docs/validation/selected-discovery-release-022-dependency-r0.json @@ -0,0 +1,86 @@ +{ + "root": "src/metaclass_registry/", + "base_revision": "3294a69dabc9f99dd646c32571b8f97cc139d378", + "head_revision": "9d181724bf3eac9d06b6bd990312f722911c66fb", + "paths": [ + "src/metaclass_registry/__init__.py" + ], + "base": { + "StringDispatch:src/metaclass_registry/__init__.py": 0, + "TypeSwitch:src/metaclass_registry/__init__.py": 0, + "StringDispatchArms:src/metaclass_registry/__init__.py": 0, + "TypeSwitchArms:src/metaclass_registry/__init__.py": 0, + "GodClassExcess:src/metaclass_registry/cache.py::CacheKeyCodec": 0, + "GodClassExcess:src/metaclass_registry/cache.py::CacheConfig": 0, + "GodClassExcess:src/metaclass_registry/cache.py::RegistryCacheManager": 0, + "GodClassExcess:src/metaclass_registry/core.py::RegistryKeyAttribute": 0, + "GodClassExcess:src/metaclass_registry/core.py::SecondaryRegistryDict": 0, + "GodClassExcess:src/metaclass_registry/core.py::LazyDiscoveryDict": 0, + "GodClassExcess:src/metaclass_registry/core.py::SecondaryRegistry": 0, + "GodClassExcess:src/metaclass_registry/core.py::RegistryFamily": 0, + "GodClassExcess:src/metaclass_registry/core.py::RegistryConfig": 0, + "GodClassExcess:src/metaclass_registry/core.py::AutoRegisterMeta": 0, + "GodClassExcess:src/metaclass_registry/core.py::RegisteredEnumMeta": 0, + "GodClassExcess:src/metaclass_registry/exceptions.py::RegistryError": 0, + "GodClassExcess:src/metaclass_registry/exceptions.py::DiscoveryError": 0, + "GodClassExcess:src/metaclass_registry/exceptions.py::CacheError": 0, + "TypeIdentity": 0, + "LongBooleanChain": 0, + "BooleanChainTerms:src/metaclass_registry/__init__.py": 0, + "ForeignAbsenceProbe:src/metaclass_registry/__init__.py": 0, + "CodecSubclass:src/metaclass_registry/__init__.py": 0, + "StringSubscript": 0 + }, + "head": { + "StringDispatch:src/metaclass_registry/__init__.py": 0, + "TypeSwitch:src/metaclass_registry/__init__.py": 0, + "StringDispatchArms:src/metaclass_registry/__init__.py": 0, + "TypeSwitchArms:src/metaclass_registry/__init__.py": 0, + "GodClassExcess:src/metaclass_registry/cache.py::CacheKeyCodec": 0, + "GodClassExcess:src/metaclass_registry/cache.py::CacheConfig": 0, + "GodClassExcess:src/metaclass_registry/cache.py::RegistryCacheManager": 0, + "GodClassExcess:src/metaclass_registry/core.py::RegistryKeyAttribute": 0, + "GodClassExcess:src/metaclass_registry/core.py::SecondaryRegistryDict": 0, + "GodClassExcess:src/metaclass_registry/core.py::LazyDiscoveryDict": 0, + "GodClassExcess:src/metaclass_registry/core.py::SecondaryRegistry": 0, + "GodClassExcess:src/metaclass_registry/core.py::RegistryFamily": 0, + "GodClassExcess:src/metaclass_registry/core.py::RegistryConfig": 0, + "GodClassExcess:src/metaclass_registry/core.py::AutoRegisterMeta": 0, + "GodClassExcess:src/metaclass_registry/core.py::RegisteredEnumMeta": 0, + "GodClassExcess:src/metaclass_registry/exceptions.py::RegistryError": 0, + "GodClassExcess:src/metaclass_registry/exceptions.py::DiscoveryError": 0, + "GodClassExcess:src/metaclass_registry/exceptions.py::CacheError": 0, + "TypeIdentity": 0, + "LongBooleanChain": 0, + "BooleanChainTerms:src/metaclass_registry/__init__.py": 0, + "ForeignAbsenceProbe:src/metaclass_registry/__init__.py": 0, + "CodecSubclass:src/metaclass_registry/__init__.py": 0, + "StringSubscript": 0 + }, + "delta": { + "StringDispatch:src/metaclass_registry/__init__.py": 0, + "TypeSwitch:src/metaclass_registry/__init__.py": 0, + "StringDispatchArms:src/metaclass_registry/__init__.py": 0, + "TypeSwitchArms:src/metaclass_registry/__init__.py": 0, + "GodClassExcess:src/metaclass_registry/cache.py::CacheKeyCodec": 0, + "GodClassExcess:src/metaclass_registry/cache.py::CacheConfig": 0, + "GodClassExcess:src/metaclass_registry/cache.py::RegistryCacheManager": 0, + "GodClassExcess:src/metaclass_registry/core.py::RegistryKeyAttribute": 0, + "GodClassExcess:src/metaclass_registry/core.py::SecondaryRegistryDict": 0, + "GodClassExcess:src/metaclass_registry/core.py::LazyDiscoveryDict": 0, + "GodClassExcess:src/metaclass_registry/core.py::SecondaryRegistry": 0, + "GodClassExcess:src/metaclass_registry/core.py::RegistryFamily": 0, + "GodClassExcess:src/metaclass_registry/core.py::RegistryConfig": 0, + "GodClassExcess:src/metaclass_registry/core.py::AutoRegisterMeta": 0, + "GodClassExcess:src/metaclass_registry/core.py::RegisteredEnumMeta": 0, + "GodClassExcess:src/metaclass_registry/exceptions.py::RegistryError": 0, + "GodClassExcess:src/metaclass_registry/exceptions.py::DiscoveryError": 0, + "GodClassExcess:src/metaclass_registry/exceptions.py::CacheError": 0, + "TypeIdentity": 0, + "LongBooleanChain": 0, + "BooleanChainTerms:src/metaclass_registry/__init__.py": 0, + "ForeignAbsenceProbe:src/metaclass_registry/__init__.py": 0, + "CodecSubclass:src/metaclass_registry/__init__.py": 0, + "StringSubscript": 0 + } +} diff --git a/docs/validation/selected-discovery-release-022-dependency-r0.resources.txt b/docs/validation/selected-discovery-release-022-dependency-r0.resources.txt new file mode 100644 index 0000000000..0ed151cf0d --- /dev/null +++ b/docs/validation/selected-discovery-release-022-dependency-r0.resources.txt @@ -0,0 +1,24 @@ +Running as unit: run-p2656422-i15265826.scope; invocation ID: 67d242be75134d1c8f8cb3038f86025f + Command being timed: "timeout 60s taskset -c 0 env PYTHONDONTWRITEBYTECODE=1 XDG_CACHE_HOME=/home/ts/.cache/agent-scratch/selected-discovery-release-022-20261001/cache OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMBA_NUM_THREADS=1 /home/ts/.local/share/uv/python/cpython-3.14-linux-x86_64-gnu/bin/python3.14 -I -B -c import sys;sys.path[:0]=["/home/ts/wt/comms-ratchet-pinned-ui348-20261001/src","/home/ts/wt/basicpy-live-candidate-20260930/.venv/lib/python3.12/site-packages"];from agent_comms.debt_ratchet import main;sys.argv=["agent-comms-ratchet","--root","src/metaclass_registry","--base","3294a69dabc9f99dd646c32571b8f97cc139d378","--head","HEAD"];sys.exit(main())" + User time (seconds): 0.59 + System time (seconds): 0.15 + Percent of CPU this job got: 92% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.81 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 44240 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 23759 + Voluntary context switches: 495 + Involuntary context switches: 456 + Swaps: 0 + File system inputs: 0 + File system outputs: 16 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/docs/validation/selected-discovery-release-022-probe.json b/docs/validation/selected-discovery-release-022-probe.json new file mode 100644 index 0000000000..3ba6ce3299 --- /dev/null +++ b/docs/validation/selected-discovery-release-022-probe.json @@ -0,0 +1,16 @@ +{ + "interpreter": "/home/ts/wt/openhcs-generated-inputs-installed-parent-20261001/.venv/bin/python", + "dependency_module": "/home/ts/wt/metaclass-registry-selected-discovery-376-20261001/src/metaclass_registry/__init__.py", + "candidate_version": "0.2.2", + "openhcs_requirement": "metaclass-registry<0.3,>=0.2.2", + "original_openhcs_requirement": "metaclass-registry<0.3,>=0.2.1", + "original_accepts_api_incompatible_021": true, + "original_021_commit": "ca0a87e873f929b311a87a4d60cd3bfba315dbcf", + "original_missing_api_error": "'LazyDiscoveryDict' object has no attribute 'discover_matching'", + "new_api_call": "passed; unconfigured registry performs no discovery", + "installed_or_published": false, + "index_probe": { + "available": false, + "detail": "exact release is not visible yet" + } +} diff --git a/docs/validation/selected-discovery-release-022-probe.resources.txt b/docs/validation/selected-discovery-release-022-probe.resources.txt new file mode 100644 index 0000000000..6ab52a7ac2 --- /dev/null +++ b/docs/validation/selected-discovery-release-022-probe.resources.txt @@ -0,0 +1,24 @@ +Running as unit: run-p2653964-i15230987.scope; invocation ID: 87c8798e8c0a408a88410cc71b64fd0c + Command being timed: "timeout 60s taskset -c 0 env PYTHONDONTWRITEBYTECODE=1 OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMBA_NUM_THREADS=1 XDG_CACHE_HOME=/home/ts/.cache/agent-scratch/selected-discovery-release-022-20261001/cache /home/ts/wt/openhcs-generated-inputs-installed-parent-20261001/.venv/bin/python -B docs/validation/diagnose-selected-discovery-release-022.py /home/ts/wt/metaclass-registry-selected-discovery-376-20261001 --probe-index" + User time (seconds): 0.15 + System time (seconds): 0.04 + Percent of CPU this job got: 56% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.35 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 31904 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 8055 + Voluntary context switches: 52 + Involuntary context switches: 49 + Swaps: 0 + File system inputs: 72 + File system outputs: 8 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/docs/validation/selected-discovery-release-022-source.log b/docs/validation/selected-discovery-release-022-source.log new file mode 100644 index 0000000000..a01d698b54 --- /dev/null +++ b/docs/validation/selected-discovery-release-022-source.log @@ -0,0 +1,41 @@ +Running as unit: run-p2654481-i15231014.scope; invocation ID: eac580953c8943ce8ef975db930e86f3 +Interpreter: /home/ts/wt/openhcs-generated-inputs-installed-parent-20261001/.venv/bin/python 3.12.3 (main, May 22 2025, 14:39:13) [GCC 14.2.1 20250207] +Discovery owner: /home/ts/wt/metaclass-registry-selected-discovery-376-20261001/src/metaclass_registry/__init__.py +============================= test session starts ============================== +platform linux -- Python 3.12.3, pytest-8.3.5, pluggy-1.6.0 +rootdir: /home/ts/wt/metaclass-registry-selected-discovery-376-20261001 +configfile: pyproject.toml +collected 48 items + +../metaclass-registry-selected-discovery-376-20261001/tests/test_selected_discovery.py . [ 2%] +.. [ 6%] +../metaclass-registry-selected-discovery-376-20261001/tests/test_core.py . [ 8%] +.................................. [ 79%] +../metaclass-registry-selected-discovery-376-20261001/tests/test_discovery.py . [ 81%] +........ [ 97%] +../metaclass-registry-selected-discovery-376-20261001 . [100%] + +============================== 48 passed in 0.56s ============================== + Command being timed: "timeout 60s taskset -c 0 env PYTHONDONTWRITEBYTECODE=1 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMBA_NUM_THREADS=1 XDG_CACHE_HOME=/home/ts/.cache/agent-scratch/selected-discovery-release-022-20261001/cache /home/ts/wt/openhcs-generated-inputs-installed-parent-20261001/.venv/bin/python -B docs/validation/knowledge-selected-source-tests.py /home/ts/wt/metaclass-registry-selected-discovery-376-20261001/tests/test_selected_discovery.py /home/ts/wt/metaclass-registry-selected-discovery-376-20261001/tests/test_core.py /home/ts/wt/metaclass-registry-selected-discovery-376-20261001/tests/test_discovery.py tests/unit/test_validate_local_release_floors.py::test_dynamic_hatch_version_path_is_the_candidate_authority --basetemp=/home/ts/.cache/agent-scratch/selected-discovery-release-022-20261001/pytest" + User time (seconds): 0.79 + System time (seconds): 0.08 + Percent of CPU this job got: 100% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.87 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 42372 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 10556 + Voluntary context switches: 28 + Involuntary context switches: 138 + Swaps: 0 + File system inputs: 0 + File system outputs: 232 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/docs/validation/selected-discovery-release-022.rst b/docs/validation/selected-discovery-release-022.rst index f3fe477eca..1ad79832b3 100644 --- a/docs/validation/selected-discovery-release-022.rst +++ b/docs/validation/selected-discovery-release-022.rst @@ -29,3 +29,45 @@ this seam. Both old376WTs and branches/history are retained; new draft branches reuse those same owned persistent worktrees, with no new worktree or environment. NRA MEMB-1/TIME-3 review: version/requirements remain package metadata facts; original declarative API and cooperative discovery mechanisms remain unchanged. + +Visible drafts and bounded evidence +----------------------------------- + +Dependency https://github.com/OpenHCSDev/metaclass-registry/pull/3 prepares the +version declaration0.2.2 from main3294a69. OpenHCS +https://github.com/OpenHCSDev/openhcs/pull/414 stages the coordinated minimum; +DO NOT MERGE before the availability gate above. The dependency implementation +and tests remain original mergedPR2; only __version__ and changelog change. + +Source reproducer diagnose-selected-discovery-release-022.py reads actual +f2aabe45 OpenHCS metadata, invokes original v0.2.1 core from exact commit +ca0a87e873f929b311a87a4d60cd3bfba315dbcf and observes missing-method AttributeError. +Common imports use current source; this is a narrow API-absence witness, not a +fresh old-wheel/install proof. Draft requirement rejects0.2.1, accepts0.2.2, +excludes0.3 and requires the actual Hatch-declared candidate version. Original +metadata-only probe_release reports0.2.2 unavailable,0.35s/31904KiB; exit0 +means source witness completed, NOT that dependency publication succeeded. + +48source checks pass,0.87s/42372KiB, covering selected/full discovery/core and +original Hatch metadata authority. Version declaration9d18172 is tested; original +pinned R0 main3294a69 ->9d18172 has24projections,zero positive,0.81s/44240KiB. +Original tool3b03785f/Python3.14 unchanged. OpenHCS production/tests are identical +to mergedf2aabe45; no redundant full R0/R1 retry for metadata-only changes. +Prior CP new-declaration/cooperative MRO controls remain the reviewed376 evidence. + +Exact commands/resources: selected-discovery-release-022-probe.resources.txt, +selected-discovery-release-022-source.log and dependency-r0.resources.txt; +probe/dependency-r0 JSON persist separately. Original read-only Python3.12 for +source checks, Python3.14 for original R0, CPU0/512MiB/no swap/60s serial. +No tag, artifact upload, workflow dispatch, private install, provider/native or +uncertain registration/input replay. Publication authorization remains explicit. + +Cleanup: after terminal source workers, no matching process/open lsof handles, +and canonical no-symlink check, removed only owned +/home/ts/.cache/agent-scratch/selected-discovery-release-022-20261001 (300KiB). +Durable source/history/original failures and the previous376worktree are retained. + +Exact paired prepared gitlink4b7d491e816ed8806a1f52e6302d38c05c78dfcb is published +on dependency PR3. Only receipt text follows tested version source9d18172; +src/tests are byte-identical. This is prepared source, not published0.2.2. +No dependency tag is created. Checksums are in selected-discovery-release-022-SHA256SUMS. diff --git a/external/metaclass-registry b/external/metaclass-registry index 9d181724bf..4b7d491e81 160000 --- a/external/metaclass-registry +++ b/external/metaclass-registry @@ -1 +1 @@ -Subproject commit 9d181724bf3eac9d06b6bd990312f722911c66fb +Subproject commit 4b7d491e816ed8806a1f52e6302d38c05c78dfcb From f872cd2542b026fedcbf834fe901ae805e14b3ba Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Thu, 1 Oct 2026 20:50:18 -0400 Subject: [PATCH 3/4] docs: retain authorized exact release tag and original publisher handle --- .../RECEIPT.rst | 59 ++++++++++++ .../job-queued.json | 1 + .../pending-deployments.json | 1 + .../release-session.typescript | 17 ++++ .../verify_publication.py | 94 +++++++++++++++++++ .../workflow-initial.json | 1 + .../selected-discovery-release-022.rst | 22 +++++ 7 files changed, 195 insertions(+) create mode 100644 docs/validation/metaclass-registry-022-publication-20261001/RECEIPT.rst create mode 100644 docs/validation/metaclass-registry-022-publication-20261001/job-queued.json create mode 100644 docs/validation/metaclass-registry-022-publication-20261001/pending-deployments.json create mode 100644 docs/validation/metaclass-registry-022-publication-20261001/release-session.typescript create mode 100644 docs/validation/metaclass-registry-022-publication-20261001/verify_publication.py create mode 100644 docs/validation/metaclass-registry-022-publication-20261001/workflow-initial.json diff --git a/docs/validation/metaclass-registry-022-publication-20261001/RECEIPT.rst b/docs/validation/metaclass-registry-022-publication-20261001/RECEIPT.rst new file mode 100644 index 0000000000..47ca81af4d --- /dev/null +++ b/docs/validation/metaclass-registry-022-publication-20261001/RECEIPT.rst @@ -0,0 +1,59 @@ +Authorized metaclass-registry 0.2.2 publication +============================================== + +Owner: Schrodinger. Explicit owner authorization: publish this dependency now +through original scripts/release.py and tag-triggered publisher. No authorization +for other releases or current private installation changes. Parent owns414 minimum +integration and safe fresh installed acceptance while live science remains active. + +Normally fetched/fast-forwarded the clean owned dependency WT to exact merged +393a7e03003cdc56df9013f932ed4f26e632d77a; source/metadata match reviewed4b7d491. +Original annotated v0.2.2 absent before launch. Original installed Python3.12 +executed scripts/release.py once under CPU0/512MiB/no swap/60s. Script reported +current0.2.2/PyPI0.2.1; answered y. Direct terminal exit0, no restart/replay. +Original release session66838 transcript is release-session.typescript. + +Actual original publication handles +----------------------------------- + +* Annotated tag object c88166848834c402b0a059db37ed8a141cd42147. +* Remote tag peel393a7e03003cdc56df9013f932ed4f26e632d77a verified. +* Publisher run36946473814, attempt1, push event v0.2.2/head393a7e0: + https://github.com/OpenHCSDev/metaclass-registry/actions/runs/36946473814 +* Job110649639675, original Build and publish to PyPI, ubuntu-latest: + https://github.com/OpenHCSDev/metaclass-registry/actions/runs/36946473814/job/110649639675 +* Check suite100077633915; check run matches original job, no annotations. +* Original gh run watch --interval10 observer session69246; workflow-watch.log. + +Initial actual state queued, runner_id0, no steps, started_at2026-10-02T00:32:05Z. +Actions permissions enabled/all; pending_deployments empty. No specific cause +established for runner nonassignment. This is original publishing execution, +not optional CI validation or another permission wait. Do not cancel/replay it. + +Artifact/index/API completion is still pending in this initial checkpoint. +No artifacts existed locally or were claimed available at this checkpoint; +one retained set will live in this directory's artifacts/ through the ORIGINAL +OpenHCS materialize_release_files helper, with its SHA256 validation intact. +verify_publication.py uses original probe_release for metadata+installer index, +compares packaged Python source in both wheel/sdist to exact tag393a7e0, and runs +original tests/test_selected_discovery.py directly from that retained PyPI wheel. +It refuses to overwrite or rematerialize an existing artifact directory. +Direct wheel import is not a private install/fresh normal OpenHCS journey. + +Keep414 unmerged until actual index and API proof completes. Public minimum +requires a real0.2.2 distribution, not this tag alone. No package/API shim, +new publisher, new environment, native/viewer, science or provider expenditure. +Resource warning: RAM12.2GiB/home6.1GiB/root7.7GiB/swap10.3GiB; only small +source/metadata operations here. Dependency WT/source remains clean at393a7e0. + +Orchestration cell207 observes the ORIGINAL session69246 rather than a second +publisher/status store. On watcher terminal, it records authoritative workflow +metadata; only actual completed/success/exact393a7e0 admits the verification +command. Original wait_for_release provides a bounded30s/10s index wait; original +materialize_release_files retains one wheel/sdist set; whole source verification +is CPU0/kernel512MiB/no swap/60s in the existing read-only Python3.12 interpreter. +Verification output is artifact-verification.log/resources.txt. Durable source +driver is retained; future disposable API fixtures are owned only at +/home/ts/.cache/agent-scratch/metaclass-registry-022-publication-20261001. +No automated private installation or minimum merge is scheduled. This initial +checkpoint remains pending until actual terminal/index/API observations arrive. diff --git a/docs/validation/metaclass-registry-022-publication-20261001/job-queued.json b/docs/validation/metaclass-registry-022-publication-20261001/job-queued.json new file mode 100644 index 0000000000..6aa5094ac2 --- /dev/null +++ b/docs/validation/metaclass-registry-022-publication-20261001/job-queued.json @@ -0,0 +1 @@ +{"completed_at":null,"conclusion":null,"id":110649639675,"labels":["ubuntu-latest"],"runner_group_name":"","runner_id":0,"runner_name":"","started_at":"2026-10-02T00:32:05Z","status":"queued","steps":[]} diff --git a/docs/validation/metaclass-registry-022-publication-20261001/pending-deployments.json b/docs/validation/metaclass-registry-022-publication-20261001/pending-deployments.json new file mode 100644 index 0000000000..0637a088a0 --- /dev/null +++ b/docs/validation/metaclass-registry-022-publication-20261001/pending-deployments.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/docs/validation/metaclass-registry-022-publication-20261001/release-session.typescript b/docs/validation/metaclass-registry-022-publication-20261001/release-session.typescript new file mode 100644 index 0000000000..86dcdfc564 --- /dev/null +++ b/docs/validation/metaclass-registry-022-publication-20261001/release-session.typescript @@ -0,0 +1,17 @@ +Script started on 2026-10-01 20:31:57-04:00 [COMMAND="systemd-run --user --scope -p MemoryMax=512M -p MemorySwapMax=0 -p CPUQuota=100% -- timeout 60s taskset -c 0 env PYTHONDONTWRITEBYTECODE=1 OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMBA_NUM_THREADS=1 /home/ts/wt/openhcs-generated-inputs-installed-parent-20261001/.venv/bin/python -B scripts/release.py" TERM="dumb" TTY="/dev/pts/6" COLUMNS="80" LINES="24"] +Running as unit: run-p2677172-i15228715.scope; invocation ID: bbe88d2a6ed540829fe834ae3fc6fd65 +Current package version: 0.2.2 +Current PyPI version: 0.2.1 +Create release for v0.2.2? [y/N] y +Enumerating objects: 1, done. +Counting objects: 100% (1/1) Counting objects: 100% (1/1), done. +Writing objects: 100% (1/1) Writing objects: 100% (1/1), 173 bytes | 173.00 KiB/s, done. +Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) +To https://github.com/OpenHCSDev/metaclass-registry.git + * [new tag] v0.2.2 -> v0.2.2 + +Successfully created and pushed tag v0.2.2 +GitHub Actions workflow should start automatically. +Monitor progress at: https://github.com/OpenHCSDev/metaclass-registry/actions + +Script done on 2026-10-01 20:32:02-04:00 [COMMAND_EXIT_CODE="0"] diff --git a/docs/validation/metaclass-registry-022-publication-20261001/verify_publication.py b/docs/validation/metaclass-registry-022-publication-20261001/verify_publication.py new file mode 100644 index 0000000000..1562491348 --- /dev/null +++ b/docs/validation/metaclass-registry-022-publication-20261001/verify_publication.py @@ -0,0 +1,94 @@ +"""Verify original public artifacts without installation or a second publisher.""" + +import argparse +import hashlib +import json +import subprocess +import sys +import tarfile +from email.parser import BytesParser +from pathlib import Path +from zipfile import ZipFile + +parser = argparse.ArgumentParser(description=__doc__) +parser.add_argument("source", type=Path) +parser.add_argument("--scratch", type=Path, required=True) +args = parser.parse_args() +evidence = Path(__file__).resolve().parent +sys.path.insert(0, str(evidence.parents[2])) +from scripts.wait_for_pypi_release import materialize_release_files, wait_for_release + +source = args.source.resolve() +expected_commit = "393a7e03003cdc56df9013f932ed4f26e632d77a" +actual_commit = subprocess.check_output( + ["git", "-C", str(source), "rev-parse", "HEAD"], text=True, +).strip() +assert actual_commit == expected_commit +assert subprocess.check_output( + ["git", "-C", str(source), "rev-parse", "v0.2.2^{commit}"], text=True, +).strip() == expected_commit +probe = wait_for_release( + "metaclass-registry", "0.2.2", timeout_seconds=30.0, + poll_interval_seconds=10.0, +) +assert probe.available, probe.detail +artifacts = evidence / "artifacts" +assert not artifacts.exists(), "retain existing artifacts; never replay materialization" +paths = materialize_release_files("metaclass-registry", "0.2.2", artifacts) +wheels = tuple(path for path in paths if path.name.endswith(".whl")) +sdists = tuple(path for path in paths if path.name.endswith(".tar.gz")) +assert len(wheels) == len(sdists) == 1 +assert len(paths) == 2 +wheel, sdist = wheels[0], sdists[0] +source_paths = tuple(path for path in subprocess.check_output( + ["git", "-C", str(source), "ls-tree", "-r", "--name-only", expected_commit, + "--", "src/metaclass_registry"], text=True, +).splitlines() if path.endswith(".py")) +with ZipFile(wheel) as distribution, tarfile.open(sdist) as source_distribution: + wheel_sources = { + name for name in distribution.namelist() + if name.startswith("metaclass_registry/") and name.endswith(".py") + } + assert wheel_sources == {path.removeprefix("src/") for path in source_paths} + assert not any(name.endswith(".pyc") for name in distribution.namelist()) + metadata_names = tuple( + name for name in distribution.namelist() if name.endswith(".dist-info/METADATA") + ) + assert len(metadata_names) == 1 + metadata = BytesParser().parsebytes(distribution.read(metadata_names[0])) + assert metadata["Name"] == "metaclass-registry" + assert metadata["Version"] == "0.2.2" + for path in source_paths: + blob = subprocess.check_output( + ["git", "-C", str(source), "show", f"{expected_commit}:{path}"], + ) + assert distribution.read(path.removeprefix("src/")) == blob, path + member = source_distribution.extractfile(f"{sdist.name.removesuffix('.tar.gz')}/{path}") + assert member is not None + with member: + assert member.read() == blob, path + +# Import directly from the one retained PyPI wheel, not checkout/site-packages. +sys.path.insert(0, str(wheel)) +import metaclass_registry +assert metaclass_registry.__file__.startswith(f"{wheel}/") +assert metaclass_registry.__version__ == "0.2.2" +import pytest +result = pytest.main([ + "--noconftest", "-o", "addopts=", "-p", "no:cacheprovider", + f"--basetemp={args.scratch / 'pytest'}", + str(source / "tests/test_selected_discovery.py"), +]) +assert result == 0, f"published-wheel API controls failed: {result}" +print(json.dumps({ + "source_commit": expected_commit, + "index": {"available": probe.available, "detail": probe.detail, + "wheel_url": probe.wheel_url}, + "wheel_import": metaclass_registry.__file__, + "exact_source_files_checked_in_wheel_and_sdist": len(source_paths), + "api_controls": "original selected/full discovery and both failure controls passed", + "artifacts": [{"path": str(path), "size": path.stat().st_size, + "sha256": hashlib.sha256(path.read_bytes()).hexdigest()} + for path in paths], + "installation": "none; direct retained-wheel import in original read-only interpreter", +}, indent=2), flush=True) diff --git a/docs/validation/metaclass-registry-022-publication-20261001/workflow-initial.json b/docs/validation/metaclass-registry-022-publication-20261001/workflow-initial.json new file mode 100644 index 0000000000..f292434cbb --- /dev/null +++ b/docs/validation/metaclass-registry-022-publication-20261001/workflow-initial.json @@ -0,0 +1 @@ +{"conclusion":"","createdAt":"2026-10-02T00:32:04Z","databaseId":36946473814,"event":"push","headBranch":"v0.2.2","headSha":"393a7e03003cdc56df9013f932ed4f26e632d77a","jobs":[{"completedAt":"0001-01-01T00:00:00Z","conclusion":"","databaseId":110649639675,"name":"Build and publish to PyPI","startedAt":"2026-10-02T00:32:05Z","status":"queued","steps":[],"url":"https://github.com/OpenHCSDev/metaclass-registry/actions/runs/36946473814/job/110649639675"}],"status":"queued","url":"https://github.com/OpenHCSDev/metaclass-registry/actions/runs/36946473814"} diff --git a/docs/validation/selected-discovery-release-022.rst b/docs/validation/selected-discovery-release-022.rst index 1ad79832b3..1b163228c7 100644 --- a/docs/validation/selected-discovery-release-022.rst +++ b/docs/validation/selected-discovery-release-022.rst @@ -71,3 +71,25 @@ Exact paired prepared gitlink4b7d491e816ed8806a1f52e6302d38c05c78dfcb is publish on dependency PR3. Only receipt text follows tested version source9d18172; src/tests are byte-identical. This is prepared source, not published0.2.2. No dependency tag is created. Checksums are in selected-discovery-release-022-SHA256SUMS. + +Subsequent explicit publication authorization +--------------------------------------------- + +Owner subsequently authorized this dependency publication immediately. PR3 is +merged393a7e03003cdc56df9013f932ed4f26e632d77a; original release.py executed once, +confirmed y for0.2.2/PyPI0.2.1 and pushed annotated tag v0.2.2, terminal exit0. +Remote tag object c88166848834c402b0a059db37ed8a141cd42147 peels exactly393a7e0. +Original publisher36946473814/job110649639675 is queued, no hosted runner/steps; +Actions enabled and no pending deployment approval. No specific cause established. + +Current evidence/verification driver: +docs/validation/metaclass-registry-022-publication-20261001/RECEIPT.rst. +Original10s GH watcher session69246 retained; orchestration cell207 observes that +same watcher and schedules bounded original-helper materialization/API verification +only on actual terminal success. No publisher restart/replay or another publisher. +This is actual artifact creation, not an optional CI validation gate. Keep414 +unmerged until the verified metadata/index/artifact/API receipt succeeds; parent +owns the final minimum/gitlink integration and safe private installation. No current +private/backing environment or live science process change. Prior draft restrictions +on publication above describe the earlier unauthorised stage, not a permission wait +after this explicit authorization. No artifact availability/completion claimed yet. From 4742b69d307580083ce44558b2b30214ca36bc7a Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Thu, 1 Oct 2026 21:05:16 -0400 Subject: [PATCH 4/4] Coordinate published metaclass-registry 0.2.2 and exact artifact proof --- .../RECEIPT.rst | 62 + .../SHA256SUMS | 13 + .../artifact-verification.log | 34 + .../artifact-verification.resources.txt | 24 + .../metaclass_registry-0.2.2-py3-none-any.whl | Bin 0 -> 22522 bytes .../artifacts/metaclass_registry-0.2.2.tar.gz | Bin 0 -> 30773 bytes .../github-release.json | 24 + .../workflow-terminal.json | 118 ++ .../workflow-watch.log | 1008 +++++++++++++++++ .../selected-discovery-release-022.rst | 23 + external/metaclass-registry | 2 +- 11 files changed, 1307 insertions(+), 1 deletion(-) create mode 100644 docs/validation/metaclass-registry-022-publication-20261001/SHA256SUMS create mode 100644 docs/validation/metaclass-registry-022-publication-20261001/artifact-verification.log create mode 100644 docs/validation/metaclass-registry-022-publication-20261001/artifact-verification.resources.txt create mode 100644 docs/validation/metaclass-registry-022-publication-20261001/artifacts/metaclass_registry-0.2.2-py3-none-any.whl create mode 100644 docs/validation/metaclass-registry-022-publication-20261001/artifacts/metaclass_registry-0.2.2.tar.gz create mode 100644 docs/validation/metaclass-registry-022-publication-20261001/github-release.json create mode 100644 docs/validation/metaclass-registry-022-publication-20261001/workflow-terminal.json create mode 100644 docs/validation/metaclass-registry-022-publication-20261001/workflow-watch.log diff --git a/docs/validation/metaclass-registry-022-publication-20261001/RECEIPT.rst b/docs/validation/metaclass-registry-022-publication-20261001/RECEIPT.rst index 47ca81af4d..c608530b3e 100644 --- a/docs/validation/metaclass-registry-022-publication-20261001/RECEIPT.rst +++ b/docs/validation/metaclass-registry-022-publication-20261001/RECEIPT.rst @@ -1,6 +1,68 @@ Authorized metaclass-registry 0.2.2 publication ============================================== +Terminal publication and PR414 integration +------------------------------------------ + +Public release/index/artifact/API gate PASSED. Original publisher36946473814, +attempt1, job110649639675 completed SUCCESS at2026-10-02T00:58:17Z. Original +observer69246 exited0; orchestration cell207 completed after the one admitted +verification. workflow-terminal.json and workflow-watch.log retain the actual +terminal steps. The queued state below is the preserved predecessor observation. + +Original OpenHCS wait_for_release/probe_release verified exact PyPI metadata AND +the normal installer index for metaclass-registry==0.2.2. Original +materialize_release_files downloaded one wheel/sdist set and verified the declared +SHA256 digests. No second download, environment or installation was performed. + +Retained distributions in artifacts/: + +* metaclass_registry-0.2.2-py3-none-any.whl,22522bytes, + SHA25667ae17c58d9d10cd58acf83ebe01833c1f1fe0a1a2e281924fab836958d592ed. +* metaclass_registry-0.2.2.tar.gz,30773bytes, + SHA256540bd730c52a535e08866c487b34aa4f9cb2fe857eb07a312882cdc43a15517c. + +verify_publication.py compared all six packaged library Python sources in BOTH +distributions byte-for-byte with exact tagged393a7e03003cdc56df9013f932ed4f26e632d77a. +Wheel metadata/version and source inventory passed. The original read-only +Python3.12 imported metaclass_registry directly from the retained PUBLIC wheel, +not checkout/site-packages: version0.2.2; original selected/full discovery identity +and ImportError/ValueError negative controls all3passed in0.02s. Whole verification +exit0,0.59s,40040KiB peak RSS, CPU0/kernel512MiB/no swap/60s. Exact output and command +are artifact-verification.log and artifact-verification.resources.txt. + +Normally merged OpenHCS main9a04107492ad90233394cf17524d0ca8e74062bb (including +418's root aggregate versus selected-plane capability) into the existing PR414 +branch: mergec054f1674ff4cf4169f4cb175be27d2515711346. Updated ONLY the metaclass +gitlink from prepared4b7d491 to actual released393a7e0. Remaining production diff +against that main is pyproject.toml >=0.2.2,<0.3 and that gitlink; openhcs/ and +tests/ are identical to main. Dependency src/tests/pyproject are unchanged from +reviewed4b7d491. No submodule checkout was initialized or changed. Prior48source +checks/original pinnedR0 zero-positive remain retained; no identical source rerun, +full R1 retry, timeout increase or global qualification claim. + +NRA catalog review: IMPL-12/13 retain original publisher/probe/materialization and +LazyDiscoveryDict importer/registration owner; MEMB-1/2 introduce no parallel +catalog/roster; TIME-3/4 require the actual published API through the package +minimum, not a compatibility alias or negotiated fallback. Original source376 +new-declaration/cooperative capability tests remain unchanged. Published-wheel +new-case test creates independent Plugin declarations, exercises selected then +full registration through the original shared owner, and preserves exact identity +without generic consumer edits. No ornamental inheritance or new mechanism. + +After all observer/verifier workers were terminal and no lsof/process handles +remained, removed ONLY owned +/home/ts/.cache/agent-scratch/metaclass-registry-022-publication-20261001 (56KiB). +Canonical root and pytest alias symlinks resolving inside it were checked first. +One durable artifact set and all original evidence/source/history remain. + +PR414 is ready for parent review/merge; installed OpenHCS acceptance and package +installation remain parent-owned. No private/backing environment, native/viewer, +provider or scientific input/output changes. No persisted format changes. + +Initial authorized publication checkpoint (historical) +------------------------------------------------------ + Owner: Schrodinger. Explicit owner authorization: publish this dependency now through original scripts/release.py and tag-triggered publisher. No authorization for other releases or current private installation changes. Parent owns414 minimum diff --git a/docs/validation/metaclass-registry-022-publication-20261001/SHA256SUMS b/docs/validation/metaclass-registry-022-publication-20261001/SHA256SUMS new file mode 100644 index 0000000000..bb77bc3ad2 --- /dev/null +++ b/docs/validation/metaclass-registry-022-publication-20261001/SHA256SUMS @@ -0,0 +1,13 @@ +45eee23e4ec97cefbfcad768f165e9e9ee8d58b035656e11b555db85d4eb6369 docs/validation/metaclass-registry-022-publication-20261001/RECEIPT.rst +9690d44f2e0426c5ffb19d80356df2f41c32b7ea5a24c144912e8632e5fc8960 docs/validation/metaclass-registry-022-publication-20261001/verify_publication.py +0231889209c76b3d9f6fe4c11dddba6d8cc91359010d82c3d83e967d27cb94ff docs/validation/metaclass-registry-022-publication-20261001/release-session.typescript +7b80e7b28ee1f3111fd7462853e15636d064a368726e6f1d3898ad465036c3f9 docs/validation/metaclass-registry-022-publication-20261001/workflow-initial.json +0422e1a4841db83e61d052634a80036358978812d6b07215d46c53553d34a177 docs/validation/metaclass-registry-022-publication-20261001/job-queued.json +4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945 docs/validation/metaclass-registry-022-publication-20261001/pending-deployments.json +13a18c7696575cf7ec50bbe4c0787637880fcf76471dc46570ad983a31e7598e docs/validation/metaclass-registry-022-publication-20261001/workflow-terminal.json +0470677218e39615ce28d29f1bd1747c4017ce4d6113bcf52a475a22933fd498 docs/validation/metaclass-registry-022-publication-20261001/workflow-watch.log +742a3ac59191573de6dc09097b9d7890776e950d28542d30b75185b232c2fab3 docs/validation/metaclass-registry-022-publication-20261001/github-release.json +0beee0649d3efa7468b4f630d1202595d0bdc81180fe08127d492e298c00f493 docs/validation/metaclass-registry-022-publication-20261001/artifact-verification.log +25afa796fc6061dd476f43347c8c74a3d8659ec1dc1f8955c5a0f08a905a0ff4 docs/validation/metaclass-registry-022-publication-20261001/artifact-verification.resources.txt +67ae17c58d9d10cd58acf83ebe01833c1f1fe0a1a2e281924fab836958d592ed docs/validation/metaclass-registry-022-publication-20261001/artifacts/metaclass_registry-0.2.2-py3-none-any.whl +540bd730c52a535e08866c487b34aa4f9cb2fe857eb07a312882cdc43a15517c docs/validation/metaclass-registry-022-publication-20261001/artifacts/metaclass_registry-0.2.2.tar.gz diff --git a/docs/validation/metaclass-registry-022-publication-20261001/artifact-verification.log b/docs/validation/metaclass-registry-022-publication-20261001/artifact-verification.log new file mode 100644 index 0000000000..7f9008bc07 --- /dev/null +++ b/docs/validation/metaclass-registry-022-publication-20261001/artifact-verification.log @@ -0,0 +1,34 @@ +============================= test session starts ============================== +platform linux -- Python 3.12.3, pytest-8.3.5, pluggy-1.6.0 +rootdir: /home/ts/wt/metaclass-registry-selected-discovery-376-20261001 +configfile: pyproject.toml +collected 3 items + +../metaclass-registry-selected-discovery-376-20261001/tests/test_selected_discovery.py . [ 33%] +.. [100%] + +============================== 3 passed in 0.02s =============================== +{ + "source_commit": "393a7e03003cdc56df9013f932ed4f26e632d77a", + "index": { + "available": true, + "detail": "PyPI metadata and installer index serve metaclass-registry==0.2.2 with an installable wheel", + "wheel_url": "https://files.pythonhosted.org/packages/0f/fd/4b3043710035b1c21c0edb5ca24ee7bee8b5fc61a2162d93f527326ab2ed/metaclass_registry-0.2.2-py3-none-any.whl#sha256=67ae17c58d9d10cd58acf83ebe01833c1f1fe0a1a2e281924fab836958d592ed" + }, + "wheel_import": "/home/ts/wt/openhcs-knowledge-declaration-source-376-20261001/docs/validation/metaclass-registry-022-publication-20261001/artifacts/metaclass_registry-0.2.2-py3-none-any.whl/metaclass_registry/__init__.py", + "exact_source_files_checked_in_wheel_and_sdist": 6, + "api_controls": "original selected/full discovery and both failure controls passed", + "artifacts": [ + { + "path": "/home/ts/wt/openhcs-knowledge-declaration-source-376-20261001/docs/validation/metaclass-registry-022-publication-20261001/artifacts/metaclass_registry-0.2.2-py3-none-any.whl", + "size": 22522, + "sha256": "67ae17c58d9d10cd58acf83ebe01833c1f1fe0a1a2e281924fab836958d592ed" + }, + { + "path": "/home/ts/wt/openhcs-knowledge-declaration-source-376-20261001/docs/validation/metaclass-registry-022-publication-20261001/artifacts/metaclass_registry-0.2.2.tar.gz", + "size": 30773, + "sha256": "540bd730c52a535e08866c487b34aa4f9cb2fe857eb07a312882cdc43a15517c" + } + ], + "installation": "none; direct retained-wheel import in original read-only interpreter" +} diff --git a/docs/validation/metaclass-registry-022-publication-20261001/artifact-verification.resources.txt b/docs/validation/metaclass-registry-022-publication-20261001/artifact-verification.resources.txt new file mode 100644 index 0000000000..673479c067 --- /dev/null +++ b/docs/validation/metaclass-registry-022-publication-20261001/artifact-verification.resources.txt @@ -0,0 +1,24 @@ +Running as unit: run-p2726043-i15339559.scope; invocation ID: 6f8d248733e6475abd8d7760a69f4d91 + Command being timed: "timeout 60s taskset -c 0 env PYTHONDONTWRITEBYTECODE=1 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 NUMBA_NUM_THREADS=1 /home/ts/wt/openhcs-generated-inputs-installed-parent-20261001/.venv/bin/python -I -B docs/validation/metaclass-registry-022-publication-20261001/verify_publication.py /home/ts/wt/metaclass-registry-selected-discovery-376-20261001 --scratch /home/ts/.cache/agent-scratch/metaclass-registry-022-publication-20261001" + User time (seconds): 0.28 + System time (seconds): 0.06 + Percent of CPU this job got: 58% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.59 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 40040 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 11156 + Voluntary context switches: 119 + Involuntary context switches: 65 + Swaps: 0 + File system inputs: 0 + File system outputs: 152 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/docs/validation/metaclass-registry-022-publication-20261001/artifacts/metaclass_registry-0.2.2-py3-none-any.whl b/docs/validation/metaclass-registry-022-publication-20261001/artifacts/metaclass_registry-0.2.2-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..ecda496085ead4b4c0188582d42e536d9fac9ae0 GIT binary patch literal 22522 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 Kx)$AkeEk<{dVC51 literal 0 HcmV?d00001 diff --git a/docs/validation/metaclass-registry-022-publication-20261001/artifacts/metaclass_registry-0.2.2.tar.gz b/docs/validation/metaclass-registry-022-publication-20261001/artifacts/metaclass_registry-0.2.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..095e2ac191c71dcdde2c1805f1335f3ae8b9848c GIT binary patch literal 30773 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%0Dd2SDL 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 literal 0 HcmV?d00001 diff --git a/docs/validation/metaclass-registry-022-publication-20261001/github-release.json b/docs/validation/metaclass-registry-022-publication-20261001/github-release.json new file mode 100644 index 0000000000..6d60fa911f --- /dev/null +++ b/docs/validation/metaclass-registry-022-publication-20261001/github-release.json @@ -0,0 +1,24 @@ +{ + "tagName": "v0.2.2", + "targetCommitish": "main", + "publishedAt": "2026-10-02T00:57:52Z", + "url": "https://github.com/OpenHCSDev/metaclass-registry/releases/tag/v0.2.2", + "assets": [ + { + "name": "metaclass_registry-0.2.2-py3-none-any.whl", + "apiUrl": "https://api.github.com/repos/OpenHCSDev/metaclass-registry/releases/assets/604473210", + "url": "https://github.com/OpenHCSDev/metaclass-registry/releases/download/v0.2.2/metaclass_registry-0.2.2-py3-none-any.whl", + "size": 22522, + "state": "uploaded", + "digest": "sha256:67ae17c58d9d10cd58acf83ebe01833c1f1fe0a1a2e281924fab836958d592ed" + }, + { + "name": "metaclass_registry-0.2.2.tar.gz", + "apiUrl": "https://api.github.com/repos/OpenHCSDev/metaclass-registry/releases/assets/604473209", + "url": "https://github.com/OpenHCSDev/metaclass-registry/releases/download/v0.2.2/metaclass_registry-0.2.2.tar.gz", + "size": 30773, + "state": "uploaded", + "digest": "sha256:540bd730c52a535e08866c487b34aa4f9cb2fe857eb07a312882cdc43a15517c" + } + ] +} diff --git a/docs/validation/metaclass-registry-022-publication-20261001/workflow-terminal.json b/docs/validation/metaclass-registry-022-publication-20261001/workflow-terminal.json new file mode 100644 index 0000000000..d0afd19f4d --- /dev/null +++ b/docs/validation/metaclass-registry-022-publication-20261001/workflow-terminal.json @@ -0,0 +1,118 @@ +{ + "conclusion": "success", + "databaseId": 36946473814, + "event": "push", + "headBranch": "v0.2.2", + "headSha": "393a7e03003cdc56df9013f932ed4f26e632d77a", + "jobs": [ + { + "completedAt": "2026-10-02T00:58:17Z", + "conclusion": "success", + "databaseId": 110649639675, + "name": "Build and publish to PyPI", + "startedAt": "2026-10-02T00:57:37Z", + "status": "completed", + "steps": [ + { + "completedAt": "2026-10-02T00:57:39Z", + "conclusion": "success", + "name": "Set up job", + "number": 1, + "startedAt": "2026-10-02T00:57:38Z", + "status": "completed" + }, + { + "completedAt": "2026-10-02T00:57:40Z", + "conclusion": "success", + "name": "Checkout code", + "number": 2, + "startedAt": "2026-10-02T00:57:39Z", + "status": "completed" + }, + { + "completedAt": "2026-10-02T00:57:40Z", + "conclusion": "success", + "name": "Set up Python", + "number": 3, + "startedAt": "2026-10-02T00:57:40Z", + "status": "completed" + }, + { + "completedAt": "2026-10-02T00:57:42Z", + "conclusion": "success", + "name": "Install build dependencies", + "number": 4, + "startedAt": "2026-10-02T00:57:40Z", + "status": "completed" + }, + { + "completedAt": "2026-10-02T00:57:44Z", + "conclusion": "success", + "name": "Build package", + "number": 5, + "startedAt": "2026-10-02T00:57:42Z", + "status": "completed" + }, + { + "completedAt": "2026-10-02T00:57:48Z", + "conclusion": "success", + "name": "Check distribution", + "number": 6, + "startedAt": "2026-10-02T00:57:44Z", + "status": "completed" + }, + { + "completedAt": "2026-10-02T00:57:53Z", + "conclusion": "success", + "name": "Create GitHub Release", + "number": 7, + "startedAt": "2026-10-02T00:57:48Z", + "status": "completed" + }, + { + "completedAt": "2026-10-02T00:58:15Z", + "conclusion": "success", + "name": "Publish to PyPI", + "number": 8, + "startedAt": "2026-10-02T00:57:53Z", + "status": "completed" + }, + { + "completedAt": "2026-10-02T00:58:15Z", + "conclusion": "success", + "name": "Post Publish to PyPI", + "number": 14, + "startedAt": "2026-10-02T00:58:15Z", + "status": "completed" + }, + { + "completedAt": "2026-10-02T00:58:15Z", + "conclusion": "success", + "name": "Post Set up Python", + "number": 15, + "startedAt": "2026-10-02T00:58:15Z", + "status": "completed" + }, + { + "completedAt": "2026-10-02T00:58:16Z", + "conclusion": "success", + "name": "Post Checkout code", + "number": 16, + "startedAt": "2026-10-02T00:58:15Z", + "status": "completed" + }, + { + "completedAt": "2026-10-02T00:58:16Z", + "conclusion": "success", + "name": "Complete job", + "number": 17, + "startedAt": "2026-10-02T00:58:16Z", + "status": "completed" + } + ], + "url": "https://github.com/OpenHCSDev/metaclass-registry/actions/runs/36946473814/job/110649639675" + } + ], + "status": "completed", + "url": "https://github.com/OpenHCSDev/metaclass-registry/actions/runs/36946473814" +} diff --git a/docs/validation/metaclass-registry-022-publication-20261001/workflow-watch.log b/docs/validation/metaclass-registry-022-publication-20261001/workflow-watch.log new file mode 100644 index 0000000000..2d4473c9b0 --- /dev/null +++ b/docs/validation/metaclass-registry-022-publication-20261001/workflow-watch.log @@ -0,0 +1,1008 @@ +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 2 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 2 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 2 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 2 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 2 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 3 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 3 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 3 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 3 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 3 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 3 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 4 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 4 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 4 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 4 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 4 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 5 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 5 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 5 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 5 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 5 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 5 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 6 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 6 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 6 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 6 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 6 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 6 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 7 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 7 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 7 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 7 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 7 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 7 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 8 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 8 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 8 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 8 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 8 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 9 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 9 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 9 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 9 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 9 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 9 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 10 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 10 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 10 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 10 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 10 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 10 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 11 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 11 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 11 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 11 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 11 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 12 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 12 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 12 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 12 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 12 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 12 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 13 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 13 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 13 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 13 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 13 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 13 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 14 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 14 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 14 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 14 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 14 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 15 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 15 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 15 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 15 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 15 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 15 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 16 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 16 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 16 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 16 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 16 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 16 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 17 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 17 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 17 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 17 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 17 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 18 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 18 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 18 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 18 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 18 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 18 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 19 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 19 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 19 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 19 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 19 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 19 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 20 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 20 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 20 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 20 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 20 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 21 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 21 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 21 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 21 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 21 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 21 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 22 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 22 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 22 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 22 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 22 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 22 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 23 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 23 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 23 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 23 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 23 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 23 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 24 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 24 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 24 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 24 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 24 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 25 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 25 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 25 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 25 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 25 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) + ✓ Set up job + ✓ Checkout code + ✓ Set up Python + ✓ Install build dependencies + ✓ Build package + * Check distribution + * Create GitHub Release + * Publish to PyPI + * Post Set up Python + * Post Checkout code +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 25 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) + ✓ Set up job + ✓ Checkout code + ✓ Set up Python + ✓ Install build dependencies + ✓ Build package + ✓ Check distribution + ✓ Create GitHub Release + * Publish to PyPI + * Post Publish to PyPI + * Post Set up Python + * Post Checkout code +Refreshing run status every 10 seconds. Press Ctrl+C to quit. + +* v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 26 minutes ago + +JOBS +* Build and publish to PyPI (ID 110649639675) + ✓ Set up job + ✓ Checkout code + ✓ Set up Python + ✓ Install build dependencies + ✓ Build package + ✓ Check distribution + ✓ Create GitHub Release + * Publish to PyPI + * Post Publish to PyPI + * Post Set up Python + * Post Checkout code +✓ v0.2.2 Publish to PyPI · 36946473814 +Triggered via push about 26 minutes ago + +JOBS +✓ Build and publish to PyPI in 40s (ID 110649639675) + ✓ Set up job + ✓ Checkout code + ✓ Set up Python + ✓ Install build dependencies + ✓ Build package + ✓ Check distribution + ✓ Create GitHub Release + ✓ Publish to PyPI + ✓ Post Publish to PyPI + ✓ Post Set up Python + ✓ Post Checkout code + ✓ Complete job diff --git a/docs/validation/selected-discovery-release-022.rst b/docs/validation/selected-discovery-release-022.rst index 1b163228c7..b0dd34398f 100644 --- a/docs/validation/selected-discovery-release-022.rst +++ b/docs/validation/selected-discovery-release-022.rst @@ -1,6 +1,29 @@ Selected-discovery public installer coordination ================================================ +Current delivery checkpoint +---------------------------- + +Dependency0.2.2 is now PUBLISHED from exact merged/tagged393a7e0 through the +original publisher36946473814/job110649639675, terminal SUCCESS. Original OpenHCS +helpers verified metadata AND normal installer-index availability; one retained +wheel/sdist set matches all six library sources at393a7e0; original public-wheel +API controls3passed,0.59s/40040KiB for the complete bounded verifier. Details, +artifact paths/checksums and exact handles: +metaclass-registry-022-publication-20261001/RECEIPT.rst. + +Existing PR414 normally integrates current main9a0410749 (including416/418) and +advances the metaclass gitlink to actual release393a7e0. Its only production +changes against that main are the coordinated >=0.2.2,<0.3 minimum and gitlink. +Public availability/API gate is complete; ready for parent review/merge, without +hosted CI wait. Parent owns subsequent installation/live user acceptance. No +private install or science/native replay was performed. Original preparation and +queued-publication observations below remain historical evidence, not current +availability or authorization restrictions. No persisted format changes. + +Historical preparation and publication observations +--------------------------------------------------- + Owner: Schrodinger. Base OpenHCS mainf2aabe45a84d9834eef37d1862f0d0290ba73b63. Draft minimum >=0.2.2,<0.3; DO NOT MERGE before authorized dependency publication and exact ordinary installer-index/API verification. No artifact publication or diff --git a/external/metaclass-registry b/external/metaclass-registry index 4b7d491e81..393a7e0300 160000 --- a/external/metaclass-registry +++ b/external/metaclass-registry @@ -1 +1 @@ -Subproject commit 4b7d491e816ed8806a1f52e6302d38c05c78dfcb +Subproject commit 393a7e03003cdc56df9013f932ed4f26e632d77a