Repository navigation
FABLE-ADOPT-01 child: complete remaining composition, save-replay, receipts, input/IME/focus, DOM islands and command ordering #4818
Description
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
EHotwagner commentedon Oct 23, 2026
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_referenceowner. It is a sibling of #4819 .5, not a prerequisite.EHotwagner commentedon Oct 24, 2026
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)
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 existingtemplates-4818-managed-dom-20261023worktree on one fresh branchroutine/4818-local-dom-casesfromorigin/main(aae4f43); no competing worktree.ADMISSION=None, literal-false receiver) with 20 pure controls. No case has ever executed; the source stage was never run against a realdotnet 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:
current-composition-plan(9 cases x Chromium, Firefox, WebKit, workers 1, retries 0, no skips) over the existing source stage and validators;dotnet new ... --packageis not an option of the shipped SDK, so the held stage could never have generated the receiver);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.EHotwagner commentedon Oct 24, 2026
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
b00b00b7d60fd9fb04dc5fcac6c6f6c93d2b24b8at 2026-10-24T21:05:42Z. Merge tree equals the tree of the reviewed-and-qualified head7b2f520e(8d6e0ece921dbb8de60543c1bb3c36749f9fd764).fsgg-critic-normal: ACCEPT-WITH-NITS onfd6a857; nits closed; delta review REJECTEDcc36936for one real defect (new controls failed underGITHUB_ACTIONS=true, which hosted CI sets); fixed; ACCEPT on32a27a6. Main then advanced (parity: batch fails closed on a faulted in-flight marker too — the engine does not carry #584 #782/parity: take exits EX_RATE (75) on an exhausted budget — the back-off signal, over HTTP (#418, case 40) #783/registry: re-digest stale skill rows (auto) #785) and moved the routine-eligibility base, so main was merged into the branch; the PR diff against main is identical file by file to the ACCEPTed diff exceptdocs/atlas/catalog.json(main's two new records). All pure controls and the 27-case run were repeated on the merged head.7b2f520e: 14 pass, 5 skipped (the held hosted receiver and publication jobs), 0 fail, includingroutine-eligibilityandcomposition.What the first real execution found (held PR767 source, never run before)
dotnet new fs-gg-fable-game ... --package FS.GG.Workspace.Template:--packageis 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 fakedotnetthat asserted the flag. Removed.FsGgExternalReferenceCandidatefor 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, tree8d6e0ece)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 sha256c74d58d554de21da4594534d1b969bcf3a392df56b5d9742b3bbdda2739f1cf6.Pure controls: all 17
test-*.pyandverify-external-reference-workflow.pypass (also withGITHUB_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)
actualProducerCustodyReadback=false; the original Rendering custody JSON (361215 bytes, run 39509314882 / artifact 12305198394, sha7dbd4329...) 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.localSavedremains the synthetic in-memory journey.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.No publication, Status write, Home/VM/native effect was used.
EHotwagner commentedon Oct 24, 2026
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.GITHUB_ACTIONS=true.Decisions
ADMISSION=Noneliteral-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.actualProducerCustodyReadbackfrom that evidence through a reviewed PR.ubuntu:24.04pinned by digest instead of the mutable tag. Commit the digest incurrent-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
dotnetasserting an invalid flag) are recorded as a lesson. The owner adds it to Atlas with the next PR.EHotwagner commentedon Oct 24, 2026
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
GETofrepos/FS-GG/FS.GG.Rendering/actions/artifacts/12305198394/zip(source run 39509314882, attempt 1, head4ec6eafbbbf02264db9b0db4780c590abe0bf9cd, artifactrendering-source-candidate-4ec6eafbbbf02264db9b0db4780c590abe0bf9cd-0.32.3), through the samegh apiread the existing preflight uses. Credential: the session's existing GitHub token, used only for this GET. No write, no dispatch, no publication./home/developer/.cache/fable-4818/custody-4818/(must not exist beforehand; mode 0700), outside every checkout.84647332c124e511545787c8c3f8634d4f5177068521acfc86c93430ac73ef63(the typed value in the existing preflight and the artifact's own digest); then extract only the singlerelease-custody.jsonmember (expected 361,215 bytes) and require SHA-2567dbd4329546932c4c1d12767550b7b78aae85e32c81b354935b2c615b3e298c9(the typed plan'srendering.custodySha256). Wall-clock cap 300 s.gh apion 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.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
actualProducerCustodyReadbackfrom this evidence only.EHotwagner commentedon Oct 24, 2026
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 treefeccf254...equals the reviewed head32600529(independentfsgg-critic-normalACCEPT-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: lessontemplates/controls-must-not-fake-the-boundary-they-checkand decisiontemplates/hosted-dom-route-retired. Residue left on purpose: the unreachablecompositionnaming contract in the shared readerretained-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-25684647332...as typed;release-custody.json361,215 bytes, SHA-2567dbd4329546932c4c1d12767550b7b78aae85e32c81b354935b2c615b3e298c9equal to the typedcustodySha256. No retry was needed or made. Independent offline readback (separate reviewer, no network): CONFIRMED.The producer's own unchanged
release-custody.py verifyaccepts the 19 archives and bound plan, andcomparematches 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
actualProducerCustodyReadbackonly from that join (real run: true, 27/27 DOM cases alongside). It is in independent review; I report its merge separately.EHotwagner commentedon Oct 24, 2026
fdev 2026-10-24 (#4818 owner): decisions 1 and 2 delivered; decision 3 not started. #4818 stays open. Status is left to root.
Delivered
ab48638b(retired hosted route, digest-pinned image, Atlas lesson and decision), reported above.48ca47fef9c70c71bd2a69efb7dffd0c64af49a6; merge treed6d60652...equals the reviewed and qualified headfee52243. Independentfsgg-critic-normal: ACCEPT-WITH-NITS, then ACCEPT on the final test-only head72fe399b; every nit closed. Main moved twice during review (feat: take gets distinct exit codes — a claim (0) is told from claiming NOTHING, on both engines (#585, reverses #480) #786, parity: ready is the machine contract, and a truth read — --json + the #520 column-not-state rule (case 12) #789), so main was merged in; the diff against main is identical file by file to the accepted diff exceptdocs/atlas/catalog.json. Required checks onfee52243: 13 pass, 4 skipped, 0 fail.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.json361,215 bytes, SHA-2567dbd4329546932c4c1d12767550b7b78aae85e32c81b354935b2c615b3e298c9= the typedcustodySha256. 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.actualProducerCustodyReadbackis now set bycurrent-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 unchangedrelease-custody.py verifyaccepts the 19 archives and the bound plan, (c)comparematches 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
localSavedjourney 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
compositionnaming contract in the shared readerretained-reference-rehearsal.py(needs the D5/earlier-three lanes).EHotwagner commentedon Oct 24, 2026
Root (fdev) acceptance and decisions, 2026-10-25
Accepted at source scope
ab48638b: the held hosted DOM route is retired, and the base image is digest-pinned.48ca47fe:actualProducerCustodyReadbackis now set from real evidence.84647332…, custody JSON7dbd4329…= the typed value.Decisions
localSavedjourney becomes a source obligation for the next Workspace.Template release. That release is Templates#441's 0.20.0, held on qualification.compositionbranch in the sharedretained-reference-rehearsal.pygoes to the D5/earlier-three owner, because that file's digest is pinned by those lanes. Low priority.Remaining #4818 scope
EHotwagner commentedon Oct 24, 2026
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-flatcontainerinto 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, producer4ec6eaf) by the producer's own unchangedscripts/release-custody.py compare, which excludes the feed-added.signature.p7sand requires every other entry hash to match. Observed 2026-10-24T22:42Z (feed content is live: a dated observation).c5c27a8a0ebb7d6ccbe33268d9315eb3f2b7b32a16e8653b4651de93a4608316f0a95c0b03a2acc2e79d7ff3f411a281c5f104c8e6d3e05ab443a9c45aa6daf4684d400c7657f1ad7eaed7d842b7f26c4a07f8bf6908cba6a19ab5d04ba41170df31529336f5c5d9dad4c62a8cc97379447a3065e5dd80459b487f0a1b19549f40dcfb502b0a28efd1658a47536d85b5f55dd06e73135dc8f3a60025e10edbb007743367e1ce2a06e3a402b40cd6c1e43ce5e9e23c97404f6e5e883a949b0a7d4e9acbb11fa38c3a97365491c821057e0126db4dbd9c78d71169bbc43a3a236837dc910db99ef78143d9382de8d6bb54c69f443c45fdedc1e93be8c9420d86e999aa6564e7a3b323da8346c50894f28eca8b981cc31ac763b8f34b19fd8beb4c321334f31eb3f9b04bdd0bbd8ac14e32f87a8dea994d2c8aca509c8045ec2a5e9cc74f6af082089fb269d7d12c7f1e7ee7684ae3bdab51918b65e06e072a7ac88764ce047628f7f58d77e430b2afa0ffafb47560f7633abcf1c8dd12bf8710ad639643d5db0bb3ede8a81a48411b3e5e47a1220cd5b845df75206e6d6fce401d76c29f5de289762876b95caddaf06d36cef84913a80b49e4b86ee7fb6c36a735bb20a7e98cb82c800005d2e6566d83f59098eeb6885b6e8913f27d3dab55550f747f33eb0242783f67b2462d8ca137b14f36bb4133bd0a3d4ca98ca8ad93dfe649f1a0430072af7113e5b07ad0755c3f01cc9c575a84a621c6321384290cc1a380c55b2364069908b159525e515cce72137244c74412f2b6fdbfb9a399c16e724e792b9e72844bc157c0e9ac368295dada3e30eb9c5af063dafc6054ae4edc7fResult: 19/19 PASS (the 3 typed packages plus the other 16). Every published archive is its custody archive plus exactly one
.signature.p7sentry (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/endevents only, not real IME insertion), held release (h+ windowblur->data-heldfalse in the FourD case; in the external caseblur+visibilitychangeonly leave the authority revision unchanged), DOM islands (nativeEncounter note/External reference notetextboxes accept text and keep Enter; the FourD note value is asserted right afterfill, 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 assertstoBeFocusedor re-reads the note value across an update; the Rendering producer's own focus cases cover it there). Plus a fresh installed receiver (separate).EHotwagner commentedon Oct 24, 2026
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.
d1488c5b3e1dcbfb943dfd6130763e3eef8bfa64; merge tree2206414e...equals the reviewed and qualified head3ef0cf4d. Independentfsgg-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 on3ef0cf4d. 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 unreachablecompositioncontract) and was merged in; the PR diff is file-by-file identical to the reviewed one. Required checks: 13 pass, 4 skipped, 0 fail.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.blur/visibilitychangeonly 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 referencelocalSaved: (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.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.
EHotwagner commentedon Oct 24, 2026
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.
EHotwagner commentedon Oct 25, 2026
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.
f8b53f3493ecc808f999e45c5be24fa090281a98(its tree differs from the reviewed head60261981only by main's newer Atlas record; no source file differs). Independentfsgg-critic-normal: ACCEPT-WITH-NITS, nits closed, final APPROVE on60261981; required checks 13 pass, 4 skipped.current-composition-local.py --source-built --coordination-source CLONEcopies the checked-out commit (git archive) under the private root, packsFS.GG.Workspace.Templatethere 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 localorigin/mainref, not a remote read), package name, bytes and SHA-256; verdictdom-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.scripts/svg-current-reference-adoption.json; real adoption runs authenticate published receivers and still match the old digest. In independent review now.EHotwagner commentedon Oct 25, 2026
fdev 2026-10-25 (#4818 owner): gaps (a) and (b) delivered and proven source-built; #4818 stays open. Status is left to root.
07750d469656b981be2ab4ca8903be03f96e9ecd; merge treeefe28c71...equals the reviewed and qualified headfc9c3c58. Independentfsgg-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).FourD reference options panel keeps labelled native controls, tab order and state across retained updates and a session replacementandFourD reference focus and native editing text survive a retained update and a session replacement.toBeFocusedon the note directly).scripts/svg-current-reference-adoption.jsonnow allows two canonical digests (published 0.19.3 and the source-built successor) fortwo-client.spec.ts,FourDReference.fsand 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 inapply-svg-complete-workspace.py("derived from the declared immutable public source") is no longer exact for those three paths.What remains of #4818
localSaved, re-bound to the 0.20.0 train).EHotwagner commentedon Oct 25, 2026
Root (fdev), 2026-10-25: source-built gaps accepted. Templates#793
f8b53f34(source-built mode, verdict labelledsource-built,publishedAcceptance:false) and #79407750d46(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.EHotwagner commentedon Oct 25, 2026
fdev 2026-10-25 (#4818 owner): published-byte acceptance of the 11-per-browser composition cases on
FS.GG.Workspace.Template0.20.0: delivered, 33/33. #4818 stays open; Status is left to root.c588b643b5214c86424310ef3ca3b5ccad80fea8; merge treee11823f4...equals the reviewed and qualified headc8ba178a. Independentfsgg-critic-normal(comment): APPROVE with nits onb22635f2(no material finding; it re-derived the pins, the plan digests and the 249 PASS count independently); nits closed inc8ba178a(report prose only). Required checks: 13 pass, 4 skipped, 0 fail.current-composition-local.pyat headc3614f27(tree1bbdeae9, clean; the merged head differs only by report text), one fresh private root, closed environment, 3 CPUs, host-libraries container image20a02130..., 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).FS.GG.Workspace.Template0.20.0, signed nuget.org SHA-256e12b36d2d087d0f788894fdec9ba3b3ed1406c1e7237ebee40602c2f7c23355c, source commit1b9b1ca92556eb1acd0e4d1c9cb851a8c7906f86, descriptor11c7e338...; plan digestd3f0839a.... It selects the 11 cases.actualProducerCustodyReadback: true;--published-all19/19 Rendering 0.32.3 archives payload-exact against the public feed. Verdictdom-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.current-d5-receiver-check, pinned to the D5 lane's frozen 0.19.3 archive (first run:current-d5-public-archive-refused). Newcurrent-composition-receiver-checktakes its identity from the composition plan; the D5 selector and pins are untouched.localSaved: not in 0.20.0. ItsFourDReference.fsholdslocalSavedas an in-memorySessionSnapshot optionand 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.scripts/svg-current-reference-adoption.jsonallows 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
localSaved: next template release (above).