Skip to content

feat(modules): all remaining flippable service modules leave the host build graph (#1644 step 2, task #66) - #1681

Merged
rbuergi merged 9 commits into
mainfrom
feat/flip-all-service-modules
Aug 16, 2026
Merged

rbuergi merged 9 commits into
mainfrom
feat/flip-all-service-modules

Conversation

@rbuergi

@rbuergi rbuergi commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

What

#1644 step 2, task #66: every remaining SERVICE-ONLY module whose activation already rides Modules:Assemblies is flipped off the host's ships-the-bits ProjectReference and onto the modules/<Name>/ closure lane in memex/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 sequence
  • MeshWeaver.Notifications.Channels — host never compiled against it (comments only); triage watcher self-skips unless Email:Enabled
  • MeshWeaver.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 stays Modules:Assemblies → each pack's MeshNodeProviderAttribute.

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.cs compiles against ISpeechTranscriber, which lives in the module assembly; there is no MeshWeaver.Speech.Contract. A contract split is a separate design change, not a flip.
  • MeshWeaver.Social — Memex.Portal.Shared/Social/ApiCredentialNodeType.cs compiles against PlatformCredential, and SocialModuleAttribute'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 line app.UseMeshWeaverGrpcWebWhenInstalled() (defined in the module assembly): middleware must run between UseRouting and the endpoint maps and cannot ride MeshEndpointProviderAttribute (documented in GrpcHostingExtensions). 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 -warnaserror clean (0 warnings, 0 errors) after every flip and at the end.
  • Monolith Release build lays out bin/Release/net10.0/modules/<Name>/<Name>.dll for all 8 flipped modules; the app root no longer carries the flipped DLLs. Private deps landed as designed: AzureFoundry keeps Azure.AI.Agents.Persistent/Microsoft.Agents.AI.AzureAI.Persistent/Microsoft.Extensions.AI.AzureAIInference, ClaudeCode keeps ClaudeAgentSdk, Copilot keeps GitHub.Copilot.SDK; OpenAI keeps none (its SDK closure still rides the app via MeshWeaver.AI).
  • Tests (Release, fresh .trx each): Memex.Portal.Shared.Test 367/367 passed; MeshWeaver.AI.Test 1150 passed / 5 skipped / 0 failed; MeshWeaver.Hosting.Monolith.Test filtered AgentPickerProjectionTest 6/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

rbuergi and others added 9 commits August 16, 2026 14:14
…/ 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>
Copilot AI lite review requested due to automatic review settings August 16, 2026 15:40

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.

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 MeshModuleClosure lane so they ship via modules/<Name>/.
  • Removed corresponding ProjectReferences from Memex.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.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 5)

1 371 tests   1 370 ✅  4m 47s ⏱️
   11 suites      1 💤
   11 files        0 ❌

Results for commit b9efbf7.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 0)

919 tests   918 ✅  11m 13s ⏱️
 10 suites    1 💤
 10 files      0 ❌

Results for commit b9efbf7.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 4)

1 604 tests   1 598 ✅  6m 58s ⏱️
   11 suites      6 💤
   11 files        0 ❌

Results for commit b9efbf7.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 3)

   11 files     11 suites   6m 2s ⏱️
2 197 tests 2 006 ✅ 191 💤 0 ❌
2 563 runs  2 372 ✅ 191 💤 0 ❌

Results for commit b9efbf7.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 1)

2 148 tests   2 045 ✅  6m 55s ⏱️
   11 suites    103 💤
   11 files        0 ❌

Results for commit b9efbf7.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 2)

2 440 tests   2 436 ✅  8m 19s ⏱️
   11 suites      4 💤
   11 files        0 ❌

Results for commit b9efbf7.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results

    65 files      65 suites   44m 16s ⏱️
10 679 tests 10 373 ✅ 306 💤 0 ❌
11 045 runs  10 739 ✅ 306 💤 0 ❌

Results for commit b9efbf7.

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