Skip to content

fix(modules): a module type is served from the modules wherever it is asked — provider catalogs and chat-client factories reach MeshWeaver.AI (reviews down) - #6206

Merged
rbuergi merged 1 commit into
mainfrom
fix/module-contributions-cross-container
Oct 6, 2026
Merged

rbuergi merged 1 commit into
mainfrom
fix/module-contributions-cross-container

Conversation

@rbuergi

@rbuergi rbuergi commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Why (sev:B: PR reviews are down fleet-wide)

Since #6127, each module's services run in their own container. A type that a module declares was served only inside that module's container. On memex.systemorph.com (the control instance) every replica's Provider import has listed only the 9 platform nodes since 07:10Z. Provider/OpenRouterEU had 0 models, the control logged "No IChatClientFactory is registered", and the review lane had no model.

There are three defects, and all three are reproduced in ModuleContributionsCrossContainersTest. It runs two real Roslyn-emitted modules in a real mesh: a hub module shaped like MeshWeaver.AI and a provider module shaped like MeshWeaver.AI.OpenAI.

  1. A dependent module's registrations never reach the module that declares the type. A provider module registers MeshWeaver.AI's LanguageModelCatalogSource and IChatClientFactory. Those registrations went into the root as forwarders. The AI container's fallback refuses to ask the root about its own types. A root DispatchProxy over a collectible interface cannot even be constructed: A non-collectible assembly may not reference a collectible assembly.
  2. The root (the mesh hub) cannot resolve any module-declared type. Every provider factory reads ChatClientCredentialResolver and the catalog through Hub.ServiceProvider, which is the mesh hub.
  3. A dependent module's container cannot resolve its dependency's services.

Fix (core)

  • New ModuleServiceRoute.Contributed route. It covers a registration of a type that another module declares. Such a registration is never placed in the root.
  • ModuleServices.RegistrationsElsewhere. For a type a module declares, it returns that module's own registrations (via ResolveAt, one per registration), followed by every contribution from other modules, all from the current generations.
  • The root serves module types through ModuleOwnedRootSource. It is registered on the root by SetupModules. The mesh hub and every per-node hub are scopes under the root, so they all see these types. This replaces the per-node AddModuleOwned forwarders, which it covers.
  • Other module containers are served through ModuleFallbackSource.
  • Docs: LiveModuleUpdate.md → "Root services" is updated.

Evidence

  • ModuleContributionsCrossContainersTest has 4 tests: the declaring module's list, the mesh hub, a per-node hub, and a dependent resolving its dependency. Negative control: on the code before this PR all 4 fail. The first one fails with Expected {"hub"} to equal {"hub","OpenRouter","OpenRouterEU"}.
  • All 175 Module* tests in MeshWeaver.Compiler.Pipeline.Test pass. That includes ModuleRootServicesSwapTest, which checks that generation N is actually collected after a swap, and ModuleServicesKeepEveryRegistrationTest.
  • Memex.Portal.Shared.Test Module* tests: 431/431. MeshWeaver.Hosting.Test Module*/StaticNodePrecedence tests: 10/10.
  • Plugins' MeshWeaver.AI.Test (2700), MeshWeaver.AI.OpenAI.Test (135) and MeshWeaver.AI.Anthropic.Test (28) are all green against this branch.
  • Release -warnaserror build is clean for ServiceProvider, Mesh.Contract, Compiler.Pipeline.Test, Hosting.Test and Portal.Shared.Test.

Pairs-with: none — this PR removes no public type or member (only the internal ModuleServiceForwarding.AddModuleOwned). It adds ModuleServiceRoute.Contributed, ModuleOwnedRootSource, ModuleServices.RegistrationsElsewhere/IsOwnedByAnotherModule, ModuleServiceProvider.StandIns and a Create overload. No interface members are added.

There is a companion Plugins PR, which can land in either order. It registers each catalog source as its own registration (the old pattern found the shared LanguageModelCatalogOptions singleton and appended to it, which cannot cross containers). It also takes Kimi out of the review lane's fallback tier.

After deploy (memex / control)

The Provider import runs at boot, so a roll/restart of the control instance is required. After that, recycle Provider/OpenRouterEU and Provider/OpenRouter if they still list 0 models.

🤖 Generated with Claude Code

… asked — provider contributions reach MeshWeaver.AI, the mesh hub and dependents

Since #6127 each module's services live in a container of their own, and a type a
module DECLARES was served only inside that container:

- a dependent module's registrations of it (every AI provider's LanguageModelCatalogSource /
  IChatClientFactory) went to the root as forwarders the declaring module never consulted —
  and a root DispatchProxy over a collectible interface cannot even be built;
- the root (mesh hub) and other module containers could not resolve it at all.

On the control instance the Provider import listed only platform nodes, Provider/OpenRouterEU
had 0 models, "No IChatClientFactory is registered", and every PR review stopped.

Now: a registration of another module's type routes Contributed (never into the root);
ModuleServices.RegistrationsElsewhere answers a module type with the declaring module's
registrations plus every contribution; the root serves it through ModuleOwnedRootSource
(replacing the per-node forwarders, which it subsumes) and other module containers through
ModuleFallbackSource. ModuleContributionsCrossContainersTest pins four directions; all four
fail on the previous code.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@meshweaver-cloud
meshweaver-cloud Bot enabled auto-merge October 6, 2026 18:17
@systemorph-com
systemorph-com Bot disabled auto-merge October 6, 2026 18:18
@github-actions

github-actions Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Test Results

    22 files  ±0      22 suites  ±0   43m 56s ⏱️ - 1m 24s
10 856 tests +4  10 663 ✅ +4  193 💤 ±0  0 ❌ ±0 
10 869 runs  +4  10 676 ✅ +4  193 💤 ±0  0 ❌ ±0 

Results for commit 456b994. ± Comparison against base commit b437e46.

This pull request removes 40 and adds 20 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.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.<---
 ---> (Inner Exception #1) MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest+ProviderException (0x80004005): Failed to connect to 10.42.18.4:5432<---
 ---> (Inner Exception #1) System.ArgumentException: Value does not fall within the expected range.<---
 ---> (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<---
…
Memex.Portal.Shared.Test.InstanceIdRulesMatchTheRegistryTest ‑ TheSetupHostAgreesWithTheRegistry(candidate: "afbcbcc3-2ff5-45b8-b883-c7993c168ed3")
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.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "a stall as an aggregate's FIRST member", fault: System.AggregateException: One or more errors occurred. (Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.)
 ---> MeshWeaver.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.
   --- End of inner exception stack trace ---, expected: True)
MeshWeaver.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "a stall as an aggregate's SECOND member", fault: System.AggregateException: One or more errors occurred. (The operation has timed out.) (Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.)
 ---> System.TimeoutException: The operation has timed out.
   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) MeshWeaver.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.<---
, expected: True)
MeshWeaver.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "a stall nested in an aggregate inside a wrapper", fault: System.InvalidOperationException: outer
 ---> System.AggregateException: One or more errors occurred. (Value does not fall within the expected range.) (Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.)
 ---> System.ArgumentException: Value does not fall within the expected range.
   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) MeshWeaver.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.<---

   --- End of inner exception stack trace ---, expected: True)
MeshWeaver.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "a stall wrapped as InnerException", fault: System.InvalidOperationException: outer
 ---> MeshWeaver.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.
   --- End of inner exception stack trace ---, expected: True)
MeshWeaver.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "an aggregate of unrelated faults", fault: System.AggregateException: One or more errors occurred. (The operation has timed out.) (Value does not fall within the expected range.)
 ---> System.TimeoutException: The operation has timed out.
   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) System.ArgumentException: Value does not fall within the expected range.<---
, expected: False)
MeshWeaver.Graph.Test.ModuleContributionsCrossContainersTest ‑ ADependentModule_ResolvesItsDependencysService
MeshWeaver.Graph.Test.ModuleContributionsCrossContainersTest ‑ AModuleService_SeesTheRegistrationsADependentModuleContributes
MeshWeaver.Graph.Test.ModuleContributionsCrossContainersTest ‑ APerNodeHub_SeesTheContributedRegistrations_AndTheDeclaringModulesDefault
…

♻️ This comment has been updated with latest results.

@systemorph-com systemorph-com Bot added the thread:pr-systemorph-meshweaver-6206-ea92de https://memex.systemorph.com/Hosting/Triage/_Thread/pr-systemorph-meshweaver-6206 label Oct 6, 2026
@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Test Results (shard 0)

  3 files  ±0    3 suites  ±0   3m 48s ⏱️ -7s
566 tests ±0  375 ✅ ±0  191 💤 ±0  0 ❌ ±0 
570 runs  ±0  379 ✅ ±0  191 💤 ±0  0 ❌ ±0 

Results for commit 456b994. ± Comparison against base commit b437e46.

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Test Results (shard 2)

    5 files  ±0      5 suites  ±0   3m 33s ⏱️ +14s
1 273 tests ±0  1 273 ✅ ±0  0 💤 ±0  0 ❌ ±0 
1 274 runs  ±0  1 274 ✅ ±0  0 💤 ±0  0 ❌ ±0 

Results for commit 456b994. ± Comparison against base commit b437e46.

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Test Results (shard 3)

2 339 tests  ±0   2 339 ✅ ±0   5m 49s ⏱️ -30s
    4 suites ±0       0 💤 ±0 
    4 files   ±0       0 ❌ ±0 

Results for commit 456b994. ± Comparison against base commit b437e46.

This pull request removes 3 and adds 1 tests. Note that renamed tests count towards both.
   --- End of inner exception stack trace ---, isDenial: True)
 ---> System.UnauthorizedAccessException: Access denied
Memex.Portal.Shared.Test.SessionDenialIsAnAnswerTest ‑ OnlyAVerdictReadsAsADenial(shape: "the same verdict nested, as a late denial dispatch"···, failure: System.InvalidOperationException: write failed
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)

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Test Results (shard 1)

1 764 tests  ±0   1 762 ✅ ±0   5m 53s ⏱️ -7s
    4 suites ±0       2 💤 ±0 
    4 files   ±0       0 ❌ ±0 

Results for commit 456b994. ± Comparison against base commit b437e46.

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Test Results (shard 5)

    2 files  ±0      2 suites  ±0   8m 43s ⏱️ -6s
1 110 tests ±0  1 110 ✅ ±0  0 💤 ±0  0 ❌ ±0 
1 111 runs  ±0  1 111 ✅ ±0  0 💤 ±0  0 ❌ ±0 

Results for commit 456b994. ± Comparison against base commit b437e46.

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Test Results (shard 4)

    4 files  ±0      4 suites  ±0   16m 8s ⏱️ -47s
3 804 tests +4  3 804 ✅ +4  0 💤 ±0  0 ❌ ±0 
3 811 runs  +4  3 811 ✅ +4  0 💤 ±0  0 ❌ ±0 

Results for commit 456b994. ± Comparison against base commit b437e46.

This pull request removes 37 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)
 ---> (Inner Exception #1) MeshWeaver.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.<---
 ---> (Inner Exception #1) MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest+ProviderException (0x80004005): Failed to connect to 10.42.18.4:5432<---
 ---> (Inner Exception #1) System.ArgumentException: Value does not fall within the expected range.<---
 ---> (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.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.
…
Memex.Portal.Shared.Test.InstanceIdRulesMatchTheRegistryTest ‑ TheSetupHostAgreesWithTheRegistry(candidate: "afbcbcc3-2ff5-45b8-b883-c7993c168ed3")
MeshWeaver.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "a stall as an aggregate's FIRST member", fault: System.AggregateException: One or more errors occurred. (Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.)
 ---> MeshWeaver.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.
   --- End of inner exception stack trace ---, expected: True)
MeshWeaver.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "a stall as an aggregate's SECOND member", fault: System.AggregateException: One or more errors occurred. (The operation has timed out.) (Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.)
 ---> System.TimeoutException: The operation has timed out.
   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) MeshWeaver.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.<---
, expected: True)
MeshWeaver.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "a stall nested in an aggregate inside a wrapper", fault: System.InvalidOperationException: outer
 ---> System.AggregateException: One or more errors occurred. (Value does not fall within the expected range.) (Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.)
 ---> System.ArgumentException: Value does not fall within the expected range.
   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) MeshWeaver.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.<---

   --- End of inner exception stack trace ---, expected: True)
MeshWeaver.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "a stall wrapped as InnerException", fault: System.InvalidOperationException: outer
 ---> MeshWeaver.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.
   --- End of inner exception stack trace ---, expected: True)
MeshWeaver.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "an aggregate of unrelated faults", fault: System.AggregateException: One or more errors occurred. (The operation has timed out.) (Value does not fall within the expected range.)
 ---> System.TimeoutException: The operation has timed out.
   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) System.ArgumentException: Value does not fall within the expected range.<---
, expected: False)
MeshWeaver.Graph.Test.ModuleContributionsCrossContainersTest ‑ ADependentModule_ResolvesItsDependencysService
MeshWeaver.Graph.Test.ModuleContributionsCrossContainersTest ‑ AModuleService_SeesTheRegistrationsADependentModuleContributes
MeshWeaver.Graph.Test.ModuleContributionsCrossContainersTest ‑ APerNodeHub_SeesTheContributedRegistrations_AndTheDeclaringModulesDefault
MeshWeaver.Graph.Test.ModuleContributionsCrossContainersTest ‑ TheMeshHub_SeesAModuleTypesWholeList
…

@rbuergi
rbuergi merged commit 15ded28 into main Oct 6, 2026
62 of 68 checks passed
rbuergi added a commit that referenced this pull request Oct 6, 2026
Conflicts with #6202/#6206 (module types served from the modules wherever asked):
- ModuleServiceForwarders.AddModuleOwned: main replaced the per-node forwarders with
  ModuleOwnedRootSource; this branch had taught them keyed registrations. Taken main's
  deletion and carried the keyed half into the root source: a KeyedService for a type a
  module declares is answered by key (ModuleServices.KeyedRegistrationsElsewhere).
- ModuleServices.Scope: Contributed joins the index-keyed routes, and a keyed registration
  keeps its own key on every route (both intents).
- RegistrationsElsewhere never counts a keyed registration among a type's unkeyed positions
  (ResolveAt would point past the end) nor serves a keyed contribution as an unkeyed one.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@rbuergi
rbuergi deleted the fix/module-contributions-cross-container 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

thread:pr-systemorph-meshweaver-6206-ea92de https://memex.systemorph.com/Hosting/Triage/_Thread/pr-systemorph-meshweaver-6206

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant