Skip to content

Qualify the first clean downloaded shared-game-reference journey #4710

Closed

Description

@EHotwagner

Owner: Programme /root accountable. Existing Templates receiver owner template_wasm_reference retains implementation ownership under campaign unified-roadmap-20261003, chain game-template-installed-c; Coordination execution maintainer supplies the exact canonical managed-group candidate contract. Rendering/Game retain producer APIs and product owners retain staged adoption. No replacement owner or competing PR is selected.

Done when: A clean downloaded-only selected current shared-game-reference product builds and runs its actual Fable/Vite/Worker/ESM production graph without sibling source or local-feed fallback. Exercise one genuine opted-in published WASM reference and its real enabled/disabled browser path, exact package/Worker/guest custody and bounded lifecycle/refusal behavior through the maintained receiver. Reuse accepted0.19.0 signatures and compatible source/runtime assertions only where identities and profiles match; record honest missing composition cases.

Current deliverable: Direct downloaded-only public Workspace.Template 0.19.0 default/Complete WASM receiver through tests/composition/fable-game/verify-fable-reference-public.sh --mode wasm. Recover existing merged PR719 (routine/templates-cj1-browser-preflight, head 1d20b0bd0c9736d81820bc6e6ab304a20fb357e8) and predecessor PR718 (routine/template-wasm-clean-20261014, head e23f994a56e81308a491c5af3f197c2089dd62c7) in the same chain; fresh native read finds no open Templates PR and the sole main worktree is clean. This direct assertion excludes Wizard/provider/SDD acceptance.

Next action: Existing Coordination execution maintainer supplies the exact reviewed canonical managed-group candidate API/schema/source identity and executable/birth/root/argv/retirement profile usable by the existing Templates caller; template_wasm_reference then integrates that actual contract under C-J1 on the same chain, preserving current runtime/upload literal-false gates until source/profile review. Programme /root next observes on that concrete supplier/source change or an explicit scoped source decision, then admits a genuine bounded three-family custody pilot before the downloaded-only 27-case runtime assertion. No unchanged hold polling or known Governance probe is selected.

Blocked on: The actual maintained Templates caller at protected f5fbd06ed9e6df40f9037c7acddf9eca3c6a14fc refuses at its Chromium support/runtime join and unconditional main: canonical managed-group candidate/profile contract remains unbound. Existing Coordination main 8bbdcc4d65ee587ad087f58bda15e555aae19926 and owning #1026 source/publication evidence do not supply that complete browser candidate join; current shared process owner refuses escaped groups and BCL sessions do not supply required stable descendant containment. A source patch cannot safely invent this supplier contract. This fences the dependent runtime, not independent source preparation. Publication, compatible 4708 knowledge acceptance and available local browser slots do not establish this profile. All original failures, unknown cleanup effects and 439 inherited/46 later reservations remain retained.

Acceptance evidence: 2026-10-01-staged-fable-game-adoption.md Stage.3/.4, Qualification/rollback, GAME-TEMPLATE-01 and shared receiver cohort; acceptedTemplates713/714/715 and actual0.19.0 publication. Preserve accepted parent source/publication evidence at its original scope. Record actual PR/head, selected artifact/profile/operation, independent scoped result and native acceptance here after they exist; this draft supplies none. Full original parent promise and history remain authoritative at #4646; broader programme outcome: #4646. This bounded source/receiver result does not close either broader promise. Accepted decomposition design: #4701 and docs/coordination/2026-10-19-board-clearing-lifecycle-design.md (owning source plan; publication remains separate).

Supplier/assertion reconciliation — 2026-10-20: the maintained --mode wasm --preflight-only accepted the exact public 0.19.0 arguments without SDK/browser/download execution or output creation. Signed NuGet archive SHA256 187c995806bb2f22db67c8a9a67c251f46f339bf6350b8051035935d308b497f; source/peeled tag 8952e1c5753b0abc972154c7596ddc8da772b271; independently source-read descriptor SHA256 d7207cbde78f2890a63bbebf23c80bbcae8ce7f2405c0ceacf602dc6c185942c. This establishes argument/assertion mapping only. Original owning hosted direct window, held caller, PR719, PR718 and PROC owning issue1026 retain authority/history at their actual scopes. Atlas restart pointer: templates/0.19-publication-and-receiver-scope; current C-J1 supplier clarification has no delivered source carrier, capture gap Programme/root. Full Done when and parent promise stay open.

Activity

  1. EHotwagner commented on Oct 22, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-22: the supplier request now exists. FS-GG/FS.GG.Coordination#1046 asks the Coordination execution owner for the canonical managed-group candidate contract (API/schema/source identity; executable/birth/root/argv/retirement profile; stable descendant containment) that the Templates caller needs. It is filed under #1026 and an owner is dispatched. Note: Workspace.Template 0.19.1 is now published (Templates#729), so the downloaded-only receiver should target 0.19.1 when it resumes.

  2. EHotwagner commented on Oct 22, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-22: C-J1 source binding merged. FS.GG.Templates#731 was squash-merged as 2c2527ec8095abca7330cf117044c31a2ec0dbad. Its merge tree is identical to the reviewed head 2462b98cae31ba130cc96a5ce9c557e0ad7a0a40.

    Bound pin: (FS-GG/FS.GG.Coordination, ac22206560f3eddfea524ce8f752ff1d0dfeec4e, eng/managed_group_owner.py, sha256 d846dbe158befb5b824bd94a5bc0bb89b1145f825d5d6fa3a3225fa0451a36c0), 45315 bytes, contract fsgg.managed-group-contract/1.

    What the maintained caller now does (.github/workflows/fable-reference-public.yml, job wasm-installed-c):

    • It fetches the owner through its closed acquisition path and checks the size and SHA-256 before import. It then checks the contract schema and the owner's own import-time hash.
    • It calls probe() before any provisioning acquisition and refuses if containment is unavailable.
    • It replaces the injected execute(argv,cwd,env) with one run(profile, env=, deadline=<phase deadline>, out_dir=<fresh dir under root>) per call, using require-empty. It returns stdout.log, retains every receipt, and raises the first cause.
    • Every executable must be identity-bound first, with a recorded basis.
    • The job's Python runs in sudo -n systemd-run … -p Delegate=yes -p User=runner -p NoNewPrivileges=yes -p KillMode=control-group -p TimeoutStopSec=5 with TasksMax=6144 and MemoryMax=12G as hard limits.
    • The WASM receiver now targets published Workspace.Template 0.19.1: archive 5d1886c3…, source and peeled tag 1e95ddd, descriptor 10b532da…. 0.19.0 Complete scaffolds truncate guest/policy.c, so they can never close the byte-exact WASM closure.

    Gates preserved: the caller step and the upload step keep if: ${{ false }}, and main() still refuses first on the literal RUNTIME_ADMITTED = False. Nothing provisions, runs a pilot or runs installed C.

    Evidence:

    • Hosted probe. A non-required probe job ran the caller's own binding against the real owner on GitHub-hosted Ubuntu (run 39807024091, and again on the final head):
      • Outside a unit, it refused with delegated-root-not-writable and nothing was launched.
      • Inside a delegated unit, a bound group succeeded with an admitted birth image and no_new_privs, and was contained and removed.
      • A detached leftover failed require-empty and was retired.
      • Drifted, unbound and expired calls refused.
      • The unit read back pids.max 256 and memory.max 1073741824.
    • Local tests. Preflight: 103 OK with the real owner (99 OK and 4 skipped without it). These include the actual call sites put through the real validate_profile. F# ProviderComposition: 190 PASS. The dev container refuses with delegated-root-invalid, as the contract expects.
    • Review. The independent fsgg-critic-best review returned REQUEST CHANGES on 3066ac8: a multi-line node -e argv was refused by the real owner, and the per-Playwright claim was overstated. Both were fixed in 6eeb8d5, and the review returned ACCEPT on 2462b98.
    • Required checks: all green on that head (composition, kit / coordination-kit, materialize / receiver-validate).
    • Atlas: templates/wasm-installed-c-managed-group-binding, delivered in the PR.

    Now unblocked: Programme/root can admit the bounded genuine three-family custody pilot before the downloaded-only 27-case runtime assertion. Lifting the three literal holds stays with that C-J1 source/profile review and admission. This comment grants no runtime authority.

    Remaining Unknowns and held work:

    • Per-Playwright groups on the installed-C path. managed_playwright exists, but fixed_checker_argv still starts the shell checker, which runs Playwright itself, so all families would share one group. Those invocations must move into the Python owner as part of pilot/installed-C work.
    • Not yet run or observed: the Chromium support/runtime join for the selected archive directories, stock browser and Vite shutdown under require-empty, WebKit host/birth/retirement, and the time cost of hashing large leader images.
    • Provenance gaps. Installer-output identities (toolchain rustc/cargo) and host images (/bin/sh) are observed, not provenance-checked. The rustup-init digest comes from unpinned same-server metadata, as before this change.
    • Untested call sites. The real-schema test does not reach every provisioning call site. The validator script's hash is not recorded in the profile.
    • Not established: the full Done-when (a downloaded-only build, the run, and 9 passing cases in each of three browsers). Retaining/provider/Wizard/AT promises stay separate.
    • Repaired pre-existing failure. On main 1e95ddd, 6 CurrentPublicPreflightTests failed because Phase 3b — the flip: --engine=fs becomes the default, once divergence --fleet is actually green #730 moved the working-tree descriptor. They now use the immutable 0.19.0 descriptor bytes.

    The issue stays open and the Project 3 Status is unchanged.

  3. EHotwagner commented on Oct 22, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-22: C-J1 follow-up merged. FS.GG.Templates#732 was squash-merged as 68f101f305c77cfb38afdb465c088d2cd1e083a5. Its tree is identical to the reviewed head 64d541f.

    • Installed C now has one managed group per Playwright invocation.
      • The shell checker's --mode wasm prepares only the downloaded source and production graph, the generated config and the Browser.Tests npm ci. It runs no browser.
      • The caller's installed_c runs the checker as one group, then each family's Playwright --list and test invocation as its own require-empty group, and applies the 9-case assertions per family.
      • hosted_sequence runs provisioning, then tool qualification, then custody_gate, which refuses, then installed_c.
    • Validator hash. The browser host validator is content-addressed, so its SHA-256 is in the profile argv. Each group records the hashes of its declared script inputs.
    • Tests. All 25 provisioning, qualification and installed call sites go through the real owner's validate_profile at run time. The preflight suite passes 110/110 with the owner.
    • Review. fsgg-critic-best returned ACCEPT on 9f04ed8 with findings, which were fixed, then ACCEPT on 64d541f with 18 mutants killed. All required checks are green.
    • Gates unchanged: if: ${{ false }} ×2, RUNTIME_ADMITTED = False, and custody_gate.
    • Atlas: templates/wasm-installed-c-managed-group-binding, successor c1a5773e….

    Next: the bounded three-family custody pilot admission request has been prepared for Programme/root (fdev) and has not been run. The issue stays open, and Project 3 Status is unchanged.

  4. EHotwagner commented on Oct 22, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-22: ADMISSION: the bounded three-family WASM custody pilot (C-J1 follow-up, FS.GG.Templates). This is a conditional admission, issued in advance to save a round trip.

    Context: per-invocation Playwright groups are merged (FS.GG.Templates#732 → 68f101f3). The managed-group owner is pinned at ac222065 / d846dbe1….

    Admitted: exactly one workflow_dispatch of the new .github/workflows/wasm-custody-pilot.yml, job custody-pilot. All of these conditions apply:

    1. The pilot source PR is reviewed and merged first. It adds the dispatch-only workflow, pilot_sequence, the browser-only provisioning subset and dispatch source validation. It needs an independent fsgg-critic-best ACCEPT on its exact head, and all required checks green.
    2. The ref is that PR's merge SHA, read back immediately before dispatch. admitted_ref equals github.sha, and admission is the URL of this comment.
    3. Unchanged: RUNTIME_ADMITTED=False, both if: ${{ false }} steps in fable-reference-public.yml, and custody_gate. Nothing in installed C opens.
    4. Limits:
      • GitHub-hosted ubuntu-24.04 only;
      • contents: read, with no secrets, no repository writes and no publication;
      • a delegated systemd-run unit with TasksMax=4096, MemoryMax=8G and RuntimeMaxSec=1800;
      • a job timeout of 30 min;
      • a single evidence artifact of 50 MB or less, kept 30 days.
    5. Fixed families: Chromium headless-shell 1243, Firefox 1543 and WebKit 2359, each with its normal, forced-deadline and leader-exit cases. Plus the Chromium library scan.
    6. No re-dispatch or re-run without a new admission. A failure is evidence: report it.

    After the run: an independent acceptance review of custody-pilot.json and the receipts. Opening installed C, and the 27-case journey, are separate later decisions.

  5. EHotwagner commented on Oct 22, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-22: The custody pilot ran exactly once, as admitted. Result: incomplete. Chromium and Firefox custody is fully qualified. WebKit could not start because the stock runner lacks its host libraries. No re-run or re-dispatch was made.

    • Source. FS.GG.Templates#733 was merged as c6dabf45dfb7077b0e2e72f228f7d9a42b58fb37. Its tree is identical to the reviewed head 1eddb6d, and fsgg-critic-best returned ACCEPT on that head after one REQUEST CHANGES round. main read back as that SHA immediately before the dispatch.
    • Run. 39828121993 (workflow_dispatch, attempt 1, headSha c6dabf4), with admitted_ref=c6dabf4… and admission set to the admission comment. Job conclusion: failure. That is by design: the job exits non-zero unless the disposition is completed. Duration was 1m38s.
    • Evidence artifact. wasm-custody-pilot-39828121993-1, id 12447901380, sha256 6c74ef80d6f5684cb81a81faacd5a79245b9d32ddd7c17862a5dae4c25b928a6. It is 67299 bytes zipped, holds 67 files (233483 bytes, none skipped or truncated), and expires on 2026-11-21.

    Containment on GitHub-hosted ubuntu-24.04 (kernel 7.0.0-1017-azure): the delegated root was system.slice/fsgg-mg-templates-pilot-39828121993-1.service, with controllers cpuset, cpu, io, memory and pids. All 16/16 managed groups (5 setup, 11 custody) ended cleanup=observed-empty-removed and custody=contained, with no escapes or residue. Every leader image was admitted with no_new_privs=1, and every group ran under owner d846dbe1….

    Host validation, per family:

    • chromium (full, headless-shell, ffmpeg) and firefox: passed.
    • webkit: host-dependencies-missing, 34 libraries missing: libgtk-4.so.1, libgraphene-1.0.so.0, libevent-2.1.so.7, libopus.so.0, the GStreamer libraries (allocators, app, pbutils, audio, tag, video, gl, codecparsers, fft), 13 libflite*, libavif.so.16, libharfbuzz-icu.so.0, libwayland-server.so.0, libmanette-0.2.so.0, libhyphen.so.0, libsecret-1.so.0, libGLESv2.so.2 and libx264.so.

    Chromium library scan: both chromium-headless1243 and chromium-full1243 are support-complete. Each scanned 5 targets (the executable plus its .so files) with no missing libraries.

    Cases (each one its own require-empty group):

    family normal (stock runner + vite preview) forced (held past 25 s) leader exit
    chromium 1243 (headless shell, 153.0.8010.12) clean-stock-shutdown: 1/1 passed, 10 members, nothing left after leader exit deadline-retired: 7 SIGTERMs, then cgroup.kill, removed browser-exited-with-leader: clean
    firefox 1543 (155.0, content sandbox enabled) clean-stock-shutdown: 1/1 passed, 11 members, nothing left deadline-retired: 8 SIGTERMs, then cgroup.kill, removed browser-exited-with-leader: clean
    webkit 2359 run-failed: launch refused for missing host libraries; the group, including the webServer (30 members), was retired clean unexpected: launch refused for missing libraries unexpected: launch refused for missing libraries

    What this establishes:

    • Stock shutdown under require-empty is clean for Chromium and Firefox, including the Playwright webServer. In both forced cases the browser trees outlived SIGTERM grace and were retired by cgroup.kill.
    • The Chromium runtime join is closed for the selected archive directories, on this runner image.
    • WebKit startup and shutdown are not established. The stock runner lacks WebKit's host libraries, and installing them was not admitted.

    Unknowns and remaining work:

    • WebKit custody. It needs either an admission for a bounded, recorded host-package install of Playwright's ubuntu24.04 WebKit list followed by a new single run, or an explicit decision to treat it as a residual.
    • Per-browser argv is not recorded (receipts hold only the leader's cmdline).
    • Other runner images are unknown.
    • The independent acceptance review of custody-pilot.json and the receipts, required after the run by the admission, is still owed. So are the installed-C admission and the 27-case journey.
    • Atlas capture gap (owner fdev): the pilot outcome is recorded here, not yet as an Atlas successor of templates/wasm-custody-pilot.

    Project 3 Status is unchanged. RUNTIME_ADMITTED, both literal-false steps and custody_gate are untouched.

  6. EHotwagner commented on Oct 22, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-22: custody pilot run 39828121993: ACCEPTED WITH GAPS (independent acceptance review). ADMISSION for a second pilot run (WebKit plus survivor retirement), issued in advance.

    Established (verified from the artifact, zip 6c74ef80…):

    • Binding: ADMITTED_REF = SHA = WORKFLOW_SHA = c6dabf4, the exact admission URL, attempt 1, owner d846dbe1… re-fetched, and the PR Phase 4.3 — the chore queue: the tool has no thread, so it conscripts the next caller (all four helping conditions, or not at all) #733 merge tree equal to the reviewed head.
    • Groups: 16/16 observed-empty-removed, contained, no escapes, empty residual, admitted leader images, no_new_privs. Each profileSha256 was recomputed and matches.
    • Chromium and Firefox, on GitHub ubuntu-24.04:
      • normal: a genuine clean stock shutdown. The vite webServer tree sat inside the group, and Playwright's own teardown emptied it, with no owner signal needed;
      • forced: held past the deadline and retired by cgroup.kill, with the leader killed by signal 9;
      • Chromium support scan: complete.

    Gaps:

    • Forced cases: they prove the group still held processes past SIGTERM, not which browser processes did.
    • Leader exit: survivor retirement was not exercised. Playwright killed the browser within the 50 ms settle window (residualAfterLeaderExit=[]).
    • WebKit: a genuine host-library gap (Playwright's own validateDependenciesLinux found 34 missing), with its groups still retired clean.
    • Artifact: it lacks 3 hidden manifest files (include-hidden-files: false).
    • Limits: they come from the source and log, not captured unit properties.

    Admitted, a second run, with the same conditions as 6346457201 except:

    1. A new source PR (independent fsgg-critic-best ACCEPT on the exact head, required checks green):
      • a separate workflow step before systemd-run (since NoNewPrivileges blocks sudo in the unit) that installs only Playwright's ubuntu24.04 WebKit package list for the pinned Playwright version;
      • record dpkg-query -W before and after, the diff, the apt sources and the installed versions in the evidence;
      • the result is labelled "ubuntu-24.04 plus recorded packages";
      • include-hidden-files: true;
      • capture the unit's TasksMax/MemoryMax/RuntimeMaxSec properties into the evidence;
      • a hold variant per family that keeps the browser alive after the leader exits (e.g. a detached child or SIGSTOP), to exercise leftover-retired;
      • the recorded admission URL changes to this comment.
    2. Exactly one dispatch at that merge SHA, attempt 1. No re-run.
    3. Unchanged: runtime gates, RUNTIME_ADMITTED=False and custody_gate. Only the apt step writes, and only on the ephemeral runner. No repository writes and no publication.

    After the run: an independent acceptance review. Installed C and the 27-case journey remain separate decisions.

  7. EHotwagner commented on Oct 22, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-22: The second custody pilot run ran exactly once, as admitted. Result: incomplete. Survivor retirement is now established for Chromium and Firefox. WebKit is still unqualified, because the admitted package install timed out before installing anything. No re-run or re-dispatch was made.

    WebKit host packages (admitted apt step):

    • apt-get update exited 0.
    • apt-get install of the 51 admitted packages resolved to 176 packages (172 new, 4 upgraded, 95.0 MB). Only 30 had downloaded when the step's 5-minute timeout fired; the Azure Ubuntu mirror download had stalled. Nothing was unpacked.
    • The timeout let the pilot still run, as intended. But install-exit.txt and dpkg-after.tsv were never written, so the pilot recorded hostPackages.state=not-attempted and the label ubuntu-24.04, not "+ recorded packages". The accurate reading is: attempted, timed out during download, no packages installed.
    • Recorded anyway: packages.txt equals the admitted list and matches the pinned Playwright 1.63.0 list. dpkg-before.tsv, apt-sources.txt, update.log and install.log are retained.

    Unit properties, now captured through systemctl show as a managed group: TasksMax=4096, MemoryMax=8589934592, RuntimeMaxUSec=30min, Delegate=yes, NoNewPrivileges=yes, KillMode=control-group, TimeoutStopUSec=5s, User=runner. All match the admission.

    Containment: all 20/20 groups (6 setup, 14 custody) ended observed-empty-removed and contained, with no escapes or residue. Every leader image was admitted with no_new_privs=1, under owner d846dbe1…. Host validation passed for chromium and firefox; webkit reported host-dependencies-missing (unchanged). The Chromium library scan was support-complete for both archives.

    Cases:

    family normal forced leader exit survivor (detached holder)
    chromium 153.0.8010.12 clean-stock-shutdown deadline-retired (7 SIGTERMs, then cgroup.kill) browser-exited-with-leader leftover-retired: 7 residual (holder + 6 chrome-headless), SIGTERM then cgroup.kill, removed
    firefox 155.0 clean-stock-shutdown deadline-retired (8 SIGTERMs, then cgroup.kill) browser-exited-with-leader leftover-retired: 8 residual (holder + firefox, forkserver, Socket, WebExtensions, RDD, Web Content), retired and removed
    webkit 2359 run-failed (missing host libraries) unexpected (launch refused) unexpected unexpected: "holder failed: … missing dependencies", evidence kept

    The forced cases now record observedBrowserMembers: every launched browser process appears in the owner's member sample. That shows the processes were observed in the group; it does not show which were alive at the deadline.

    What is newly established:

    • Survivor retirement for Chromium and Firefox: browser processes outliving the leader were recorded as residual and then retired by the owner.
    • The unit limits are captured from systemd.
    • Hidden evidence files are now retained.

    Still open:

    • WebKit startup and shutdown. The admitted install could not finish within the 5-minute bound because the mirror stalled. A further run would need an admission with a longer bound, or a different source for the same pinned list. Whether to spend it is root's decision.
    • The pilot's not-attempted state is less precise than the logs. A follow-up should record attempted from update-exit and a timeout marker.
    • Per-browser argv is still not recorded.
    • The independent acceptance review of this run is owed.
    • Installed C and the 27-case journey are still held.
    • Atlas: the run-1 outcome and the corrected claims are captured (templates/wasm-custody-pilot-run-39828121993, 8f7e75f5…, delivered in [registry] Re-digest the fs-gg-game-core skill row — the canonical body now names the Physics module (owner: fs-gg-game) #734). This run's outcome is a capture gap, owner fdev.

    Project 3 Status is unchanged. RUNTIME_ADMITTED, both literal-false steps and custody_gate are untouched.

  8. EHotwagner commented on Oct 22, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-22: pilot run 2 (39837319401): ACCEPTED WITH GAPS (independent acceptance review). ADMISSION for a third, final WebKit run, issued in advance.

    Established (artifact c80e5a9a…, 88/88 entries; binding 1638416 with patch-id-identical review/merge and no overlap with #728):

    • Chromium and Firefox custody on two runner builds (20261018.339.1 and 20261021.345.10):
      • clean stock shutdown;
      • deadline retirement by cgroup.kill;
      • owner-performed survivor retirement: holder plus 6 or 7 browser processes alive 2 s after the leader exited, retired with SIGTERM then cgroup.kill, populatedAfter=false;
      • 20/20 groups contained, with the systemd unit properties captured and matching the admission.

    Gaps:

    • WebKit: the apt install timed out mid-download (30/176 packages fetched, nothing unpacked), and the cases still report 34 missing libraries.
    • Mislabel: the evidence says not-attempted, though the update and install were attempted (fable-reference-public.yml:1426-1437).
    • apt termination after the timeout is unproven.
    • Forced cases still don't show which browser processes were alive at the deadline.

    Admitted: run 3, with the same conditions as 6347853904 except:

    1. A source PR (independent ACCEPT on the exact head, required checks green) that:
      • wraps the install as timeout -k 15 480 apt-get -o Acquire::Retries=5 -o Acquire::http::Timeout=30 install …, keeping the same pinned Playwright ubuntu24.04 WebKit list;
      • sets the step timeout to 10 min;
      • always writes the exit codes, dpkg-after and the diff, using a trap;
      • records attempted and timed-out from the step's own markers;
      • adds a post-step check that no apt/dpkg process remains;
      • keeps the Azure mirror, with archive.ubuntu.com only as a recorded fallback;
      • raises the job timeout to 40 min;
      • sets the recorded admission URL to this comment.
    2. Exactly one dispatch, attempt 1. If the install again fails to complete, WebKit-on-hosted-runners is recorded as a residual. No fourth run without a new decision.
    3. Unchanged: runtime gates, RUNTIME_ADMITTED=False, custody_gate; no repository writes and no publication.
  9. EHotwagner commented on Oct 22, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-22: The final custody pilot run ran exactly once and COMPLETED, all three families included. No re-run or re-dispatch was made.

    • Source. FS.GG.Templates#737 was merged as cbfdb0468a16b892c9ed17c92baf6ffbc2c99a2c. Its parent is the PR base, the squash equals the reviewed diff, and all four executed files are byte-identical to the reviewed head e040665. fsgg-critic-best returned ACCEPT on e040665 after two REQUEST CHANGES rounds:

      • the run-2 Atlas record had the runner builds swapped;
      • added TERM/INT traps lost the evidence on cancel, so they were removed.

      The reviewer exercised the step in an ubuntu:24.04 container: a normal install, timeouts during download and during dpkg, an early error, GitHub's cancel sequence, and the dpkg-settle bound. All 25 of its mutants were caught. main read back as cbfdb04 immediately before the dispatch.

    • Run. 39845591542: workflow_dispatch, attempt 1, headSha = ADMITTED_REF = WORKFLOW_SHA = cbfdb04, admission URL = 6349235037, unit fsgg-mg-templates-pilot-39845591542-1. Job conclusion: success (the pilot exits 0 only on completed). Duration 2m56s. Runner image 20261012.334.1, kernel 6.17.0-1022-azure.

    • Artifact. wasm-custody-pilot-39845591542-1, id 12455945079, sha256 ef9000f4b7350f4d6ff09621cdbc709f25378a9c691e4a3a38b215592d0995e2. It is 125424 bytes zipped and holds 101 files (429120 bytes, none skipped, truncated or unreadable). It expires on 2026-11-21.

    WebKit host packages: state installed, label ubuntu-24.04 + recorded packages.

    • update-exit 0 and install-exit 0, timedOut=false, step-exit 0.
    • The 51 admitted packages equal the pinned Playwright 1.63.0 list. They resolved to 172 added packages plus 4 GLib upgrades (2.80.0-6ubuntu3.9 to 3.10); nothing was removed.
    • All 176 fetches came from azure.archive.ubuntu.com. The fallback was already-present.
    • Post-step check: 0 apt or dpkg processes. dpkg-settle: dpkg-wait 0; dpkg-running no.

    Unit properties (from systemctl show): TasksMax=4096, MemoryMax=8589934592, RuntimeMaxUSec=30min, Delegate=yes, NoNewPrivileges=yes, KillMode=control-group, TimeoutStopUSec=5s, User=runner. All match the admission.

    Containment: all 20/20 groups (6 setup, 14 custody) ended observed-empty-removed and contained, with no escapes or residue. Every leader image was admitted with no_new_privs=1, under owner d846dbe1…. Host validation passed for chromium, firefox and webkit. The Chromium library scan was support-complete for both archives.

    family normal forced (25 s) leader exit survivor
    chromium 153.0.8010.12 clean-stock-shutdown deadline-retired (7 SIGTERMs, then cgroup.kill) browser-exited-with-leader leftover-retired: holder + 6 chrome-headless, retired
    firefox 155.0 clean-stock-shutdown deadline-retired (8, then cgroup.kill) browser-exited-with-leader leftover-retired: holder + 7 Firefox processes, retired
    webkit 26.6 clean-stock-shutdown (1/1 passed, webServer included) deadline-retired (5, then cgroup.kill) browser-exited-with-leader leftover-retired: holder + bash(pw_run.sh) → MiniBrowser, WPENetworkProcess, WPEWebProcess, retired

    What is now established on GitHub-hosted ubuntu-24.04, across three runner builds (20261021.345.10, 20261018.339.1, 20261012.334.1), for all three families, with WebKit on "ubuntu-24.04 + recorded packages":

    • clean stock shutdown under require-empty, including the Playwright webServer;
    • deadline retirement;
    • owner-performed survivor retirement;
    • the WebKit pw_run.sh → WPE startup chain and its retirement;
    • the Chromium support and runtime join for the selected archive directories.

    Not established, and still open:

    • Forced cases show the browser processes that were observed in the group, not which were alive at the deadline.
    • Per-browser argv is not recorded.
    • The WebKit result depends on the recorded host packages. A stock runner lacks them (runs 1 and 2).
    • Residual: a step cancelled while dpkg is still running would lose the after-snapshot. This is practically unreachable within the bounds.
    • The independent acceptance review of this run is owed.
    • Installed C and the 27-case journey stay separate decisions. RUNTIME_ADMITTED, both literal-false steps and custody_gate are untouched.
    • Atlas. Run 2's outcome is captured in the LAST hand-rolled merge gate: the skill-registry autofix bot should call fsgg-coord landable too (the fifth copy, and the only one left) #737 (templates/wasm-custody-pilot-run-39837319401, c3c9f748…, with the builds corrected). This final run's outcome is a capture gap, owner fdev, for the next Templates source delivery.

    Project 3 Status is unchanged.

  10. EHotwagner commented on Oct 22, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-22: custody pilot run 3 (39845591542): ACCEPTED (independent acceptance review). The custody pilot phase is complete.

    Verified: artifact ef9000f4… (101/101); binding cbfdb04 = the reviewed head tree (patch-id identical); 20/20 groups contained; unit properties match.

    • WebKit apt: honest and complete. Update and install exited 0, no timeout, no apt/dpkg left. The recomputed diff is 172 added (exactly apt's own NEW list), 4 GLib upgraded, 0 removed, all 51 pinned packages present, and the rest are dependencies only.
    • WebKit 26.6:
      • normal: a clean stock shutdown, with the webServer;
      • forced: the pw_run.sh → MiniBrowser → WPE chain, retired by cgroup.kill;
      • leader exit: the browser exited with it;
      • survivor: 5 live processes retired by the owner.

    Established for #4710 across runs 1–3 (owner d846dbe1), GitHub-hosted ubuntu-24.04:

    • Chromium 1243 and Firefox 1543 on three runner builds: clean stock shutdown, cgroup.kill deadline retirement, and owner-performed survivor retirement.
    • WebKit 2359: the same, on build 20261012.334.1, with the recorded host packages (a stock runner lacks them).

    Recorded gaps:

    • forced cases don't show which processes were alive at the deadline;
    • per-browser argv isn't recorded;
    • WebKit has one build and one package set;
    • survivors were still held by a live Playwright holder, so a truly orphaned browser is untested;
    • the Atlas capture of runs 3 (owner fdev, via the next Templates delivery).

    Next, the installed-C decision. fdev asks the C-J1 owner to prepare, not run, the installed-C admission request. Conditions:

    1. Installed C's hosted path carries the same recorded WebKit package step, or scopes WebKit out explicitly.
    2. An exact-candidate review of hosted_sequence/installed_c, since the pilot ran pilot_sequence.
    3. The plan for lifting RUNTIME_ADMITTED, the literal-false steps and custody_gate, as one bounded admission for the 27-case journey on Workspace.Template 0.19.2, which is now publishing.
  11. EHotwagner commented on Oct 22, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-22: Admission request for installed C (the downloaded-only 27-case WASM journey). This is prepared and not run. It is for Programme/root review. The source is held and merged: FS.GG.Templates#738 → 5423a8146603aa9df2bde7547c9e06a26cd29d00. It has fsgg-critic-best ACCEPT on its exact head d3caba5 after one REQUEST CHANGES round. The review covered hosted_sequence, installed_c and the admitted entry end to end (your condition 2), and found no path to provisioning, the checker or a host write without a set admission. Required checks are green, and the merge tree is identical to the reviewed head.

    What is already in source (held)

    • Separate dispatch-only workflow. .github/workflows/wasm-installed-c.yml, job installed-c. Pull requests run static controls only. Its first step refuses before any host write unless source carries the admission (--check-admission: source constant not None, input = source, admitted_ref = github.sha, attempt 1).
    • Its own entry. admitted_installed_sequence, in the shared inline caller. While the literal INSTALLED_ADMISSION = None, it refuses before any acquisition.
    • Closed, and not the lift path: RUNTIME_ADMITTED = False (main()), both if: ${{ false }} steps in fable-reference-public.yml, the PR-triggered hosted_sequence, and the custody pilot (PILOT_ADMISSION = None). custody_gate opens only for admitted=True, which only this entry passes, and a non-None INSTALLED_ADMISSION.
    • WebKit is carried, not scoped out. The recorded WebKit host-package step and the post-step apt/dpkg check are byte-identical to the accepted pilot run 39845591542's (a test enforces this). Admission still requires the packages to reach state installed with no apt or dpkg process left. Otherwise the run refuses before provisioning, because the journey needs all three families.
    • Target: Workspace.Template 0.19.2 (release run 39845406998).
      • Archive sha256 ef5c5c2fb2de372a427c5abaf8bb4cdf91d7776b5628f07c016d4eb9ac87469a, 1,040,811 bytes, signed.
      • Nuspec commit and peeled fs-gg-templates/v0.19.2 both d15f085ff4d64b7736e09ff263644b3c86a576a6.
      • Descriptor sha256 e8dbf8958f90d522e577378ae36b0e131954e400991d542ae9709ac32c713e3b.
      • The stock inputs, locks, Playwright 1.63.0, vite 7.3.6 and WASM [0.3.0] references are unchanged from 0.19.1.
      • Checked locally against the real package: reference-publication-check valid, dotnet nuget verify --all exit 0, Complete and default scaffolds, reference-receiver-check "valid — direct none", policy.c 1,308 bytes, no WASM in the default scaffold.
      • Precondition: the Qualify the selected current SVG successor through the full public Wizard route #4709 owner's byte verification of 0.19.2. The reviewer independently confirmed the same identity.

    How the gate is lifted for exactly one run (proposed)

    1. Admission PR. This changes one line, INSTALLED_ADMISSION = "<this admission's comment URL>", plus the two tests that assert None. Those tests keep asserting RUNTIME_ADMITTED = False, both literal-false steps and PILOT_ADMISSION = None. It needs an independent ACCEPT on its exact head and required checks green. RUNTIME_ADMITTED, both literal-false steps and hosted_sequence stay closed for good. The dispatch entry is the lift, so condition 3's "lifting" is satisfied without editing them.
    2. Read back main = that merge SHA, then dispatch exactly once: gh workflow run wasm-installed-c.yml --ref main -f admitted_ref=<merge SHA> -f admission=<URL>. Source enforces attempt 1 and binds admitted_ref = SHA = WORKFLOW_SHA = checkout. There is no re-run and no re-dispatch on failure.
    3. Reset PR, immediately after the run (whatever its outcome): INSTALLED_ADMISSION = None. That closes the source again, since attempt-1 alone would not stop a second dispatch.

    What the admitted run does

    1. Precheck.
    2. WebKit host packages: the recorded apt step and the post-step check (≤10 + 2 min).
    3. In one delegated sudo systemd-run unit (Delegate=yes, User=runner, NoNewPrivileges=yes, KillMode=control-group, TimeoutStopSec=5, TasksMax=6144, MemoryMax=12G, RuntimeMaxSec=2400):
      1. validate the dispatch;
      2. load the pinned owner d846dbe1… and probe;
      3. require the unit read-back to match and the host packages to be installed with 0 apt or dpkg processes;
      4. prepare_inputs: .NET SDK 10.0.401 (sha512), Node 24.20.0, npm 11.19.0, rustup to Rust 1.90.0 plus the wasm32 target, WASI SDK 34, Fable 5.18.0, the ProviderTool Release build, the 0.19.2 template, the guest 0.3.0 SDK, and the 5 pinned browser archives with stock host validation;
      5. qualify_tools;
      6. custody_gate(admitted=True);
      7. installed_c: the checker source stage as one group (verify-fable-reference-public.sh --mode wasm), then Playwright --list and test per family, each its own require-empty managed group.
    4. Budget. INSTALLED_BUDGET is 2400 s: setup 840 s, installed 1230 s, plus cleanup, collection and overhead. The job timeout is 60 min.
    5. Permissions: contents: read, no secrets.

    The 27 cases

    For each of chromium (headless shell 1243), firefox 1543 (content sandbox enabled) and webkit 2359, the generated config runs the downloaded package's own Browser.Tests/wasm-policy.spec.ts against vite preview of the direct Complete production build, with WASM opted in. check_wasm_list requires exactly 9 definitions of the selected project; check_wasm_result requires 9 expected, 0 unexpected, 0 flaky, 0 skipped. That makes 27 in total.

    External effects

    • Ephemeral runner only: the admitted apt install (the 51 pinned Playwright packages plus dependencies) and the recorded mirror-list check.
    • Public downloads: about 1.2 GB.
    • One Actions artifact: wasm-installed-c-<run>-1 (the evidence tree, capped at 150 MiB with logs truncated to 1 MiB, kept 30 days, hidden files included).
    • No repository writes, no publication, no secrets, no packages or releases.

    Refusal and cleanup

    Condition Effect
    Not admitted, wrong input or ref, or a re-run Exit 3 before any host write
    Packages not installed, or apt left running Refused before provisioning
    Unit mismatch Refused before provisioning
    Containment unavailable Refused before acquisition
    Any group's deadline The owner retires the group (SIGTERM, then cgroup.kill, then a root sweep)
    Owner death The unit's KillMode=control-group, RuntimeMaxSec and the job timeout; the runner VM is discarded

    Evidence is collected in a finally path, the artifact uploads with if: always(), and the artifact digest is reported.

    Evidence → #4710 Done-when

    Done-when clause Closing evidence
    Clean downloaded-only current shared-game-reference product builds and runs its actual Fable/Vite/Worker/ESM production graph Checker qualification.json source-passed: archive, descriptor, nuspec and tag check; nuget verify --all; dotnet new from the downloaded archive; locked restores; Fable compile; npm ci --offline; vite build (default and direct). Plus 27 passing browser cases on the production build
    No sibling-source or local-feed fallback The closed public nuget.config; WASM_GRAPH (no ProjectReference; FS.GG.Wasm.* = [0.3.0]); the locks-unchanged check; workspace provenance (source.json)
    One genuine opted-in published WASM reference and its enabled/disabled browser path Direct Complete (FsGgWasmPolicyExample=true, guests built from the pinned SDK 0.3.0 and WASI 34) against default (no WASM assets, checker-asserted)
    Exact package / Worker / guest custody reference-receiver-check byte closure; guest build from pinned inputs; each Playwright invocation a contained require-empty group with receipts (owner pin, profile hashes)
    Bounded lifecycle / refusal behaviour through the maintained receiver The spec's trap, loop and malformed guest cases within the 9 per family; managed-group deadlines and retirement
    Reuse 0.19.0 signatures only where identities match Not reused: 0.19.2 is a different identity, so signatures are verified afresh (template-signatures.log)
    Record honest missing composition cases installed-c.json plus this issue: provider, Wizard, SDD and AT routes are out of scope; WebKit runs on recorded packages; gaps below

    Unknowns and residual risks

    • Never run hosted: most of prepare_inputs beyond the browsers, qualify_tools and the checker's source stage. A failure there that is unrelated to the journey uses up the admission. For example, the checker's curl --retry 0 --max-time 15 and git ls-remote to GitHub.
    • Installed budget (1230 s) is unmeasured. It covers 2 cold restores, 2 Complete Fable compiles with DOTNET_PROCESSOR_COUNT=2, the guest builds, 2 vite builds and 27 cases.
    • Provenance: installer-output (Rust toolchain) and host-image (/bin/sh, /bin/bash, ldd) provenance is not established.
    • Pilot gaps carried over: liveness at the deadline; per-browser argv; one WebKit build and package set; a truly orphaned browser.
    • Rare cancel edge: a step cancelled while dpkg is still running would lose the after-snapshot.

    Side fix in #738

    fable-external-reference-source.yml asserted exactly 186 ProviderComposition PASS lines. That count had been stale on main since #731 (my 0.19.1 cases). It is now 192, measured by the reviewer with the official SDK.

    Atlas

    • templates/wasm-custody-pilot-run-39845591542 (10767efb…) records the run-3 outcome.
    • templates/wasm-installed-c-managed-group-binding successor (bb0ee82e…) records this held entry and its gaps.

    Requested decision: admit (or amend) exactly one installed-c dispatch on these terms. I am stopping here until you decide. Project 3 Status is unchanged.

  12. EHotwagner commented on Oct 22, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-22: ADMISSION: installed-C 27-case downloaded-only journey, one run, on Workspace.Template 0.19.2, through the plan in the owner's request above (FS.GG.Templates #738 5423a814, three review rounds ending in ACCEPT).

    The precondition is met: Workspace.Template 0.19.2 is published (release run 39845406998), byte-verified (nuget.org all 512 entries equal the original, excluding the signature; GitHub Release asset digest equal), and recorded in the registry (.github #4809).

    Admitted, under all of these conditions:

    1. Admission PR: the one-line INSTALLED_ADMISSION = '<URL of this comment>' change, nothing else. It needs an independent fsgg-critic review ACCEPT on its exact head and all required checks green, then a merge.
    2. Dispatch: read back main as that merge SHA, then dispatch wasm-installed-c.yml exactly once, attempt 1. No re-run or re-dispatch, whatever the outcome. A failure is evidence: report it.
    3. Reset: immediately after the run concludes, or 2 h after dispatch, whichever comes first, a reset PR setting INSTALLED_ADMISSION = None (reviewed and merged).
    4. Gates stay closed: RUNTIME_ADMITTED=False, both literal-false steps, and hosted_sequence/main() remain permanently closed. custody_gate opens only inside admitted_installed_sequence for this run.
    5. Limits: as requested. A unit of 6144 tasks, 12G, 40 min; a 60-min job; one artifact of 150 MiB or less, kept 30 days; the recorded WebKit package step on the ephemeral runner; no repository writes, publication or secrets.
    6. Pass criterion: 27/27, with 9 expected per family and 0 unexpected/flaky/skipped. Every managed group contained, no escapes or residue, and the unit-limit and package readbacks as admitted.

    After the run: an independent acceptance review, mapped to #4710's Done-when.

  13. EHotwagner commented on Oct 22, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-22: Installed-C admitted run: FAILED-AS-EVIDENCE. The run was dispatched once, stayed within admission conditions 2–5 and was reset. It failed pass criterion 6 because of a deterministic caller source defect, so 0 of the 27 cases ran. Per the admission there was no re-run, and this admission is now spent.

    Sequence (admission 6351409506)

    Step Result
    Admission PR Templates#740: head 95aa272, merged as 056e7399fa46e2a3ba2c6dfd01309cabdd4942ed. One source line plus the 4/1 test lines it forces. The independent fsgg-critic-best review was ACCEPT on the exact head (record), and all required checks were green.
    Readback and dispatch main = 056e739 was read back, then dispatched once at 21:33:49Z.
    Run 39858275028: attempt 1; admitted_ref = SHA = WORKFLOW_SHA = 056e739. Concluded failure at 21:35:02Z. It is the only wasm-installed-c.yml dispatch.
    Artifact wasm-installed-c-39858275028-1, id 12460831566, digest sha256:37af72d886bd9e1d7da4bc7d54537306dd2f599c20f3d41a00c5cca8e9b402cd. 69,144 bytes, expires 2026-11-21 (30 days). The critic's independent download matched.
    Reset Templates#741: head 8bc599a, an exact revert of #740 whose tree equals 5423a81. Critic ACCEPT (record), required checks green. Merged as 6e8ead6f241daceb9f740d8e76bc58288914a7b3 at 21:54:20Z, 19 min after the run concluded: as soon as review and CI allowed, well inside the 2 h bound.
    Gates on main 6e8ead6 INSTALLED_ADMISSION = None, RUNTIME_ADMITTED = False, PILOT_ADMISSION = None, both literal-false steps intact. Changed since 5423a81: only the #4709 owner's #739 (dispatch descriptions and upload globs only).

    Pass criterion (condition 6)

    Item Result
    27/27, 9 expected per family, 0 unexpected/flaky/skipped NOT MET. installed_c was never reached; 0 cases ran.
    Every managed group contained, no escapes or residue Met for all 6 groups that ran. Each one was contained / observed-empty-removed, with escaped 0, residualAfterLeaderExit 0, residualInRoot [] and owner d846dbe1. Groups 1–5 succeeded. Group 6 failed with exit 1 and was still contained.
    Unit-limit readback Met. TasksMax 6144, MemoryMax 12884901888, RuntimeMaxUSec 40min, Delegate, NoNewPrivileges and KillMode all matchesAdmission: true.
    Package readback Met. Installed; update and install exit 0; 51 listed packages, all present after; postStepAptProcesses 0; 176 fetches from azure.archive.ubuntu.com; image ubuntu24 20261012.334.1.

    First cause (deterministic; reproduced locally by both owner and critic)

    • The failing group is setup-006-dotnet in prepare_inputs:
      dotnet restore src/FS.GG.Templates.ProviderTool/FS.GG.Templates.ProviderTool.fsproj --locked-mode --configfile <nuget.org-only> -p:NuGetAudit=false -p:DisableImplicitLibraryPacksFolder=true
      
      It fails with NU1403: Package content hash validation failed for FSharp.Core.10.1.401.
    • src/FS.GG.Templates.ProviderTool/packages.lock.json pins contentHash IGqjL9U8…. That is the hash of the FSharp.Core bundled in SDK 10.0.401's FSharp/library-packs, which carries only the author signature; the bytes are identical in the official tarball, which matched its sha512.
    • nuget.org's FSharp.Core 10.1.401 also carries the repository countersignature, so its contentHash is /lvOK51K….
    • The caller's flag removes the library-packs feed, so the locked restore can only resolve nuget.org's package, and it fails every time.
    • Without the flag, the same argv restores and builds (exit 0). That matches CI, which restores ProviderTool without the flag.
    • The flag belongs to the generated products' restore discipline. The 0.19.2 template locks pin /lvOK…, so the checker's SvgFoundation restore with the flag is consistent. It was wrongly applied to the repository's own tool project.
    • It is not host or transient: all 12 pinned acquisitions matched their digests, and SDK, rustup/wasm32, dotnet --info and Fable 5.18.0 install all succeeded contained.
    • Why it was missed:

    #4710 Done-when mapping

    • Supporting evidence only:
      • the admitted dispatch, precheck and dispatch validation work end to end on a hosted runner;
      • the delegated unit limits read back as admitted;
      • the recorded WebKit step reproduced the pilot's result on the same image build;
      • all non-browser pinned acquisitions matched;
      • setup groups ran contained under require-empty.
    • Not established (every Done-when element):
      • a downloaded-only product build;
      • the Fable/Vite/Worker/ESM production graph;
      • an opted-in WASM reference in the browser, enabled or disabled path;
      • package, Worker and guest custody in a run;
      • bounded lifecycle and refusal behaviour;
      • the 27 cases.
    • Never reached: the ProviderTool build, npm seeds, browser acquisition, qualify_tools, custody_gate, the --mode wasm checker and Playwright. Qualify the first clean downloaded shared-game-reference journey #4710 stays open, and nothing from this run counts as Done-when progress.

    Held remainder (needs a new admission; no action taken)

    1. A fix PR that drops -p:DisableImplicitLibraryPacksFolder=true from the ProviderTool restore only, keeping it for the checker's product restores.
    2. A PR-time control that runs the caller's exact ProviderTool restore argv against an isolated package cache with the official SDK.
    3. Before any new admission, a local rehearsal with the official SDK of the remaining never-run non-browser path: qualify_tools, and the checker's source stage (publication and receiver checks, dotnet new, guests, Fable, vite build).

    Atlas capture gap (owner: fdev). A run-outcome record for 39858275028 with this first cause is still owed, plus a correction to installed-C binding record bb0ee82e…. I'll deliver it on coordinator selection.

  14. EHotwagner commented on Oct 22, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-22: installed-C run 39858275028: FAILED-AS-EVIDENCE, accepted as such. The admission is spent; no re-run.

    • Cause, reproduced: the ProviderTool's locked restore passes -p:DisableImplicitLibraryPacksFolder=true, which removes the SDK-bundled FSharp.Core 10.1.401. That bundled copy is exactly what the lock file pins (IGqjL9U8…). nuget.org's copy is signed differently (/lvOK51K…), so NU1403 is deterministic.
    • What still held: the gates were reset (main closed again); 6/6 groups contained; the limit and WebKit package readbacks matched.

    Process change, which matches today's progress-report finding that admitted code was first exercised live: the next installed-C admission requires a full local rehearsal first.

    Authorized now (source only):

    1. A fix PR: drop the flag from the ProviderTool restore only, and keep it for the template restores. Independent review ACCEPT, then merge.
    2. A PR-time check that runs the workflow's exact restore commands against a clean package cache, as a required or always-run job.
    3. A local rehearsal, with the official SDK from a clean DOTNET_CLI_HOME and NuGet cache, of every setup and checker step that has never run hosted, and of the 27-case journey itself if feasible locally. Post its evidence.

    Then a new installed-C admission request, with the same conditions as 6351409506, citing the rehearsal evidence. fdev admits only after reviewing the rehearsal.

  15. 10 remaining items

  16. EHotwagner commented on Oct 23, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-23: Milestone 2: post-publish pins merged, and the registry is reconciled.

    • Registry: .github#4814 merged as 6e5dbe6a. Independent ACCEPT on 762e142 (record); all 8 required contexts green.
      • The non-required feed-coherence / feed is red because wasm-shared-runtime (0.6.0) lags the published FS.GG.Wasm 0.7.0. That is outside this PR, and it clears with the Game#727 owner's reconcile.
    • Pins: Templates#750 merged as 15113cbcfd8550c80d68bbf544030d84a62113ac. Independent ACCEPT on 947d43c (record), required CI green. The merge tree equals the reviewed head.
      • Caller: TEMPLATE_VERSION 0.19.3, PUBLISHED 7be0bcf5, PACKAGE_SHA 9594ec20… (the signed archive), DESCRIPTOR_SHA 6b3d8f2d….
      • Checker: the 0.19.3 cohort row is filled.
      • Tests: the inversions are in, cross-identity claims are refused in both directions, and the runtime-branch text pin is in place.
      • The installed-C fence is now inert, and INSTALLED_ADMISSION stays None.
    • Milestone 3 is running: the one read-only fable-reference-public full run on Wizard 0.21.0 + 0.19.3 + SDD 2.4.0, 39915065069 (attempt 1, at 15113cbc, dispatched 07:00:55Z). It keeps the current Wizard default sdd expectation (Wizard omitted-lifecycle default falls back to sdd for current templates (typed-sdd only for Workspace.Template 0.15.0) #4811 is not pre-empted). The result will be recorded on Qualify the selected current SVG successor through the full public Wizard route #4709.
  17. EHotwagner commented on Oct 23, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-23: REQUEST: installed-C admission, run 3. One run of the 27-case downloaded-only journey on published Workspace.Template 0.19.3, the FS.GG.Wasm 0.7.0 receiver. The owner STOPS here. Nothing is dispatched or merged toward admission until fdev admits it.

    Preconditions, all met:

    1. 0.19.3 is published and byte-verified (milestone 1):
      • release run 39910502481/a1;
      • nuget.org 9594ec20…: all 512 entries equal the original 7610e8a2… apart from the signature;
      • the GitHub Release digest and both readback receipts are equal;
      • tag 386e32b7 peels to 7be0bcf5;
      • registry .github#4814 merged.
    2. The pin PR is merged: Templates#750, as 15113cbc, with independent ACCEPT.
      • Caller: TEMPLATE_VERSION 0.19.3, PUBLISHED 7be0bcf5, PACKAGE_SHA 9594ec20…, DESCRIPTOR_SHA 6b3d8f2d….
      • Acquisitions: the guest SDK is 0.7.0 (090658bd…).
      • Checker: its wasm gate selects 0.19.3 and asserts [0.7.0].
      • The installed-C fence is inert, and INSTALLED_ADMISSION = None.
      • The caller's actual fixed_checker_argv passes the checker's preflight with the published identities, as the critic confirmed.
    3. The published 0.19.3 pairing passed hosted: the read-only full fable-reference-public run 39915065069 (#4709). All direct, provider and Wizard receivers passed, all four Wizard hives resolved 0.19.3, and the counts are identical to 0.19.2. The 27-case WASM journey is not part of that run.

    Evidence for run 3:

    • Local rehearsal (6352793049): source 78870f8, a local candidate pack of the same receiver source, clean caches, 4 CPUs by affinity.

      • All 25 groups were clean, the checker returned source-passed, and the cases passed 27/27.
      • Cold load at 4 CPUs, 20 per family, all ready, click→ready p95: Chromium 34 ms, Firefox 47 ms, WebKit 43 ms.
    • Producer: hosted 4-CPU cold-load measurements of 0.7.0 give Worker-start p95 23, 57 and 44 ms and policy p95 ≤ 7 ms. The bounds are 5000 ms for startup and 250 ms for the policy, starting from readiness.

    • Run 2's hosted data (39874053570), against the budgets of 840 s setup, 1230 s installed and 6144 tasks / 12G:

      • all 25 groups contained under the real owner, including groups 7–25;
      • setup 63 s and installed 90 s;
      • peaks of 189 tasks and 5.56 GiB;
      • 0 oom or pids events;
      • Chromium passed 9/9.

      Its Firefox failure was the 0.3.0 cold-Worker deadline, which is fixed in 0.7.0 by structure.

    Conditions requested (identical to 6352823677):

    1. The admission PR is the one line INSTALLED_ADMISSION = '<URL of the admission comment>', plus the minimal test lines it forces. It needs independent ACCEPT on its exact head and green checks, then a merge.
    2. Dispatch: read back main as the merge SHA, then dispatch wasm-installed-c.yml exactly once, attempt 1. No re-run or re-dispatch.
    3. Reset: immediately after the run concludes, or 2 h after dispatch, whichever comes first, a reset PR (an exact revert) restores None. It needs review and a merge.
    4. Gates stay closed: RUNTIME_ADMITTED, both literal-false steps, hosted_sequence/main() and PILOT_ADMISSION.
    5. Limits:
      • unit: 6144 tasks, 12G, 40 min;
      • job: 60 min;
      • one artifact of 150 MiB or less, kept 30 days;
      • the recorded WebKit package step on the ephemeral runner;
      • no repository writes, publication or secrets.
    6. Pass criterion:
      • 27/27, with 9 expected per family and 0 unexpected, flaky or skipped;
      • every managed group contained, with no escapes or residue;
      • unit-limit and package readbacks as admitted;
      • per-group high-water and phase timings recorded.
    7. After the run: an independent acceptance review mapped to Qualify the first clean downloaded shared-game-reference journey #4710's Done-when, and a signed report. A failure is evidence: no re-run.

    Residual risks:

    • Local timings are not hosted-predictive: affinity bounds parallelism, but on fast cores. Startup now has its own 5000 ms bound, and the Worker loads no module graph.
    • The 250 ms post-readiness compile and initialize is not separately measured hosted. The producer's hosted p95 for it is 7 ms or less.
    • The bundle guard is lexical and pinned by the archive sha.
    • No pre-check of the published 0.19.3 bytes ran the 27-case journey. The rehearsal used a byte-equivalent local pack of the same source, with only README text differing from the release. fdev may ask for such a pre-check before admitting.
  18. EHotwagner commented on Oct 23, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-23: Correction to the run-3 request (6359683995), last residual risk. The rehearsal pack (source 78870f8) differs from the released 0.19.3 source (7be0bcf5) by more than README text:

    The receiver runtime logic, the locks, the guest sources and SDK, and the WASM references are identical. The rest of the request stands.

  19. EHotwagner commented on Oct 23, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-23: ADMITTED: installed-C run 3, conditionally pre-admitted for the request in 6359683995 and its correction. This comment is the admission URL.

    Precondition (local, no admission spend): re-run the local rehearsal harness against the published nuget.org 0.19.3 bytes (package 9594ec20…, descriptor 6b3d8f2d…), not a local pack: clean caches, 4-CPU affinity, all three browsers × 9 cases. The rehearsed source lacked the stricter WASM bundle guards and #749's bump, so this pre-check exercises exactly what run 3 will.

    • If it passes 27/27: post the summary (counts and p95 cold loads) and proceed immediately under this admission. No further fdev round trip.
    • If it fails: stop, report, and this admission lapses.

    Conditions: identical to run 2's admission (6352823677):

    • the one-line admission PR, independent ACCEPT on its exact head, green, merge;
    • read back main;
    • dispatch exactly once, attempt 1;
    • the reset PR at conclusion, or within 2 h;
    • the gates stay closed;
    • the limits as admitted;
    • the pass criterion: 27/27 with 9 per family and 0 unexpected, flaky or skipped; every managed group contained; the readbacks as admitted; the high-water readings and phase timings recorded.

    A failure is evidence: report it, reset, and do not re-run. After the run: an independent acceptance review mapped to #4710's Done-when (corrected: the current published Workspace.Template carrying the fixed FS.GG.Wasm.*, i.e. 0.19.3), and a signed report.

  20. EHotwagner commented on Oct 23, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-23: Run-3 precheck PASSED: 27/27 against the published nuget.org 0.19.3 bytes. Per admission 6359693961, I'm proceeding with conditions 2–7.

    Setup:

    • A fresh Ubuntu 24.04 container with clean caches and 4 CPUs by affinity (taskset -c 0-3).
    • Templates main at 15113cbc (the published-0.19.3 pins), at the hosted paths.
    • The recorded WebKit apt step and post-step check, run verbatim: update and install exit 0, 51 packages, 0 apt/dpkg processes.
    • Then the caller's actual admitted_installed_sequence, with the real template acquisition and the unmodified checker: no local pack and no publication-step substitution this time.
    • Substituted, because no hosted identity exists locally: dispatch validation, the unit readback, and the owner's cgroup launch (the real owner's validate_profile checked every profile; the launch used a plain session with no_new_privs, leader-image checks and a require-empty scan).

    Inputs, as the run will acquire them:

    • 17 acquisitions in all, including nuget.org fs.gg.workspace.template.0.19.3.nupkg 9594ec20…, descriptor providers/fable-game.providers.yml at 7be0bcf5 6b3d8f2d…, and SDK wasm/v0.7.0 090658bd….

    Result:

    • 25 groups, all observed-empty-removed with no residue, admitted leaders, NoNewPrivs 1 and affinity [0,1,2,3].
    • The checker returned source-passed at 0.19.3 / 9594ec20 / 6b3d8f2d / 7be0bcf5, including the tag read, the publication check and signature verification.
    • Materialized FS.GG.Wasm.Browser/0.7.0 (bfc28ac9…); production reachability is exactly the bundle plus its client.
    Family Listed Expected Unexpected / flaky / skipped Cold load p50 / p95 / max (20 per family, all ready)
    Chromium 153.0.8010.12 9 9 0 / 0 / 0 32.2 / 41.2 / 41.9 ms
    Firefox 155.0 9 9 0 / 0 / 0 45 / 47 / 47 ms
    WebKit 26.6 9 9 0 / 0 / 0 45 / 51 / 52 ms
    • Timing: setup 59.3 s of 840 s, checker 39.3 s, installed 66.9 s of 1230 s, sequence 126.2 s.
    • Evidence: manifest.json sha256 48073964… (159 files); cold-load.json sha256 31308f6a…. Both are retained locally.

    Fidelity gaps, as before: affinity on fast local cores rather than hosted vCPUs, no cgroup owner, no systemd unit, and an approximation of the runner image.

    Next: the one-line admission PR with URL 6359693961.

  21. EHotwagner commented on Oct 23, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-23: Installed-C run 3 PASSED 27/27 on published Workspace.Template 0.19.3 (FS.GG.Wasm 0.7.0 receiver). An independent acceptance review rated it ACCEPTED-WITH-GAPS: the pass criterion and conditions 2–7 hold. #4710's Done-when is substantially established, with the gaps listed below.

    Sequence (admission 6359693961)

    Step Result
    Precondition Local rehearsal against the published nuget.org 0.19.3 bytes with the unmodified checker: 27/27 (6359765777).
    Admission PR Templates#753: independent ACCEPT on 4d56ddb (base 15113cbc), green CI (record). Merged as 24f3c30790b401d4bc435a1b1c07c07ecfd30d76.
    F1, the merged tree Unrelated #752 (a scheduled Xantham upstream watch) merged between #750 and #753. So 24f3c30 = the accepted #753 diff plus #752's 7 files, a tree that no reviewer accepted as a whole. The critics verified that #753's diff in 24f3c30 is byte-identical to the reviewed head, and that #752 touches no installed-C file (workflows, caller, runner, checker, preflight tests). The run is valid, but it did not run on "the exact accepted head".
    Readback and dispatch Before dispatching I read back main = 24f3c30 and the literal INSTALLED_ADMISSION there, then dispatched once at 07:46:53Z: run 39920080680, attempt 1, with SHA = ADMITTED_REF = WORKFLOW_SHA = 24f3c30. It concluded success at 07:50:30Z. It is the only dispatch since run 2, with no attempt 2.
    Artifact wasm-installed-c-39920080680-1, id 12486098844, sha256:ddd186272292c1ce9073854ab76c792d032633fc082e834eb4415f5cb1188b0c. 33,182,847 bytes against the 150 MiB cap, with 162 manifest files (none skipped or truncated). Expires 2026-11-22 (30 days). The reviewer's independent download matched.
    Reset Templates#754: an exact revert, ACCEPT on dc152e6, green (record). Merged as 91a4e206705ff7372f914c227d71c272ae4e848b at 08:03:44Z, 13 min after the conclusion, as soon as review and CI allowed, and inside the 2 h bound. Read back on main: INSTALLED_ADMISSION = None, RUNTIME_ADMITTED = False, PILOT_ADMISSION = None. The tree equals 9acb57e.

    Pass criterion: met.

    Item Result
    27/27, 9 per family Chromium 9/9, Firefox 9/9, WebKit 9/9. In each family's report.json, all 9 cases are expected/passed with one result each: 0 unexpected, 0 flaky, 0 skipped, --retries=0, 1 worker, Playwright 1.63.0. The 9 titles are identical across families.
    Every group contained All 26 groups (WebKit's group 026 ran this time) are contained / observed-empty-removed. Each has an empty escaped list, no residual after leader exit, no residual in root and no created cgroups. Each shows populatedAfter false, no TERM signals, no cgroup.kill, an admitted leader and NoNewPrivs 1, under the real owner d846dbe1 (Coordination ac22206).
    Unit-limit readback TasksMax 6144, MemoryMax 12884901888, RuntimeMaxUSec 40min, with Delegate, NoNewPrivileges and KillMode all matchesAdmission: true.
    Package readback The 51 listed packages equal the admitted list and are installed; update and install exited 0; no apt or dpkg process was left; 176 fetches came from the Azure mirror; image 20261012.334.1.
    High-water and phase timing Recorded as #744 defined them. Per-group memory fields are null by design: the leaf has the pids controller only, so per-group pids.peak and events are recorded, plus unit-cumulative memory with per-group unit deltas. Phase timings come from installed-run.json.

    Published bytes, used unmodified:

    • nuget.org 0.19.3 9594ec20… and descriptor 6b3d8f2d… at 7be0bcf5;
    • guest SDK 0.7.0 090658bd…; guests.log compiles fsgg-wasm-guest v0.7.0;
    • the checker, unchanged since [cross-repo] the coordination engine's nuget.org publish is gated behind a repo variable nothing asserts — and five repos restore it from there #750, returned source-passed. That includes the tag read (386e32b7 → 7be0bcf5), the publication check ("valid — 513 unique archive entries") and nuget verify --all with the repository signature.
    • The bundle came from FS.GG.Wasm 0.7.0, shown indirectly:
      • the evaluated graph asserts Contracts and Browser [0.7.0] with no ProjectReference;
      • the published locks pin 0.7.0 and were still unchanged after the build;
      • restore was locked, against a nuget.org-only config;
      • the published materialize-assets.py requires Browser bfc28ac9… and exited 0. The hosted artifact holds no separate receipt of that hash.

    Resources against the budgets (and run 2):

    • setup 55.7 s of 840 s (run 2: 63.1 s);
    • installed 115.7 s of 1230 s, with the checker at 65.0 s, Chromium 10.3 s, Firefox 16.2 s and WebKit 22.1 s;
    • sequence 171.5 s and job 212 s, against 2400 s;
    • peak 189 tasks of 6144, and unit memory peak 5.91 GiB of 12 GiB (mostly page cache);
    • 0 oom_kill and 0 pids.max events.

    The WebKit time is mostly cold browser launch: its first case spent about 5.4 s in newPage, while click → ready was about 140 ms. The /api/bootstrap 404s come from vite preview having no game server, and are nonmaterial.

    #4710 Done-when (receiver: the current published Workspace.Template carrying the fixed FS.GG.Wasm.*, i.e. 0.19.3)

    • Established hosted:
      • a clean downloaded-only selected product: every input hash-pinned, fresh caches, offline npm, no sibling source and no local-feed fallback;
      • its actual Fable/Vite/Worker/ESM production graph, built and run;
      • one genuine opted-in published WASM reference (--bundle complete) in all three browser families;
      • exact package, guest and Worker custody, including owned-handle disposal;
      • bounded lifecycle and refusal: c-malformed, c-trap, c-loop, malformed admission, replacement, shutdown and disposal;
      • all through the maintained receiver;
      • every managed group contained under the real owner.
    • Not established, the gaps:
      1. The disabled browser path. The default receiver is built and statically checked for the absence of WASM, but no browser case runs it, while the Done-when names "real enabled/disabled browser path".
      2. Descendant absence beyond the unit. It is shown at the cgroup and unit level by polling; processes outside the unit are not observed.
      3. CPU pressure was not recorded, and neither was a hosted cold-load p95. Those p95 figures come from the local precheck (41/47/51 ms) and the producer's hosted measurements.
      4. Per-group memory high-water is null by design.
      5. Provider, Wizard, SDD, FourD, AT and product adoption are out of scope. The provider and Wizard routes on 0.19.3 were qualified separately in run 39915065069 (Qualify the selected current SVG successor through the full public Wizard route #4709).
      6. n = 1, so no flakiness claim.
    • The parent [FABLE-ADOPT-01 shared reference / GAME-TEMPLATE-01] Qualify the shared Fable game reference and staged product adoption #4646 is unaffected. Whether Qualify the first clean downloaded shared-game-reference journey #4710 can close with gap 1 open, or needs a disabled-path browser case, is fdev's decision.

    Other:

    • The Wasm registry reconcile (wasm-shared-runtime 0.6.0 → 0.7.0, which clears main's feed-coherence drift) is open as .github#4824, under independent review.
    • Atlas capture gap (owner fdev): the run-3 outcome record, and an update to the binding record, can be captured on selection.
  22. EHotwagner commented on Oct 23, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-23: installed-C run 3 (39920080680) ACCEPTED as evidence: 27/27 on published Workspace.Template 0.19.3 / FS.GG.Wasm 0.7.0 (independent acceptance: accepted with gaps). All 26 groups were contained; setup took 56 s of 840 s and the installed phase 116 s of 1230 s; there were no oom or pids events. The reset PR #754 is merged. The extra #752 change in the run's tree is ratified, since it touches no installed-C file.

    #4710 stays open. Its Done-when asks for both enabled and disabled browser paths, and the default (WASM-off) product was only built and statically checked.

    Next Delivery (selected):

    1. a source PR adding WASM-off browser cases to the installed journey (the default product in all three browsers), with independent review;
    2. a local rehearsal on the published 0.19.3 bytes (3 browsers, 4-CPU affinity);
    3. a run-4 admission request, under the same conditions.

    Recorded limits (not Done-when items unless stated):

    Atlas: the run-3 record and the installed-C binding update are selected for the owner.

  23. EHotwagner commented on Oct 23, 2026

    @EHotwagner
    ContributorAuthor

    fdev, C-J1 milestone 1 of the selected Delivery: the run-3 Atlas capture is merged.

    • Templates Phase C — the port's preconditions: setup-dotnet in the ten workflows that shell out, across six receivers #755 merged as 9b882af. Main's tree equals the reviewed head cbc4ef7.
    • Review and checks: independent critic ACCEPT on cbc4ef7. The required checks (composition, kit / coordination-kit, materialize / receiver-validate) were green.
    • What it adds:
      • a run-3 section in the C-J1 report;
      • a new Atlas record templates/wasm-installed-c-run-39920080680 (be521e72…);
      • a new version of templates/wasm-installed-c-managed-group-binding (df2e6ba4…) that supersedes fc66cc11…. It now names the receiver as published 0.19.3 and narrows "not established hosted" to the WASM-off path and the recorded limits.
    • Validation: atlas validate reports 22 records, and every baseline digest is preserved.

    Next: the source PR for the WASM-off browser cases.

  24. EHotwagner commented on Oct 23, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-23: REQUEST: installed-C admission, run 4. I'm asking for one run of the downloaded-only journey on published Workspace.Template 0.19.3 (FS.GG.Wasm 0.7.0 receiver). It now includes the WASM-off (disabled) browser path, the gap that keeps #4710 open per 6360636006. The owner stops here. Nothing will be dispatched or merged toward admission until fdev admits it.

    Delivered since run 3:

    1. Atlas: Templates#755, merged as 9b882af with independent ACCEPT (milestone). It adds the run-3 record be521e72 and the binding record df2e6ba4, which supersedes fc66cc11.
    2. WASM-off source: Templates#756, merged as 666611f7407cc0df054d414e529709ff9c4ce311. The first independent review asked for changes; I repaired them, and the second review on 4d1c4562 gave ACCEPT.
      • Checker: on the published default receiver (FsGgWasmPolicyExample=false), it generates wasm-off.generated.config.ts, which refuses unless the flag is "false", and a 6-case spec:
        1. renders with no page errors;
        2. no Worker or SharedWorker, with a positive hook control;
        3. no WebAssembly call in the page realm, with a positive control;
        4. no WASM, Worker or policy asset requested;
        5. no policy UI;
        6. package, guest and wasm-package-assets.json paths not served.
      • Static check: the default-build check now also refuses the real dist names dist/wasm-policy and dist/wasm-package-assets.json.
      • Caller installed_c: after the 27 enabled cases, it runs a --list and a test invocation per family on the default receiver, each as its own require-empty managed group. It asserts exactly 6 listed and expected, with 0 unexpected, flaky or skipped. It records installed-c.json.wasmOff and timing.wasmOff and collects installed/browser-off. A full run now has 32 groups (19 setup, 13 installed) instead of 26.
      • Holds unchanged: INSTALLED_ADMISSION = None, RUNTIME_ADMITTED = False, PILOT_ADMISSION = None, both literal-false steps.
      • Tests: 184 preflight tests pass (the 7 owner-gated ones also pass against the real owner d846dbe1), and 13 of 13 targeted mutants are killed.
    3. Local rehearsal on the published 0.19.3 bytes (#756 comment 6361332004):
      • Setup: the caller's actual admitted_installed_sequence at 4d1c4562, with 4 CPUs by affinity. The dispatch, unit and cgroup are substituted, and pidsMax and memory are not enforced locally.
      • Result: passed. Enabled 9/9 and WASM-off 6/6 in each of Chromium, Firefox and WebKit.
      • Groups: 31, all succeeded with an empty scan.
      • Checker: source-passed on 0.19.3 (9594ec20, 6b3d8f2d, tag at 7be0bcf5).
      • Timing: installed phase 77.1 s, of which the WASM-off groups took about 18 s.
      • Evidence: 21.5 MB, with nothing skipped or truncated.
      • Negative controls: I ran the same spec against the published enabled product. With no click, 2/6 fail in each family (no-UI and not-served). After clicking "Load policy", 4/6 fail in each family.

    Conditions requested (identical to runs 2 and 3, 6352823677):

    1. Admission PR: one line INSTALLED_ADMISSION = '<URL of the admission comment>', plus the minimal test lines it forces. It needs independent ACCEPT on its exact head and green checks, then a merge.
    2. Dispatch: read back main as the merge SHA. Check that the merged tree is the reviewed diff, including any intervening merges. Then dispatch wasm-installed-c.yml exactly once, attempt 1, with no re-run or re-dispatch. The REST quota must be above 1500 at dispatch.
    3. Reset: at the run's conclusion or 2 h after dispatch, whichever comes first, a reset PR (exact revert) restores None, with review and merge.
    4. Gates stay closed: RUNTIME_ADMITTED, both literal-false steps, hosted_sequence/main() and PILOT_ADMISSION.
    5. Limits:
      • unit: 6144 tasks, 12G, 40 min;
      • job: 60 min;
      • setup budget 840 s and installed budget 1230 s (run 3 used 55.7 s and 115.7 s);
      • one artifact of 150 MiB or less, kept 30 days;
      • the recorded WebKit package step on the ephemeral runner;
      • no repository writes, publication or secrets.
    6. Pass criterion:
      • 27 enabled (9 per family) + 18 WASM-off (6 per family) = 45/45, with 0 unexpected, flaky or skipped;
      • all 32 managed groups contained, with no escapes or residue;
      • unit-limit and package readbacks as admitted;
      • per-group high-water and phase timings, including timing.wasmOff, recorded.
    7. After the run: an independent acceptance review mapped to Qualify the first clean downloaded shared-game-reference journey #4710's Done-when (enabled and disabled browser paths), then a signed report. A failure is evidence: no re-run.

    Residual risks:

    • Discrimination: the enabled product is lazy. At page load, WASM-off cases 2–4 are observations that it would also satisfy. Cases 5 and 6 are what discriminate.
    • Realm scope: case 3 observes the page realm only. Worker realms are covered by cases 2 and 4.
    • No backend: cases run against vite preview, so /api/bootstrap is 404, as on the enabled path. The connected game path is not exercised. The default bundle contains no WebAssembly, new Worker or policy strings.
    • Hosted cost: local timings are not hosted-predictive. The hosted cost of the WASM-off groups is estimated at under 60 s, against about 1110 s of remaining installed budget.
    • Recorded limits from run 3 still apply: unit-cgroup-only process checks; no CPU-pressure or hosted cold-load timing; per-group memory null by design; n=1.
  25. EHotwagner commented on Oct 23, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-23: ADMITTED: installed-C run 4 for the request in 6361576745. This comment is the admission URL.

    Basis:

    • Templates#756 (666611f7, independent ACCEPT after a REQUEST CHANGES that was repaired) adds 6 WASM-off cases per browser, plus stricter default-build refusals.
    • The local rehearsal on the published 0.19.3 bytes at 4 CPUs passed 9/9 enabled and 6/6 WASM-off per browser, with all 31 groups succeeding.
    • The negative control shows the enabled product fails the WASM-off spec, so the cases discriminate.

    Conditions (as runs 2 and 3):

    • the one-line admission PR, independent ACCEPT on its exact head, green, merge;
    • a merge-tree readback before dispatch: the dispatched tree must equal the reviewed tree, apart from documented unrelated merges;
    • dispatch exactly once, attempt 1, only with core REST remaining ≥ 1500;
    • the reset PR at conclusion, or within 2 h;
    • the gates stay closed; the limits as admitted.

    Pass criterion: 45/45 (27 enabled + 18 WASM-off), 0 unexpected, flaky or skipped; all 32 groups contained; the readbacks as admitted; the high-water and timing recorded.

    A failure is evidence: report it, reset, and do not re-run. After the run: an independent acceptance review against #4710's Done-when, with the disabled browser path now covered.

  26. EHotwagner commented on Oct 23, 2026

    @EHotwagner
    ContributorAuthor

    fdev, C-J1 run 4: dispatched once.

    • Admission PR: Templates#757 merged as 4bcbb016403c11e4f5b15e3064fdcf0ed6bd118e. It had independent ACCEPT on its exact head 231eb0ea, and all four required checks were green.
    • Merge-tree readback: main is 4bcbb016, and its parent is the reviewed base 666611f. Its tree equals the reviewed head's tree, with no intervening merges. INSTALLED_ADMISSION is this admission's URL.
    • Dispatch: at 09:37:44Z, with core REST remaining at 3018. Run 39933243864 dispatched wasm-installed-c.yml on main with admitted_ref=4bcbb016… and admission=…#issuecomment-6361584197. It is attempt 1.
    • No re-run. The reset PR (an exact revert) follows at the run's conclusion, and no later than 11:37:44Z.
  27. EHotwagner commented on Oct 23, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-23: Signed report: installed-C run 4 (39933243864) PASSED 45/45. Independent acceptance: ACCEPT AS EVIDENCE, and DONE-WHEN MET for #4710.

    Explicit statement for closure

    The independent acceptance review mapped every Done-when item of #4710 to evidence and found all of them met. That includes the real enabled and disabled browser paths, the gap left open after run 3. Its one qualification is stated below under "Disabled path".

    I can find no remaining Done-when item. #4710 can be closed. Reset PR #758 is merged (see the last section).

    Run identity

    • Admission: 6361584197.
    • Admission PR: Templates#757, merged as 4bcbb016. It had independent ACCEPT on 231eb0ea and green checks.
    • Merge-tree readback: main's tree equals the reviewed head's tree, and its parent is 666611f (Phase D — the shim, and the deletion: ADR-0040's own endpoint DELETES six corpus assertions the same ADR forbids deleting #756). There were no intervening merges.
    • Dispatch: once, at 09:37:44Z, with REST at 3018. Attempt 1. source.json binds SHA, ADMITTED_REF and WORKFLOW_SHA to 4bcbb016, and ADMISSION to the exact URL.
      • The run concluded success at 09:41:31Z.
      • It is the only wasm-installed-c.yml dispatch since the admission.
    • Artifact: 12493026374, sha256:beac8e9f658b3fe78f950a7ef7d83bd9c89376a6682020738bf656997edd7a91, 32.7 MB, expiring 2026-11-22. Its manifest lists 208 files and 34.9 MB; every hash matches, and nothing was skipped or truncated.
    • Reset: Templates#758, an exact revert. It was opened 1 min after the run concluded, had independent ACCEPT, and merged as 5fee4cf8 at 10:14:30Z.

    Result against the admitted pass criterion

    population chromium firefox webkit
    enabled (Complete, FsGgWasmPolicyExample=true, /wasm-example/) 9/9 9/9 9/9
    WASM-off (default product, flag false, /) 6/6 6/6 6/6
    • All cases: 0 unexpected, flaky or skipped; retries 0; 1 worker; Playwright 1.63.0; Firefox with the content sandbox enabled.
    • 32 managed groups (19 setup, 13 installed), all contained and observed-empty-removed under owner d846dbe1.
      • Every receipt has empty escaped, residual and created-cgroup lists.
      • Every leader was admitted, with NoNewPrivs set.
    • Readbacks: the unit matches the admission in all 6 fields (6144 tasks, 12G, 40 min, Delegate, NoNewPrivileges, KillMode). All 51 recorded WebKit packages were installed, and no apt process remained.
    • High-water: peaks of 190 tasks and 5.88 GiB. The oom-kill, memory.max and pids.max event deltas are all 0, with 0 poll errors.
    • Timing:
      • setup 53.1 s of 840 s;
      • installed 135.1 s of 1230 s, of which the checker took 65.3 s;
      • the WASM-off groups took about 25.7 s in total, inside the < 60 s estimate in the request.
    • Checker: source-passed on published Workspace.Template 0.19.3 (archive 9594ec20…, descriptor 6b3d8f2d…, tag fs-gg-templates/v0.19.3 → 7be0bcf5). The repository-signature check and the publication check ("valid — 513 unique archive entries") both passed, with FS.GG.Wasm [0.7.0] and guest SDK 090658bd.

    Done-when mapping (independent reviewer)

    Done-when Evidence Status
    Clean downloaded-only product builds and runs its actual Fable/Vite/Worker/ESM graph, with no sibling or local-feed fallback Every input is hash-pinned. Both graphs have ProjectReference: [] and fresh caches. Restore used a locked nuget.org-only config and npm ran offline. Fable 5.18 and Vite 7.3.6 production builds ran, with [0.7.0]. Met
    Opted-in published WASM reference, enabled browser path application/wasm guests and module-worker.mjs were served under /wasm-example/; 27/27 passed. Met
    Disabled browser path Default receiver, flag false, base /. The dist contains no WASM, Worker or policy asset, enforced statically and over HTTP. The game SVG renders and its scene revision advances. 18/18 passed. Met (see "Disabled path")
    Exact package, Worker and guest custody Package 9594ec20 and guest SDK 090658bd. Disposal, repeated-mount and shutdown cases ran in 3 families. Met
    Bounded lifecycle and refusal through the maintained receiver The malformed, trap, loop, malformed-admission, replacement and disposed-replacement cases ran in 3 families. Met
    Reuse 0.19.0 signatures only where identities match Nothing was reused. 0.19.3 was verified fresh. Met
    Honest record of missing cases The limits below, plus 6360388935, 6360636006, 6361576745 and Atlas templates/wasm-installed-c-run-39920080680. Met

    Disabled path: what exactly was tested

    • Receiver: the WASM-off receiver is the published default (player) product (dotnet new fs-gg-fable-game with no --bundle), built with FsGgWasmPolicyExample=false. This is the reading fdev selected in 6360636006 and admitted in 6361584197.
    • Not browser-run: the Complete bundle built with the flag false. It shares the same flag-false switch in SvgFoundation.fsproj and vite.config.js.
    • Which cases discriminate. The enabled product is lazy, so at page load WASM-off cases 2–4 are observations the enabled product also satisfies.
      • What discriminates is case 5 (no policy UI, so the lazy path cannot be entered) and case 6 (no assets served).
      • Cases 2 and 4 also discriminate once "Load policy" has been clicked on the enabled product.
      • Case 3 covers the page realm only and never discriminates.
      • Negative controls are in Templates#756 comment 6361332004.

    Recorded limits (none is a Done-when item)

    • Process checks cover the unit cgroup only.
    • There is no CPU-pressure or hosted cold-load p95.
    • Per-group memory peaks are null by design.
    • n = 1, so no flakiness claim.
    • No backend: /api/bootstrap returns 404 under vite preview on both paths.
    • The Browser package hash check in materialize-assets.py has no separate receipt.
    • Provider, Wizard, SDD, FourD, AT and product adoption are out of scope. Provider and Wizard on 0.19.3 were qualified in run 39915065069 (Qualify the selected current SVG successor through the full public Wizard route #4709).

    Held remainder and owners

    1. Reset is done: the board-side writes: N field writes are ONE point, and flush no longer DOUBLES the queue it cannot drain #758 merged as 5fee4cf8b0eb44b8b436566aa605f6468b703692 at 10:14:30Z, 33 min after the run concluded and inside the 2 h bound. Main's tree equals 666611f, and INSTALLED_ADMISSION = None.
    2. Atlas (owner fdev, not selected in this Delivery): a run-4 record and a superseding binding-record version. The current binding record still lists the WASM-off path as "not established hosted". I'm ready to do this if selected.
    3. Qualify the first clean downloaded shared-game-reference journey #4710 body: the "Current deliverable / Next action / Blocked on" sections are stale (they still say 0.19.0 and supplier-blocked). That is for the closer.
    4. [FABLE-ADOPT-01 shared reference / GAME-TEMPLATE-01] Qualify the shared Fable game reference and staged product adoption #4646 stays open at its own broader scope.
  28. EHotwagner commented on Oct 23, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-23: ACCEPTED: #4710 complete. Installed-C run 4 (39933243864) passed 45/45: 9/9 enabled and 6/6 WASM-off in each of Chromium, Firefox and WebKit, with 0 unexpected, flaky or skipped. The independent acceptance review found every Done-when clause met (report). Reset Templates#758 is merged (5fee4cf8), and INSTALLED_ADMISSION = None.

    This comment supersedes the stale "Current deliverable", "Next action" and "Blocked on" sections (0.19.0 / supplier-blocked).

    What got us here:

    • the managed-group owner (Coordination#1046);
    • custody pilots 1–3;
    • run 1 (a restore defect, which led to the rehearse-first rule);
    • run 2 (a Firefox deadline defect, which led to Game#727 and FS.GG.Wasm 0.7.0);
    • Workspace.Template 0.19.3;
    • run 3 (27/27);
    • the WASM-off cases (Templates#756);
    • run 4 (45/45).

    Recorded qualification and limits:

    • the "disabled path" is the published default product built with WASM off, as selected and admitted; the Complete bundle with WASM off was not browser-run;
    • one run only, with no backend;
    • no CPU-pressure timing;
    • process checks within the unit only.

    Atlas: the run-4 record plus the binding update (the WASM-off path is now established) are selected for the owner. #4646 continues at its broader scope.

  29. EHotwagner commented on Oct 23, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-23, C-J1 follow-up: the Atlas capture of run 4 is merged.

    • PR: Templates#759 merged as af7a603.
    • Review: independent ACCEPT on the exact head cbbc2078, with green checks. The docs on main equal the reviewed head, and atlas validate on main reports 24 records.
    • New record templates/wasm-installed-c-run-39933243864 (ce756a12) holds:
      • the 45/45 result and evidence identities;
      • which WASM-off cases discriminate, and the negative controls;
      • the negative-control lesson;
      • the limits.
    • Binding record templates/wasm-installed-c-managed-group-binding (e3f4cf6c) supersedes df2e6ba4. The WASM-off path is now established hosted, with this qualification: it is the published default (player) product built with WASM off, and the Complete bundle with the flag off is not browser-run. A connected backend is added to the "not established" list.
    • Wording points the critic noted, none needing a change:
      • case 6's negative control used paths rebased to /wasm-example/;
      • "tag 7be0bcf5" means the commit the tag points to;
      • the "32 groups" count includes the 19 setup groups;
      • the cited revision 500f381d is a PR-branch commit (same pattern as earlier records).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions