Repository navigation
Description
What is failing
RadioGroupView (in MeshWeaver.Blazor.EntityViews, the Blazor view for RadioGroupControl) resolves its value through a node-bound DataContext (/$meshNode/…, produced by LayoutAreaReference.GetMeshNodeDataContext). When that node does not exist, the read fails with DeliveryFailureException: No node found at '<path>' and the view logs at fail level on every render pass — the samples show 3–5 identical entries within a 4 ms window for a single page.
Probable cause — high confidence on the mechanism, medium on where the fix belongs.
Both sample target paths are verified absent right now, and in each case the whole subtree below the user root is gone (rbuergi/_Draft/Event_SavGeneralversammlung2026_Talk; roger.sas2026/_Answers/AgenticEngineering/Introduction/Quiz). So the radio group is bound to a node that was either (a) deleted while the page was still open (a _Draft event node), or (b) never created before the form was rendered (the course _Answers quiz node). The data-binding rule (Doc/GUI/DataBinding) is explicit about this class: a node-bound editor must have its node created first — "NEVER … on an absent path (it NotFound-storms)". Neither the view nor the binding seam handles the absent case, so every render cycle re-attempts the load and re-logs.
Impact
473 occurrences over 4 days, on all 5 portal pods, and still active at the time of triage. Steady background log noise, not an outage. User-visible: the affected radio group never loads its value, so forms on pages bound to a missing node render broken, and every such open page keeps emitting fail-level logs on each render cycle. Two distinct affected spaces are visible in the samples (a user draft event's SendDocument form, and a course quiz's Options area).
Where to look
MeshWeaver.Blazor.EntityViews.RadioGroupView— the field-load path that logsLoading '{field}' in area '{area}': it should handle bound-node-absent (render an empty state, log once at warning) instead of re-failing on every render.- The node-bound read seam:
BlazorView.DataBind/MeshNodeBindingExtensions(MeshWeaver.Mesh.Contract), where the absent node surfaces as aDeliveryFailureException. - The layouts producing these dangling bindings: the SendDocument form bound to a
_Draftevent node, and the QuizOptions1area bound to the learner's_Answersnode — both should follow the create-on-absent rule (create the node before binding, e.g. on first interaction).
Not a duplicate: the other DeliveryFailureException incidents are different defects (NamedAreaView = transient Orleans silo disconnections, already suppressed; ContentRoute = hub-activation NullReferenceExceptions). This is the only RadioGroupView incident.
Evidence
| Fingerprint | a577a67482869286 |
| Category | MeshWeaver.Blazor.EntityViews.RadioGroupView |
| Severity | Error |
| Exception | MeshWeaver.Messaging.DeliveryFailureException |
| Namespace | memex-cloud |
| Pods | memex-portal-deployment-77cfc55bfc-txpk7, memex-portal-deployment-77cfc55bfc-bg4lk, memex-portal-deployment-5b9cbf46dd-5nqbz, memex-portal-deployment-5b9cbf46dd-gs6j6, memex-portal-deployment-58c859d4cc-b8pfg |
| Occurrences | 474 |
| First seen | 2026-09-03 09:30:15Z |
| Last seen | 2026-09-07 03:35:18Z |
Recent log lines
2026-09-05 20:58:29Z memex-portal-deployment-5b9cbf46dd-gs6j6 fail: MeshWeaver.Blazor.EntityViews.RadioGroupView[0]
Loading 'delivery' in area 'SendDocument/7/2' in Area SendDocument/7/2
MeshWeaver.Messaging.DeliveryFailureException: No node found at 'rbuergi/_Draft/Event_SavGeneralversammlung2026_Talk'. Closest ancestor is 'rbuergi' (remainder='_Draft/Event_SavGeneralversammlung2026_Talk').
2026-09-06 10:41:15Z memex-portal-deployment-5b9cbf46dd-gs6j6 fail: MeshWeaver.Blazor.EntityViews.RadioGroupView[0]
Loading 'delivery' in area 'SendDocument/7/2' in Area SendDocument/7/2
MeshWeaver.Messaging.DeliveryFailureException: No node found at 'rbuergi/_Draft/Event_SavGeneralversammlung2026_Talk'. Closest ancestor is 'rbuergi' (remainder='_Draft/Event_SavGeneralversammlung2026_Talk').
2026-09-06 10:41:15Z memex-portal-deployment-5b9cbf46dd-gs6j6 fail: MeshWeaver.Blazor.EntityViews.RadioGroupView[0]
Loading 'delivery' in area 'SendDocument/7/2' in Area SendDocument/7/2
MeshWeaver.Messaging.DeliveryFailureException: No node found at 'rbuergi/_Draft/Event_SavGeneralversammlung2026_Talk'. Closest ancestor is 'rbuergi' (remainder='_Draft/Event_SavGeneralversammlung2026_Talk').
2026-09-06 10:41:15Z memex-portal-deployment-5b9cbf46dd-gs6j6 fail: MeshWeaver.Blazor.EntityViews.RadioGroupView[0]
Loading 'delivery' in area 'SendDocument/7/2' in Area SendDocument/7/2
MeshWeaver.Messaging.DeliveryFailureException: No node found at 'rbuergi/_Draft/Event_SavGeneralversammlung2026_Talk'. Closest ancestor is 'rbuergi' (remainder='_Draft/Event_SavGeneralversammlung2026_Talk').
2026-09-06 10:41:15Z memex-portal-deployment-5b9cbf46dd-gs6j6 fail: MeshWeaver.Blazor.EntityViews.RadioGroupView[0]
Loading 'delivery' in area 'SendDocument/7/2' in Area SendDocument/7/2
MeshWeaver.Messaging.DeliveryFailureException: No node found at 'rbuergi/_Draft/Event_SavGeneralversammlung2026_Talk'. Closest ancestor is 'rbuergi' (remainder='_Draft/Event_SavGeneralversammlung2026_Talk').
2026-09-06 10:41:15Z memex-portal-deployment-5b9cbf46dd-gs6j6 fail: MeshWeaver.Blazor.EntityViews.RadioGroupView[0]
Loading 'delivery' in area 'SendDocument/7/2' in Area SendDocument/7/2
MeshWeaver.Messaging.DeliveryFailureException: No node found at 'rbuergi/_Draft/Event_SavGeneralversammlung2026_Talk'. Closest ancestor is 'rbuergi' (remainder='_Draft/Event_SavGeneralversammlung2026_Talk').
2026-09-07 03:33:10Z memex-portal-deployment-58c859d4cc-b8pfg fail: MeshWeaver.Blazor.EntityViews.RadioGroupView[0]
Loading 'answers/biggest-shift-engineer' in area 'Quiz/Options1' in Area Quiz/Options1
MeshWeaver.Messaging.DeliveryFailureException: No node found at 'roger.sas2026/_Answers/AgenticEngineering/Introduction/Quiz'. Closest ancestor is 'roger.sas2026' (remainder='_Answers/AgenticEngineering/Introduction/Quiz').
2026-09-07 03:33:10Z memex-portal-deployment-58c859d4cc-b8pfg fail: MeshWeaver.Blazor.EntityViews.RadioGroupView[0]
Loading 'answers/biggest-shift-engineer' in area 'Quiz/Options1' in Area Quiz/Options1
MeshWeaver.Messaging.DeliveryFailureException: No node found at 'roger.sas2026/_Answers/AgenticEngineering/Introduction/Quiz'. Closest ancestor is 'roger.sas2026' (remainder='_Answers/AgenticEngineering/Introduction/Quiz').
2026-09-07 03:33:10Z memex-portal-deployment-58c859d4cc-b8pfg fail: MeshWeaver.Blazor.EntityViews.RadioGroupView[0]
Loading 'answers/biggest-shift-engineer' in area 'Quiz/Options1' in Area Quiz/Options1
MeshWeaver.Messaging.DeliveryFailureException: No node found at 'roger.sas2026/_Answers/AgenticEngineering/Introduction/Quiz'. Closest ancestor is 'roger.sas2026' (remainder='_Answers/AgenticEngineering/Introduction/Quiz').
2026-09-07 03:35:18Z memex-portal-deployment-58c859d4cc-b8pfg fail: MeshWeaver.Blazor.EntityViews.RadioGroupView[0]
Loading 'answers/biggest-shift-engineer' in area 'Quiz/Options1' in Area Quiz/Options1
MeshWeaver.Messaging.DeliveryFailureException: No node found at 'roger.sas2026/_Answers/AgenticEngineering/Introduction/Quiz'. Closest ancestor is 'roger.sas2026' (remainder='_Answers/AgenticEngineering/Introduction/Quiz').
Opened automatically from Admin/_LogIncident/a577a67482869286. Recurrences are folded into this issue rather than opening new ones.
Activity
rbuergi commentedon Sep 7, 2026
Located, and the "where the fix belongs" question splits cleanly across two repos
The issue rates the mechanism high-confidence and the location medium. Here is the location, measured.
RadioGroupViewsrc/MeshWeaver.Blazor.EntityViews/RadioGroupView.razorGetMeshNodeDataContextsrc/MeshWeaver.Data.Contract/LayoutAreaReference.cs:104So it is genuinely a two-repo question rather than an ambiguous one, and which repo owns the fix depends on which of two things is being asserted.
🚨 The platform rule already decides the mechanism, and it is not "handle the absent case"
Doc/Architecture/CqrsAndContentAccessand AGENTS.md are explicit, and this is the exact shape they name:That reframes the fix. The view re-attempting every render pass is the symptom; the defect is that something is issuing a point read on a path that may not exist, which the rule forbids outright. 🚨 So a
try/catchinRadioGroupView, or a null-check that swallows theDeliveryFailureException, would be a band-aid and would leave the storm-breaker open on that path — suppressing writes to it, which is the part that hurts and the part the log noise hides.The two candidate fixes, and how to choose between them
GetMeshNodeDataContextis meant to be usable for a node that may not exist yet, it needs the two-half shape, and every view bound through it is fixed at once — 473 occurrences across two unrelated spaces (a_Draftevent's SendDocument form and a course quiz's_Answers) argues this is not one view's bug.Doc/GUI/DataBindingalready says a node-bound editor must have its node created first — "NEVER … on an absent path (it NotFound-storms)". Both samples fit: one node deleted while the page was open, one never created before the form rendered. On this reading the fix isCreateOrUpdateNodeRequestat the two call sites, not in the view at all.These are not exclusive and the honest answer is probably both — (2) for the two known sites now, (1) so the next binding does not have to remember. What decides it is whether
GetMeshNodeDataContextis specified to tolerate an absent node; that is a maintainer call about the seam's contract, not something to infer from the samples.🚨 A trap for whoever picks this up
/Users/roland/code/MeshWeaver/src/MeshWeaver.Blazor.EntityViews/exists on disk in the core checkout and is tracked by git in neither repo — 0 files undergit ls-files, an untracked leftover of the Blazor extraction. EditingRadioGroupView.razorthere would compile locally and be invisible to git, to CI, and to review. The real file is in MeshWeaver.Plugins. Checkgit ls-files --error-unmatch <path>before editing anything under asrc/MeshWeaver.Blazor*directory in this checkout.Sequencing
The Plugins half is in
src/**, which is compiled into the image and is not synced into live portals by a registration — so the live-portal source-sync rule (Plugins#1430) does not gate it. The lane pin does: if it adopts a new core seam from fix (1),MW_PLATFORM_REFmust carry it, checked withgit cat-file -e <pin>:<path>and never by date.Not started tonight — fix (1) changes a contract in
MeshWeaver.Data.Contractthat every node-bound view depends on, which is not a 03:40 change. This comment is the analysis so the next reader starts at the decision rather than the search.test(#3517): pin that the gate never blanks a node that EXISTS
rbuergi commentedon Sep 7, 2026
Resolved in the SEAM (core), and the contract was not silent
Being worked in #3536 — claiming it here so a second session does not start the same fix.
The decider you named — "is
GetMeshNodeDataContextSPECIFIED to tolerate an absent node?" — has an answer, but not on that method.GetMeshNodeDataContext(LayoutAreaReference.cs:104) is a pure string encoder and says nothing about node lifetime. The seam that actually reads isMeshNodeBindingExtensions.Bind(src/MeshWeaver.Mesh.Contract/), and its contract names this exact case:So the seam was already specified to tolerate an absent node and draw the control empty. It got the mechanism wrong: absence does not arrive as a filtered
null— routing mints an authoritativeNotFoundthat terminates the stream and opens the storm-breaker window on the path. That is fix (1), and it is where this landed.And both samples independently rule the call sites out
rbuergi/_Draft/Event_…SendDocumentLayoutAreacallsEmailDraftNodeType.EnsureExists— create-before-bind, already applied — and stormed anyway, because the_Draftsubtree was deleted with the tab still open. No call-site discipline prevents that.roger.sas2026/_Answers/…/QuizSo fix (2) is not the missing half — it was already done at one site and would be wrong at the other. Core-only; nothing to change in MeshWeaver.Plugins, and
MW_PLATFORM_REFneeds no move because the Plugins half is unchanged.What landed
Bindnow composes the shapeDoc/Architecture/CqrsAndContentAccess→ An OPTIONAL node requires: a live exact-path query (path:{x}⇒QueryScope.Exact, zero rows on absent, no NotFound, no breaker window) answers whether; the owner's stream answers what. Absent ⇒ the control draws empty and the binding stays subscribed, so the node appearing populates it — no.Take(1), no re-render.A
catchin the view was explicitly not an option, and the doc now says why: it hides the fault and leaves the breaker open on the path, and the breaker fast-fails writes too — so the suppressed read goes on suppressing the write the form is about to make.Three arms on a real monolith mesh (
NodeBoundBindingToleratesAnAbsentNodeTest), all green, arms 1–2 falsified RED against the pre-fix seam with the exact production message (No node found at 'TestData/…'. Closest ancestor is 'TestData'). Arm 3 pins the one way this fix could have been worse than the bug and silent: a gate that reported "absent" for a node that exists — asserted on a satellite path (ThreadComposerView's shape) and a partition root (SettingsLayoutArea's shape).One thing NOT fixed here, deliberately
The quiz's write half.
MeshNodeBindingExtensions.Writegoes throughGetMeshNodeStream(path).Update, which mutates and cannot create — so a learner's first answer still has nothing to land on until the_Answersnode exists. That is a call-site concern (CreateOrUpdateNodeRequestat the quiz), it lives in in-mesh course content rather than either repo'ssrc/, and it is a different defect from the read storm this issue reports. Worth its own issue rather than widening this one.fix(#3517): the existence gate reads the CHANGE STREAM, not the snaps…
docs(#3517): say why the existence gate is not cached per path
docs(#3517): correct two phrases the review round made stale
rbuergi commentedon Sep 7, 2026
Fixed and merged — #3536
Closing by hand: the merge queue does not fire
Closeslinks.Ancestry verified, not assumed —
git merge-base --is-ancestoron both, plus the content itself:0ed02badc515b4656517f0b24797a1730f7f68d1— ancestor oforigin/main✅76bfdbb398dc944461539c3820fe80ca6e58c7db— ancestor oforigin/main✅MeshNodeBindingExtensions.csonorigin/mainNodeBoundBindingToleratesAnAbsentNodeTest.csonorigin/mainWhich half, and what decided it. The seam, in core — and the decider was that
MeshNodeBindingExtensions.Bind's own contract already named "the node is genuinely ABSENT" as acase it handles and specified the behaviour. It had the mechanism wrong: absence does not arrive as
a filtered
null, it arrives as a routingNotFoundthat terminates the stream and opens thestorm-breaker. Both production samples independently ruled the call sites out — SendDocument already
creates its draft (
EmailDraftNodeType.EnsureExists) and stormed anyway because the node was deletedwith the page open; the quiz's
_Answersnode is written by the first answer on purpose.Bindnow composes the two-half shape: a live exact-path query (QueryScope.Exact— zero rows onabsent, no NotFound, no breaker window) answers whether, the owner's stream answers what. Absent ⇒
the control draws empty and the binding stays subscribed, so the node appearing populates it.
Verified by falsification, both directions. With the gate removed, both #3517 shapes fail on their
first assertion with the exact message from this issue's log samples (
No node found at 'TestData/…'. Closest ancestor is 'TestData'). A third arm pins the one way the fix could have been worse andsilent — a gate reporting "absent" for a node that exists — on a satellite path and a partition root.
Review then caught a real instance of exactly that (the gate was on the snapshot query surface, which
seeds
.StartWith(empty)and so answersfalsefirst for every node); fixed, and the teststrengthened to assert the first emission rather than a later one.
The reasoning is committed, not just filed here:
Doc/Architecture/CqrsAndContentAccess→ An OPTIONALnode gained a section on the GUI binding, and
Doc/GUI/DataBinding's "create it first" line iscorrected — that rule is about writes; tolerating an absent node on the read side is the
framework's job, not the author's.
🚧 Deliberately NOT fixed here — worth its own issue
The quiz's write half.
MeshNodeBindingExtensions.Writegoes throughGetMeshNodeStream(path).Update, which mutates and cannot create, so a learner's first answer stillhas nothing to land on until the
_Answersnode exists. That is a call-site concern(
CreateOrUpdateNodeRequestat the quiz), it lives in in-mesh course content rather than eitherrepo's
src/, and it is a different defect from the read storm this issue reports. It is no worsethan before — previously the breaker was also fast-failing that write — but it is not fixed.
systemorph commentedon Sep 15, 2026
Reopened — this fault is happening again.
Still occurring: 33 more since the last update (507 total).
memex-portal-deployment-77cfc55bfc-txpk7,memex-portal-deployment-77cfc55bfc-bg4lk,memex-portal-deployment-5b9cbf46dd-5nqbz,memex-portal-deployment-5b9cbf46dd-gs6j6,memex-portal-deployment-58c859d4cc-b8pfg,memex-portal-deployment-7fd9668b69-jwzzlRecent log lines
rbuergi commentedon Sep 15, 2026
The reopen is not a regression: #3536 held, and a DIFFERENT defect is folding into this fingerprint.
The bot reopened on "still occurring", the quoted sample is from 2026-09-07 (before the fix merged at 06:25Z that day), and the counter did move (474 → 507). All three are true at once, so I read the incident record itself —
Admin/_LogIncident/a577a67482869286on the control instance, which is where these live (it is under a_LogIncidentsatellite segment, so a content query answers 0 for it even withcoverage.partitions: ["admin"]—getby exact path is the only instrument).The exception CHANGED
Of the ten stored samples, nine are the original shape and the newest is not:
…-58c859d4cc-b8pfgNo node found at '<path>'. Closest ancestor is '<user>' (remainder=…)…-7fd9668b69-jwzzlPath resolution for 'sglauser/_Answers/AgenticBusiness/01-MeetYourCoworker/Quiz' failed: The operation has timed out.The absent-node shape this issue was filed for — and that #3536 fixed in
MeshNodeBindingExtensions— has not been seen since 2026-09-07 03:53:59Z, i.e. 32 minutes before the fix merged. The one post-fix occurrence is a timeout in path resolution, which is a different failure with a different cause.The fix is genuinely deployed, so this is not a delivery question
https://memex.meshweaver.cloud/api/versionreports3.0.0+c84c6c05…;c84c6c05is core's2026-09-12 09:30:22Z.git merge-base --is-ancestor 0ed02bad c84c6c05→ true, so #3536's seam fix is in the running image, and the absent-node shape stopped appearing the day it merged. That is the fix working, measured on the deployed build rather than assumed from the merge.Why it looked like a regression
The fingerprint is computed from the normalised message plus the exception TYPE:
"Node absent" and "path resolution timed out" are both
DeliveryFailureExceptionraised from the sameLoading …log site, so they normalise to the same fingerprint and fold into one incident — and the storedsampleskeep the earliest lines, so the reopen comment quotes 09-07 evidence for a 09-15 event. Two distinct defects are therefore indistinguishable from the issue thread alone; that is the mechanism behind this close/reopen loop, not a flapping fix.What is actually open
One occurrence, on one pod, of: per-user
_Answerspath resolution timing out for a learner opening a quiz._Answersis not a configured satellite segment, so ordinary routing applies. I am deliberately not guessing the mechanism from a single sample — what would name it is the routing/hub-activation trace for that path at2026-09-15 18:52:48Z, and whether the storm-breaker was open on it (a breaker opened by the old NotFound behaviour would fast-fail resolution on the same path, which would tie the two together, but that is a hypothesis and not a measurement).Suggested disposition: this issue's stated defect is fixed and verified on the deployed build; the remaining fault deserves its own title rather than inheriting one about NotFound-storms. Re-closing it unchanged will simply reopen on the next timeout.
Measured 2026-09-15 by Claude Opus 5.
[-]RadioGroupView NotFound-storms when the node it is bound to is missing[/-][+]Per-user _Answers path resolution times out when a learner opens a quiz (the NotFound half was fixed by #3536; same fingerprint, different cause)[/+]rbuergi commentedon Sep 15, 2026
Closing as a duplicate of #1122 — both halves are now accounted for.
c84c6c05= 2026-09-12;git merge-base --is-ancestor 0ed02bad c84c6c05is true). It has not appeared in a sample since 2026-09-07 03:53:59Z, 32 minutes before that fix merged.Path resolution for 'sglauser/_Answers/AgenticBusiness/01-MeetYourCoworker/Quiz' failed: The operation has timed out.at 2026-09-15 18:52:48Z — is downstream of Per-node hub DataContext initialization times out at 120s, taking every hub under a user partition dark (root of #3517, #2886, #1313) #1122: five minutes later, on the same pod,DataContext initialization TIMED OUT forthat same node path, leaving the hub inFAILEDstate. The per-node hub never initialises, so every read of the node times out;RadioGroupViewis reporting the fault, not causing it.Tracking the remaining work on #1122, where the root is. Detail and evidence: #1122 (comment)
🚨 If the recurrence bot reopens this: the fingerprint here is
category + normalised message + exception TYPE, and both causes raiseDeliveryFailureExceptionfrom the sameLoading …log site, so they are indistinguishable to it. A reopen is not evidence that #3536 regressed — compare the newest sample's exception text before acting.Closed 2026-09-15 by Claude Opus 5.