Skip to content

feat(mesh): durable streams are saved mesh nodes, consumed inside hubs - #6018

Merged
meshweaver-cloud[bot] merged 6 commits into
mainfrom
feat/durable-streams
Oct 3, 2026
Merged

meshweaver-cloud[bot] merged 6 commits into
mainfrom
feat/durable-streams

Conversation

@rbuergi

@rbuergi rbuergi commented Oct 3, 2026

Copy link
Copy Markdown
Contributor

Durable streams: saved mesh nodes, consumed inside hubs

A durable stream is a set of saved mesh nodes. It is consumed inside a hub, and it survives a recycle, a pod roll and a restart. Design of record: Doc/Architecture/DurableStreams (new page, in this PR).

Shape

{Key}/_DurableStream/{Namespace}                                   DurableStream      (owner partition, mesh_nodes)
{Key}/_DurableStream/{Namespace}/_DurableStreamItem/000000000001   DurableStreamItem  (owner partition, durable_stream_items)
  • The stream node's hub is the single writer. It serializes every append, claim, ack and release through one Subject+Concat chain. Sequences are therefore contiguous, and the lease has exactly one owner.
  • The lease is the subscription. Each grant starts a new epoch, and an acknowledgement under an older epoch is fenced. A claim takes over only from a holder that does not answer a ping. A release orphans the stream: Subscriber=null and OrphanedAt are set, and that change to the stream node is the orphan event.
  • The checkpoint is a field of the stream node (Checkpoint, CheckpointAt).
  • Items get their own satellite table through a new SatelliteTableMapping("_DurableStreamItem", "durable_stream_items", "DurableStreamItem"). The segment is 18 characters, longer than _ThreadMessage and _DocumentPart, so it wins the longest-segment placement rule. ensure_partition_schema generates the table from the mapping list, so the Postgres side needs no code change.
  • Delivery is hub-native. One synced query over the items namespace supplies both the backlog and the live tail (Added), and items are released strictly in order. DurableStreamSource<T> reads an existing ordered child set, such as a document's _DocumentPart children, as a stream without a second copy.

API

  • IObservable<long> hub.PublishDurable<T>(DurableStreamId stream, T payload) — cold; emits the sequence once the item node is saved.
  • config.WithDurableStreamConsumer<T>(string ns, Func<IMessageHub,string> streamKey, Func<IMessageHub, DurableStreamItem<T>, IObservable<Unit>> handler) (plus an overload that takes a DurableStreamSource<T>).
  • hub.ReadDurable<T>(stream[, source], afterSequence) — an unleased reader.
  • public sealed record DurableStreamId(string Namespace, string Key), public sealed record DurableStreamItem<T>(DurableStreamId Stream, long Sequence, T Payload).

Three behaviours found while building this

  1. A quiescing hub refuses to send new requests (cannot process AckDurableStreamRequest … RunLevel=Quiescing). For that reason, ack, release and claim are issued from hub.GetMeshHub().ReadIssuingHub(), never from the consumer.
  2. A wake message to a recycled owner can land on the still-quiescing activation and be dropped. The wake is therefore a re-probing READ of the owner node (GetMeshNodeOutcome), followed by a DurableStreamWake nudge.
  3. On the Orleans route, a request to a not-yet-existing path is NotFound, and that NotFound outlives the node's creation. A resend straight after a successful create was refused in the same way (measured in an Orleans TestCluster). Stream nodes are therefore created before the first request (DurableStreamDirectory), never discovered by routing to them.

Tests (executed)

  • DurableStreamConsumerTest (Monolith): 6/6. It covers:
    • a consumer recycled mid-stream, with exactly-once in-order processing of 60 items;
    • the checkpoint field and the item nodes;
    • a stream hub recycled mid-stream, after which the sequence continues from the nodes;
    • takeover from a subscriber that died without releasing, resuming after its acknowledged items, with a stale-epoch ack fenced;
    • two racing subscribers, each item processed exactly once;
    • the orphan event.
  • OrleansDurableStreamConsumerTest (Orleans TestCluster, grain-hosted consumer and stream hub, client producer): 1/1.
  • Falsified locally:
    • With the acknowledgement removed, 3/6 fail (the recycle re-processes items).
    • With live-only delivery (memory-stream shape), 6/6 fail.
  • Regression runs: MeshWeaver.Graph.Test full 2460/2460, MeshWeaver.Hosting.Test full 1094 passed, 1 skipped, MeshWeaver.Documentation.Test guards 662/662.
  • The Postgres half is tested in MeshWeaver.Plugins (follow-up PR, DurableStreamPostgresTests). It checks that items are rows of the owner partition's durable_stream_items table and that the checkpoint is on the stream node's row. It passes against pgvector, and it fails with 42P01 … durable_stream_items does not exist when the mapping is removed.

