--- status: historical created: 2026-08-21 archived: 2026-08-21 reason: "First-ON-CI-gate evidence: the three ON render-stall surfaces root-caused — NO demand hole; every red a write-path defect (program write lost + carriage-refused server fallback; served rows with service identity; client binding-write never commits); two surfaces converge on the owed OW31/§2b carriage build; fix seats S-A..S-J." --- # ON render-stall root cause — the three "rendered value never appears" surfaces Investigator: read-only on the branch (scratch edits reverted; worktree clean). Worktree `/Users/berni/labs-worktrees/land-off` @ `ba50f8961`. Date: 2026-08-20/21. Status: **COMPLETE for the land-gate question** (each surface classified with store/log/live-run evidence; the one client-internal seam not fully traced is named in §6). ## 0. Headline **DEMAND HOLE: NO — on all three surfaces.** None of these is the W0 §2.8(b) refutation shape (a rendered value whose writer is outside the tracked-ids demand closure). The (d′) demand machinery came out clean everywhere it could be observed: where the serving loop had the structure and the inputs, it derived (group-chat: 33–41 derived commits, demand counters healthy, settle series normal; home-profile: the identical Grace case derived the name with 72 basis rows). Every "value never appears" here is a **write-path defect under ON**: a write that no longer lands (program materialization lost at reload; client draft write never commits), a write that lands with the wrong identity (service-labeled authorship), or an action killed at commit-prep before it can write (CFC asserts/compile refusals). Bounded seams, each named below — not the serving loop's demand model. Meta-family: the ON design re-homed *derivation* to the server and guarded *writes* by serve-ownership/authority — and each surface is a write whose new home is either dead (refused, no carriage), lost (raced by reload / silently dropped), or mislabeled (service identity). The demand walk's deletion is not implicated. ## 1. Surface 1 — home-profile-reload-durability: profile name renders `#id` placeholder forever ### Mechanism (3 sentences) Under ON the CreateProfile flow splits: the served event-handler run commits the new profile space's piece SETUP cross-space (server-authored; lands fine — the name is durably in the argument), but the piece's PROGRAM (code + CFC labelMap + schema docs) is only ever written by the client's own local run as a separate post-arrival commit — and the server's fallback, the `compile-cache/writeback/` action running in the HOME space's wave, is **refused by the wave accumulator as a foreign-space write with no §2b delegated carriage** (serving-loop.md §3d, RULED 2026-08-14 (c)) — `seal-space-commit-failed`, 17 refusals per profile space in one run. The reload kills the trailing create's client-side program commit (it is issued after `waitForRuntimeIdle` returns, because the handler no longer runs client-side at create time), nothing ever re-issues it, and the profile space's serving loop — started, watermark written, piece demanded — parks the structure load forever in the non-terminal "unloadable pattern awaiting its source docs" branch (`space-server.ts` ~2818: `structureLoadDeferred`), silently. The demanded computed name docs (pre-created ids in the setup) never receive values; the client, which does not re-derive served work, renders the `#3GsWo8`-style id fallback forever. ### Evidence - Store (`…/scratchpad/on-store/…`): Ada's profile space `z6MkooEW…`: seq1 space-create, seq2 derived watermark=1, seq3 server-authored setup (403,086B, 66 ops, `patternIdentity {identity:"Jlzs0wulc…", symbol:"default"}`, `{"initialName":"Ada Lovelace"}`), then NOTHING. `scheduler_basis` rows: **0**. Alan's space `z6MkoBbg…`: identical, 0 rows. Grace's `z6MkrM4z…`: same + **seq4 client-session authored commit (124,973B): the program** (`of:…code` 45KB, CFC labelMap 78KB, `cid:` schema) → seq5 derived `computed:… add /value "Grace Hopper"` → …; **72 basis rows**. The trailing create before each reload (Ada in step 1, Alan in step 2) is the one whose program commit is missing — matching the test's own "the trailing create's commit had the least time" framing, resurfacing on a new write class. - Server log (`toolshed-on.log`): 77 `foreign-write-refused` + 77 `seal-space-commit-failed` during the test window (05:33:42–05:38:50): `compile-cache/writeback/Jlzs0wulc…` 17× against EACH of the three profile spaces (also refused against Grace's, where it didn't matter — the client write had landed), plus `cf:module/Jlzs0wulc…:{__cfLift_1,__cfLift_4,applyInitialName}` 26× against Grace's space (the home wave also ran the profile module cross-space and was refused writing its results — her name derived only because her OWN space's loop ran it). - No wave ever served Ada's space ("wave serving z6MkooEW": 0 lines); no error names her space from its own loop — the wedge is fully silent (no `structureLoadFailures`, no log). - OFF control (live, this session): `home-profile-reload-durability` OFF = **green in 11 s** (run `rc-home-profile-off`). CI shard8's ON failure text is byte-identical in shape to the local one. ### Classification **Server-never-derived, demanded-but-structure-missing** (write-availability), composed with a client-side durability gap (the program write is issued after the idle barrier and dies with the reload; post-reload adoption never re-materializes). NOT a demand hole — demand reached the piece; the identical demand derived Grace's name. ### Bounded or structural? Bounded, with a named owed seat: the write-authority carriage (§2b: acting identity + capabilityRef) that OW31's post-merge build owes is exactly what the dead server-side writeback path needs. The silent-forever park is a detectability sub-gap (OW19-adjacent). ### Fix seats (named, not built) - **S-A (server, primary):** give `compile-cache/writeback` a legitimate write path into the piece's own space — either §2b delegated carriage (the OW31 build) or a RULING that program/compile-cache materialization docs are system-class, content-addressed, idempotent writes exempt from the foreign-write refusal. This also heals already-broken spaces on next demand. - **S-B (client):** cover the program-materialization commit with the pending-commit durability barrier (`Scheduler.idleWithPendingCommits`) so `waitForRuntimeIdle` cannot return before the program is durable — restores the exact contract this test pins. - **S-C (client):** re-issue program materialization on adopt/open when the space lacks the program docs for a referenced patternIdentity (heal-on-read). - **S-D (observability):** the "unloadable pattern awaiting source docs" deferral must count/log after N cycles (today it is a silent forever-park; `structureLoadFailures` stays 0). ## 2. Surface 2 — cfc-group-chat-demo "gates sends through the trusted surface" Two distinct defects, one per failure point. Neither is a demand hole; neither is a double-render (that reading is refuted below). ### 2a. CI shape (fails at Alice's authorship check, test line 154): served writes carry the SERVICE identity Mechanism: under ON the trusted send is an events-down handler run on the serving runtime, and its durable consequence — the message row — is labeled `authored-by` / `represents-principal` **`did:key:z6MksHnZ…` (the service signer), not Alice**; the CFC authorship verification compares the row's claim (name "Alice") against the resolved value's authored-by label, so `state` stays `"unverified"` forever and the verified row never appears. Store proof from the LOCAL runs (not just CI): Alice's message commit (seq 37, derived) carries authored-by ×4 and represents-principal ×2, ALL `z6MksHnZ…`; Bob's profile entity labelMap likewise. The local runs passed this check only because the client's own speculative (Alice-labeled) copy was still what rendered at probe time — the durable truth is identical to CI's. This is the **protocol.md §2 "server-produced authored row" / §2b acting-identity carriage** that the foreign-write refusal message itself names as missing, i.e. the **OW31 write-authority build (explicitly owed post-merge, pre-flip)**. Deterministic once the served copy is what renders; bounded; known-owed. ### 2b. Local shape (fails at Bob's send click, line 197): the client's draft write never commits, so the served `sendDisabled` correctly never flips Mechanism: `sendDisabled = computed(snapshot === undefined || draft empty)` (trusted.tsx:1060–1063; disabled bound at :1101). Bob's profile save works end-to-end (his session commits the draft + save event; the server derives his myProfile, the per-user computeds, and the participants row — seq 40–45 + 26 service-session user-scope sets). But **Bob's `messageDraft` write — a `$value` binding patch on the piece root's user-scope instance doc, the exact op that landed for Alice (`patch user of:rPncV5… /value/messageDraft`) — never reaches the store**: 0 occurrences of "Hello from Bob" in 4 independent runs, including a 300-second probe run (scratch test edit, reverted) in which Bob's session committed **12 other writes** (seq 41–62) while the draft patch never appeared and `#trusted-send-button` stayed `disabled=true` for the full 300 s. With the inner native button `disabled` (cf-button reflects it onto the shadow `