Workflow bind and run both break cluster-wide from ~14:15 SGT; identical definition passed 12 minutes earlier
Summary
Between 14:03 and 14:20 SGT on 2026-08-07 (06:03–06:20 UTC), our scope went from fully working to unable to bind or run any workflow. Nothing changed on our side in that window — we can prove this because the identical workflow definition that passed admission at 14:03 and completed all 14 steps at 14:15 is rejected at admission when resubmitted byte-for-byte at 14:20, and still rejected at 14:34.
Four distinct symptoms appeared together. All are infrastructure-level; none reproduce against NyxID or the downstream service directly.
Timeline (SGT, UTC+8)
| Time |
Event |
| 14:03 |
workflows:explicit-request-preview returns 6 call sites; bind succeeds |
| 14:04 |
Run rejected with workflow run is already active while every run in the list reads failed; step count regresses 9/10 → 6/10 |
| 14:15 |
Same member runs 14/14, completed |
| 14:20 |
Identical definition rejected: NYXID_ADMISSION_SOURCE_CREDENTIAL_REQUIRED |
| 14:20 |
Runtime code_execute fails: NYXID_PROXY_HTTP_502 |
| 14:30 |
Second workflow (27 steps) fails at step 1/27: Forwarding failed: tried to forward message Request [<internal-silo-address> runtimeactor/sco… |
| 14:34 |
Admission still rejected (4th reproduction) |
Symptom 1 — admission rejects a definition it accepted 17 minutes earlier
POST /api/scopes/{scopeId}/workflows:explicit-request-preview
400 INVALID_USER_WORKFLOW_REQUEST
External workflow capability admission failed:
NYXID_ADMISSION_SOURCE_CREDENTIAL_REQUIRED: A source-readable caller NyxID credential is required.
Reproduced 4 times (14:20, 14:21, 14:22, 14:34) with the byte-identical request body that succeeded at 14:03.
Isolation probes — we first assumed this was specific to a write call site we were adding, and tried to narrow it. All four returned the same error:
| Probe |
Result |
POST /open-apis/im/v1/messages (the new write) |
SOURCE_CREDENTIAL_REQUIRED |
same call site changed to GET |
SOURCE_CREDENTIAL_REQUIRED |
| same call site pointed at a different path |
SOURCE_CREDENTIAL_REQUIRED |
| same call site degraded to the exact shape of a read step that had just passed |
SOURCE_CREDENTIAL_REQUIRED |
That assumption was wrong. The control settled it: removing the new call site entirely and resubmitting the definition that ran 14/14 minutes earlier is also rejected. So this is not about any call site we authored.
Both capability selectors are affected — capability.nyxid_operation and capability.nyxid_request behave identically.
Symptom 2 — runtime code_execute returns 502 while the sandbox is healthy
An already-bound workflow (bound 14:03, ran 14/14 at 14:15) now fails at step 8:
tool 'code_execute' execution failed: NYXID_PROXY_HTTP_502: The service request failed.
Calling the same sandbox service directly through NyxID at the same time succeeds:
{"success":true,"output":{"stdout":"ok","stderr":"","exit_code":0,"execution_time_ms":1089}}
So the sandbox is up and the NyxID proxy path to it is healthy. The break is on the aevatar → sandbox leg.
Symptom 3 — Orleans message forwarding failure on a second workflow
A different member (27-step workflow, bound 2026-08-06) fails at step 1 of 27, before any of our code runs:
step_executor_failed: step 'readctx' (tool_call) failed during executor:
Forwarding failed: tried to forward message Request [<internal-silo-address> runtimeactor/sco
The message is truncated by the platform at ~100 characters, so we cannot supply more of it. The internal silo address is redacted here and can be provided privately.
Symptom 4 — run-actor state inconsistency
At 14:04, new runs were refused with workflow run is already active while the runs list showed every run in failed state — no active run existed. In the same window, the observatory step count for one run went backwards, 9/10 → 6/10, across successive polls of the same runId.
We initially logged this as an isolated anomaly and moved on when a retry succeeded at 14:15. In hindsight it looks like the earliest symptom of the same problem: a grain reactivating on a different silo with stale state would produce exactly this.
What is healthy (controls run at 14:34, same session, same token)
- chrono-sandbox direct via NyxID — 200,
stdout: "ok", 1130 ms
- Lark bot service direct via NyxID — reaches upstream, returns the upstream's own scope error
- Caller identity —
whoami resolves; token valid for another ~4.5 h
- aevatar read endpoints — scope, members, bindings, observatory runs all respond normally
So: NyxID is up, the downstream services are up, our credential is valid, and aevatar's read plane works. Admission, the runtime tool leg, and actor dispatch are what changed.
Our reading
One hypothesis covers all four symptoms: aevatar lost the ability to read or use the forwarded caller NyxID credential, alongside silo churn. The aevatar service is configured Auth: none and relies entirely on the forwarded caller token — admission needs it to resolve capabilities (symptom 1), and the runtime needs it as the bearer to the sandbox (symptom 2). Symptoms 3 and 4 point at grain relocation happening at the same time.
We are not attached to this explanation; the timeline and the controls are the durable part.
Impact
Both of our production-migration workflows are fully blocked — one that had just reached end-to-end success for the first time, and one that cannot get past its first step. Our production automation still runs on the previous system, so there is no business outage; the migration is what is stalled.
Environment
- Scope, member, workflow and run IDs: available privately on request
- Reproduced continuously from 14:20 to 14:34 SGT on 2026-08-07
- All requests issued through the NyxID proxy with a caller token valid until 19:00 SGT
Workflow bind and run both break cluster-wide from ~14:15 SGT; identical definition passed 12 minutes earlier
Summary
Between 14:03 and 14:20 SGT on 2026-08-07 (06:03–06:20 UTC), our scope went from fully working to unable to bind or run any workflow. Nothing changed on our side in that window — we can prove this because the identical workflow definition that passed admission at 14:03 and completed all 14 steps at 14:15 is rejected at admission when resubmitted byte-for-byte at 14:20, and still rejected at 14:34.
Four distinct symptoms appeared together. All are infrastructure-level; none reproduce against NyxID or the downstream service directly.
Timeline (SGT, UTC+8)
workflows:explicit-request-previewreturns 6 call sites; bind succeedsworkflow run is already activewhile every run in the list readsfailed; step count regresses 9/10 → 6/10NYXID_ADMISSION_SOURCE_CREDENTIAL_REQUIREDcode_executefails:NYXID_PROXY_HTTP_502Forwarding failed: tried to forward message Request [<internal-silo-address> runtimeactor/sco…Symptom 1 — admission rejects a definition it accepted 17 minutes earlier
Reproduced 4 times (14:20, 14:21, 14:22, 14:34) with the byte-identical request body that succeeded at 14:03.
Isolation probes — we first assumed this was specific to a write call site we were adding, and tried to narrow it. All four returned the same error:
POST /open-apis/im/v1/messages(the new write)SOURCE_CREDENTIAL_REQUIREDGETSOURCE_CREDENTIAL_REQUIREDSOURCE_CREDENTIAL_REQUIREDSOURCE_CREDENTIAL_REQUIREDThat assumption was wrong. The control settled it: removing the new call site entirely and resubmitting the definition that ran 14/14 minutes earlier is also rejected. So this is not about any call site we authored.
Both capability selectors are affected —
capability.nyxid_operationandcapability.nyxid_requestbehave identically.Symptom 2 — runtime
code_executereturns 502 while the sandbox is healthyAn already-bound workflow (bound 14:03, ran 14/14 at 14:15) now fails at step 8:
Calling the same sandbox service directly through NyxID at the same time succeeds:
{"success":true,"output":{"stdout":"ok","stderr":"","exit_code":0,"execution_time_ms":1089}}So the sandbox is up and the NyxID proxy path to it is healthy. The break is on the aevatar → sandbox leg.
Symptom 3 — Orleans message forwarding failure on a second workflow
A different member (27-step workflow, bound 2026-08-06) fails at step 1 of 27, before any of our code runs:
The message is truncated by the platform at ~100 characters, so we cannot supply more of it. The internal silo address is redacted here and can be provided privately.
Symptom 4 — run-actor state inconsistency
At 14:04, new runs were refused with
workflow run is already activewhile the runs list showed every run infailedstate — no active run existed. In the same window, the observatory step count for one run went backwards, 9/10 → 6/10, across successive polls of the samerunId.We initially logged this as an isolated anomaly and moved on when a retry succeeded at 14:15. In hindsight it looks like the earliest symptom of the same problem: a grain reactivating on a different silo with stale state would produce exactly this.
What is healthy (controls run at 14:34, same session, same token)
stdout: "ok", 1130 mswhoamiresolves; token valid for another ~4.5 hSo: NyxID is up, the downstream services are up, our credential is valid, and aevatar's read plane works. Admission, the runtime tool leg, and actor dispatch are what changed.
Our reading
One hypothesis covers all four symptoms: aevatar lost the ability to read or use the forwarded caller NyxID credential, alongside silo churn. The aevatar service is configured
Auth: noneand relies entirely on the forwarded caller token — admission needs it to resolve capabilities (symptom 1), and the runtime needs it as the bearer to the sandbox (symptom 2). Symptoms 3 and 4 point at grain relocation happening at the same time.We are not attached to this explanation; the timeline and the controls are the durable part.
Impact
Both of our production-migration workflows are fully blocked — one that had just reached end-to-end success for the first time, and one that cannot get past its first step. Our production automation still runs on the previous system, so there is no business outage; the migration is what is stalled.
Environment