Skip to content

MeshWeaver.AI leaves core; Application.Styles folds into Domain (#2276) - #2568

Closed
rbuergi wants to merge 7 commits into
mainfrom
feat/2276-ai-leaves-core
Closed

rbuergi wants to merge 7 commits into
mainfrom
feat/2276-ai-leaves-core

Conversation

@rbuergi

@rbuergi rbuergi commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

MeshWeaver.AI is gone from this repo

Engine, tests and embedded content all live in MeshWeaver.Plugins now. Core: 44 → 41 src projects.

🚨 Merge Systemorph/MeshWeaver.Plugins#786 FIRST. It is the additive half; this is the deletion.

Deleted

src/MeshWeaver.AI (166 files) · src/MeshWeaver.AI.Orleans.TestBase · test/MeshWeaver.AI.Test ·
test/MeshWeaver.AI.Test.FakeCli · test/MeshWeaver.Threading.Test (40 of its 42 files were AI
tests under a threading name) · content/ai (35 Agent/Skill nodes the engine globbed at build
time) · plus the 35 AI-bound tests inside Hosting.Orleans.Test (27), Query.Test (6) and
Documentation.Test (2).

The knot, and why it mostly wasn't one

Core's ~51 Orleans tests that never touch an agent inherited OrleansTestBase /
SharedOrleansFixture, which lived in the AI assembly. Measured rather than assumed:

apparent coupling actual
OrleansTestBase wires an IChatClientFactory a using + 2 doc crefs — RegisterChatClientFactory has an empty body
ConfigurePortalMesh "production-like portal mesh" AI-free but for one .AddAI()
seed provider agents + threads splits cleanly: TestUser/access are AI-free
SharedOrleansFixture — the only genuine one — owns SwappableChatClientFactory

Hosting.Orleans.TestBase now holds the machinery with five neutral hooks —
SiloConfiguratorType, ClientConfiguratorType, CreateFixture, ConfigureClient, and
ConfigurePortalMesh(extra) — and Plugins plugs the AI rig in.

🚨 The one that cost the most: the CLIENT mesh is a separate player

The fixture wires two configurators. Tests post CreateNodeRequest at
Fixture.ClientMesh.Address, so the node-type check runs on the client mesh, not the silo.
A silo-only hook left it refusing NodeType 'ModelProvider' is not registered — an error that
names the type and never the hub, so it reads as a missing AddAI() on the silo. Both
configurators call ConfigurePortalMesh(), so one hook covers half the rig silently.

The fixture stays non-generic: Orleans accepts configurator type names
(TestClusterOptions.{Silo,Client}BuilderConfiguratorTypes), so a virtual Type does the job with
plain inheritance and no call-site churn.

Application.Styles folds into Domain

4 files — 2,363 generated icon factory methods plus 67 lines of custom icons, no logic. It could
not move out: core's Layout, Graph (25 files), Mesh.Contract, Kernel.Hub, Compiler and
PluginCatalog all use it. The namespace is preserved inside Domain, so every
using MeshWeaver.Application.Styles call site is untouched.

Identity flip

ContentSurfaceAssemblies drops Application.Styles → 29 entries. Every satellite re-bakes on
this, which is exactly why it is batched with the AI removal instead of shipping as two flips.

The gate

No modules/MeshWeaver.AI is laid any more — this repo cannot build it. TesterModules.ImageShipped
is empty and a node repo mounts its own build through the module flag (#2541), which the bake
composes too (#2565). The module-composition guard used to bind AI and would have silently stopped
asserting anything
the moment the engine left; it now compiles its own throwaway probe assembly.

using MeshWeaver.AI; survives in six files and is correct: IProviderKeyProtector and friends
keep their original namespace while living in Mesh.Contract via #2398 type-forwarders.

Verification

  • core Orleans 168/168, plugins AI Orleans 48/48
  • Domain, Layout, GitSync, Compiler, PluginTester, Orleans.Test, Query.Test, Documentation.Test,
    PluginTester.Test all Release + -warnaserror clean

🤖 Generated with Claude Code

rbuergi and others added 3 commits August 28, 2026 07:59
Complete and verified in this tree:
• src/MeshWeaver.AI, AI.Orleans.TestBase, AI.Test, AI.Test.FakeCli, Threading.Test, content/ai deleted
• the 35 AI-bound tests removed from Hosting.Orleans.Test / Query.Test / Documentation.Test
  (they land in MeshWeaver.Plugins#786)
• MeshWeaver.Application.Styles FOLDED into MeshWeaver.Domain — namespace preserved, so every
  'using MeshWeaver.Application.Styles' call site is unchanged; Domain/Layout/GitSync/Compiler and
  PluginTester all build Release+warnaserror clean
• ContentSurfaceAssemblies drops Application.Styles (29 entries) — the intended identity flip
• PluginTester stops laying modules/MeshWeaver.AI (core cannot build it any more); TesterModules.
  ImageShipped is now empty and node repos mount their own build via the module flag (#2541/#2565)
• slnx + shard-assign weights cleaned

NOT DONE — why this does not build yet:
core's ~51 NON-AI Orleans tests inherit OrleansTestBase / SharedOrleansFixture, which live in
AI.Orleans.TestBase. OrleansTestBase is trivially freeable (a using + two doc crefs; its
RegisterChatClientFactory hook has an EMPTY body and takes IServiceCollection). SharedOrleansFixture
is not: it owns SwappableChatClientFactory : IChatClientFactory and registers it into the silo.
Freeing it means giving core's fixture a neutral 'extra silo services' hook and subclassing it in
plugins — across repos, through an xUnit collection fixture matched by TYPE. That is a design task,
not a move, and doing it hastily risks exactly the shared-fixture breakage that shows up only under
load.
The engine, its tests and the content it embeds are gone from this repo — they live in
MeshWeaver.Plugins. Core is 41 src projects, down from 44.

DELETED: src/MeshWeaver.AI (166 files), src/MeshWeaver.AI.Orleans.TestBase,
test/MeshWeaver.AI.Test, test/MeshWeaver.AI.Test.FakeCli, test/MeshWeaver.Threading.Test (40 of its
42 files were AI tests under a threading name) and content/ai (35 Agent/Skill nodes the engine
globbed at build time). Plus the 35 AI-bound tests that lived in Hosting.Orleans.Test (27),
Query.Test (6) and Documentation.Test (2).

THE KNOT, and why it is not one: core's ~51 Orleans tests that never touch an agent inherited
OrleansTestBase / SharedOrleansFixture, which lived in the AI assembly. It looked like deep
coupling and mostly was not — OrleansTestBase's RegisterChatClientFactory hook has an EMPTY body
and takes IServiceCollection, so its only AI content was a using and two doc crefs;
ConfigurePortalMesh was AI-free but for one .AddAI(); the seeds split cleanly (TestUser and its
access grant are AI-free, the Agent node and cold-start thread are not). Only SharedOrleansFixture
genuinely owned an AI type. Hosting.Orleans.TestBase now holds the machinery with four neutral
hooks — SiloConfiguratorType, CreateFixture, ConfigureClient, and ConfigurePortalMesh's `extra` —
and MeshWeaver.Plugins plugs the AI rig into them.

🚨 The fixture stays NON-generic on purpose. Parameterising it by configurator forced awkward
cross-repo generics on every test base; Orleans accepts configurator TYPE NAMES
(TestClusterOptions.SiloBuilderConfiguratorTypes), so a virtual Type property does the same job
with plain inheritance and no call site changes.

APPLICATION.STYLES folds into MeshWeaver.Domain. It is 4 files — 2,363 GENERATED icon factory
methods plus 67 lines of custom icons, no logic — but it could not move OUT: core's Layout, Graph
(25 files), Mesh.Contract, Kernel.Hub, Compiler and PluginCatalog all use it. The namespace is
preserved inside Domain, so every `using MeshWeaver.Application.Styles` call site is untouched.

IDENTITY FLIP: ContentSurfaceAssemblies drops Application.Styles → 29 entries. Every satellite
re-bakes on this, which is the whole point of batching it with the AI removal rather than shipping
two flips.

THE GATE no longer lays modules/MeshWeaver.AI (this repo cannot build it): TesterModules.
ImageShipped is empty and a node repo mounts its own build through the module flag (#2541), which
the bake composes too (#2565). The module-composition guard used to bind AI and would have
silently stopped asserting anything the moment the engine left — it now compiles its own throwaway
probe assembly, so it cannot rot when the next module moves out.

`using MeshWeaver.AI;` survives in six files and is CORRECT: IProviderKeyProtector and friends keep
their original namespace while living in Mesh.Contract via #2398 type-forwarders. The assembly is
gone; the namespace is not.

Verified: 167/167 core Orleans tests green (run twice — before and after the generic→virtual
rework); Domain, Layout, GitSync, Compiler, PluginTester, Orleans.Test, Query.Test,
Documentation.Test and PluginTester.Test all build Release + -warnaserror clean.

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

`SharedOrleansFixture` wires TWO configurators and the split only covered one:

  SharedSiloConfigurator  → the silo (grains, persistence)
  TestClientConfigurator  → the CLIENT mesh hub `mesh/{id}`

Tests post `CreateNodeRequest` at `Fixture.ClientMesh.Address`, so the node-type existence check
(`FindStaticNode`) runs on the CLIENT mesh — not the silo. Both configurators call
`ConfigurePortalMesh()`, which is where `.AddAI()` used to sit, so a single silo-side hook silently
covered half the rig and the client mesh refused every AI node type with
"NodeType 'ModelProvider' is not registered".

That error names the type, never the hub, so it reads as a missing AddAI() on the silo. It is not.
`TestClientConfigurator` now exposes the same `MeshExtra` hook and `SharedOrleansFixture` a virtual
`ClientConfiguratorType`; MeshWeaver.Plugins supplies `AiTestClientConfigurator`.

Also home: TestClusterSizingGuard, which a `grep -rl 'MeshWeaver.AI'` had swept into the move
because it MENTIONS AI. It is a core guard — it locates the repo root via MeshWeaver.slnx, which
the plugins repo does not have — and its scan list drops the departed AI TestBase. The AI half of
that guard lives beside the sources it polices, in the other repo: a guard that scans nothing still
passes, so splitting the rig means splitting the guard.

Verified: core Orleans 168/168, plugins AI Orleans 48/48.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI lite review requested due to automatic review settings August 28, 2026 06:42

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

Removes the MeshWeaver.AI engine/tests/content and the MeshWeaver.Application.Styles project from core after they’ve moved to MeshWeaver.Plugins, and adjusts core test infrastructure and module/tester wiring so non-AI Orleans tests remain AI-free while module-owning repos can plug in their own configurators.

Changes:

  • Deleted src/MeshWeaver.AI, AI test projects, and content/ai/** from this repo; updated solution/projects to drop references.
  • Refactored Orleans test infrastructure (Hosting.Orleans.TestBase) to provide “hooks by Type” for silo/client configurators and moved AI-free seeds into a neutral provider.
  • Removed MeshWeaver.Application.Styles from core projects/identity and folded its usage expectations into MeshWeaver.Domain (namespace preserved per PR description).

Reviewed changes

Copilot reviewed 121 out of 514 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
tools/MeshWeaver.PluginTester/TesterModules.cs Sets ImageShipped modules to empty and documents external --module usage post-AI move.
src/MeshWeaver.Hosting.Orleans.TestBase/TwoSiloCacheUpdateFixture.cs Adds subclass hooks for configurator type selection and an AI-free extension point (ConfigureAdditional).
src/MeshWeaver.Hosting.Orleans.TestBase/OrleansTestSeedProvider.cs Introduces AI-free static seeds (TestUser + access grant) via IStaticNodeProvider.
src/MeshWeaver.Hosting.Orleans.TestBase/OrleansTestMeshNodeAttribute.cs Provides a mesh-node attribute for the Orleans test application node.
src/MeshWeaver.Hosting.Orleans.TestBase/OrleansSharedTestBase.cs Adds a virtual CreateFixture() hook so external repos can supply derived fixtures.
src/MeshWeaver.Hosting.Orleans.TestBase/MeshWeaver.Hosting.Orleans.TestBase.csproj Adds MeshWeaver.Documentation reference and extends InternalsVisibleTo for AI Orleans test assemblies living outside this repo.
src/MeshWeaver.Layout/MeshWeaver.Layout.csproj Drops MeshWeaver.Application.Styles project reference.
src/MeshWeaver.GitSync/MeshWeaver.GitSync.csproj Drops MeshWeaver.Application.Styles project reference.
src/MeshWeaver.Compiler/FrameworkBuildIdentity.cs Removes MeshWeaver.Application.Styles from the identity surface list.
src/MeshWeaver.Application.Styles/* Deletes the project (moved/absorbed per PR description).
MeshWeaver.slnx Removes deleted projects from the solution.
test/* (various) Removes AI/threading test projects/configs and drops MeshWeaver.AI project references from remaining test projects.
content/ai/** Deletes built-in agent/skill markdown nodes from this repo (now owned by Plugins).
src/MeshWeaver.AI/** and src/MeshWeaver.AI.Orleans.TestBase/** Deletes AI engine and AI-flavoured Orleans test base from core.

💡 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 Aug 28, 2026 •

Copy link
Copy Markdown
Contributor

Test Results (shard 3)

466 tests   462 ✅  5m 3s ⏱️
  6 suites    4 💤
  6 files      0 ❌

Results for commit 715472f.

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Aug 28, 2026 •

Copy link
Copy Markdown
Contributor

Test Results (shard 2)

946 tests   946 ✅  5m 26s ⏱️
  6 suites    0 💤
  6 files      0 ❌

Results for commit 715472f.

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Aug 28, 2026 •

Copy link
Copy Markdown
Contributor

Test Results (shard 0)

894 tests   894 ✅  5m 38s ⏱️
  6 suites    0 💤
  6 files      0 ❌

Results for commit 715472f.

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Aug 28, 2026 •

Copy link
Copy Markdown
Contributor

Test Results (shard 4)

   10 files     10 suites   6m 8s ⏱️
3 739 tests 3 547 ✅ 192 💤 0 ❌
4 351 runs  4 159 ✅ 192 💤 0 ❌

Results for commit 715472f.

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Aug 28, 2026 •

Copy link
Copy Markdown
Contributor

Test Results (shard 5)

1 570 tests   1 569 ✅  6m 59s ⏱️
    8 suites      1 💤
    8 files        0 ❌

Results for commit 715472f.

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Aug 28, 2026 •

Copy link
Copy Markdown
Contributor

Test Results (shard 1)

985 tests   985 ✅  6m 51s ⏱️
  6 suites    0 💤
  6 files      0 ❌

Results for commit cc22d7a.

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Aug 28, 2026 •

Copy link
Copy Markdown
Contributor

Test Results

   42 files     42 suites   35m 32s ⏱️
8 568 tests 8 370 ✅ 197 💤 1 ❌
9 175 runs  8 977 ✅ 197 💤 1 ❌

For more details on these failures, see this check.

Results for commit cc22d7a.

♻️ This comment has been updated with latest results.

rbuergi and others added 2 commits August 28, 2026 09:09
The deletion exposed an undeclared dependency: core's own sample packages ship AI-typed nodes, so
with the engine gone the samples gate refused to install them —

    Install of 'ACME' failed:        NodeType(s) not registered: Agent
    Install of 'Cornerstone' failed: NodeType(s) not registered: ThreadMessage
    Install of 'FutuRe' failed:      NodeType(s) not registered: Thread, ThreadMessage

That was never only a CI problem. AI is an optional MODULE now, so a deployment installing these
samples without it would fail exactly the same way; the dependency was simply invisible while every
image carried the engine.

Removed: the ACME TodoAgent, the Cornerstone and FutuRe demo threads, and the User/Samuel demo
chats — 17 nodes typed Agent / Thread / ThreadMessage. Verified none remain by walking every
samples node's nodeType, not by grep.

🚨 Checked before deleting rather than after: TodoAgent is named in 8 files and the FutuRe thread in
6, which looked like it would strand references. Every one is PROSE, a directory diagram or a
mermaid label — the single markdown link points at a doc PAGE, not at the node. So no link breaks
and DocumentationLinkIntegrityTest is unaffected. The docs still describe AI integration, which is
accurate for a deployment that installs the module; what no longer ships is a pre-made agent.

The alternative — re-homing the demos in MeshWeaver.Plugins — is a content decision, not a
mechanical one: that repo has no samples tree, so it would mean inventing one and deciding what
ACME/FutuRe demo content means over there. Left for whoever wants those demos back.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Deleting content/ai removed the last thing under content/, so the directory is gone — and
MigrationWorkloadModelGuard enumerated it unconditionally, threw DirectoryNotFoundException and
took BOTH of its checks down with it. A deletion over here silently disarmed a guard over there:
the shard reported it as MASKED (the host crashed after streaming results), which is not a shape
anyone reads as "a guard stopped running".

🚨 The subject MOVED, it did not disappear. MeshWeaver.AI/Data/Skill/logon-action.md genuinely
discusses migrations, so MeshWeaver.Plugins#786 adds the matching guard over its own copy of that
content — with an explicit non-empty assertion, because a sweep that scans nothing still passes.
That is the fourth guard this migration has stranded (TestClusterSizingGuard, the module-composition
test, AiResolutionSeamAuditTest, this): when code changes repos, check what was WATCHING it.

Verified: MigrationWorkloadModelGuard 3/3 here, MigrationWorkloadModelGuardTest 2/2 there.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
# Conflicts:
#	content/ai/Agent/Assistant.md
#	content/ai/Skill/pull-request.md
#	src/MeshWeaver.AI/MeshWeaver.AI.csproj
#	test/MeshWeaver.AI.Test/AiContentPackDriftTest.cs
#	test/MeshWeaver.AI.Test/TestData/AiContentPackSync.json
@rbuergi

rbuergi commented Aug 28, 2026

Copy link
Copy Markdown
Contributor Author

Superseded by #2588, which carries this change plus the other two (one CI run instead of three). The only conflict — MigrationWorkloadModelGuard's content/ root — is resolved there keeping BOTH the optional root and the note that the subject moved. Branch kept; reopen if #2588 has trouble.

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