From 615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc Mon Sep 17 00:00:00 2001 From: EHotwagner Date: Sun, 18 Oct 2026 00:11:21 +0200 Subject: [PATCH 1/2] Bind current installed qualification to original 0.5 publication --- docs/roadmaps/wasm-shared-01.md | 64 +++++++++++++------ .../wasm-release/bind-installed-release.py | 18 ++---- .../wasm/test-installed-org-workflow.py | 24 ++++--- tests/release/wasm/test-release-promotion.py | 10 +-- 4 files changed, 69 insertions(+), 47 deletions(-) diff --git a/docs/roadmaps/wasm-shared-01.md b/docs/roadmaps/wasm-shared-01.md index f99767e5..a5f7e9b8 100644 --- a/docs/roadmaps/wasm-shared-01.md +++ b/docs/roadmaps/wasm-shared-01.md @@ -1,11 +1,11 @@ # WASM-SHARED-01 — producer qualification successor -## Current 0.5 Worker packaging source preparation +## Current 0.5 closed Worker and installed qualifier The current source successor selects coherent `0.5.0` for the pair and SDK. -Published `0.4.0` and its finite P/Q installed qualification below remain unchanged. -The generated Worker policy currently forms an ESM import graph that must evaluate -before the native entry installs its command handler. Request admission already +Published `0.4.0` and its historical P/Q installed qualification below remain unchanged. +The previous generated Worker policy formed an ESM import graph that had to evaluate +before the native entry installed its command handler. Request admission still sets the deadline before creating that Worker. A later ready event cannot move the start of the operation budget. @@ -31,14 +31,13 @@ pre-create deadline, identity, capacity and termination policies are unchanged. A retired physical Worker's error also cannot borrow a newly created same-name Worker's command identity. -Prepared installed controls exercise a fresh initial Worker, candidate abort and +Candidate-package controls exercise a fresh initial Worker, candidate abort and new physical candidate, real cold expiry, and a genuine loaded message withheld until expiry then released as late evidence. The latter is an explicit delivery impairment control, not evidence of a naturally late callback. Existing normal configuration, ABI/refusal/profile and lifecycle controls remain. No priming, retry, clock enlargement, speculative HTTP cache change or consumer asset rewrite -is selected. The existing 35-minute hosted producer profile remains the bound; -new tool/build/browser fit is unqualified until its original complete run. +is selected. The existing 35-minute hosted producer profile remains the bound. The first candidate qualifier [39069862111](https://github.com/FS-GG/FS.GG.Game/actions/runs/39069862111), attempt 1, @@ -46,19 +45,44 @@ failed static preflight on the Lifecycle.Tests project dependency range before compiler or runtime qualification. The connected repair selects the current Contracts project version in that lock edge and tests the previous published version as a refusal. All other restored package hashes and historical package -locks remain unchanged; a fresh exact-head full qualifier is still required. - -Source preparation does not publish `0.5.0` or qualify installed adoption. Its -actual future publication P and read-only installed qualifier cannot be guessed; -the existing finite installed binder still identifies authentic published `0.4.0` -until a genuine successor publication supplies the next closed binding. Consumer -adoption and native/product outcomes remain separately owned. This rationale -comes from the producer's own source; private consumer evidence is not part of -the public producer record. - -## Current 0.4 producer supplier acceptance - -Published producer and original publisher P remains +locks remain unchanged. The original repaired PR qualifier +[39070020711](https://github.com/FS-GG/FS.GG.Game/actions/runs/39070020711), attempt 1, +passed before PR719 delivered exact producer P +`80540027623d9b1a8aa7715d0591de48455403b7`, tree +`fa2cd0160f9a7c5bb0a1ad85fd8f1eff68b867d3`. Original protected qualification +[39071360197](https://github.com/FS-GG/FS.GG.Game/actions/runs/39071360197), attempt 1, +passed in 21m14s and retained the complete 39-file eligible custody. Its 35 real +package-browser cases include the three new histories; default53 and selected16 +compiled source/candidate-installed CLR/Fable/numeric cohorts also passed. +This measured fit is not a guarantee for future cold runs or consumer workloads. + +Original publication +[39073209865](https://github.com/FS-GG/FS.GG.Game/actions/runs/39073209865), attempt 1, +completed through admission, begin, org, public, assets and complete at that same P. +Release [416092764](https://github.com/FS-GG/FS.GG.Game/releases/tag/wasm/v0.5.0) +retains the literal P tag, original pair/SDK and manifest +`4874c07d6c6b4f1cd920e2a1379de2e5778529f94d211b2c8d138ed8d719483c`. +Its immutable transaction hash is +`c567d141277004186ec6f4b24df63defb103c2fc1b811d1f4c3bcd83588cacb7`. +The org originals match whole bytes; public repository signing changes the +envelopes while every payload member and NuGet unsigned content hash correspond. +Native signature verification and complete readbacks remain part of the original +publication evidence, not a claim of local native verification. + +The read-only installed qualifier now selects this exact `0.5.0` P/tree. Q must +descend from P, bind its actual native transaction and original qualifying run, +and change only the explicit binder/control/owning-document/Atlas closure. +Runtime, package source, build inputs and workflow/profile bytes remain identical +to P. Real current Q checkout, first attempt, complete source audit, separate +org/public feeds, raw locks, exact served archives, Core/Worker/output custody and +original status/cleanup observations remain mandatory. Q source preparation is +not a dispatched or accepted served-feed installed run; consumer adoption and +native/product outcomes remain separately owned. Private consumer evidence is +not part of this public producer record. + +## Historical 0.4 producer supplier acceptance + +The original 0.4 published producer and publisher P remains `6732d2371d142d5ccc5d2d127f20e4f179800892`, tree `cc71e7cfe73449919376acf775940ff9e8bdab56`. Its original protected qualifier [39013804889](https://github.com/FS-GG/FS.GG.Game/actions/runs/39013804889), diff --git a/scripts/wasm-release/bind-installed-release.py b/scripts/wasm-release/bind-installed-release.py index e59ec5fe..7bf813c4 100644 --- a/scripts/wasm-release/bind-installed-release.py +++ b/scripts/wasm-release/bind-installed-release.py @@ -13,24 +13,16 @@ ROOT = pathlib.Path(__file__).resolve().parents[2] REPO = "FS-GG/FS.GG.Game" -PUBLISHED = "6732d2371d142d5ccc5d2d127f20e4f179800892" -PUBLISHED_TREE = "cc71e7cfe73449919376acf775940ff9e8bdab56" +PUBLISHED = "80540027623d9b1a8aa7715d0591de48455403b7" +PUBLISHED_TREE = "fa2cd0160f9a7c5bb0a1ad85fd8f1eff68b867d3" # Closed repair closure. Root selection binds the exact Q; this is not authority # for arbitrary descendants or semantic changes inside a broad scripts prefix. INSTALLED_PATHS = frozenset({ - '.github/workflows/wasm-installed-org.yml', 'scripts/wasm-release/bind-installed-release.py', - 'scripts/wasm-release/promotion.py', - 'scripts/wasm-release/installed-evidence.py', - 'scripts/verify-wasm-package-consumer.sh', 'tests/release/wasm/test-installed-org-workflow.py', 'tests/release/wasm/test-release-promotion.py', - 'tests/release/wasm/test-installed-evidence.py', - 'scripts/verify-wasm-workflow.sh', 'docs/roadmaps/wasm-shared-01.md', 'docs/atlas/catalog.json', - 'docs/atlas/records/264a2f7887a9b6473cbc24102e1bf9be70e57f6d7ba224138140efa094d541f4.json', - 'docs/atlas/records/2056fa8b653c2240afdad2a16f572a07019109254847829610a9468bb2f95248.json', }) @@ -45,7 +37,7 @@ def checked_inputs(environment, tracked_version): for key, length in (("ACCEPTED_EXECUTOR",40),("PROMOTION_BINDING_SHA256",64)): values[key] = environment[key] assert re.fullmatch(r"[0-9a-f]{%d}" % length, values[key]), "invalid explicit executor/transaction binding" - assert values["RELEASE_VERSION"] == "0.4.0", "historical release is not the selected current route" + assert values["RELEASE_VERSION"] == "0.5.0", "historical release is not the selected current route" assert values["PUBLISHED_SOURCE"] == PUBLISHED and values["QUALIFIER_SOURCE"] == values["ACCEPTED_EXECUTOR"], "immutable publication and selected current qualifier required" assert not environment.get("EXECUTION_BINDING") and not environment.get("CANONICAL_QUALIFICATION_AUDIT"), "historical overlays cannot authorize current qualification" return values @@ -53,7 +45,7 @@ def checked_inputs(environment, tracked_version): def validate_release(release, values): version = values["RELEASE_VERSION"] - assert version == "0.4.0", "only selected current release can qualify" + assert version == "0.5.0", "only selected current release can qualify" tag = f"wasm/v{version}" assert release["tag_name"] == tag and not release["draft"] and not release["prerelease"] assert release["published_at"], "release is unpublished" @@ -100,7 +92,7 @@ def fingerprint(revision, blob): def bind_executor(source, executor, version): - assert version == '0.4.0' and executor == os.environ['ACCEPTED_EXECUTOR'] == os.environ['QUALIFIER_SOURCE'] == os.environ['GITHUB_SHA'] == os.environ['GITHUB_WORKFLOW_SHA'] == git('rev-parse','HEAD'), 'wrong actual installed qualifier/executor' + assert version == '0.5.0' and executor == os.environ['ACCEPTED_EXECUTOR'] == os.environ['QUALIFIER_SOURCE'] == os.environ['GITHUB_SHA'] == os.environ['GITHUB_WORKFLOW_SHA'] == git('rev-parse','HEAD'), 'wrong actual installed qualifier/executor' assert os.environ['GITHUB_REPOSITORY'] == REPO and os.environ['GITHUB_REF'] == 'refs/heads/main' and os.environ['GITHUB_EVENT_NAME'] == 'workflow_dispatch' and os.environ['GITHUB_RUN_ATTEMPT'] == '1', 'foreign/rerun installed execution' assert os.environ['GITHUB_WORKFLOW_REF'] == REPO+'/.github/workflows/wasm-installed-org.yml@refs/heads/main', 'foreign installed workflow' assert os.environ['GITHUB_JOB'] == 'installed' and re.fullmatch('[1-9][0-9]*',os.environ['GITHUB_RUN_ID']), 'wrong installed native run/job' diff --git a/tests/release/wasm/test-installed-org-workflow.py b/tests/release/wasm/test-installed-org-workflow.py index 0453702e..6c2eb87c 100644 --- a/tests/release/wasm/test-installed-org-workflow.py +++ b/tests/release/wasm/test-installed-org-workflow.py @@ -62,27 +62,33 @@ def validate(candidate): else: raise SystemExit("known-bad installed qualification route accepted") -values = {"RELEASE_VERSION": "0.4.0", "PUBLISHED_SOURCE": binding.PUBLISHED, "QUALIFIER_SOURCE": "a" * 40, "ACCEPTED_EXECUTOR": "a" * 40, "PROMOTION_BINDING_SHA256": "e" * 64, "MANIFEST_SHA256": "c" * 64, "SDK_SHA256": "d" * 64} -assert binding.checked_inputs(values, "0.4.0") == values -for key, value in (("PUBLISHED_SOURCE", "main"), ("QUALIFIER_SOURCE", "wasm/v0.4.0"), ("SDK_SHA256", "unknown"), ("RELEASE_VERSION", "0.1.1"), ("MANIFEST_SHA256", "$(false)")): +values = {"RELEASE_VERSION": "0.5.0", "PUBLISHED_SOURCE": binding.PUBLISHED, "QUALIFIER_SOURCE": "a" * 40, "ACCEPTED_EXECUTOR": "a" * 40, "PROMOTION_BINDING_SHA256": "e" * 64, "MANIFEST_SHA256": "c" * 64, "SDK_SHA256": "d" * 64} +assert binding.checked_inputs(values, "0.5.0") == values +try: + binding.checked_inputs(dict(values, RELEASE_VERSION="0.4.0"), "0.4.0") +except AssertionError: + pass +else: + raise SystemExit("historical installed release accepted as current") +for key, value in (("PUBLISHED_SOURCE", "main"), ("QUALIFIER_SOURCE", "wasm/v0.5.0"), ("SDK_SHA256", "unknown"), ("RELEASE_VERSION", "0.1.1"), ("MANIFEST_SHA256", "$(false)")): try: - binding.checked_inputs(dict(values, **{key: value}), "0.4.0") + binding.checked_inputs(dict(values, **{key: value}), "0.5.0") except AssertionError: pass else: raise SystemExit(f"unbound dispatch {key} accepted") for missing in ('ACCEPTED_EXECUTOR','PROMOTION_BINDING_SHA256'): broken=dict(values);broken.pop(missing) - try:binding.checked_inputs(broken,'0.4.0') + try:binding.checked_inputs(broken,'0.5.0') except (AssertionError,KeyError):pass else:raise SystemExit('missing current transaction/executor accepted') for key, value in [('PUBLISHED_SOURCE','b'*40),('QUALIFIER_SOURCE','b'*40),('EXECUTION_BINDING','{}'),('CANONICAL_QUALIFICATION_AUDIT','historical')]: - try:binding.checked_inputs(dict(values,**{key:value}),'0.4.0') + try:binding.checked_inputs(dict(values,**{key:value}),'0.5.0') except (AssertionError,KeyError):pass else:raise SystemExit('current source/overlay substitution accepted') -release = {"tag_name": "wasm/v0.4.0", "draft": False, "prerelease": False, "published_at": "2026-10-02T00:00:00Z", "assets": []} -for name, digest in (("release-manifest.json", "c" * 64), ("fsgg-wasm-sdk-0.4.0.tar.gz", "d" * 64), ("promotion-binding.json", "e" * 64)): - release["assets"].append({"name": name, "digest": "sha256:" + digest, "browser_download_url": f"https://github.com/FS-GG/FS.GG.Game/releases/download/wasm/v0.4.0/{name}"}) +release = {"tag_name": "wasm/v0.5.0", "draft": False, "prerelease": False, "published_at": "2026-10-02T00:00:00Z", "assets": []} +for name, digest in (("release-manifest.json", "c" * 64), ("fsgg-wasm-sdk-0.5.0.tar.gz", "d" * 64), ("promotion-binding.json", "e" * 64)): + release["assets"].append({"name": name, "digest": "sha256:" + digest, "browser_download_url": f"https://github.com/FS-GG/FS.GG.Game/releases/download/wasm/v0.5.0/{name}"}) assert len(binding.validate_release(release, values)) == 3 for mutant in ("digest", "url", "draft", "version", "missing"): broken = copy.deepcopy(release) diff --git a/tests/release/wasm/test-release-promotion.py b/tests/release/wasm/test-release-promotion.py index 8adceef1..2b65aaf5 100644 --- a/tests/release/wasm/test-release-promotion.py +++ b/tests/release/wasm/test-release-promotion.py @@ -730,14 +730,14 @@ def test_actual_clean_executor_and_finite_glue_delta(self): # Actual Git cleanliness/head checks remain live; the complete diff parser # is exercised independently against real inert Git commits by collector controls. with patch.dict(os.environ,env),patch.object(binder,'source_audit',return_value={'bound':True}) as audit: - # This read-only binder remains finite to authentic published 0.4; - # selecting current source 0.5 must not invent its publication P. - audit_row=binder.bind_executor(binder.PUBLISHED,head,'0.4.0') + # This read-only binder selects the exact 0.5 publication producer; + # neither historical versions nor arbitrary executors can replace it. + audit_row=binder.bind_executor(binder.PUBLISHED,head,'0.5.0') self.assertTrue(audit_row['bound']);self.assertEqual(audit_row['execution']['run'],707) audit.assert_called_once_with(binder.PUBLISHED,head) for key,bad in [('GITHUB_SHA','9'*40),('GITHUB_WORKFLOW_SHA','9'*40),('QUALIFIER_SOURCE','9'*40),('GITHUB_REF','refs/heads/other'),('GITHUB_EVENT_NAME','push'),('GITHUB_RUN_ATTEMPT','2'),('GITHUB_WORKFLOW_REF',p.REPO+'/.github/workflows/other.yml@refs/heads/main'),('GITHUB_JOB','other'),('GITHUB_RUN_ID','0'),('WASM_PACKAGE_FEED','https://other.invalid/index.json')]: - with self.subTest(key=key),patch.dict(os.environ,{key:bad}),self.assertRaises(AssertionError):binder.bind_executor(binder.PUBLISHED,head,'0.4.0') - for executor,version in [('9'*40,'0.4.0'),(head,'0.3.0'),(head,p.VERSION)]: + with self.subTest(key=key),patch.dict(os.environ,{key:bad}),self.assertRaises(AssertionError):binder.bind_executor(binder.PUBLISHED,head,'0.5.0') + for executor,version in [('9'*40,'0.5.0'),(head,'0.3.0'),(head,'0.4.0')]: with self.assertRaises(AssertionError):binder.bind_executor(binder.PUBLISHED,executor,version) with patch.dict(os.environ,{'EXECUTION_BINDING':'{"schema":"historical"}'}),self.assertRaises(p.Refusal):p.execution_input() From 09427201c599a9c59cb308a93b81e98382032c7c Mon Sep 17 00:00:00 2001 From: EHotwagner Date: Sun, 18 Oct 2026 00:12:35 +0200 Subject: [PATCH 2/2] Capture original 0.5 publication and exact installed source boundary --- docs/atlas/catalog.json | 2 +- ...5940d22dd1d85148ee49f47aed714395fbd51d07b8751147815a55f.json | 1 + ...eac40c68aec6131ef0559967b399266aae89f9673d3c30ce12f36b0.json | 1 + scripts/wasm-release/bind-installed-release.py | 2 ++ 4 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 docs/atlas/records/71bc29a175940d22dd1d85148ee49f47aed714395fbd51d07b8751147815a55f.json create mode 100644 docs/atlas/records/ab69ebe00eac40c68aec6131ef0559967b399266aae89f9673d3c30ce12f36b0.json diff --git a/docs/atlas/catalog.json b/docs/atlas/catalog.json index 6d344a7b..07de57f2 100644 --- a/docs/atlas/catalog.json +++ b/docs/atlas/catalog.json @@ -1 +1 @@ -{"records":["049f1d0d8155f65b6f7675ebdb200d4595570cc7d585dd74876e0285eceffed6","0863093e69a16355fa9b90f8e7e29156ea4ad88c4523bc4883568bde831bdf35","2056fa8b653c2240afdad2a16f572a07019109254847829610a9468bb2f95248","231df3792931ad2333d00970a5993b3e13fa9dc38f687899f9fa2c966ed9fbfa","24fdc3980640ba58bedcae6f16d5b467eb7383c31161fb9b6ff10fd2e667b0e5","264a2f7887a9b6473cbc24102e1bf9be70e57f6d7ba224138140efa094d541f4","2b7dfb3a2f76368cb603161cdb6f8fa8c2b8afc3e96659dd37c975921ba5ba66","33df463263533529cca24a0b09937573f836d197cc1a739e9960b1cdd4deb1fd","343077d02ddd266b21d8677f7c256854134f7e3e2d18137b55ebe3f32564c5c0","34391bda3fb56135a2bddf74ab790958c175bc6a69c38175e6f8db792cfd50a0","36a19fefd7024f54f3391ffed19019c10222a514719edd7a44f0cde2a1c48258","3d3a0a302c02cd0bfee86715d09b0211baa8dad3e47402c638fc95c7cfa02e87","3de8718fb3ca9b15212e8bd84fba205995d24636087090a61c63c28a96a745b1","3df4f31fda99ad137c651322ad29809e36380400516399274870b4a4332b4a92","3f09ee199e3c2e808e0f6e74f197f2fdd8158ae099a7195c498ce9466bb78b03","44bda82d6f9a9625a83283bf56a15a1831f287037214dc134eeeae87f1faa869","6c5b38ee260d1f15f8029d699ec1cebceafb5e1407a6341dc7a4b96f4d9d3521","72742cbaa561237f10251e94aa5c61153ab5c7f14fc5771b7a5ebdece1e1cb11","85f06991da74fa4e59ba73c7034dc53a35a4e90c5b64d83cc8956d3afd61d376","87d6de6f3730cecd75d9a4411bf4dbac4e058127a3ce9f46b07f6de110bc26de","8b1cf51c5f03c0ae19c46ca3ea4a1158acbb6e47bf109ca8c506c5417b51cf9f","95115e1052b5ea4fcd393f5c9b9c6f0298657f0028eee84e16215ede97576cfa","a38737476856236f33e0aef1b97e2b900677cf99f1dbcfd381c708ceeca8b7f3","ab4502eff76606ac8e58b623878f3d76e1e0b18f30796aec7c446e2aab8b57c8","c01c2c98f13a65b49113916a2f295e46a03fc4c185ece880267dd86c3f3dee8b","d557525e3ebfad227c8d6db9bb6350d42506fb02b1de8058cb443f4f008c0f67","d9718eb12e9ae9ea3a29a9904f131f53e99c584ef1b297aa05f1f8f6cdc6ab2a"],"schema":"fsgg.atlas/1"} +{"records":["049f1d0d8155f65b6f7675ebdb200d4595570cc7d585dd74876e0285eceffed6","0863093e69a16355fa9b90f8e7e29156ea4ad88c4523bc4883568bde831bdf35","2056fa8b653c2240afdad2a16f572a07019109254847829610a9468bb2f95248","231df3792931ad2333d00970a5993b3e13fa9dc38f687899f9fa2c966ed9fbfa","24fdc3980640ba58bedcae6f16d5b467eb7383c31161fb9b6ff10fd2e667b0e5","264a2f7887a9b6473cbc24102e1bf9be70e57f6d7ba224138140efa094d541f4","2b7dfb3a2f76368cb603161cdb6f8fa8c2b8afc3e96659dd37c975921ba5ba66","33df463263533529cca24a0b09937573f836d197cc1a739e9960b1cdd4deb1fd","343077d02ddd266b21d8677f7c256854134f7e3e2d18137b55ebe3f32564c5c0","34391bda3fb56135a2bddf74ab790958c175bc6a69c38175e6f8db792cfd50a0","36a19fefd7024f54f3391ffed19019c10222a514719edd7a44f0cde2a1c48258","3d3a0a302c02cd0bfee86715d09b0211baa8dad3e47402c638fc95c7cfa02e87","3de8718fb3ca9b15212e8bd84fba205995d24636087090a61c63c28a96a745b1","3df4f31fda99ad137c651322ad29809e36380400516399274870b4a4332b4a92","3f09ee199e3c2e808e0f6e74f197f2fdd8158ae099a7195c498ce9466bb78b03","44bda82d6f9a9625a83283bf56a15a1831f287037214dc134eeeae87f1faa869","6c5b38ee260d1f15f8029d699ec1cebceafb5e1407a6341dc7a4b96f4d9d3521","71bc29a175940d22dd1d85148ee49f47aed714395fbd51d07b8751147815a55f","72742cbaa561237f10251e94aa5c61153ab5c7f14fc5771b7a5ebdece1e1cb11","85f06991da74fa4e59ba73c7034dc53a35a4e90c5b64d83cc8956d3afd61d376","87d6de6f3730cecd75d9a4411bf4dbac4e058127a3ce9f46b07f6de110bc26de","8b1cf51c5f03c0ae19c46ca3ea4a1158acbb6e47bf109ca8c506c5417b51cf9f","95115e1052b5ea4fcd393f5c9b9c6f0298657f0028eee84e16215ede97576cfa","a38737476856236f33e0aef1b97e2b900677cf99f1dbcfd381c708ceeca8b7f3","ab4502eff76606ac8e58b623878f3d76e1e0b18f30796aec7c446e2aab8b57c8","ab69ebe00eac40c68aec6131ef0559967b399266aae89f9673d3c30ce12f36b0","c01c2c98f13a65b49113916a2f295e46a03fc4c185ece880267dd86c3f3dee8b","d557525e3ebfad227c8d6db9bb6350d42506fb02b1de8058cb443f4f008c0f67","d9718eb12e9ae9ea3a29a9904f131f53e99c584ef1b297aa05f1f8f6cdc6ab2a"],"schema":"fsgg.atlas/1"} diff --git a/docs/atlas/records/71bc29a175940d22dd1d85148ee49f47aed714395fbd51d07b8751147815a55f.json b/docs/atlas/records/71bc29a175940d22dd1d85148ee49f47aed714395fbd51d07b8751147815a55f.json new file mode 100644 index 00000000..9c67b930 --- /dev/null +++ b/docs/atlas/records/71bc29a175940d22dd1d85148ee49f47aed714395fbd51d07b8751147815a55f.json @@ -0,0 +1 @@ +{"citations":[{"path":"docs/roadmaps/wasm-shared-01.md","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"e1e6304e5f4f22aa2d95f665b0ffa2bc27d9a9111e43dd99d87710191d9e74c2"},{"path":"scripts/wasm-release/build-worker-policy.sh","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"3e767ab1a920c3bc84c9c56a0d7eeef89e3c06f861d945f4b3523426337a945e"},{"path":"scripts/wasm-release/worker-bundle/build.mjs","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"404803d8f8bf57efc76843776158cce2358f635f311f156decbb451d595c2509"},{"path":"scripts/wasm-release/worker-bundle/closed-module.mjs","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"8511d26e35a0c1468511db735d0179e3b699a55e72ab961cfb34314576080f77"},{"path":"scripts/wasm-release/worker-bundle/package-lock.json","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"14b0f16377cd6a6a6242ffb86201d6819390ab1de32046b49ce23df170643fa4"},{"path":"src/Wasm.Browser/WorkerEntry.fs","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"34cd39c024c4f5415489947e024a48bee8a44671b39b9b013ca3118bcd21ad9f"},{"path":"src/Wasm.Browser/js/module-worker.mjs","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"81a4a316b1da49793eef3d4f3849cdf94ef6135c9e38f1b2867d887e95a8dea4"},{"path":"src/Wasm.Browser/js/worker-client.mjs","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"9bfcc57b363b4169f96e8b4ea8bb6a6b85a961ceec41c2e0a174ab2e0ce0cfcd"},{"path":"scripts/wasm-release/release_manifest.py","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"d1035834fed0950169dd3f5c14b5ee37aebed5171a2785a43d14fb5ceb8cfbde"},{"path":"tests/Wasm.PackageConsumer/browser/package-consumer.spec.mjs","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"269344d9658e2e3b565003dc6d4bae9d8292369b2aaa85ea1a019887133dc266"},{"path":"tests/release/wasm/test-worker-transport.mjs","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"b1b996e7e3e657dd86e79a2aeffce9670526d9ac081cc683771acea0161b98be"},{"path":"lib/shared/types.ts","repository":"evanw/esbuild","revision":"609683d892977362a0f99026cb74b96263d728a9","sha256":"e078310f23f0ccfa28a6ac81b5fad81f27150e921f92ab6e648caab42e2d9a14"},{"path":"scripts/wasm-release/worker-bundle/closed-module.test.mjs","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"77c3b4a57b0413c6c326378bcfec3795626224c6511781398b6d9cf89fa8779c"},{"path":"scripts/verify-wasm-workflow.sh","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"65fbc7d304e80e27a7fa99bb97ff6d5bca840505821213d3fabf624ada19a79f"},{"path":"tests/Wasm.Lifecycle.Tests/packages.lock.json","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"61d0c74c684e1576b5729da2905ea638a78e2071eca75bc547db2080d968900f"}],"conflictsWith":[],"id":"game/closed-worker-build-boundary","kind":"architecture","recordedAt":"2026-10-17T22:12:22Z","repository":"FS-GG/FS.GG.Game","schema":"fsgg.atlas/1","status":"recorded","summary":"Coherent Contracts/Browser and SDK 0.5.0 are published from immutable producer/executor 80540027623d9b1a8aa7715d0591de48455403b7/tree fa2cd0160f9a7c5bb0a1ad85fd8f1eff68b867d3. Original repaired PR qualification39070020711 and protected39071360197/attempt1 passed; the protected 39-file eligible artifact12115444543 preserves complete package/source/model evidence. Protected duration21m14 was within the unchanged35-minute profile, not a future cold-fit guarantee. All35 package-browser cases (32 existing plus three genuine fresh/expiry/late-message histories), default53 and selected16 source/candidate-installed CLR/Fable/numeric cohorts passed. Fresh history has four successful operations and94 healthy bounded observations; cold expiry remains explicitly incomplete, and held-message expiry is deliberate delivery impairment, not naturally late-callback evidence.\nThe maintained build supplies exact captured generated-F# and mechanical source buffers to locked build-only esbuild0.28.2 twice; Acorn8.19.0 and ESLintscope9.1.2 inspect the complete closed ESM and lexical aliases. It is not an arbitrary-JavaScript sandbox. Original package custody retains38 generated inputs, mechanical source, tool lock, source/tree and the single647649-byte bundle SHA25696e9c1a7e31c6532358a1f57605eb69aa1c708c56744b808232367b83b19c6ec. Package readers and native qualification bind the original inputs/output; local data review is not independent native compilation or signature execution. Advisory ready/admission/SHA/instantiate observations never change original pre-create deadlines, capacity, identity or retirement, and their clocks remain separate.\nOriginal release-wasm39073209865/attempt1 completed all seven ordered stages; literal wasm/v0.5.0 tag/release416092764 retain P. Native credential admission proved observable coordinate absence; local OAuth org-package403 was Unknown, never absence. Org whole archives, signed-public payload/content hashes, SDK/manifest and exact original transaction were independently reviewed. Published0.4/P6732 and Q20c accepted installed evidence remain immutable history. Current0.5 served-feed installed Q, consumer/native/image/product acceptance remain separate and unexecuted at capture.\nRetain the first39069862111 static failure on one stale Project lock edge, repaired without changing other package hashes; the earlier alias-escape and source-tree correspondence findings are source-resolved with actual-caller controls. The full download primitive correctly refused local invocation without genuine Actions executor variables; read-only tuple/native/custody primitives supplied local data verification without fabricated environment. Neither successful publication nor this record proves earlier consumer timeout cause or grants another operation.","supersedes":["d9718eb12e9ae9ea3a29a9904f131f53e99c584ef1b297aa05f1f8f6cdc6ab2a"],"tags":["wasm","worker","bundle","startup","diagnostics","custody","current-only"],"title":"Qualified closed Worker 0.5 build and original publication boundary"} diff --git a/docs/atlas/records/ab69ebe00eac40c68aec6131ef0559967b399266aae89f9673d3c30ce12f36b0.json b/docs/atlas/records/ab69ebe00eac40c68aec6131ef0559967b399266aae89f9673d3c30ce12f36b0.json new file mode 100644 index 00000000..1dc51a6a --- /dev/null +++ b/docs/atlas/records/ab69ebe00eac40c68aec6131ef0559967b399266aae89f9673d3c30ce12f36b0.json @@ -0,0 +1 @@ +{"citations":[{"path":"docs/roadmaps/wasm-shared-01.md","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"e1e6304e5f4f22aa2d95f665b0ffa2bc27d9a9111e43dd99d87710191d9e74c2"},{"path":"scripts/wasm-release/bind-installed-release.py","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"123edf6d52b364eff9a5be7acce4d558f8f5b8c27bc3af612625171ddae21865"},{"path":"scripts/wasm-release/promotion.py","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"29de90182f78b9e219c98ee56d340f75aecec7f9c27bb53f3cf0971a29b1e73e"},{"path":".github/workflows/wasm-installed-org.yml","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"5d9a89a860e6af539ce4c5e99add2a2d5cc50e217ae36b720a2b8f90a9434221"},{"path":"scripts/wasm-release/installed-evidence.py","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"d6349d4ee7212810855e9daadaed8b20f19d1072bd5d25dce12c7578c6398758"},{"path":"scripts/verify-wasm-package-consumer.sh","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"31d98f934faee58ade6b84ed776bfd344435601b3a5f6741877e45781ce953ac"},{"path":"tests/release/wasm/test-installed-org-workflow.py","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"00c96caabdc404b2ce7e77317e911c3361d84b0ae8f6d65f6da97d0b2220dc62"},{"path":"tests/release/wasm/test-release-promotion.py","repository":"FS-GG/FS.GG.Game","revision":"615ce17ed90bd59a8cdaf7a4e5a2d8a86616afbc","sha256":"6895bcc544384fb509637c87aabeb575e386889b6678f1426454633012196e89"}],"conflictsWith":[],"id":"game/current-wasm-custody-source-boundary","kind":"boundary","recordedAt":"2026-10-17T22:12:22Z","repository":"FS-GG/FS.GG.Game","schema":"fsgg.atlas/1","status":"recorded","summary":"Current original publication0.5.0 is P80540027623d9b1a8aa7715d0591de48455403b7/treefa2cd0160f9a7c5bb0a1ad85fd8f1eff68b867d3. Accepted protected39071360197/attempt1/artifact12115444543 binds the exact coherent pair and SDK; original publication39073209865/attempt1/release416092764 and literal P tag preserve those originals. Manifest SHA2564874c07d6c6b4f1cd920e2a1379de2e5778529f94d211b2c8d138ed8d719483c; SDK1aaa536f13e2afe93cf5b8bd825461b6ac7232df90e9f246a73f9fabb9ed8390; transactionc567d141277004186ec6f4b24df63defb103c2fc1b811d1f4c3bcd83588cacb7. Org literal archives and public signed envelopes have separate physical hashes but identical original payloads/unsigned content; genuine native signature checks and complete original readbacks passed. This resolves current publication, not served-feed installed or product adoption.\nThe next current-only read-only binder selects genuine0.5 P/tree instead of retaining a compatibility route for0.4. Q must be a clean actual current-main first-attempt installed workflow executor, descend from P, and preserve every runtime/workflow/tool/profile path outside the explicit binder/tests/owning-document/catalog and individual captured-record closure. No broad scripts-prefix grant. Native release/tag/asset/transaction, original qualification and all successful publisher stages are reauthenticated; executor overlays, arbitrary refs/versions, foreign tree/transaction and partial evidence refuse. Final record paths are admitted individually in the coherent source closure, never as a directory wildcard. Narrow Q preparation has independent source review and meaningful inert controls, but its compiler/full CI and actual installed operation remain pending.\nExisting served-feed qualification remains sequential org/public,45minutes per feed, Node2048MiB, with unchanged512MiB total/256MiB file/32MiB logs/1MiB metadata/1024-member refusal limits. Full restored archives/sidecars/metadata/locks/configuration, exact feed, Core/compiler/Fable runtime, Worker/compiled dependency provenance and separate command/log/collector/cleanup/upload statuses remain necessary. Native fit/custody must be observed rather than inferred from prior candidate-package qualification. Published0.4/P6732 and accepted original Q20c94478/39023332496 plus protected39023124943 remain historical accepted evidence; its original failures and no-local-workload boundary remain unchanged. No installed dispatch, consumer pin/adoption, native image or whole-product closure is granted by this record.","supersedes":["a38737476856236f33e0aef1b97e2b900677cf99f1dbcfd381c708ceeca8b7f3"],"tags":["wasm","installed","publication","qualification","source","evidence","fable","nuget"],"title":"Immutable 0.5 publisher and finite read-only installed qualifier"} diff --git a/scripts/wasm-release/bind-installed-release.py b/scripts/wasm-release/bind-installed-release.py index 7bf813c4..24347bdd 100644 --- a/scripts/wasm-release/bind-installed-release.py +++ b/scripts/wasm-release/bind-installed-release.py @@ -23,6 +23,8 @@ 'tests/release/wasm/test-release-promotion.py', 'docs/roadmaps/wasm-shared-01.md', 'docs/atlas/catalog.json', + 'docs/atlas/records/71bc29a175940d22dd1d85148ee49f47aed714395fbd51d07b8751147815a55f.json', + 'docs/atlas/records/ab69ebe00eac40c68aec6131ef0559967b399266aae89f9673d3c30ce12f36b0.json', })