Repository navigation
Conversation
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>
There was a problem hiding this comment.
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, andcontent/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.Stylesfrom core projects/identity and folded its usage expectations intoMeshWeaver.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.
Test Results (shard 3)466 tests 462 ✅ 5m 3s ⏱️ Results for commit 715472f. ♻️ This comment has been updated with latest results. |
Test Results (shard 2)946 tests 946 ✅ 5m 26s ⏱️ Results for commit 715472f. ♻️ This comment has been updated with latest results. |
Test Results (shard 0)894 tests 894 ✅ 5m 38s ⏱️ Results for commit 715472f. ♻️ This comment has been updated with latest results. |
Test Results (shard 4) 10 files 10 suites 6m 8s ⏱️ Results for commit 715472f. ♻️ This comment has been updated with latest results. |
Test Results (shard 5)1 570 tests 1 569 ✅ 6m 59s ⏱️ Results for commit 715472f. ♻️ This comment has been updated with latest results. |
Test Results (shard 1)985 tests 985 ✅ 6m 51s ⏱️ Results for commit cc22d7a. ♻️ This comment has been updated with latest results. |
Test Results 42 files 42 suites 35m 32s ⏱️ For more details on these failures, see this check. Results for commit cc22d7a. ♻️ This comment has been updated with latest results. |
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
MeshWeaver.AIis gone from this repoEngine, tests and embedded content all live in
MeshWeaver.Pluginsnow. 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 AItests under a threading name) ·
content/ai(35 Agent/Skill nodes the engine globbed at buildtime) · plus the 35 AI-bound tests inside
Hosting.Orleans.Test(27),Query.Test(6) andDocumentation.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:OrleansTestBaseIChatClientFactoryusing+ 2 doc crefs —RegisterChatClientFactoryhas an empty bodyConfigurePortalMesh.AddAI()SharedOrleansFixtureSwappableChatClientFactoryHosting.Orleans.TestBasenow holds the machinery with five neutral hooks —SiloConfiguratorType,ClientConfiguratorType,CreateFixture,ConfigureClient, andConfigurePortalMesh(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
CreateNodeRequestatFixture.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 thatnames the type and never the hub, so it reads as a missing
AddAI()on the silo. Bothconfigurators 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 virtualTypedoes the job withplain inheritance and no call-site churn.
Application.Stylesfolds intoDomain4 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,CompilerandPluginCatalogall use it. The namespace is preserved insideDomain, so everyusing MeshWeaver.Application.Stylescall site is untouched.Identity flip
ContentSurfaceAssembliesdropsApplication.Styles→ 29 entries. Every satellite re-bakes onthis, which is exactly why it is batched with the AI removal instead of shipping as two flips.
The gate
No
modules/MeshWeaver.AIis laid any more — this repo cannot build it.TesterModules.ImageShippedis 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:IProviderKeyProtectorand friendskeep their original namespace while living in
Mesh.Contractvia #2398 type-forwarders.Verification
PluginTester.Test all Release +
-warnaserrorclean🤖 Generated with Claude Code