AI content-save exchange puts the mesh router on both ends: SaveContentResponse answered back onto the router by HandleSaveContent
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 42/100
Research direction
Read AIExtensions.cs at line 204 and trace how the response target is derived from the incoming delivery; this distinguishes an answering response from an explicitly chosen router target. Then compare with ContentCollectionPlugin.cs at line 142 and the Router Traffic Detection guidance, including its named test fixture. Done means identifying which side owns the router delivery and correcting that path; the issue does not establish that the save failed or that the behavior recurs.
Written by the indexing model from the issue text.
Description
Observed
One request/response exchange on the memex-cloud pod, 2026-10-12T23:20:57Z, put the mesh router on both ends of an AI content save:
- Request (sibling incident
262d20ded4c888f5):SaveContentRequestwas POSTED with the mesh hub (mesh/Pzw3Ylzty0e946KWrAGV4g) as sender, targetOIB/PowerBIExtracts, call siteMeshWeaver.AI.Plugins.ContentCollectionPlugin.UploadContent (ContentCollectionPlugin.cs:142)— invoked throughMicrosoft.Extensions.AI.AIFunctionFactoryreflection, i.e. an AI tool call. - Response (this incident):
SaveContentResponsewas POSTED with the mesh hub as target (senderOIB/PowerBIExtracts), call siteMeshWeaver.AI.AIExtensions+<>c__DisplayClass2_0.<HandleSaveContent>b__1 (AIExtensions.cs:204), on a ReactiveSelectManycontinuation.
Same two addresses, same second, same pod — these are not independent defects; they are the two halves of one delivery. The receiver-side echo of item 2 is sibling incident 30c9a3cc740b2a91 (same payload, no call site), and the burst's cross-hub RawJson receiver line was folded into 2a40878fdda81b44, already filed as Systemorph/MeshWeaver#5620.
Where and when
One occurrence, one pod, a single exchange — first and last sighting at 23:20:57Z. Note the detector dedups once per (role, type) per hub lifetime, so one line per role does not mean one event: sustained traffic of this shape would keep printing exactly one line per hub restart.
Impact
The response is delivered to and executed by the root mesh hub — the router, whose action block must only route (Router Traffic Detection; the 2026-06-11 wedge family). Whether the UploadContent tool invocation ever received its save confirmation is not established from this evidence. One sighting on one pod; no user-visible failure observed.
Not established
- Whether
HandleSaveContentechoed the request's sender (ResponseFor(delivery)-style) or chose the mesh hub as the response target — the origin line cannot separate the two "target" populations. - Whether the save on
OIB/PowerBIExtractsitself succeeded. - Whether this exchange recurs (the once-per-hub-lifetime dedup masks recurrence until the hub restarts).
- Whether other message types on the same path show the same shape.
Candidate causes and the reading that separates them
- The answering half of a router-issued request (the evidence favours this). The response's target is byte-identical to the request's sender, in the same second — a response goes where the request came from. If so,
HandleSaveContentis the innocent answering half, and the defect is the request side:ContentCollectionPlugin.UploadContentpostingSaveContentRequestfrom the DI-injectedIMessageHub, which in the root container is the router (covered by sibling262d20ded4c888f5;ContentCollectionPluginresolves as a mesh-singleton plugin service, the exact caller class the rulebook names as needing a seam). Discriminating reading:AIExtensions.cs:204— the target of the response post derives from the incoming delivery rather than being constructed there. - An explicit choice of the router as response target. If the post at
AIExtensions.cs:204names the mesh hub itself, this call site is an offender in its own right, independent of the request side. Discriminating reading: the same one look — what theWithTarget/response construction at that line reads from.
Where to look
MeshWeaver.AI.AIExtensions,HandleSaveContentlambda (AIExtensions.cs:204) — the call site this line names; the one look that separates the two candidates above.MeshWeaver.AI.Plugins.ContentCollectionPlugin.UploadContent(ContentCollectionPlugin.cs:142) — the request side of the same exchange, sibling incident262d20ded4c888f5.- Router Traffic Detection — the role-dependent reading of a
targetline (the two populations with opposite ownership) and the pinned test fixtureRouterTrafficOnNodeCreateFromTheRootHubTestfor reproducing router-end exchanges from the root hub. - Sibling incidents to consolidate against:
262d20ded4c888f5(request origin — this is the offender if candidate 1 holds),30c9a3cc740b2a91(receiver-side duplicate of this response, closeable against this ticket),2a40878fdda81b44/ MeshWeaver#5620 (the foldedRawJsonline from the same burst).
Evidence
| Fingerprint | 530ff78477238090 |
| Category | MeshWeaver.Messaging.MessageHub |
| Severity | Error |
| Top frame | MeshWeaver.AI.AIExtensions+<>c__DisplayClass2_0.<HandleSaveContent>b__1 (AIExtensions.cs:204) |
| Namespace | memex-cloud |
| Pods | memex-portal-deployment-5897c49648-jtqxn |
| Occurrences | 1 |
| First seen | 2026-10-12 23:20:57Z |
| Last seen | 2026-10-12 23:20:57Z |
| Routing | not determined — no configured route matches the category MeshWeaver.Messaging.MessageHub. This repository is the configured fallback, not a finding about who owns the fault; the category names the LOGGER, which may not be the subject. |
Recent log lines
2026-10-12 23:20:57Z memex-portal-deployment-5897c49648-jtqxn fail: MeshWeaver.Messaging.MessageHub[0]
ROUTER_TRAFFIC ORIGIN: SaveContentResponse was POSTED with the mesh hub as target (sender: OIB/PowerBIExtracts, target: mesh/Pzw3Ylzty0e946KWrAGV4g). The mesh hub is the ROUTER and must not be an end of a work delivery. If the role above includes 'sender', this post LEFT the router: hop it onto the seam that matches what this delivery IS — MeshExtensions.NodeOperationIssuingHub() for a node LIFECYCLE write, MeshExtensions.ReadIssuingHub() for a bounded one-shot READ, MeshExtensions.StreamSubscribingHub() for a remote stream SUBSCRIPTION. The three are NOT interchangeable and the wrong one fails SILENTLY: ReadIssuingHub() registers no handlers by design, so a subscription hopped onto it stops reporting AND stops receiving data (#4614). If the role above includes 'target', ask where that target CAME FROM, because the two cases have opposite fixes: if this call site CHOSE the router as the destination, the call site is the offender — address the owning node instead (MeshExtensions.NodeOperationTarget()); if the target was read off an incoming request or subscription (request.Subscriber, ResponseFor(delivery) — SubscribeAck, DataChangedEvent, StreamErrorEvent and StreamEndedEvent all are), then this call site is the innocent answering half and the hub to move is the one that SUBSCRIBED or REQUESTED (#4697). 'sender AND target' means both apply. Reported once per role+type for this hub. Call site:
at MeshWeaver.AI.AIExtensions+<>c__DisplayClass2_0.<HandleSaveContent>b__1 (AIExtensions.cs:204)
at System.Reactive.AnonymousSafeObserver`1.OnNext
at System.Reactive.Linq.ObservableImpl.SelectMany`2+ObservableSelector+_+InnerObserver.OnNext
at System.Reactive.Linq.ObservableImpl.ReturnImmediate`1.Run
at System.Reactive.BasicProducer`1.SubscribeRaw
at System.Reactive.Linq.ObservableImpl.SelectMany`2+ObservableSelector+_.SubscribeInner
at System.Reactive.Linq.ObservableIm…[truncated]
Opened automatically from Admin/_LogIncident/530ff78477238090. Recurrences are folded into this issue rather than opening new ones.
It also stands for the whole log site 86529185e3af081f: other fingerprints of this site fold in here as comments rather than opening tickets of their own.
- Dominant language
- C#
- Stars
- 12
- Forks
- 5
- Avg merge
- 4h 19m
- Merged PRs (30d)
- 932
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- No contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from Systemorph/MeshWeaver
-
bug sev:L
Difficulty 4/5 3-5 days Newbie friendliness 35/100
Systemorph/MeshWeaver#6648 · 5 comments ·
Maintainers usually reply within 1 day
-
bug sev:M
Difficulty 4/5 3-5 days Newbie friendliness 42/100
Systemorph/MeshWeaver#6647 ·
Maintainers usually reply within 1 day
-
bug sev:M
Difficulty 4/5 3-5 days Newbie friendliness 25/100
Systemorph/MeshWeaver#6645 · 2 comments ·
Maintainers usually reply within 1 day
-
bug sev:M
Difficulty 4/5 3-5 days Newbie friendliness 25/100
Systemorph/MeshWeaver#6644 · 2 comments ·
Maintainers usually reply within 1 day
-
bug sev:M
Difficulty 4/5 3-5 days Newbie friendliness 48/100
Systemorph/MeshWeaver#6643 · 2 comments ·
Maintainers usually reply within 1 day
All issues in Systemorph/MeshWeaver
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 1 day
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
Maintainers usually reply within 1 day
-
area:re1 bounty help wanted needs-game
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
StackExchange/StackExchange.Redis#3274 ·
Maintainers usually reply within 1 day
-
affected/v17 affected/v18 area/frontend type/bug
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
umbraco/Umbraco-CMS#24186 ·
Maintainers usually reply within 2 days