Repository navigation
Webhook endpoint answers after post-creation handlers: GitHub org-hook delivery recorded 500 (10 s timeout) although the event was stored (roll window) #6039
Description
Moved from the fleet's private triage inbox (MeshWeaver.Feedback#47, filed 2026-09-26). Core owns it: memex/Memex.Portal.Shared/Api/WebhookInboxEndpoints.cs is core.
Owner: core Memex.Portal.Shared/Api/WebhookInboxEndpoints.cs (+ MeshExtensions CreateNode post-creation path). Measured 2026-09-26 on memex.systemorph.com. GitHub org hook 686037663 delivery 3844954004041777152 (guid 8914f260-b9d5-11f1-9f1c-5957880239ef, issues/edited, Systemorph/Memex#116) is recorded status_code 500, duration 10, response headers null, status text verbatim: 'POST https://memex.systemorph.com/api/hooks/Hosting/PlatformBuilds giving up after 1 attempt(s): ... context deadline exceeded (Client.Timeout exceeded while awaiting headers)'. So the 500 is GitHub's own label for NO RESPONSE in 10 s, not a server 500. The portal side: pod memex-portal-deployment-85f748bdd7-qvqf7 (new ReplicaSet of the Roll to 3.0.0-ci.9414, Ops/Actions/selfupdate-roll-memex-3-0-0-ci-9414-63633d50, whose watcher reports an observer pod gone at 18:10:20Z) logged 'Node created at Hosting/PlatformBuilds/_Inbox/54cf68225ef94775a0482c11d17d9f26 by system-security' at 18:10:31.369Z, i.e. the store succeeded ~200 ms after GitHub sent; the event was later processed and is gone from the inbox, so nothing was lost (and an 'edited' action is ignored by triage anyway; the endpoint never parses the body, so the action plays no role). What stalled is the path from 'Node created' to the HTTP answer: MeshExtensions CreateNode runs the post-creation handlers and posts the response after that log line, and the endpoint awaits CreateNode(...).Take(1) before answering. The last 100 deliveries: p50 0.46 s, p90 2.38 s, max 10 s; the 13 after 18:13Z (still in the roll) took 1.0-4.9 s. Not established: which stage (post-creation handlers, response routing to the root hub while the old ReplicaSet's silo was leaving, or Kestrel) held the answer; 'Webhook stored at' (Information) and the [CreateNode] step lines (Debug) are not shipped at this instance's level (a control query for 'Webhook stored at|ignoring non-build event' over 35 min returned 0 lines for ALL deliveries), so the logs cannot say. Risk: GitHub does not redeliver; any delivery that stalls past 10 s is shown red and a sender that treats non-2xx as failure (node-repo-ci-failure, publish-bake) may retry or fail although the event was stored. Candidate direction (not a bound increase): answer once the store has committed rather than after post-creation handlers and the response hop.
Context (added by triage):
- Category: bug (verified defect report, agent session, Claude Code)
- Where: no specific Space/portal node named — observed during the memex.systemorph.com self-update roll to 3.0.0-ci.9414; affects the portal webhook inbox path generally.
- Evidence trails: gh api orgs/Systemorph/hooks/686037663/deliveries/3844954004041777152; Ops/Logs/memex-1790446231369780045-48bdd7-qvqf7 (Node created); Ops/Actions/logs-memex-20260926-inbox-54cf6822 (1 line only); Ops/Actions/logs-memex-20260926-webhook-stored-vs-ignored (0 lines, control arm); Ops/Actions/logs-memex-20260926-fail-lines-1810 (health-check failures every 10 s on old pod 5f99d7f5fb-hk7t7 18:09:58-18:11:38, fail: Polly on qvqf7 18:10:50).
- Origin: https://memex.systemorph.com/rbuergi/Feedback/org-webhook-timeout-during-roll-20260926
filed by the triage agent on behalf of rbuergi (agent session, Claude Code) via systemorph-com
Activity
rbuergi commentedon Oct 8, 2026
Status 2026-10-08: still live. The suggested cause is wrong; the real coupling is a framework one. Not fixed. #6322 documents it.
WebhookEvent, so for an inbox node the handler chain is empty. The success reply is posted right after the "Node created" log line (src/MeshWeaver.Mesh.Contract/MeshExtensions.cs~1540-1589).portal/nodeops, the hub that runs every node create in the mesh. Two attempts show the endpoint cannot get around it:hub.ReadIssuingHub(), as A freshly uploaded content file 503s for minutes (10s timeout per request) before it starts serving — /api/content settle window #2901 did for the content route). A deterministic test that held the nodeops hub after the commit and before the reply still saw no answer to the delivery. The request trail shows why: the answering hub queues its own outgoing reply on itself before routing it (RESPONSE_POSTED target=portal/reads-… ↩ reply#1: RECEIVED @portal/nodeops-… → ENQUEUED → QUEUED).Doc/Architecture/WebhookInboxin fix(webhook-inbox): a stalled target read answers 503 + Retry-After, not a bare 500 (#6125) #6322.fix(webhook-inbox): drop the reply subscription once the commit has a…
Merge pull request #6436 from Systemorph/fix/6039-webhook-answers-on-…
rbuergi commentedon Oct 11, 2026
Closing: the endpoint now answers on the store's commit, and the live deliveries show it.
Fix.
d41f8070ecandcfa4b2b310(2026-10-10):WebhookInboxstores throughIMeshService.CreateNodeAnsweredOnCommit, so the HTTP answer no longer waits for the create's reply to leave through the node-operation hub. Both commits are ancestors of the build the control instance runs (/api/version→e438ab89e7, read 2026-10-11 11:00Z).Reading (REST,
orgs/Systemorph/hooks/686037663/deliveries, 2026-10-11 09:51:48Z → 11:14:11Z). The hook now delivers tocontrol.systemorph.com/api/hooks/Hosting/PlatformBuilds.The original report was a roll window, so this one had to contain one: the control instance rolled to
3.1.10515(done 10:05Z) and to3.1.10517(done 10:22Z) inside it, and a roll to3.1.10519was in flight at its end (Ops/Actions/selfupdate-roll-control-3-1-1051{5,7,9}-…). The 2026-09-26 report read p90 2.38 s and max 10 s over 100 deliveries of the same hook.Not established: what held the node-operation hub at 18:10:31Z on 2026-09-26. The fix makes the answer independent of that, it does not explain it.
Fleet issue wave, Claude Opus 5.5 (agent session).