Skip to content

fix(create): a stalled validators stage names the validator it waits on (#6391) - #6421

Merged
rbuergi merged 1 commit into
mainfrom
fix/6391-validator-stage-verdict
Oct 10, 2026
Merged

rbuergi merged 1 commit into
mainfrom
fix/6391-validator-stage-verdict

Conversation

@rbuergi

@rbuergi rbuergi commented Oct 10, 2026

Copy link
Copy Markdown
Contributor

Refs #6391 · Refs #6393

What

A create whose chain stalls in the validators stage now names the validator it was waiting on.

  • The stage reads validators: resolving while the scoped validators are constructed (DI).
  • It then reads validators: <TypeName> (i/n) from the moment the Concat subscribes to each validator.
  • The same text goes on the stalled verdict (LifecycleVerdictStalledException) and on the fate trail (CREATE_STAGE …).

Why this and not a "fix" of the stall itself

On memex.systemorph.com, #6391 fired ten times in three minutes on one freshly booted pod (memex-portal-deployment-5f6b9fc9b-hrdhq, 2026-10-09 20:36–20:39Z). The creates were all System-written: Admin/_Notification/…, Admin/PlatformVersion/_Activity/startup-…, Doc/_Activity/import-…, Admin/_LogIncident/site-….

I read every core validator's Validate. For a System write each one answers with a synchronous Observable.Return. RLS and PartitionWriteGuard bypass System, CreatableTypes exempts platform writers, and the static-type branch of OwnsPartitionProvisioning returns at once. So the code alone cannot explain a 30 s silence in that stage. Governed Logs read Ops/Actions/logs-memex-20261010-6391-validators-window (control, pod hrdhq, 12 h, 35 lines, not cut) found none of the inner terminals a slow validator would print: no RLS: … could NOT be established, no [CreatableTypes] … could not be read, no QueryProviderStalledException. The bare stage name could not even tell "a validator never answered" from "the chain stalled before any validator was asked", for example a blocked DI construction.

Without that reading any root-cause change would be a guess. This PR makes the next occurrence name its culprit. #6391 stays open for that reading.

#6393 is a downstream casualty of the same window: its bell-node create was the tenth victim.

Test

LifecycleRequestsAlwaysReachAVerdictTest.ACreateWhoseValidatorNeverAnswers_IsAnsweredUnavailable_NamingTheStage now also asserts that the verdict contains validators: SilentCreationValidator (.

  • With the fix: all 5 tests in the class pass.
  • Negative control, with the src change reverted: the test fails with the production sentence verbatim: …it was still waiting at stage 'validators'….

MeshWeaver.Mesh.Contract, MeshWeaver.Hosting.Test and MeshWeaver.Documentation build clean with -c Release -warnaserror.

Doc

Doc/Architecture/WriteVerdictTotality: the stage table and a new paragraph on the per-validator stage.

Recycle

None needed. The change is in the node-operations handler, which ships with the image.

🤖 Generated with Claude Code

…on (#6391)

The create chain runs every INodeValidator in sequence, and its stalled
verdict said only "stage 'validators'". On memex it fired ten times in
three minutes on a freshly booted pod for System-written creates, where
every core validator answers synchronously, so the reading could not say
which validator was silent, or whether the chain stalled before any was
asked. The stage now reads 'validators: resolving' while the scoped
validators are constructed, then 'validators: <Type> (i/n)' from the
moment the chain subscribes to each, on the verdict and the fate trail.

Refs #6391

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

The focused diagnostic change is correctly composed, documented, and covered by an appropriate regression assertion.

0 open findings

What changed in this PR

Adds validator-level diagnostics to stalled create operations without changing validation behavior.

Changes:

  • Reports validator resolution and per-validator progress.
  • Extends regression coverage for named stalled validators.
  • Documents the enhanced lifecycle verdict and fate trail.
File Description
src/​MeshWeaver.Mesh.Contract/​MeshExtensions.cs Tracks validator-specific create stages.
test/​MeshWeaver.Hosting.Test/​LifecycleRequestsAlwaysReachAVerdictTest.cs Verifies stalled verdicts name the validator.
src/​MeshWeaver.Documentation/​Data/​Architecture/​WriteVerdictTotality.md Documents validator-stage diagnostics.

🧠 Review effort: Balanced


💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@github-actions

github-actions Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

Test Results

    19 files      19 suites   51m 48s ⏱️
11 164 tests 11 164 ✅ 0 💤 0 ❌
11 178 runs  11 178 ✅ 0 💤 0 ❌

Results for commit dd2f99a.

♻️ This comment has been updated with latest results.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants