Repository navigation
feat(modules): all remaining flippable service modules leave the host build graph (#1644 step 2, task #66) - #1681
Conversation
…/ closure (#1644 step 2) Memex.Portal.Shared drops the MeshWeaver.OgCard ProjectReference; the targets entry moves to the closure lane. Measured on a Monolith Release publish: modules/MeshWeaver.OgCard/ carries dll+pdb+xml+deps.json only — private deps: none (its whole closure, MeshWeaver.Graph, still rides the app). Memex.Portal.Shared.Test references the module directly now (OgCardModuleTest anchors the real DLL). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tays, engine ships via modules/ (#1644 step 2) Memex.Portal.Shared swaps its MeshWeaver.Observability ProjectReference for MeshWeaver.Observability.Contract — LogIncidentEndpoints compiles against the contract (ILogIncidentIngest / LogWatchOptions / LogIncidentReport) and already resolves the ingest seam optionally (503 when the module is delisted). The engine's targets entry moves to the closure lane. Measured on a Monolith Release publish: modules/MeshWeaver.Observability/ carries dll+pdb+xml+deps.json only — private deps: none (AI/GitSync/Graph/Contract all ride the app); MeshWeaver.Observability.Contract.dll stays in the app root as intended. Memex.Portal.Shared.Test references the engine directly (ModuleLaneSwitchTest anchors LogIncidentIngestService). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… build graph (#1644 step 2) Memex.Portal.Shared drops the ProjectReference; the targets entry moves to the closure lane. Measured on a Monolith Release publish: modules/MeshWeaver.ContentCollections.Indexing.PostgreSql/ carries dll+pdb+xml+deps.json only — private deps: none (Npgsql and Pgvector still ride the app via MeshWeaver.Hosting.PostgreSql; the Indexing core + Graph adapter stay referenced by the host). Activation stays Modules:Assemblies -> PostgresContentIndexingModuleAttribute with its enabledWhen DB gate. Its own test project already references it directly - no test csproj changes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
step 2) Memex.Portal.Shared drops the ProjectReference; the targets entry moves to the closure lane. The host never compiled against the assembly (only comments mention it) — activation stays Modules:Assemblies -> NotificationChannelsModuleAttribute, and the triage watcher self-skips unless Email:Enabled. Memex.Portal.Shared.Test references the module directly (NotificationChannelsModuleTest anchors the real DLL). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Memex.Portal.Shared drops the ships-the-bits ProjectReference (its own comment named this hard decoupling as the follow-up once the modules/ publish step existed — it does now); the targets entry moves to the closure lane. The composition root carries no provider type references — activation stays Modules:Assemblies -> the pack's MeshNodeProviderAttribute. Memex.Portal.Shared.Test references the pack directly (SpeechModuleTest / OpenAICompatibleModelSyncTest compile against OpenAICompatibleModelSync and use its internals via the existing InternalsVisibleTo). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…p 2) Memex.Portal.Shared drops the ships-the-bits ProjectReference; the targets entry moves to the closure lane. The composition root carries no provider type references — activation stays Modules:Assemblies -> the pack's MeshNodeProviderAttribute. MeshWeaver.Hosting.Monolith.Test references the pack directly (AgentPickerProjectionTest compiled against it through the host's closure until now). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Memex.Portal.Shared drops the ships-the-bits ProjectReference; the targets entry moves to the closure lane. The composition root carries no provider type references — activation stays Modules:Assemblies -> the pack's MeshNodeProviderAttribute. MeshWeaver.AI.Test already references the pack directly — no test csproj changes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ider packs now ship via modules/ (#1644 step 2) Memex.Portal.Shared drops the last ships-the-bits provider-pack ProjectReference; the targets entry moves to the closure lane and the csproj comment collapses to one block covering all four packs. Activation stays Modules:Assemblies -> each pack's MeshNodeProviderAttribute. MeshWeaver.AI.Test references the pack directly (its Copilot harness/boot tests compiled against it through Memex.Portal.Shared's closure until now). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR continues the #1644 “modules/ publish layout” migration by removing the remaining service-only module “ships-the-bits” ProjectReferences from Memex.Portal.Shared and instead publishing those modules via the modules/<Name>/ closure lane in memex/MeshModulesPublish.targets, while updating affected test projects to reference the flipped modules directly.
Changes:
- Moved the remaining flipped service modules (incl. AI provider packs, OgCard, Observability, Notifications.Channels, ContentCollections.Indexing.PostgreSql) into the
MeshModuleClosurelane so they ship viamodules/<Name>/. - Removed corresponding
ProjectReferences fromMemex.Portal.Shared(keeping only required contracts, e.g.MeshWeaver.Observability.Contract). - Updated test projects to add direct
ProjectReferences to flipped modules where tests compile against them.
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| test/MeshWeaver.Hosting.Monolith.Test/MeshWeaver.Hosting.Monolith.Test.csproj | Adds a direct reference to MeshWeaver.AI.AzureFoundry so tests compiling against it don’t rely on the host closure. |
| test/MeshWeaver.AI.Test/MeshWeaver.AI.Test.csproj | Adds a direct reference to MeshWeaver.AI.Copilot for harness/boot tests after the module left the host closure. |
| test/Memex.Portal.Shared.Test/Memex.Portal.Shared.Test.csproj | Adds direct references to flipped modules so module-layout tests can anchor the real module DLLs. |
| memex/MeshModulesPublish.targets | Moves the flipped modules into MeshModuleClosure so they publish into modules/<Name>/ (and are laid out after Build for dotnet run). |
| memex/Memex.Portal.Shared/Memex.Portal.Shared.csproj | Removes “ships-the-bits” references for flipped modules and keeps only necessary compile-time dependencies (e.g., MeshWeaver.Observability.Contract). |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Test Results (shard 5)1 371 tests 1 370 ✅ 4m 47s ⏱️ Results for commit b9efbf7. |
Test Results (shard 0)919 tests 918 ✅ 11m 13s ⏱️ Results for commit b9efbf7. |
Test Results (shard 4)1 604 tests 1 598 ✅ 6m 58s ⏱️ Results for commit b9efbf7. |
Test Results (shard 3) 11 files 11 suites 6m 2s ⏱️ Results for commit b9efbf7. |
Test Results (shard 1)2 148 tests 2 045 ✅ 6m 55s ⏱️ Results for commit b9efbf7. |
Test Results (shard 2)2 440 tests 2 436 ✅ 8m 19s ⏱️ Results for commit b9efbf7. |
Test Results 65 files 65 suites 44m 16s ⏱️ Results for commit b9efbf7. |
What
#1644 step 2, task #66: every remaining SERVICE-ONLY module whose activation already rides
Modules:Assembliesis flipped off the host's ships-the-bits ProjectReference and onto themodules/<Name>/closure lane inmemex/MeshModulesPublish.targets. One commit per module:Flipped (8 total on this branch)
MeshWeaver.OgCard,MeshWeaver.Observability(engine; contract stays),MeshWeaver.ContentCollections.Indexing.PostgreSql— the three flips from the first part of this sequenceMeshWeaver.Notifications.Channels— host never compiled against it (comments only); triage watcher self-skips unlessEmail:EnabledMeshWeaver.AI.OpenAI,MeshWeaver.AI.AzureFoundry,MeshWeaver.AI.ClaudeCode,MeshWeaver.AI.Copilot— the four provider packs. Their csproj comment named exactly this hard decoupling as the follow-up "once that publish step exists"; it exists now. The composition root carries no provider type references; activation staysModules:Assemblies→ each pack'sMeshNodeProviderAttribute.Test projects that compiled against a flipped module through the host's closure now reference it directly:
Memex.Portal.Shared.Test(+Notifications.Channels, +AI.OpenAI),MeshWeaver.Hosting.Monolith.Test(+AI.AzureFoundry for AgentPickerProjectionTest),MeshWeaver.AI.Test(+AI.Copilot).Not flipped — real compile-time coupling in the host, per the "do not force it" rule:
MeshWeaver.Speech—Memex.Portal.Shared/Api/SpeechEndpoints.cscompiles againstISpeechTranscriber, which lives in the module assembly; there is noMeshWeaver.Speech.Contract. A contract split is a separate design change, not a flip.MeshWeaver.Social—Memex.Portal.Shared/Social/ApiCredentialNodeType.cscompiles againstPlatformCredential, andSocialModuleAttribute's own docs say the ApiCredential node-type registration deliberately stays host-side so existing credential nodes survive module delisting.MeshWeaver.Hosting.Grpc— the host keeps the one compiled middleware lineapp.UseMeshWeaverGrpcWebWhenInstalled()(defined in the module assembly): middleware must run betweenUseRoutingand the endpoint maps and cannot rideMeshEndpointProviderAttribute(documented inGrpcHostingExtensions). Middleware-order coupling — the exact not-flippable category.View packs (Blazor.*) are out of scope — task #67.
Verification
Memex.Portal.Shared,Memex.Portal.Monolith,Memex.Portal.Distributed:-c Release -warnaserrorclean (0 warnings, 0 errors) after every flip and at the end.bin/Release/net10.0/modules/<Name>/<Name>.dllfor all 8 flipped modules; the app root no longer carries the flipped DLLs. Private deps landed as designed: AzureFoundry keepsAzure.AI.Agents.Persistent/Microsoft.Agents.AI.AzureAI.Persistent/Microsoft.Extensions.AI.AzureAIInference, ClaudeCode keepsClaudeAgentSdk, Copilot keepsGitHub.Copilot.SDK; OpenAI keeps none (its SDK closure still rides the app viaMeshWeaver.AI).Memex.Portal.Shared.Test367/367 passed;MeshWeaver.AI.Test1150 passed / 5 skipped / 0 failed;MeshWeaver.Hosting.Monolith.TestfilteredAgentPickerProjectionTest6/6 passed.No What's New entry: pure-internal build-graph/publish-layout change with no user-visible effect.
Refs #1644.
🤖 Generated with Claude Code