Skip to content

FABLE-ADOPT-01 child: complete remaining composition, save-replay, receipts, input/IME/focus, DOM islands and command ordering #4818

Open

Description

@EHotwagner

Owner

Programme/root accountable for integration and full acceptance; existing Templates implementation owner template_wasm_reference continues current source preparation during the independent4816 native-CI wait. Rendering/Game/product owners retain producer contracts; no competing external source or runtime assignment. Split from4646; owning plan docs/roadmaps/2026-10-01-staged-fable-game-adoption.md.

Done when

The quoted scope below, met on the current published reference with exact package identities read back.

complete remaining composition/local save-replay, external receipts/reconnect without replay, transformed pointer/keyboard/IME/focus, held release/DOM islands, command ordering/coalescing/replacement/disposal

Current deliverable

Durable save/restore and release0.20.1 source are delivered through TemplatesPR800/mergecb819938, exact reviewed/delivered treef4fe59cb, current required compositionCI and17success/4skip. Actual source-built13/13 browser cases remain accepted at source scope. Public same-archive successor qualification remains pending; no0.20.1 publication or whole child acceptance is claimed.

Next action

After the SDK revalidation supplier repair and actual matching2.44 carrier with enforceable child limits are available, finish the once-packed four-product qualification, public release/readbacks and current-reference composition acceptance under the existing owner. Preserve all original source/runtime attempts and remaining input/IME/receipt/disposal assertions.

Blocked on

SDK catalog input-lifetime repair and matchingglibc2.44 contained carrier for actual qualification. The local cgroup filesystem is read-only and cannot provide requested child memory limits; Noble2.39 is ineligible. Source/CI/merge are complete and local compute is drained.

Acceptance evidence

PR800 source mergecb819938 and exact treef4fe59cb; actual source-built13/13 current plan3343e2f4 remains source evidence. CompletedSDK2.5.2 public qualification/Doctor is reused only at its accepted scope; newly confirmed repeated capture-lifetime defect and actual carrier remain explicit prerequisites.

Independent exact308ab9c source+seal review APPROVE; fresh source-built reporta804c1d35b11d1528bc19596cee7ac108e42b2d0432d01519e8789bfbed4c2bd with13/13. Guarded native StatusInprogress→Ready verified after compute drained/owner return, preserving17fields/8views/89memberships. Runtime/public/AT/product-save whole promises remain separately open.

Owner baseline active2026-10-25 on93077072, exact clean Coordinationcc7a, fresh2CPU/8GiB isolated outputs. This is ongoing ordinary verification, not accepted durable implementation. Existing published0.20.0 acceptance#4818#6394344762 is preserved.

Root continuation2026-10-25 accepts the separately evidenced published DOM composition slice at comment6394344762/PRTemplates#797; published route verdict remains dom-observed-local-reference-only, with actualProducerCustodyReadback true and installed/AT/durable-save/native-campaign acceptance false. Whole #4818/#4646 is not closed by this result.

Source boundary: DOM protected delivery FS-GG/FS.GG.Templates#767; current D5 conditional source selection #4849 (comment); SAME journal PR FS-GG/FS.GG.Coordination#1059; retained scoped native acceptance #4816 (comment). Each supports only its explicit scope.

Boundary2026-10-23 23:21UTC: scoped4816 acceptance #4816 (comment); D5 delivered FS-GG/FS.GG.Templates#766; journal source/CI FS-GG/FS.GG.Coordination#1059; BAR original https://github.com/FS-GG/FS.GG.Coordination/actions/runs/40035696680; FourD recovery #4819 (comment). Each supports only its stated scope.

Boundary2026-10-23: source/runtime/receiving disposition #4516 (comment); conditional4816 selection #4816 (comment); current4818 source FS-GG/FS.GG.Templates#764; BAR repair FS-GG/FS.GG.Coordination#1057. Each supports only its owning scope.

#4710 accepted at #4710 (comment). Root unblock ruling #4818 (comment). Templates#722/source run38691234268 supplies synthetic in-memory save/replay source qualification only; durable persistence, downloaded-only/retained and new-control AT acceptance remain unproved.

Activity

  1. EHotwagner commented on Oct 23, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-23: the "Blocked on #4710" text is superseded. #4710 is closed as Done (run 4: 45/45 on Workspace.Template 0.19.3 / FS.GG.Wasm 0.7.0). This item is executable by its Templates template_wasm_reference owner. It is a sibling of #4819 .5, not a prerequisite.

  2. EHotwagner commented on Oct 24, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-24 (new accountable #4818 owner, succeeding the stopped Templates owner template_wasm_reference): owner recovery and slice choice.

    Recovered state (read back, nothing modified)

    • Source: Templates PR764 (routine/4818-current-composition) and PR767 (routine/4818-managed-dom-held, merged 2026-10-23T23:50:40Z) are merged; both worktrees (templates-4818-current-composition-20261023, templates-4818-managed-dom-20261023) are clean and fully merged. There is no open FABLE-ADOPT-01 child: complete remaining composition, save-replay, receipts, input/IME/focus, DOM islands and command ordering #4818 PR and no dirty source. I continue in the existing templates-4818-managed-dom-20261023 worktree on one fresh branch routine/4818-local-dom-cases from origin/main (aae4f43); no competing worktree.
    • The delivered DOM caller is a held hosted workflow (ADMISSION=None, literal-false receiver) with 20 pure controls. No case has ever executed; the source stage was never run against a real dotnet new.

    Slice: execute the 27 typed DOM cases locally on the delivered source

    Per ADR-0096 §A, a local build and test of unpublished source in a fresh private root, with no credentials, no shared destination and no publication/Home/VM/native effect, is ordinary development verification. It needs no Root runtime admission, original clock or managed-group owner. This slice therefore:

    1. adds one local runner for the typed current-composition-plan (9 cases x Chromium, Firefox, WebKit, workers 1, retries 0, no skips) over the existing source stage and validators;
    2. repairs whatever the first real execution exposes (already found: dotnet new ... --package is not an option of the shipped SDK, so the held stage could never have generated the receiver);
    3. binds each result to the exact head/tree and records it.

    Explicitly not this slice (separate obligations, unchanged)

    Full producer-custody transport and qualification (reference-only here: actualProducerCustodyReadback=false), durable product save (the localSaved journey stays synthetic in-memory), AT (#4817), the hosted original-operation route (stays held), installed/published acceptance, and whole #4818. Local results are development verification, not accepted hosted or installed scope. No publication, Status write, native desktop, AT operator or GPU is used.

  3. EHotwagner commented on Oct 24, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-24 (#4818 owner): the 27 typed DOM cases executed and passed locally; source delivered. #4818 stays open. Status is left to root.

    Delivery

    What the first real execution found (held PR767 source, never run before)

    1. dotnet new fs-gg-fable-game ... --package FS.GG.Workspace.Template: --package is not an option of the shipped SDK 10.0.401 (exit 127). The held stage could never generate the receiver; its pure control used a fake dotnet that asserted the flag. Removed.
    2. The source stage exported FsGgExternalReferenceCandidate for the build only, so the four command-outcome specs registered no case in the separate Playwright process: listing 5 of 9 identities, which the managed route would have refused at its first family. browser_environment(plan) now derives the flags from the typed selection for the managed route and the runner.

    Result (ADR-0096 ordinary verification; clean checkout, exact head 7b2f520e, tree 8d6e0ece)

    current-composition-local.py, 3 CPUs, 2m39s, fresh private root, closed environment, no credential: typed owner built; exact public template 0.19.3 and Rendering 0.32.3 archives fetched by typed SHA-256; Fable 5.18 core hash; source stage (locked restore, Fable build, Vite, server publish); then per family listing == the nine typed identities and run, workers 1, retries 0, Playwright 1.63.0 in an Ubuntu 24.04 host-libraries container (no network, 8 GiB; the Arch dev host lacks Firefox/WebKit libraries): Chromium 9/9, Firefox 9/9, WebKit 9/9 = 27 passed, 0 skipped/flaky/retried. Node 24.20.0, npm 11.19.0, SDK 10.0.401. Plan sha256 c74d58d554de21da4594534d1b969bcf3a392df56b5d9742b3bbdda2739f1cf6.
    Pure controls: all 17 test-*.py and verify-external-reference-workflow.py pass (also with GITHUB_ACTIONS=true), with 13 new runner controls (faked-process orchestration, refusals, container flags, download SHA/bound, toolchain and stage gates, process-group kill), 2 new observation controls; about 20 scratch mutations each caught.

    Not accepted / remaining for #4818 (separate obligations, unchanged)

    • Full producer-custody transport and qualification: actualProducerCustodyReadback=false; the original Rendering custody JSON (361215 bytes, run 39509314882 / artifact 12305198394, sha 7dbd4329...) is a reference only. The next slice is the authenticated original acquisition plus the unchanged payload/source/dependency binder, which needs Root's existing acquisition route.
    • Durable product save: localSaved remains the synthetic in-memory journey.
    • AT (FABLE-ADOPT-01 child: actual AT/accessibility/provider journeys #4817) and anything needing a native desktop, operator or GPU.
    • The hosted original-operation DOM route stays held (ADMISSION=None, literal-false receiver); this local pass neither opens nor replaces it. Whether the hosted route is still wanted now that local ordinary verification exists is a Root decision.
    • Installed/published acceptance, the remaining WASM/example composition, and whole FABLE-ADOPT-01 child: complete remaining composition, save-replay, receipts, input/IME/focus, DOM islands and command ordering #4818.
      No publication, Status write, Home/VM/native effect was used.
  4. EHotwagner commented on Oct 24, 2026

    @EHotwagner
    ContributorAuthor

    Root (fdev) acceptance and decisions, 2026-10-24

    DOM slice accepted at its scope. Templates#784 squash-merged as b00b00b7. The merge tree equals the tree of the reviewed and qualified head.

    • Evidence: 27/27 typed DOM cases on the exact merged tree (Chromium, Firefox, WebKit 9 each; 0 skips, flakes or retries), plus 17 pure controls, including with GITHUB_ACTIONS=true.
    • Two real defects in the held source were exposed and fixed, each with failing-before controls.

    Decisions

    1. Retire the held hosted original-operation DOM route. ADR-0096 ordinary local verification now qualifies the 27 cases, so the held hosted route adds ceremony without distinct evidence. Remove it, its ADMISSION=None literal-false receiver, and its dead controls in one reviewed PR. If CI coverage is wanted, a later optional hosted job may run the same local runner.
    2. Next FABLE-ADOPT-01 child: complete remaining composition, save-replay, receipts, input/IME/focus, DOM islands and command ordering #4818 slice: producer-custody acquisition. Selected.
    3. Playwright host-libraries image: rebuild it each time, from ubuntu:24.04 pinned by digest instead of the mutable tag. Commit the digest in current-composition-local-image.sh. No long-lived shared image.

    Still separate: durable product save, AT (#4817), installed/published acceptance, and the remaining example composition.

    Process finding accepted for intake: controls that fake the exact boundary they check (for example a fake dotnet asserting an invalid flag) are recorded as a lesson. The owner adds it to Atlas with the next PR.

  5. EHotwagner commented on Oct 24, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-24 (#4818 owner): intent for the delegated producer-custody acquisition, under Root's decision 2 (comment 6389530247 thread, newest Root comment). Recorded before the read.

    The single acquisition

    • Operation: exactly one authenticated, read-only GET of repos/FS-GG/FS.GG.Rendering/actions/artifacts/12305198394/zip (source run 39509314882, attempt 1, head 4ec6eafbbbf02264db9b0db4780c590abe0bf9cd, artifact rendering-source-candidate-4ec6eafbbbf02264db9b0db4780c590abe0bf9cd-0.32.3), through the same gh api read the existing preflight uses. Credential: the session's existing GitHub token, used only for this GET. No write, no dispatch, no publication.
    • Destination: a fresh private root, /home/developer/.cache/fable-4818/custody-4818/ (must not exist beforehand; mode 0700), outside every checkout.
    • Bounds, fixed now: the response must be exactly 15,073,469 bytes with SHA-256 84647332c124e511545787c8c3f8634d4f5177068521acfc86c93430ac73ef63 (the typed value in the existing preflight and the artifact's own digest); then extract only the single release-custody.json member (expected 361,215 bytes) and require SHA-256 7dbd4329546932c4c1d12767550b7b78aae85e32c81b354935b2c615b3e298c9 (the typed plan's rendering.custodySha256). Wall-clock cap 300 s.
    • Already read, before this intent, and not part of the acquisition: run and artifact metadata (gh api on the run and artifact objects, no content): artifact not expired, 15,073,469 bytes, digest: sha256:84647332..., expires 2027-01-18. Those are the only reads so far.
    • No retry of an uncertain read. A nonzero exit, a timeout, a short or long body, a hash mismatch or any ambiguity is recorded here as uncertain/failed with the first cause and the retained bytes; I will not repeat the GET, and I will return to Root instead.
    • Independent readback: after the read, an independent reviewer (separate from me) recomputes the SHA-256 of the retained ZIP and extracted JSON, the ZIP CRCs and member census, and joins the custody archive rows to the three typed package hashes. This is an offline read of the retained bytes; it makes no network call.

    What this establishes, and what it does not

    It establishes that the original producer custody manifest, bit-identical to the typed hash, was actually read from the authenticated original source artifact once. It does not by itself accept published packages, installed adoption, durable save, AT or whole #4818. The following PR sets actualProducerCustodyReadback from this evidence only.

  6. EHotwagner commented on Oct 24, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-24 (#4818 owner): progress on Root's decisions 1-3. #4818 stays open; Status is left to root.

    Decision 1 (retire the held hosted route, pin the image, Atlas lesson): delivered

    Templates#787, squash ab48638b660fca4bb7498a51a0982ec6aa17148c; merge tree feccf254... equals the reviewed head 32600529 (independent fsgg-critic-normal ACCEPT-WITH-NITS, no material finding; required checks 13 pass, 4 skipped). Removed the hosted workflow, managed caller, literal-false receiver, the admission constant and their controls; the stage now refuses without the local verification gate. Base image pinned by digest (ubuntu@sha256:68ee2200..., rebuilt from the pin to verify). Atlas: lesson templates/controls-must-not-fake-the-boundary-they-check and decision templates/hosted-dom-route-retired. Residue left on purpose: the unreachable composition naming contract in the shared reader retained-reference-rehearsal.py (D5 pins that file's digest, so removing it needs the D5/earlier-three lanes).

    Decision 2 (producer-custody acquisition): acquisition done; PR under review

    Per the recorded intent: exactly one authenticated read-only GET of artifact 12305198394 (run 39509314882, 4ec6eaf), 2026-10-24T21:08:02Z, one attempt, exit 0, 3.8 s, into a fresh private root /home/developer/.cache/fable-4818/custody-4818/ (now read-only). Result: 15,073,469 bytes, SHA-256 84647332... as typed; release-custody.json 361,215 bytes, SHA-256 7dbd4329546932c4c1d12767550b7b78aae85e32c81b354935b2c615b3e298c9 equal to the typed custodySha256. No retry was needed or made. Independent offline readback (separate reviewer, no network): CONFIRMED.
    The producer's own unchanged release-custody.py verify accepts the 19 archives and bound plan, and compare matches Scene, KeyboardInput and SvgBrowser entry for entry. Finding: the typed plan's package hashes are the signed nuget.org bytes and the custody rows are the pre-signing archives (differing only by .signature.p7s), so the join is at payload level and must never equate the two hashes.
    Templates#788 sets actualProducerCustodyReadback only from that join (real run: true, 27/27 DOM cases alongside). It is in independent review; I report its merge separately.

  7. EHotwagner commented on Oct 24, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-24 (#4818 owner): decisions 1 and 2 delivered; decision 3 not started. #4818 stays open. Status is left to root.

    Delivered

    Producer-custody acquisition result

    One authenticated read-only GET of artifact 12305198394 (2026-10-24T21:08:02Z, one attempt, no retry): 15,073,469 bytes (84647332...), release-custody.json 361,215 bytes, SHA-256 7dbd4329546932c4c1d12767550b7b78aae85e32c81b354935b2c615b3e298c9 = the typed custodySha256. Retained read-only at /home/developer/.cache/fable-4818/custody-4818/ (receipt, ZIP, manifest). Independent offline readback CONFIRMED; the PR reviewer re-ran the join offline and got the same result.
    actualProducerCustodyReadback is now set by current-composition-local.py --custody-evidence --rendering-source, only after (a) the manifest equals the typed hash, version and source commit, (b) the producer's own unchanged release-custody.py verify accepts the 19 archives and the bound plan, (c) compare matches Scene, KeyboardInput and SvgBrowser payload-exact with the feed signature present, and only on a fully successful run. Real run on the merged head: flag true, 27/27 DOM cases.
    Scope note: the typed package hashes are the signed nuget.org bytes and the custody rows are the pre-signing archives, so the join is at payload level and never equates the two hashes. It does not accept installed/published-feed adoption; the other 16 packages are checked only by the binder against custody; the retained bytes are not reproducible without the same credentialed access.

    Decision 3 (durable product save): not started, and it is not a Templates slice as scoped

    The localSaved journey in the Templates reference is a synthetic fixture (Examples/FourD/LocalSaveReplayExample.fs: "synthetic ... do not name a product save format"). Making it durable inside the template would only invent a storage format for synthetic data, and changing the template source cannot be exercised by the local runner, which tests the published 0.19.3 archive. The product save is FourD's: FS.GG.FourD already runs retained-save journeys (FourD#44 local join: 5 passed) in its own lane (#4819). I propose, for Root's decision, that the durable product-save obligation be bound to #4819/FourD's retained-save journeys (and the next template release if a durable reference is wanted), rather than a further Templates PR now.

    Remaining on #4818

    Durable product save (above), AT (#4817), installed/published acceptance, the remaining example composition, and whole #4818. Residue: the unreachable composition naming contract in the shared reader retained-reference-rehearsal.py (needs the D5/earlier-three lanes).

  8. EHotwagner commented on Oct 24, 2026

    @EHotwagner
    ContributorAuthor

    Root (fdev) acceptance and decisions, 2026-10-25

    Accepted at source scope

    • Templates#787 ab48638b: the held hosted DOM route is retired, and the base image is digest-pinned.
    • Templates#788 48ca47fe: actualProducerCustodyReadback is now set from real evidence.
      • One authenticated read-only acquisition, intent recorded first, no retry. Artifact 12305198394, ZIP 84647332…, custody JSON 7dbd4329… = the typed value.
      • Independent offline readback. The binder accepts all 19 archives.
      • Scene, KeyboardInput and SvgBrowser match payload-exact against the signed nuget.org bytes.
    • 27/27 DOM cases pass with the flag true.

    Decisions

    1. Durable product save is re-bound.
    2. Residue: the unreachable composition branch in the shared retained-reference-rehearsal.py goes to the D5/earlier-three owner, because that file's digest is pinned by those lanes. Low priority.

    Remaining #4818 scope

  9. EHotwagner commented on Oct 24, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-25 (#4818 owner): published-feed payload acceptance, all 19 Rendering 0.32.3 archives. #4818 stays open; Status left to root.

    Method (ADR-0096 ordinary verification). Unauthenticated GET of each archive from api.nuget.org/v3-flatcontainer into a fresh private root (/home/developer/.cache/fable-4818/published-16/, now read-only); each compared with its custody archive (from the once-read producer artifact, producer 4ec6eaf) by the producer's own unchanged scripts/release-custody.py compare, which excludes the feed-added .signature.p7s and requires every other entry hash to match. Observed 2026-10-24T22:42Z (feed content is live: a dated observation).

    package entries custody bytes published bytes (+signature) published sha256 compare
    FS.GG.UI 4 2211 15301 (+13090) c5c27a8a0ebb7d6ccbe33268d9315eb3f2b7b32a16e8653b4651de93a4608316 PASS
    FS.GG.UI.Build 8 22190 35280 (+13090) f0a95c0b03a2acc2e79d7ff3f411a281c5f104c8e6d3e05ab443a9c45aa6daf4 PASS
    FS.GG.UI.Canvas 8 37449 50538 (+13089) 684d400c7657f1ad7eaed7d842b7f26c4a07f8bf6908cba6a19ab5d04ba41170 PASS
    FS.GG.UI.Controls 53 748267 761356 (+13089) df31529336f5c5d9dad4c62a8cc97379447a3065e5dd80459b487f0a1b19549f PASS
    FS.GG.UI.Controls.Elmish 10 135613 148702 (+13089) 40dcfb502b0a28efd1658a47536d85b5f55dd06e73135dc8f3a60025e10edbb0 PASS
    FS.GG.UI.DesignSystem 12 52041 65130 (+13089) 07743367e1ce2a06e3a402b40cd6c1e43ce5e9e23c97404f6e5e883a949b0a7d PASS
    FS.GG.UI.Diagnostics 8 42503 55592 (+13089) 4e9acbb11fa38c3a97365491c821057e0126db4dbd9c78d71169bbc43a3a2368 PASS
    FS.GG.UI.Elmish 10 66289 79378 (+13089) 37dc910db99ef78143d9382de8d6bb54c69f443c45fdedc1e93be8c9420d86e9 PASS
    FS.GG.UI.KeyboardInput 19 164597 177687 (+13090) 99aa6564e7a3b323da8346c50894f28eca8b981cc31ac763b8f34b19fd8beb4c PASS
    FS.GG.UI.Layout 11 118941 132031 (+13090) 321334f31eb3f9b04bdd0bbd8ac14e32f87a8dea994d2c8aca509c8045ec2a5e PASS
    FS.GG.UI.Scene 42 816681 829771 (+13090) 9cc74f6af082089fb269d7d12c7f1e7ee7684ae3bdab51918b65e06e072a7ac8 PASS
    FS.GG.UI.Scene.SvgBrowser 37 263275 276364 (+13089) 8764ce047628f7f58d77e430b2afa0ffafb47560f7633abcf1c8dd12bf8710ad PASS
    FS.GG.UI.SkiaViewer 19 2808108 2821197 (+13089) 639643d5db0bb3ede8a81a48411b3e5e47a1220cd5b845df75206e6d6fce401d PASS
    FS.GG.UI.Symbology 11 124510 137599 (+13089) 76c29f5de289762876b95caddaf06d36cef84913a80b49e4b86ee7fb6c36a735 PASS
    FS.GG.UI.Symbology.Render 7 9045 22135 (+13090) bb20a7e98cb82c800005d2e6566d83f59098eeb6885b6e8913f27d3dab55550f PASS
    FS.GG.UI.Template 2284 9037315 9050404 (+13089) 747f33eb0242783f67b2462d8ca137b14f36bb4133bd0a3d4ca98ca8ad93dfe6 PASS
    FS.GG.UI.Testing 13 231440 244529 (+13089) 49f1a0430072af7113e5b07ad0755c3f01cc9c575a84a621c6321384290cc1a3 PASS
    FS.GG.UI.Themes.AntDesign 8 10999 24089 (+13090) 80c55b2364069908b159525e515cce72137244c74412f2b6fdbfb9a399c16e72 PASS
    FS.GG.UI.Themes.Default 9 17678 30767 (+13089) 4e792b9e72844bc157c0e9ac368295dada3e30eb9c5af063dafc6054ae4edc7f PASS

    Result: 19/19 PASS (the 3 typed packages plus the other 16). Every published archive is its custody archive plus exactly one .signature.p7s entry (overhead 13,089 or 13,090 bytes) with all payload entries identical. The three typed packages' published hashes equal their typed signed SHA-256; the other 16 have no typed pin, so their published hashes are recorded here and checked only through the payload compare. Not installed adoption.

    The same comparison is now a runner mode (--published-all) in Templates#790 (in independent review); a separately written script gave identical published hashes.

    Example composition: precise definition (corrected after independent review)

    The Done-when names six elements; each maps to executing typed cases among the 27 (assertion citations and limits in Templates#790's report). Every named element has an executing case, with stated limits: local save-replay (synthetic in-memory), external receipts/reconnect without replay (4 command-outcome cases + 2), transformed pointer/keyboard (FourD and external-input cases), IME (synthetic compositionstart/end events only, not real IME insertion), held release (h + window blur -> data-held false in the FourD case; in the external case blur + visibilitychange only leave the authority revision unchanged), DOM islands (native Encounter note / External reference note textboxes accept text and keep Enter; the FourD note value is asserted right after fill, the external note is not re-read), and ordering/coalescing/replacement/disposal (single projection request under a burst, stale-generation reply inert, disposal settles counts to 0, reload remounts).
    Final remaining composition pieces (change shipped template source, so they belong with the next Workspace.Template release, Templates#441's 0.20.0, alongside the durable reference localSaved): (a) broader DOM panels beyond one textbox (capability map F04); (b) an explicit template-level assertion that focus and native editing/IME text survive a retained update and a session replacement (F01/F04; none of the nine asserts toBeFocused or re-reads the note value across an update; the Rendering producer's own focus cases cover it there). Plus a fresh installed receiver (separate).

  10. EHotwagner commented on Oct 24, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-25 (#4818 owner): published-feed payload acceptance and the example-composition definition are delivered. #4818 stays open. Status is left to root.

    • PR: Templates#790, squash d1488c5b3e1dcbfb943dfd6130763e3eef8bfa64; merge tree 2206414e... equals the reviewed and qualified head 3ef0cf4d. Independent fsgg-critic-normal: first pass REQUESTED CHANGES on the example-composition wording (the matrix overclaimed DOM-island text/IME retention across replacement and the strength of the IME/held-release evidence) plus control gaps; all closed; delta ACCEPT-WITH-NITS; final ACCEPT on 3ef0cf4d. Main moved (fix(engine): child reads the edge before it links — fail-closed idempotency, not a blind POST (#320) (case 15) #791, the D5 owner's removal of the unreachable composition contract) and was merged in; the PR diff is file-by-file identical to the reviewed one. Required checks: 13 pass, 4 skipped, 0 fail.
    • Per-package table (19/19 payload-exact): above (unauthenticated feed read, producer's own compare; also the PR's report). It is now a repeatable runner mode, --published-all; the real run on the merged head repeated 19/19 plus 27/27 DOM cases, custody flag true.
    • Example composition, final form: every Done-when element has an executing case among the 27, with stated limits (the report cites assertions: IME is synthetic composition events; external blur/visibilitychange only leave the revision unchanged; the DOM-island notes are not re-read across scene replacement). Remaining pieces, all new template source for the next Workspace.Template release (Templates#441's 0.20.0), alongside the durable reference localSaved: (a) broader DOM panels beyond one textbox (F04); (b) an explicit assertion that focus and native editing/IME text survive a retained update and session replacement (F01/F04). Plus a fresh installed receiver. I did not add template source: it cannot be proven by the runner (published bytes) without a source-built-template mode, and it is release-train work.
    • Atlas: templates/published-payload-and-example-composition-4818.

    What remains of #4818

    (a)/(b) above and the installed receiver (all gated on 0.20.0 / installed qualification), durable save (re-bound to #4819), AT (#4817), installed/published acceptance. No further Templates PR is open from me.

  11. EHotwagner commented on Oct 24, 2026

    @EHotwagner
    ContributorAuthor

    Root (fdev), 2026-10-25: Templates#790 accepted (d1488c5b). All 19 Rendering 0.32.3 archives match custody payload-exact on the public feed, observed 2026-10-24.

    Decision: add a source-built-template mode to the local runner. It packs Workspace.Template from the exact protected source commit into a private feed, and the runner then exercises it through the same 27-case route. This keeps the verdict separate from the held 0.20.0 publication. The template-source gaps (a) broader DOM panels and (b) a focus and native-editing/IME survival assertion across retained update and session replacement are implemented and proven in that mode. Published-byte qualification stays a separate claim for the release.

  12. EHotwagner commented on Oct 25, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-25 (#4818 owner): source-built mode delivered (part 1); panel and focus cases in review (part 2). #4818 stays open; Status left to root.

    • Part 1: Templates#793, squash f8b53f3493ecc808f999e45c5be24fa090281a98 (its tree differs from the reviewed head 60261981 only by main's newer Atlas record; no source file differs). Independent fsgg-critic-normal: ACCEPT-WITH-NITS, nits closed, final APPROVE on 60261981; required checks 13 pass, 4 skipped.
      • current-composition-local.py --source-built --coordination-source CLONE copies the checked-out commit (git archive) under the private root, packs FS.GG.Workspace.Template there with the Coordination Python-fixture revision the source names (local clone, never fetched; nothing written inside the checkout), and runs the same typed cases against that package with the same public Rendering archives and locked graph. The summary records source commit and tree, onLocalOriginMain (ancestry of the local origin/main ref, not a remote read), package name, bytes and SHA-256; verdict dom-observed-source-built-reference-only, origin: source-built, publishedAcceptance: false. A second typed plan, source-built-composition-plan, pins no template archive; the published plan renders byte-identical.
      • First source-built run of the unchanged nine cases: 27/27 on the 0.20.0 source package. The published route is unchanged (27/27, custody flag true, 19/19 published payload).
    • Part 2: Templates#794 adds the FourD Encounter options island (labelled select, checkbox, radio group) and two source-only typed cases (11 per browser, 33 total). Fail-before: the commit with the cases and without the implementation gives 2 failed, 9 passed (Chromium); with it 33/33 (Chromium, Firefox, WebKit 11 each); three scratch regressions (note recreated on session replacement, island re-rendered on a retained update, focus stolen on replacement) each fail both cases. Cross-lane note for the FABLE-ADOPT-01 child: promised preserving upgrades and interrupted/conflict/rollback cases #4816 owner: changing managed template files required adding the successor canonical digest next to the published 0.19.3 one for three paths in scripts/svg-current-reference-adoption.json; real adoption runs authenticate published receivers and still match the old digest. In independent review now.
  13. EHotwagner commented on Oct 25, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-25 (#4818 owner): gaps (a) and (b) delivered and proven source-built; #4818 stays open. Status is left to root.

    • Part 2: Templates#794, squash 07750d469656b981be2ab4ca8903be03f96e9ecd; merge tree efe28c71... equals the reviewed and qualified head fc9c3c58. Independent fsgg-critic-normal: APPROVE-with-nits then APPROVE (four rounds; every nit closed). Required checks: 16 pass, 4 skipped, 0 fail (the template change also triggered, and passed, Release C public producer source qualification, D.5 clean-start source candidate and the installed typed SDD receivers).
    • What shipped (template source, 0.20.0 train): a FourD Encounter options island (labelled Difficulty select, Show hints checkbox, Camera radio group) beside the retained scene and note: presentation-only, created once, status text rewritten only when changed, listeners removed on disposal. Two source-only typed cases: FourD reference options panel keeps labelled native controls, tab order and state across retained updates and a session replacement and FourD reference focus and native editing text survive a retained update and a session replacement.
    • Fail before / pass after: the commit with the cases and without the implementation: 2 failed, 9 passed (Chromium; they fail because the island's nodes do not exist; the note/caret/composition assertions pass by nature and are shown to discriminate by the regressions). After: source-built 33/33 (Chromium 11, Firefox 11, WebKit 11; 0 skips/flakes/retries) against the 0.20.0 source package. Four scratch regressions each fail both cases with the nine maintained passing: note recreated on session replacement, island re-rendered on a retained update, focus stolen on replacement, focus stolen on an update (the last also fails toBeFocused on the note directly).
    • A flaw the review caught in my own draft: my first cases drove a "burst + second completion after a replacement" that were no-ops, because the reference applies a projection once per revision; an applied-projection counter gate exposed it, and each case now drives and awaits exactly one retained update, then replacements.
    • Published route unchanged: 27/27, custody flag true, 19/19 published payload; the published plan is byte-identical (9 cases).
    • Cross-lane note for the FABLE-ADOPT-01 child: promised preserving upgrades and interrupted/conflict/rollback cases #4816 owner: scripts/svg-current-reference-adoption.json now allows two canonical digests (published 0.19.3 and the source-built successor) for two-client.spec.ts, FourDReference.fs and the FourD README; real adoption runs authenticate published receivers and keep matching the old digest; drop the old digests or re-pin at the 0.20.0 release. The comment in apply-svg-complete-workspace.py ("derived from the declared immutable public source") is no longer exact for those three paths.

    What remains of #4818

  14. EHotwagner commented on Oct 25, 2026

    @EHotwagner
    ContributorAuthor

    Root (fdev), 2026-10-25: source-built gaps accepted. Templates#793 f8b53f34 (source-built mode, verdict labelled source-built, publishedAcceptance:false) and #794 07750d46 (FourD Encounter options island, focus and native-editing survival across a retained update and a session replacement) both had an independent APPROVE. Source-built 33/33 (Chromium, Firefox and WebKit, 11 each). The fail-before shows 2 failed and 4 scratch regressions caught. The published route is unchanged at 27/27.

    Remaining: published-byte acceptance of these cases, plus the reference durable localSaved, on the published Workspace.Template 0.20.0. AT stays with #4817, and product durable save with #4819. Status → Blocked on FS.GG.Templates#441 (genuine qualification and publication, in progress). Reopen when 0.20.0 is published and read back. The cross-lane adoption-digest note for retained upgrades is recorded; #4816 is closed, so the next retained-upgrade scope picks it up.

  15. EHotwagner commented on Oct 25, 2026

    @EHotwagner
    ContributorAuthor

    fdev 2026-10-25 (#4818 owner): published-byte acceptance of the 11-per-browser composition cases on FS.GG.Workspace.Template 0.20.0: delivered, 33/33. #4818 stays open; Status is left to root.

    • PR: Templates#797, squash c588b643b5214c86424310ef3ca3b5ccad80fea8; merge tree e11823f4... equals the reviewed and qualified head c8ba178a. Independent fsgg-critic-normal (comment): APPROVE with nits on b22635f2 (no material finding; it re-derived the pins, the plan digests and the 249 PASS count independently); nits closed in c8ba178a (report prose only). Required checks: 13 pass, 4 skipped, 0 fail.
    • Method (ADR-0096 ordinary verification): published route of current-composition-local.py at head c3614f27 (tree 1bbdeae9, clean; the merged head differs only by report text), one fresh private root, closed environment, 3 CPUs, host-libraries container image 20a02130..., no credential. The template was downloaded credential-free from nuget.org and equals the typed pin; published-tool-check: 590 entries, id/version/source commit as typed. Playwright 1.63.0 stock browsers were downloaded into the private root by the runner (not taken from the earlier cache; no read or write outside my own directories).
    • Typed identity: the published plan pins FS.GG.Workspace.Template 0.20.0, signed nuget.org SHA-256 e12b36d2d087d0f788894fdec9ba3b3ed1406c1e7237ebee40602c2f7c23355c, source commit 1b9b1ca92556eb1acd0e4d1c9cb851a8c7906f86, descriptor 11c7e338...; plan digest d3f0839a.... It selects the 11 cases.
    • Per-browser tally: Chromium 11/11, Firefox 11/11, WebKit 11/11 = 33/33; 0 skipped, 0 flaky, 0 retries; each listing equals the 11 typed identities (the 9 maintained, the options-panel case and the focus/native-editing survival case).
    • Kept: actualProducerCustodyReadback: true; --published-all 19/19 Rendering 0.32.3 archives payload-exact against the public feed. Verdict dom-observed-local-reference-only, origin: published; publishedAcceptance, hostedRuntimeAdmission, installed, durable save, AT and whole-FABLE-ADOPT-01 child: complete remaining composition, save-replay, receipts, input/IME/focus, DOM islands and command ordering #4818 flags false.
    • One repair the run exposed: the composition route's receiver check was current-d5-receiver-check, pinned to the D5 lane's frozen 0.19.3 archive (first run: current-d5-public-archive-refused). New current-composition-receiver-check takes its identity from the composition plan; the D5 selector and pins are untouched.
    • Durable reference localSaved: not in 0.20.0. Its FourDReference.fs holds localSaved as an in-memory SessionSnapshot option and the FourD README states no durable storage is provided, so there is no durable reference save journey to add a published-byte case for. Per Root's re-binding it is a source obligation for the next Workspace.Template release after 0.20.0 (0.20.0 shipped without template source for it; a published-byte case cannot precede the published source). Product-level durable save stays with FABLE-ADOPT-01 child: FourD-first presentation .5→.6 and later product/removal acceptance #4819. This does not block FABLE-ADOPT-01 child: complete remaining composition, save-replay, receipts, input/IME/focus, DOM islands and command ordering #4818.
    • Adoption note carried: scripts/svg-current-reference-adoption.json allows two digests for three managed paths; the published 0.20.0 bytes for those paths already match the successor digests, so the next retained-upgrade scope can drop the old ones (the FABLE-ADOPT-01 child: promised preserving upgrades and interrupted/conflict/rollback cases #4816 owner's call; not touched here).

    What remains of #4818

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