Limits (stated in the doc)

  • At-least-once window: a crash between a handler completing and its ack landing re-delivers that item.
  • One subscriber per stream.
  • No retention: items are never trimmed yet.
  • Catch-up reads the whole items namespace.
  • No access check on appends or claims. Stream nodes are written as the platform.

Deploy

No migration and no DbVersion bump. Existing partitions get durable_stream_items from ensure_partition_schema. Nothing is served until a hub opts in with WithDurableStreamConsumer, so there is no address to recycle.

Pairs-with: none — this PR removes no public type or member.
Implementers: none — no member is added to an existing public interface.
Mirror-sync: none — no i18n catalog key is added or changed.

🤖 Generated with Claude Code

A durable stream is a stream node {Key}/_DurableStream/{Namespace} whose own hub
orders and leases it, plus one write-once item node per appended item in the
owner partition's new durable_stream_items satellite table. Nothing about a
stream lives outside the mesh.

- hub.PublishDurable(stream, payload): the stream hub creates the item node,
  records LastSequence, then answers with the sequence (durable on emit).
- config.WithDurableStreamConsumer<T>(namespace, streamKey, handler): claims
  the lease, reads items after the acknowledged checkpoint (one synced query:
  backlog + live Added), hands each item to the hub as a request to itself so
  the handler runs on the hub's loop and a recycle's quiesce waits for it,
  acknowledges after the handler completes, releases on shutdown.
- The lease IS the subscription: epochs fence stale holders, a claim takes
  over only from an unreachable holder, a release orphans the stream (the
  stream node's change is the event), an orphaned stream with pending items
  wakes its owner by a re-probing read of the owner node.
- DurableStreamSource<T> lets a consumer read an existing ordered child set
  (e.g. _DocumentPart children) without a second copy.

Tests: DurableStreamConsumerTest (Monolith, 6) and
OrleansDurableStreamConsumerTest (Orleans TestCluster, grain-hosted consumer
and stream hub). Falsified: without the acknowledgement 3/6 fail (recycle
re-processes items); with live-only delivery 6/6 fail.

Doc: Doc/Architecture/DurableStreams.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@meshweaver-cloud
meshweaver-cloud Bot enabled auto-merge October 3, 2026 11:49
@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Test Results (shard 0)

  1 files  ±0    1 suites  ±0   3m 17s ⏱️ +3s
349 tests +1  349 ✅ +1  0 💤 ±0  0 ❌ ±0 
353 runs  +1  353 ✅ +1  0 💤 ±0  0 ❌ ±0 

Results for commit c692bb5. ± Comparison against base commit 174f317.

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Test Results (shard 4)

660 tests   - 179   660 ✅ + 14   2m 37s ⏱️ +8s
  3 suites  -   1     0 💤  - 193 
  3 files    -   1     0 ❌ ±  0 

Results for commit c692bb5. ± Comparison against base commit 174f317.

This pull request removes 216 and adds 37 tests. Note that renamed tests count towards both.
MeshWeaver.Portal.E2E.AgentFilesToolingTest ‑ EveryTool_RunsForReal_AndTheFileIsARealMeshNode
MeshWeaver.Portal.E2E.AgentFilesToolingTest ‑ TheWorkingArea_IsScopedToItsOwnThread
MeshWeaver.Portal.E2E.BlazorVsNextCompareTest ‑ Compare_Blazor_Vs_Next_AcrossScreens
MeshWeaver.Portal.E2E.ChatAtAutocompleteTest ‑ TypingAt_SurfacesLocalPartitionNodes_AndSlashExpandsPartitions
MeshWeaver.Portal.E2E.ChatClearSkillNewComposerTest ‑ ClearSkill_InSidePanel_ReplacesThreadWithComposer_AndLeavesMainAlone
MeshWeaver.Portal.E2E.ChatComposerRefocusTest ‑ Composer_AcceptsTyping_AfterClickingAwayAndBack
MeshWeaver.Portal.E2E.ChatComposerSafariFocusReproTest ‑ Composer_AcceptsTyping_AfterFocusStealDuringStream
MeshWeaver.Portal.E2E.ChatComposerStreamingFocusTest ‑ Composer_KeepsFocus_WhileResponseStreams
MeshWeaver.Portal.E2E.ChatComposerSwitchSelectionTest ‑ SlashCommands_OpenPicker_AndSelectionUpdatesStatusRow
MeshWeaver.Portal.E2E.ChatDelegationTest ‑ Coordinator_DelegatesToWorker_SubThreadSpawns_ResultFlowsBack_AndRendersWhenOpened
…
MeshWeaver.ContentCollections.Test.ContentCollectionClaimApplyRaceTest ‑ TornIngestOvertakenBetweenClaimAndPost_CannotOverwriteTheLaterTriggeredArticle
MeshWeaver.ContentCollections.Test.ContentCollectionConnectionOwnedByHubTest ‑ AfterTheHubsTeardown_GetCollectionIsRefused_NotServedFromTheReplay
MeshWeaver.ContentCollections.Test.ContentCollectionDiesWithItsHubTest ‑ DisposingTheHub_DisposesTheCollectionsItsContentServiceCreated
MeshWeaver.ContentCollections.Test.ContentCollectionIngestOrderTest ‑ TornReadFromTheCreatedEvent_CannotOverwriteTheCompleteArticle
MeshWeaver.ContentCollections.Test.ContentCollectionWriteIngestTest ‑ SaveFile_ingests_the_article_without_the_watcher
MeshWeaver.ContentCollections.Test.ContentCollectionWriteReadRaceTest ‑ Write_Succeeds_While_A_Concurrent_Read_Holds_The_File
MeshWeaver.ContentCollections.Test.ContentDeleteNotificationTest ‑ A_collection_already_qualified_by_its_address_is_not_qualified_twice
MeshWeaver.ContentCollections.Test.ContentDeleteNotificationTest ‑ Deleting_a_file_notifies_observers_with_the_qualified_collection_path
MeshWeaver.ContentCollections.Test.ContentDeleteNotificationTest ‑ Deleting_a_folder_notifies_observers_once_per_contained_file
MeshWeaver.ContentCollections.Test.ContentServiceDelegationTest ‑ ContentService_ShouldDelegateToParent
…

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Test Results (shard 2)

    2 files   -   2      2 suites   - 2   4m 32s ⏱️ +20s
1 852 tests +588  1 852 ✅ +588  0 💤 ±0  0 ❌ ±0 
1 853 runs  +588  1 853 ✅ +588  0 💤 ±0  0 ❌ ±0 

Results for commit c692bb5. ± Comparison against base commit 174f317.

This pull request removes 77 and adds 665 tests. Note that renamed tests count towards both.
MeshWeaver.Cli.Test.GateHostCompositionTest ‑ ATesterReference_IsRecognisedAsTheWrongPlatformImage(image: "ghcr.io/systemorph/memex-portal-ai:main", isTester: False)
MeshWeaver.Cli.Test.GateHostCompositionTest ‑ ATesterReference_IsRecognisedAsTheWrongPlatformImage(image: "meshweaver.azurecr.io/MW-Plugin-Test@sha256:abc", isTester: True)
MeshWeaver.Cli.Test.GateHostCompositionTest ‑ ATesterReference_IsRecognisedAsTheWrongPlatformImage(image: "meshweaver.azurecr.io/memex-portal-ai@sha256:abc", isTester: False)
MeshWeaver.Cli.Test.GateHostCompositionTest ‑ ATesterReference_IsRecognisedAsTheWrongPlatformImage(image: "meshweaver.azurecr.io/mw-plugin-test:3.0.0-rc9.ci."···, isTester: True)
MeshWeaver.Cli.Test.GateHostCompositionTest ‑ DiscardTree_OnAnAbsentPath_IsSilent
MeshWeaver.Cli.Test.GateHostCompositionTest ‑ DiscardTree_RemovesTheTree
MeshWeaver.Cli.Test.GateHostCompositionTest ‑ DiscardTree_ThatCannotBeRemoved_ReportsAndDoesNotThrow
MeshWeaver.Cli.Test.GateHostCompositionTest ‑ EveryRun_StartsThePlatformImagesDotnet_OnTheComposedHostsTesterCli
MeshWeaver.Cli.Test.GateHostCompositionTest ‑ ExtractComposeScript_WritesTheScriptWhereTheCliRunsIt
MeshWeaver.Cli.Test.GateHostCompositionTest ‑ MountsAndEnvironment_LandBeforeTheImage
…
MeshWeaver.Documentation.Test.AWebhookIssueSnapshotKeepsItsCloseDecisionTest ‑ ADuplicateCloseSurvivesTheWebhook
MeshWeaver.Documentation.Test.AWebhookIssueSnapshotKeepsItsCloseDecisionTest ‑ AnOpenIssueCarriesNoCloseDecision
MeshWeaver.Documentation.Test.AWebhookIssueSnapshotKeepsItsCloseDecisionTest ‑ TheTwoMappersAgree(wireValue: "completed", expected: Completed)
MeshWeaver.Documentation.Test.AWebhookIssueSnapshotKeepsItsCloseDecisionTest ‑ TheTwoMappersAgree(wireValue: "duplicate", expected: Duplicate)
MeshWeaver.Documentation.Test.AWebhookIssueSnapshotKeepsItsCloseDecisionTest ‑ TheTwoMappersAgree(wireValue: "not_planned", expected: NotPlanned)
MeshWeaver.Documentation.Test.AgentsRuleAndSkillAgreementGuard ‑ BothDetectorsSeeTheDefectTheyWereWrittenFor
MeshWeaver.Documentation.Test.AgentsRuleAndSkillAgreementGuard ‑ EveryPairsRuleIsStillStatedInAgentsMd
MeshWeaver.Documentation.Test.AgentsRuleAndSkillAgreementGuard ‑ NoSkillCarriesASupersededRulesWording
MeshWeaver.Documentation.Test.AgentsRuleAndSkillAgreementGuard ‑ NoSkillMintsAFileUnderAWhatsNewPath
MeshWeaver.Documentation.Test.AmbientCultureRatchetGuard ‑ NoSourceFile_ReachesForAnAmbientCulture
…

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Test Results (shard 1)

    2 files   -   1      2 suites   - 1   4m 27s ⏱️ -49s
1 638 tests  - 665  1 638 ✅  - 665  0 💤 ±0  0 ❌ ±0 
1 641 runs   - 665  1 641 ✅  - 665  0 💤 ±0  0 ❌ ±0 

Results for commit c692bb5. ± Comparison against base commit 174f317.

This pull request removes 669 and adds 2 tests. Note that renamed tests count towards both.
   --- End of inner exception stack trace ---, isDenial: True)
 ---> System.UnauthorizedAccessException: Access denied
Memex.Portal.Shared.Test.InstanceIdRulesMatchTheRegistryTest ‑ TheSetupHostAgreesWithTheRegistry(candidate: "ebd829cf-358a-468a-8fba-9c791fd1076f")
Memex.Portal.Shared.Test.SessionDenialIsAnAnswerTest ‑ OnlyAVerdictReadsAsADenial(shape: "the same verdict nested, as a late denial dispatch"···, failure: System.InvalidOperationException: write failed
MeshWeaver.Documentation.Test.AWebhookIssueSnapshotKeepsItsCloseDecisionTest ‑ ADuplicateCloseSurvivesTheWebhook
MeshWeaver.Documentation.Test.AWebhookIssueSnapshotKeepsItsCloseDecisionTest ‑ AnOpenIssueCarriesNoCloseDecision
MeshWeaver.Documentation.Test.AWebhookIssueSnapshotKeepsItsCloseDecisionTest ‑ TheTwoMappersAgree(wireValue: "completed", expected: Completed)
MeshWeaver.Documentation.Test.AWebhookIssueSnapshotKeepsItsCloseDecisionTest ‑ TheTwoMappersAgree(wireValue: "duplicate", expected: Duplicate)
MeshWeaver.Documentation.Test.AWebhookIssueSnapshotKeepsItsCloseDecisionTest ‑ TheTwoMappersAgree(wireValue: "not_planned", expected: NotPlanned)
MeshWeaver.Documentation.Test.AgentsRuleAndSkillAgreementGuard ‑ BothDetectorsSeeTheDefectTheyWereWrittenFor
…
Memex.Portal.Shared.Test.InstanceIdRulesMatchTheRegistryTest ‑ TheSetupHostAgreesWithTheRegistry(candidate: "05963f6c-ae6b-4c0b-9f7e-0d4f90864485")
Memex.Portal.Shared.Test.SessionDenialIsAnAnswerTest ‑ OnlyAVerdictReadsAsADenial(shape: "the same verdict nested, as a late denial dispatch"···, failure: System.InvalidOperationException: write failed
 ---> System.UnauthorizedAccessException: Access denied
   --- End of inner exception stack trace ---, isDenial: True)

♻️ This comment has been updated with latest results.

rbuergi and others added 2 commits October 3, 2026 14:05
…stream

A NodeType that consumes a stream family is carried by every hub of that type,
most of which never get a stream (every uploaded document will carry the
DocumentLog consumer). Activation now costs ONE existence query (a listing
read, never a point read of a possibly absent node): a stream that exists is
claimed; one that does not is claimed only when a producer's append wakes the
hub (DurableStreamWake). Consumer requests (claim, ack, release) never create
a stream node — only a producer does.

Test: five active consumers without a stream create no stream node over a
window; a publish to one wakes exactly that one. Falsified: claiming at every
activation (the previous behaviour) creates 5 stream nodes and the test fails.

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

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Test Results (shard 3)

    3 files   -     1      3 suites   - 1   15m 59s ⏱️ + 2m 54s
4 158 tests +1 150  4 158 ✅ +1 150  0 💤 ±0  0 ❌ ±0 
4 163 runs  +1 153  4 163 ✅ +1 153  0 💤 ±0  0 ❌ ±0 

Results for commit c692bb5. ± Comparison against base commit 174f317.

This pull request removes 37 and adds 1187 tests. Note that renamed tests count towards both.
MeshWeaver.ContentCollections.Test.ContentCollectionClaimApplyRaceTest ‑ TornIngestOvertakenBetweenClaimAndPost_CannotOverwriteTheLaterTriggeredArticle
MeshWeaver.ContentCollections.Test.ContentCollectionConnectionOwnedByHubTest ‑ AfterTheHubsTeardown_GetCollectionIsRefused_NotServedFromTheReplay
MeshWeaver.ContentCollections.Test.ContentCollectionDiesWithItsHubTest ‑ DisposingTheHub_DisposesTheCollectionsItsContentServiceCreated
MeshWeaver.ContentCollections.Test.ContentCollectionIngestOrderTest ‑ TornReadFromTheCreatedEvent_CannotOverwriteTheCompleteArticle
MeshWeaver.ContentCollections.Test.ContentCollectionWriteIngestTest ‑ SaveFile_ingests_the_article_without_the_watcher
MeshWeaver.ContentCollections.Test.ContentCollectionWriteReadRaceTest ‑ Write_Succeeds_While_A_Concurrent_Read_Holds_The_File
MeshWeaver.ContentCollections.Test.ContentDeleteNotificationTest ‑ A_collection_already_qualified_by_its_address_is_not_qualified_twice
MeshWeaver.ContentCollections.Test.ContentDeleteNotificationTest ‑ Deleting_a_file_notifies_observers_with_the_qualified_collection_path
MeshWeaver.ContentCollections.Test.ContentDeleteNotificationTest ‑ Deleting_a_folder_notifies_observers_once_per_contained_file
MeshWeaver.ContentCollections.Test.ContentServiceDelegationTest ‑ ContentService_ShouldDelegateToParent
…
MeshWeaver.Compiler.Pipeline.Test.AFailedCompileCarriesTheSetItConsumedTest ‑ TheFailureResult_FoldsTheConsumedSetUnderTheSameRuleAsTheLiveSnapshot
MeshWeaver.Compiler.Pipeline.Test.ALateReleaseIsAdoptedWhenItLandsTest ‑ APrebuiltAdoption_RetiresThePreviousBuildsPendingRelease
MeshWeaver.Compiler.Pipeline.Test.ALateReleaseIsAdoptedWhenItLandsTest ‑ AReleaseAtAnotherPath_IsNotAdopted_AndTheStampStands
MeshWeaver.Compiler.Pipeline.Test.ALateReleaseIsAdoptedWhenItLandsTest ‑ ARelease_LandingAtTheStampedPath_IsAdopted
MeshWeaver.Compiler.Pipeline.Test.ALateReleaseIsAdoptedWhenItLandsTest ‑ AReplayOfThePendingBuild_PreservesItsMarker
MeshWeaver.Compiler.Pipeline.Test.ALateReleaseIsAdoptedWhenItLandsTest ‑ ASeedReturningThePendingCoordinates_KeepsTheLateReleaseWatch
MeshWeaver.Compiler.Pipeline.Test.ALateReleaseIsAdoptedWhenItLandsTest ‑ Adopt_LeavesTheNodeAlone_ForAnyOtherPath(landed: "")
MeshWeaver.Compiler.Pipeline.Test.ALateReleaseIsAdoptedWhenItLandsTest ‑ Adopt_LeavesTheNodeAlone_ForAnyOtherPath(landed: "T/Release/20260923055426-OtherByt")
MeshWeaver.Compiler.Pipeline.Test.ALateReleaseIsAdoptedWhenItLandsTest ‑ Adopt_LeavesTheNodeAlone_ForAnyOtherPath(landed: "t/release/20260923055416-hd-ifsia")
MeshWeaver.Compiler.Pipeline.Test.ALateReleaseIsAdoptedWhenItLandsTest ‑ Adopt_LeavesTheNodeAlone_WhenALaterSettleClearedTheStamp
…

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Test Results (shard 5)

    4 files  ±    0      4 suites  ±0   9m 33s ⏱️ - 3m 12s
1 550 tests  - 1 175  1 550 ✅  - 1 175  0 💤 ±0  0 ❌ ±0 
1 550 runs   - 1 178  1 550 ✅  - 1 178  0 💤 ±0  0 ❌ ±0 

Results for commit c692bb5. ± Comparison against base commit 174f317.

This pull request removes 1205 and adds 14 tests. Note that renamed tests count towards both.

   --- End of inner exception stack trace ---
   --- End of inner exception stack trace ---, expected: True)
 ---> (Inner Exception #1) MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest+ProviderException (0x80004005): Failed to connect to 10.42.18.4:5432<---
 ---> (Inner Exception #1) System.InvalidOperationException: boom<---
 ---> (Inner Exception #1) System.InvalidOperationException: source B is misconfigured<---
 ---> (Inner Exception #1) System.Net.Sockets.SocketException (0xFFFDFFFF): Name or service not known<---
 ---> MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest+ProviderException (0x80004005): Failed to connect to 10.42.18.4:5432
 ---> System.AggregateException: One or more errors occurred. (Failed to connect to 10.42.18.4:5432)
 ---> System.AggregateException: One or more errors occurred. (Failed to connect to 10.42.18.4:5432) (boom)
…
MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest ‑ Classifies(shape: "a MIXED aggregate — one transient branch, one genu"···, exception: System.AggregateException: One or more errors occurred. (Failed to connect to 10.42.18.4:5432) (source B is misconfigured)
 ---> MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest+ProviderException (0x80004005): Failed to connect to 10.42.18.4:5432
   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) System.InvalidOperationException: source B is misconfigured<---
, expected: False)
MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest ‑ Classifies(shape: "a nested aggregate with one genuine leaf", exception: System.AggregateException: One or more errors occurred. (One or more errors occurred. (Failed to connect to 10.42.18.4:5432) (boom)) (Failed to connect to 10.42.18.4:5432)
 ---> System.AggregateException: One or more errors occurred. (Failed to connect to 10.42.18.4:5432) (boom)
 ---> MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest+ProviderException (0x80004005): Failed to connect to 10.42.18.4:5432
   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) System.InvalidOperationException: boom<---

   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest+ProviderException (0x80004005): Failed to connect to 10.42.18.4:5432<---
, expected: False)
MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest ‑ Classifies(shape: "a nested aggregate, all leaves transient", exception: System.AggregateException: One or more errors occurred. (One or more errors occurred. (Failed to connect to 10.42.18.4:5432)) (Failed to connect to 10.42.18.4:5432)
 ---> System.AggregateException: One or more errors occurred. (Failed to connect to 10.42.18.4:5432)
 ---> MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest+ProviderException (0x80004005): Failed to connect to 10.42.18.4:5432
   --- End of inner exception stack trace ---
   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest+ProviderException (0x80004005): Failed to connect to 10.42.18.4:5432<---
, expected: True)
MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest ‑ Classifies(shape: "a reflective wrapper around a transient cause", exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
 ---> System.Net.Sockets.SocketException (110): Connection timed out
   --- End of inner exception stack trace ---, expected: True)
MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest ‑ Classifies(shape: "a transient cause UNDER an aggregate branch's wrap"···, exception: System.AggregateException: One or more errors occurred. (wrapped)
 ---> System.InvalidOperationException: wrapped
 ---> MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest+ProviderException (0x80004005): Failed to connect to 10.42.18.4:5432
   --- End of inner exception stack trace ---
   --- End of inner exception stack trace ---, expected: True)
MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest ‑ Classifies(shape: "an 'initialization failed' wrapper around a transi"···, exception: System.InvalidOperationException: Hub 'x' initialization failed
 ---> MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest+ProviderException (0x80004005): Failed to connect to 10.42.18.4:5432
   --- End of inner exception stack trace ---, expected: True)
MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest ‑ Classifies(shape: "an aggregate whose branches are ALL transient (two"···, exception: System.AggregateException: One or more errors occurred. (Failed to connect to 10.42.18.4:5432) (Name or service not known)
 ---> MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest+ProviderException (0x80004005): Failed to connect to 10.42.18.4:5432
   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) System.Net.Sockets.SocketException (0xFFFDFFFF): Name or service not known<---
, expected: True)
MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest ‑ Classifies(shape: "the #4067 shape: transient provider fault wrapping"···, exception: MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest+ProviderException (0x80004005): Failed to connect to 10.42.18.4:5432
 ---> System.TimeoutException: Timeout during connection attempt, expected: True)
MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest ‑ Classifies(shape: "the #4068 shape: transient provider fault wrapping"···, exception: MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest+ProviderException (0x80004005): Failed to connect to 10.42.18.4:5432
 ---> System.Net.Sockets.SocketException (0xFFFDFFFF): Name or service not known, expected: True)
MeshWeaver.Testing.InMesh.Test.MeshTestRunnerTests ‑ A_case_that_ignores_its_token_does_not_take_the_next_case_down_with_it
…

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Test Results

    15 files   -   5      15 suites   - 5   40m 29s ⏱️ -34s
10 207 tests  - 280  10 207 ✅  - 87  0 💤  - 193  0 ❌ ±0 
10 220 runs   - 280  10 220 ✅  - 87  0 💤  - 193  0 ❌ ±0 

Results for commit c692bb5. ± Comparison against base commit 174f317.

This pull request removes 317 and adds 19 tests. Note that renamed tests count towards both.

   --- End of inner exception stack trace ---
   --- End of inner exception stack trace ---, expected: True)
   --- End of inner exception stack trace ---, isDenial: True)
 ---> (Inner Exception #1) MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest+ProviderException (0x80004005): Failed to connect to 10.42.18.4:5432<---
 ---> (Inner Exception #1) System.InvalidOperationException: boom<---
 ---> (Inner Exception #1) System.InvalidOperationException: source B is misconfigured<---
 ---> (Inner Exception #1) System.Net.Sockets.SocketException (0xFFFDFFFF): Name or service not known<---
 ---> MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest+ProviderException (0x80004005): Failed to connect to 10.42.18.4:5432
 ---> System.AggregateException: One or more errors occurred. (Failed to connect to 10.42.18.4:5432)
…
Memex.Portal.Shared.Test.InstanceIdRulesMatchTheRegistryTest ‑ TheSetupHostAgreesWithTheRegistry(candidate: "05963f6c-ae6b-4c0b-9f7e-0d4f90864485")
Memex.Portal.Shared.Test.SessionDenialIsAnAnswerTest ‑ OnlyAVerdictReadsAsADenial(shape: "the same verdict nested, as a late denial dispatch"···, failure: System.InvalidOperationException: write failed
 ---> System.UnauthorizedAccessException: Access denied
   --- End of inner exception stack trace ---, isDenial: True)
MeshWeaver.Graph.Test.DurableStreamConsumerTest ‑ ASubscriberThatLeaves_OrphansTheStream
MeshWeaver.Graph.Test.DurableStreamConsumerTest ‑ ConsumersWithoutAStream_StayDormant_UntilAPublishWakesExactlyThatOne
MeshWeaver.Graph.Test.DurableStreamConsumerTest ‑ RecycleOfTheConsumerMidStream_EveryItemIsProcessedExactlyOnceInOrder
MeshWeaver.Graph.Test.DurableStreamConsumerTest ‑ RecycleOfTheStreamHub_TheSequenceContinuesFromTheNodes
MeshWeaver.Graph.Test.DurableStreamConsumerTest ‑ TakeoverAfterTheSubscriberDies_ResumesAfterItsAcknowledgedItems
MeshWeaver.Graph.Test.DurableStreamConsumerTest ‑ TheStreamNodeCarriesTheCheckpoint_AndEveryItemIsANode
MeshWeaver.Graph.Test.DurableStreamConsumerTest ‑ TwoRacingSubscribers_EveryItemIsProcessedExactlyOnce
MeshWeaver.Hosting.Orleans.Test.OrleansDurableStreamConsumerTest ‑ RecycleOfAGrainHostedConsumerMidStream_EveryItemIsProcessedExactlyOnceInOrder
…

♻️ This comment has been updated with latest results.

rbuergi and others added 2 commits October 3, 2026 14:57
… period

A stream with a producer and no consumer (or an owner whose NodeType carries no
consumer) read its owner on every append. The wake now happens once per orphan
period; granting or releasing a lease starts a new one.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
# Conflicts:
#	src/MeshWeaver.Mesh.Contract/SatelliteTableMapping.cs
@rbuergi

rbuergi commented Oct 3, 2026

Copy link
Copy Markdown
Contributor Author

Shard 5 red is an unrelated flake, not this diff. It is PolymorphicResolverAllocationTest.UnrelatedRegistryEntries_DoNotAllocateAClosurePerCandidate (Messaging.Hub.Test): 44,762 B for 512 candidates, against a budget of < 1024.

I have re-run the failed jobs.

# Conflicts:
#	src/MeshWeaver.Mesh.Contract/SatelliteTableMapping.cs
@systemorph-com

systemorph-com Bot commented Oct 3, 2026

Copy link
Copy Markdown
Contributor

🩹 PR babysitter (build instance) is re-running the failed jobs of run(s) 37139221887 on head c692bb53caa7 — once per head, never again for this commit.

Why: inherited from its base 'main': 4 pull requests of Systemorph/MeshWeaver fail identically — 'lane / Automatic review answered' concluded failure: Process completed with exit code 1. — the base 'main' moved from 174f317 (what the red run tested) to 1bafcb2.

Validated: Base-red, not this diff: 4 pull requests of Systemorph/MeshWeaver fail identically on 'lane / Automatic review answered' concluded failure: Process completed with exit code 1 (same check, same words), and the base 'main' the red run tested has since moved from 174f317 to 1bafcb2 — both commits in the proposal's evidence. Approving the update-branch: it merges the moved base into the branch and re-runs run 37139221887 against it, which drains the base's red rather than re-testing the old merge commit. No prior heals on this head.

It does not merge, push or dequeue. A red after this re-run is left for the owner (rbuergi).

@meshweaver-cloud
meshweaver-cloud Bot merged commit 014bf33 into main Oct 3, 2026
@rbuergi
rbuergi deleted the feat/durable-streams branch October 10, 2026 13:10
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.

1 participant