Skip to content

The indexing pipeline, the map control and Cornerstone leave the content surface - #2941

Merged
rbuergi merged 5 commits into
mainfrom
feat/maps-indexing-leave-core
Sep 1, 2026
Merged

rbuergi merged 5 commits into
mainfrom
feat/maps-indexing-leave-core

Conversation

@rbuergi

@rbuergi rbuergi commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Wave B of the carve-out, platform half. 🔗 Paired with Systemorph/MeshWeaver.Plugins#1057 — that one merges FIRST, or the assemblies exist in neither place.

One identity flip, three projects

FrameworkBuildIdentity.ContentSurfaceAssemblies is the boundary that matters. Wave A's two projects were outside it, which is why they cost a .csproj edit. MeshWeaver.Maps, ContentCollections.Indexing and .Indexing.Graph are inside it, so each is the MeshWeaver.AI / Markdown.Collaboration move — and leaving the surface costs a framework identity flip plus a fleet re-bake.

They therefore go in one change. The flip is the cost, not the count.

Why Maps could not leave alone

samples/Graph/Data/Cornerstone/Pricing/Source/PricingLayoutAreas.cs binds MapControl — and it is a Source/*.cs mesh node, compiled at runtime in the portal, invisible to dotnet build, and baked into the shipped image.

🚨 That is why five test projects referenced MeshWeaver.Maps while not one line of their own C# mentioned it: their test meshes compile that sample. The .csproj graph misleads in both directions here — four references turned out to carry no code dependency at all (Memex.Portal.Shared builds -warnaserror clean without Maps, Indexing, .Indexing.Graph and Observability.Contract), while the consumer that actually pinned Maps appears in no project file.

So the content travels with the module, exactly as Markdown.Collaboration took its Review sources. Cornerstone is a Store/Plugin package in the plugins repo now, and its six suites pass 114/114 there.

The contract split

Mesh.Operations stays here and needs exactly one type. DocumentPaths moves to MeshWeaver.Mesh.Contract, keeping its MeshWeaver.ContentCollections.Indexing namespace — every using still resolves and no consumer changed.

Mesh.Contract rather than ContentCollections because the indexing base uses DocumentPaths too (ContentChunkSearch), so ContentCollections would have handed the pipeline a new dependency on Layout and Markdown — precisely what its own "storage-agnostic core" note rules out. Both remaining consumers already reference Mesh.Contract, so the split adds no edge to the graph.

Leaving the surface is safe for Indexing because nothing in-mesh binds it — verified across every gated sample tree and the doc data, where the only occurrences are prose in .md files.

🚨 A guard that would have checked nothing

FrameworkBuildIdentityTest.SurfaceIdentity_RecordsAbsence proved "a host missing a canonical assembly is a different surface" by removing "MeshWeaver.Maps" from the baseline. With Maps out of the baseline that Remove removes nothing, and the test would have compared two identical dictionaries — passing while proving nothing about absence.

It now names an assembly that is staying and asserts the removal actually happened, so the next name to go stale fails loudly instead of silently.

Also

AddCornerstone leaves SampleDataExtensions (declaration + its AddAllSampleData entry) — a one-line IncludePartition wrapper the moved suites call directly now. TestUsers keeps its Cornerstone grant on purpose: it is the shared fixture both repos build against, and the suites needing it run in the other one.

Verification

Mesh.Contract, Mesh.Operations, Portal.Shared Release -warnaserror, 0 Warning(s) 0 Error(s)
Content.Test, Persistence.Test, Hosting.Monolith.Test, PluginTester 0 Error(s) after the deletions
FrameworkBuildIdentity 23/23 with all three out of the surface
Dangling references none — 0 tracked files left, 0 .csproj/.slnx hits

The survey behind both waves, including how a sample Space becomes a package, is in Doc/Architecture/CarvingProjectsOutOfCore.

🤖 Generated with Claude Code

https://claude.ai/code/session_01XM3bKbVAFCCDH9ZyYCxKQy

Copilot AI lite review requested due to automatic review settings September 1, 2026 08:08
@github-actions

github-actions Bot commented Sep 1, 2026 •

Copy link
Copy Markdown
Contributor

Test Results (shard 0)

764 tests   764 ✅  3m 14s ⏱️
  6 suites    0 💤
  6 files      0 ❌

Results for commit b0f756e.

♻️ This comment has been updated with latest results.

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 “carve-out” work by removing the indexing pipeline projects (MeshWeaver.ContentCollections.Indexing, .Indexing.Graph) and the map control project (MeshWeaver.Maps) from the core repo’s content surface, updating the framework surface identity, and deleting the Cornerstone sample space content that moved to MeshWeaver.Plugins. It also relocates DocumentPaths into MeshWeaver.Mesh.Contract (while preserving its original namespace) to avoid introducing new dependencies for the indexing module.

Changes:

  • Remove MeshWeaver.Maps, MeshWeaver.ContentCollections.Indexing, and MeshWeaver.ContentCollections.Indexing.Graph projects (and their tests) from this repository and solution, plus drop now-unneeded references from test/tool/portal projects.
  • Move DocumentPaths into MeshWeaver.Mesh.Contract while preserving the MeshWeaver.ContentCollections.Indexing namespace for consumer compatibility.
  • Update framework content surface identity and its guard test, remove Cornerstone sample data from samples/Graph/Data, and update docs describing the carve-out.

Reviewed changes

Copilot reviewed 137 out of 137 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
tools/MeshWeaver.PluginTester/MeshWeaver.PluginTester.csproj Drops removed project references and keeps the gate closure aligned with the remaining content surface.
test/MeshWeaver.Security.Test/MeshWeaver.Security.Test.csproj Removes unused MeshWeaver.Maps reference after Maps leaves the surface.
test/MeshWeaver.Query.Test/MeshWeaver.Query.Test.csproj Removes unused MeshWeaver.Maps reference after Maps leaves the surface.
test/MeshWeaver.Persistence.Test/MeshWeaver.Persistence.Test.csproj Removes unused MeshWeaver.Maps reference after Maps leaves the surface.
test/MeshWeaver.Hosting.Monolith.TestBase/TestUsers.cs Keeps Cornerstone access grant in the shared test-user fixture for cross-repo suites.
test/MeshWeaver.Hosting.Monolith.Test/MeshWeaver.Hosting.Monolith.Test.csproj Removes unused MeshWeaver.Maps reference after Maps leaves the surface.
test/MeshWeaver.Graph.Test/FrameworkBuildIdentityTest.cs Fixes the surface-absence guard test to assert the removal actually occurred.
test/MeshWeaver.ContentCollections.Indexing.Test/TextExtractorTest.cs Removed (indexing tests moved with indexing module).
test/MeshWeaver.ContentCollections.Indexing.Test/PdfTestFixtures.cs Removed (indexing tests moved with indexing module).
test/MeshWeaver.ContentCollections.Indexing.Test/MeshWeaver.ContentCollections.Indexing.Test.csproj Removed (indexing tests moved with indexing module).
test/MeshWeaver.ContentCollections.Indexing.Test/InertContentIndexTest.cs Removed (indexing tests moved with indexing module).
test/MeshWeaver.ContentCollections.Indexing.Test/ImageDescriptionIndexingTest.cs Removed (indexing tests moved with indexing module).
test/MeshWeaver.ContentCollections.Indexing.Test/FakeSummarizer.cs Removed (indexing tests moved with indexing module).
test/MeshWeaver.ContentCollections.Indexing.Test/FakeImageDescriber.cs Removed (indexing tests moved with indexing module).
test/MeshWeaver.ContentCollections.Indexing.Test/FakeEmbedder.cs Removed (indexing tests moved with indexing module).
test/MeshWeaver.ContentCollections.Indexing.Test/FakeDocumentSink.cs Removed (indexing tests moved with indexing module).
test/MeshWeaver.ContentCollections.Indexing.Test/ContentSearchHitContractTest.cs Removed (indexing tests moved with indexing module).
test/MeshWeaver.ContentCollections.Indexing.Test/ChunkNavigationStoreTest.cs Removed (indexing tests moved with indexing module).
test/MeshWeaver.ContentCollections.Indexing.Graph.Test/MeshWeaver.ContentCollections.Indexing.Graph.Test.csproj Removed (graph integration tests moved with indexing module).
test/MeshWeaver.ContentCollections.Indexing.Graph.Test/DocumentPathsTest.cs Removed (tests moved; DocumentPaths now lives in Mesh.Contract).
test/MeshWeaver.ContentCollections.Indexing.Graph.Test/DocumentBlocksAreaRenderTest.cs Removed (graph integration tests moved with indexing module).
test/MeshWeaver.ContentCollections.Indexing.Graph.Test/ContentChunkAutocompleteProviderTest.cs Removed (graph integration tests moved with indexing module).
test/MeshWeaver.ContentCollections.Indexing.Graph.Test/ChatClientSummarizerTest.cs Removed (graph integration tests moved with indexing module).
test/MeshWeaver.ContentCollections.Indexing.Graph.Test/ChatClientImageDescriberTest.cs Removed (graph integration tests moved with indexing module).
test/MeshWeaver.Content.Test/MeshWeaver.Content.Test.csproj Removes unused MeshWeaver.Maps reference after Maps leaves the surface.
src/MeshWeaver.Mesh.Operations/MeshWeaver.Mesh.Operations.csproj Drops the direct reference to the removed indexing project.
src/MeshWeaver.Mesh.Contract/DocumentPaths.cs Relocates DocumentPaths into Mesh.Contract while keeping its original namespace.
src/MeshWeaver.Maps/MeshWeaver.Maps.csproj Removed (Maps moved out of core surface).
src/MeshWeaver.Maps/MapControl.cs Removed (Maps moved out of core surface).
src/MeshWeaver.Maps/GoogleMapsConfiguration.cs Removed (Maps moved out of core surface).
src/MeshWeaver.Hosting/SampleDataExtensions.cs Removes Cornerstone sample helper and its inclusion from AddAllSampleData.
src/MeshWeaver.Documentation/Data/Architecture/CarvingProjectsOutOfCore.md Adds guidance on converting a sample space into a plugin package.
src/MeshWeaver.ContentCollections.Indexing/TextExtractor.cs Removed (indexing module moved out of core).
src/MeshWeaver.ContentCollections.Indexing/TextChunker.cs Removed (indexing module moved out of core).
src/MeshWeaver.ContentCollections.Indexing/README.md Removed (indexing module moved out of core).
src/MeshWeaver.ContentCollections.Indexing/MeshWeaver.ContentCollections.Indexing.csproj Removed (indexing module moved out of core).
src/MeshWeaver.ContentCollections.Indexing/ITextExtractor.cs Removed (indexing module moved out of core).
src/MeshWeaver.ContentCollections.Indexing/ISummarizer.cs Removed (indexing module moved out of core).
src/MeshWeaver.ContentCollections.Indexing/InertContentIndex.cs Removed (indexing module moved out of core).
src/MeshWeaver.ContentCollections.Indexing/IImageDescriber.cs Removed (indexing module moved out of core).
src/MeshWeaver.ContentCollections.Indexing/IDocumentSink.cs Removed (indexing module moved out of core).
src/MeshWeaver.ContentCollections.Indexing/IChunkEmbedder.cs Removed (indexing module moved out of core).
src/MeshWeaver.ContentCollections.Indexing/IChunkedContentVectorStore.cs Removed (indexing module moved out of core).
src/MeshWeaver.ContentCollections.Indexing/ExtractiveSummarizer.cs Removed (indexing module moved out of core).
src/MeshWeaver.ContentCollections.Indexing/ExtractedDocument.cs Removed (indexing module moved out of core).
src/MeshWeaver.ContentCollections.Indexing/DocumentInfo.cs Removed (indexing module moved out of core).
src/MeshWeaver.ContentCollections.Indexing/Document.cs Removed (indexing module moved out of core).
src/MeshWeaver.ContentCollections.Indexing/ContentIndexingOptions.cs Removed (indexing module moved out of core).
src/MeshWeaver.ContentCollections.Indexing/ContentChunk.cs Removed (indexing module moved out of core).
src/MeshWeaver.ContentCollections.Indexing/ChunkPositionJson.cs Removed (indexing module moved out of core).
src/MeshWeaver.ContentCollections.Indexing/ChunkPosition.cs Removed (indexing module moved out of core).
src/MeshWeaver.ContentCollections.Indexing.Graph/README.md Removed (indexing graph integration moved out of core).
src/MeshWeaver.ContentCollections.Indexing.Graph/MeshWeaver.ContentCollections.Indexing.Graph.csproj Removed (indexing graph integration moved out of core).
src/MeshWeaver.ContentCollections.Indexing.Graph/MeshDocumentSink.cs Removed (indexing graph integration moved out of core).
src/MeshWeaver.ContentCollections.Indexing.Graph/DocumentNodeType.cs Removed (indexing graph integration moved out of core).
src/MeshWeaver.ContentCollections.Indexing.Graph/ChatClientSummarizer.cs Removed (indexing graph integration moved out of core).
src/MeshWeaver.ContentCollections.Indexing.Graph/ChatClientImageDescriber.cs Removed (indexing graph integration moved out of core).
src/MeshWeaver.Compiler/FrameworkBuildIdentity.cs Removes Maps/Indexing assemblies from the canonical content surface list and documents the rationale.
samples/Graph/Data/Cornerstone/Tesla/2026.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Tesla.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/TechIndustries/2024.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/TechIndustries.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Source/PricingStatus.cs Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Source/LineOfBusiness.cs Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Source/LegalEntity.cs Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Source/Currency.cs Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Source/Country.cs Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Pricing/Source/ReinsuranceSection.cs Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Pricing/Source/ReinsuranceAcceptance.cs Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Pricing/Source/PricingStatus.cs Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Pricing/Source/Pricing.cs Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Pricing/Source/LineOfBusiness.cs Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Pricing/Source/LegalEntity.cs Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Pricing/Source/Currency.cs Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Pricing/Source/Country.cs Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Pricing.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Nestle/2026.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Nestle.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Microsoft/2026.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Microsoft.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Insured/Source/PricingStatus.cs Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Insured/Source/Insured.cs Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Insured/Source/InsuranceLayoutAreas.cs Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Insured.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/index.md Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/GlobalManufacturing/2024.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/GlobalManufacturing.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/EuropeanLogistics/2024.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/EuropeanLogistics.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Documentation/Overview.md Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Article/Source/ArticleLayoutAreas.cs Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Article/Source/Article.cs Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/Article.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/_Access/TestUser_Access.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/_Access/Samuel_Access.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/_Access/Roland_Access.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/_Access/Quinn_Access.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/_Access/Paul_Access.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/_Access/Oliver_Access.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/_Access/Emma_Access.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/_Access/David_Access.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/_Access/Carol_Access.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/_Access/Bob_Access.json Removed (Cornerstone sample space content moved out of repo).
samples/Graph/Data/Cornerstone/_Access/Alice_Access.json Removed (Cornerstone sample space content moved out of repo).
MeshWeaver.slnx Removes deleted projects (Maps/Indexing + their tests) from the solution.
memex/Memex.Portal.Shared/Memex.Portal.Shared.csproj Removes direct references to Maps and Indexing projects now that they left the content surface.
Suppressed comments (1)

memex/Memex.Portal.Shared/Memex.Portal.Shared.csproj:92

  • This comment still says “so the monolith compiles it but never activates it”, but this PR removed the direct project references to the indexing projects from this host. The aside is now inaccurate; consider rephrasing to describe the module-based wiring/inert behavior without implying it’s compiled via direct references.
    <!-- Content → vector index (core tech): chunk/embed/store on a separate Postgres vector DB,
         per-file Document nodes, chunk-search autocomplete. Inert unless ConnectionStrings:contentindex
         + embeddings are configured (so the monolith compiles it but never activates it). -->

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +264 to +266
from the shared test-user fixture instead. See the `plugin-provisioning` skill: hand-creating a
Space grants its creator Admin, and every human-run `git_hub_sync` re-mints that grant, so the
access shape is a security decision rather than a detail.
Comment on lines 260 to 263
@@ -262,7 +261,6 @@
PRECISELY so in-mesh sample/plugin source (Cornerstone/Pricing's Excel loader + map,
Northwind/Product) can compile at runtime. Without them the gate flags content the real
host compiles fine — the gate must judge against the surface content actually gets. -->
Comment on lines 44 to 46
recurred here the moment the map packs left, and
FrameworkBuildIdentityTest.CanonicalContentSurface_IsRecordedByEverySurfaceManifestHost
is what caught it. No portal code uses these types — the reference IS the point. -->
@rbuergi
rbuergi enabled auto-merge September 1, 2026 08:18
@rbuergi
rbuergi disabled auto-merge September 1, 2026 08:18
@github-actions

github-actions Bot commented Sep 1, 2026 •

Copy link
Copy Markdown
Contributor

Test Results (shard 5)

    7 files      7 suites   3m 51s ⏱️
1 678 tests 1 485 ✅ 193 💤 0 ❌
2 382 runs  2 189 ✅ 193 💤 0 ❌

Results for commit b0f756e.

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Sep 1, 2026 •

Copy link
Copy Markdown
Contributor

Test Results (shard 4)

1 427 tests   1 427 ✅  4m 52s ⏱️
    7 suites      0 💤
    7 files        0 ❌

Results for commit b0f756e.

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Sep 1, 2026 •

Copy link
Copy Markdown
Contributor

Test Results (shard 1)

1 241 tests   1 241 ✅  4m 7s ⏱️
    7 suites      0 💤
    7 files        0 ❌

Results for commit b0f756e.

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Sep 1, 2026 •

Copy link
Copy Markdown
Contributor

Test Results (shard 2)

2 597 tests   2 593 ✅  6m 42s ⏱️
    8 suites      4 💤
    8 files        0 ❌

Results for commit b0f756e.

♻️ This comment has been updated with latest results.

@rbuergi

rbuergi commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

🚨 The merge order changed — this PR now has a precondition: #2943.

Plugins#1057's CI surfaced a circular dependency this pair could not resolve on its own. The plugins copy of the indexing pipeline binds DocumentPaths (ContentChunkSearch.cs), so it needs the type in Mesh.Contract before it can compile — while this PR cannot delete the pipeline until plugins ships it. Each was the other's precondition, and neither would ever have gone green.

#2943 breaks the cycle by moving DocumentPaths to Mesh.Contract and leaving a TypeForwardedTo behind, so every tree compiles at every point.

New order: #2943 → Plugins#1057 → this PR.

This branch still carries the DocumentPaths relocation itself; once #2943 lands I'll rebase, which drops it here and leaves this PR as what it should be — the deletions plus the content-surface change.

Worth recording why local verification missed it: I built the plugins copy against my own core worktree, which already had the move. CI builds against origin/main, which did not. A throwaway worktree pinned at origin/main is the honest reference, and is what caught it.

Nothing here is landing today regardless — held pending a decision on flipping framework identity before Friday's talk.

@github-actions

github-actions Bot commented Sep 1, 2026 •

Copy link
Copy Markdown
Contributor

Test Results (shard 3)

858 tests   858 ✅  7m 43s ⏱️
  7 suites    0 💤
  7 files      0 ❌

Results for commit b0f756e.

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Sep 1, 2026 •

Copy link
Copy Markdown
Contributor

Test Results

   42 files     42 suites   30m 33s ⏱️
8 565 tests 8 368 ✅ 197 💤 0 ❌
9 269 runs  9 072 ✅ 197 💤 0 ❌

Results for commit b0f756e.

♻️ This comment has been updated with latest results.

rbuergi and others added 5 commits September 1, 2026 10:55
Wave B of the carve-out, platform half. Stacked on the Embeddings branch;
paired with Systemorph/MeshWeaver.Plugins#1045's follow-up, which merges FIRST.

MeshWeaver.ContentCollections.Indexing and .Indexing.Graph leave the platform
repo AND FrameworkBuildIdentity.ContentSurfaceAssemblies. That second half is
the real change: the pipeline is the Indexing MODULE now, composed into
content compiles per-mesh via ComposeWithModules rather than being part of the
framework identity — the MeshWeaver.AI / Markdown.Collaboration shape, and the
comment left beside those two now covers this one.

Leaving the surface is only safe because NO in-mesh content binds it: verified
across every gated sample tree and the doc data, where the only occurrences of
the namespace are prose in .md files. (Contrast MeshWeaver.Maps, which one
gated sample does bind — it is held back deliberately so the identity flips
ONCE rather than twice.)

THE CONTRACT SPLIT. Mesh.Operations stays here and needs exactly one type,
DocumentPaths, so DocumentPaths moves to MeshWeaver.Mesh.Contract KEEPING its
MeshWeaver.ContentCollections.Indexing namespace — every `using` still
resolves and no consumer changed. Mesh.Contract rather than ContentCollections
because the indexing base uses DocumentPaths too (ContentChunkSearch), and
ContentCollections would have handed the pipeline a new dependency on Layout
and Markdown — exactly what its own "storage-agnostic core" note rules out.
Both remaining consumers already reference Mesh.Contract, so the split adds no
edge to the graph.

Also deletes test/MeshWeaver.ContentCollections.Indexing.Graph.Test, which had
been duplicated into the plugins repo and never removed here — 7 files, 7 of 7
byte-identical. The third instance of this pattern in one change set, and the
first caught before it drifted.

Three ships-the-bits ProjectReferences dropped (PluginTester, Portal.Shared ×2)
and one real one (Mesh.Operations, now served by Mesh.Contract).

Verified (Release, -warnaserror): Mesh.Contract, Mesh.Operations and
Portal.Shared all 0 Warning(s) 0 Error(s); FrameworkBuildIdentity tests 23/23
with the two names removed from the surface.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XM3bKbVAFCCDH9ZyYCxKQy
…r leave

Completes wave B's platform half. MeshWeaver.Maps and the Cornerstone sample
tree leave the repo, and Maps leaves
FrameworkBuildIdentity.ContentSurfaceAssemblies alongside the indexing
pipeline — ONE identity flip for all three, which is the point of doing them
together: the flip is the cost, not the count.

Maps could not leave alone. samples/Graph/Data/Cornerstone/Pricing/Source/
PricingLayoutAreas.cs binds MapControl, and it is a Source/*.cs MESH node —
compiled at runtime in the portal, invisible to dotnet build, and baked into
the shipped image. That is why five test projects referenced MeshWeaver.Maps
while not one line of their own C# mentioned it: their meshes compile that
sample. So the content travels with the module, exactly as
Markdown.Collaboration took its Review sources.

Also removed: AddCornerstone from SampleDataExtensions (declaration and its
AddAllSampleData entry) — a one-line IncludePartition wrapper the moved suites
now call directly; seven ships-the-bits Maps ProjectReferences; and the six
suites that exercise Cornerstone, which are in MeshWeaver.Plugins now and pass
114/114 there.

🚨 FIXED A GUARD THAT WOULD HAVE CHECKED NOTHING. FrameworkBuildIdentityTest's
SurfaceIdentity_RecordsAbsence removed "MeshWeaver.Maps" from the baseline to
prove that a missing assembly changes the identity. With Maps out of the
baseline that Remove() removes nothing, and the test would have compared two
identical dictionaries and passed having proved nothing about absence. It now
names an assembly that is staying AND asserts the removal actually happened,
so the next name to go stale fails loudly instead of silently.

TestUsers keeps its Cornerstone grant on purpose: it is the SHARED test-user
fixture both repos build against, and the suites that need that grant run in
the other one now.

Verified (Release, -warnaserror): Content.Test, Persistence.Test,
Hosting.Monolith.Test and PluginTester all 0 Error(s) after the deletions;
FrameworkBuildIdentity 23/23 with Maps and both Indexing assemblies out of the
surface.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XM3bKbVAFCCDH9ZyYCxKQy
The five steps the Cornerstone migration turned out to need, none of which is
a file copy: index.md -> index.json (both would claim the package path),
declaring what the in-mesh content binds, leaving _Access behind rather than
injecting named-user grants into every installing mesh, moving tests by the
content they load rather than the subsystem they came from, and staging a
fixture from two repos once the content lives in one and the samples tree in
the other.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XM3bKbVAFCCDH9ZyYCxKQy
`Doc content compiles and runs` failed with "samples gate: expected tree
'Cornerstone' is missing". stage-samples-gate.sh names the domain trees it
stages as an explicit list rather than a glob, so a tree that moves fails the
gate loudly instead of quietly staging nothing — it did exactly its job here.
Cornerstone is removed from that list, with a note saying where it went.

Two stale justifications go with it, and the second mattered more than its
wording: PluginTester's csproj explained its portal-surface-mirroring
references as existing "PRECISELY so in-mesh sample source (Cornerstone/
Pricing's Excel loader + map, Northwind/Product) can compile at runtime". Half
that reason has now left the repo. Left alone it would read as justification
for a reference nobody could re-derive. The note now covers the Import half
that is still true and records that a node repo binding MapControl mounts the
Maps module through the tester's module flag.

(That comment also has to avoid a literal double-dash: MSB4025, an XML comment
cannot contain '--'.)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XM3bKbVAFCCDH9ZyYCxKQy
GateAllowEntrySubjectGuard.TheResolverIsNotVacuous asserts
stage-samples-gate.sh parses to at least 8 packages. Removing Cornerstone
takes it to 7, so the guard went red — correctly, and at exactly the thing it
exists to catch.

That floor is a NON-VACUITY check on the parse, not an inventory: it catches
StagedPackagesPattern reading its own input as empty. It therefore tracks the
staged list and drops when a tree legitimately leaves. Lowering it in step with
a deliberate removal is maintenance; lowering it to silence a parse that BROKE
would be the opposite, and that distinction is now written where the number is,
because the two look identical in a diff.

Added a witness so the check cannot answer from a remembered list:
DoesNotContain("Cornerstone"), beside the existing DoesNotContain("Doc"). Doc
was never staged; Cornerstone was until it moved. A parse reading a stale copy
still contains it and now fails.

Also checked the more dangerous sibling in the same class first — the one that
catches allow entries naming subjects the repo no longer ships, which "can
never pass and never fail" and sit green asserting debt that is gone (#1786).
Cornerstone has no samples-gate.allow entry, so nothing was stranded.

Verified: GateAllowEntrySubjectGuard 2/2, build 0 Error(s).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XM3bKbVAFCCDH9ZyYCxKQy
@rbuergi
rbuergi force-pushed the feat/maps-indexing-leave-core branch from efb5412 to b0f756e Compare September 1, 2026 08:56
@rbuergi
rbuergi added this pull request to the merge queue Sep 1, 2026
@rbuergi

rbuergi commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

Holding this out of the merge queue — it would turn MeshWeaver.Plugins red the moment it lands, and its counterpart does not prevent that. Re-arm as soon as the Plugins side is rewired; nothing here is wrong, the two halves are just not safe in this order.

What happens if this merges now

This PR removes src/MeshWeaver.Maps from core (373 deletions, the directory is gone on the branch). Plugins CI checks out Systemorph/MeshWeaver in three places with no ref: — so it builds against core main, live, not a pin:

.github/workflows/ci.yml:529,1066,1279   repository: Systemorph/MeshWeaver
                                          path: meshweaver          # no ref: → default branch

And Plugins main carries 11 unconditional references to the project this PR deletes:

$ git grep -c "MeshWeaverRoot)/src/MeshWeaver.Maps" -- "*.csproj"   # on Plugins main
11 files, 0 guarded by Exists()

Memex.Portal.Gui (the portal host), MeshWeaver.AI.Test, Blazor.AppleMaps, Blazor.GoogleMaps, Blazor.OpenStreetMap, Northwind.Application, and five migrated test suites. Every one fails at restore, so Plugins main and all 21 open Plugins PRs go red together.

The counterpart does not cover it

Plugins #1057 brings src/MeshWeaver.Maps in and adds one local ProjectReference. Measured on its head: 11 files still hold the $(MeshWeaverRoot) form, so landing #1057 does not fix the other ten either.

Ordering

MeshWeaver.Maps has to exist in Plugins before it stops existing in core, and all 11 references have to move with it. Core CI cannot see this — it does not build Plugins; the coupling only shows up in CD (core builds portal-ai from plugins@main), which is after the fact.

I am fixing the Plugins side now: the 11 references get the dual-path shape this repo already uses for the MeshWeaver.Fixture move, so they resolve whichever half has landed and the ordering stops mattering. I will re-arm this PR here when that is in.

Dequeuing costs the three PRs ahead of this one a rebuild, which is the cheaper mistake.

@rbuergi
rbuergi removed this pull request from the merge queue due to a manual request Sep 1, 2026
@rbuergi

rbuergi commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

Correcting a number in my comment above: on Plugins main it is 6 unconditional references, not 11.

The 11 was measured on #1057's head, which adds the reference to five migrated test suites as well. On main today:

$ grep -rn "MeshWeaverRoot)/src/MeshWeaver.Maps" src --include="*.csproj" | grep -c ProjectReference
6      # Memex.Portal.Gui, MeshWeaver.AI.Test, Blazor.AppleMaps,
       # Blazor.GoogleMaps, Blazor.OpenStreetMap, Northwind.Application

The conclusion is unchanged — six unconditional ProjectReferences to a project this PR deletes, none guarded by Exists(), so Plugins main still fails at restore the moment this lands. But the blast radius I quoted was too large and the five test suites were the wrong half of the evidence.

Also worth noting for whoever lands #1057: on its branch the count goes to 11, so the rewiring has to cover the five it adds too, not just the six here.

@rbuergi

rbuergi commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

Retracting my own correction — the original number, 11, was right. Apologies for the churn; here is the cause, because it matters more than the number.

My "it is 6, not 11" comment was measured with grep in my primary Plugins checkout, which turns out to be 216 commits behind origin/main. Five of the eleven csproj files gained the reference in commits I did not have locally, so the stale tree honestly showed 6. Measured against the ref instead of the working directory:

$ git grep -l "MeshWeaverRoot)/src/MeshWeaver.Maps" origin/main -- "src/**/*.csproj" | wc -l
11

Memex.Portal.Gui · MeshWeaver.AI.Test · Blazor.AppleMaps · Blazor.GoogleMaps · Blazor.OpenStreetMap · Northwind.Application · Content.Test · Hosting.Monolith.Test · Persistence.Test · Query.Test · Security.Test.

So the blast radius is the larger one, and the five migrated test suites were the right half of the evidence after all.

The fix is in flight and covers all eleven — each reference becomes the dual-path shape this repo already uses for the MeshWeaver.Fixture move, with Exists() anchored to $(MSBuildThisFileDirectory) so it does not depend on the working directory:

<ProjectReference Include="../MeshWeaver.Maps/MeshWeaver.Maps.csproj"
                  Condition="Exists(...)" />
<ProjectReference Include="$(MeshWeaverRoot)/src/MeshWeaver.Maps/MeshWeaver.Maps.csproj"
                  Condition="!Exists(...)" />

That resolves against whichever half has landed, so this PR and plugins#1057 stop needing a specific merge order across two repos. I will re-arm this one once it is in.

@rbuergi

rbuergi commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

Unblocked — re-arming. plugins#1092 has merged, so all 11 Plugins references to MeshWeaver.Maps now resolve through the dual-path Exists() guard and pick up the local copy or core's, whichever is present. The cross-repo ordering constraint that made this unsafe is gone; this can land in any order relative to plugins#1057.

@rbuergi
rbuergi added this pull request to the merge queue Sep 1, 2026
@rbuergi

rbuergi commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

Downstream check: two of the three deleted projects still have unconditional references in MeshWeaver.Plugins

Measured just now by the new Hosting/RepoHealth cross-repo rule (Systemorph/MeshWeaver.Plugins#1101) over MeshWeaver.Plugins@main — 567 $(MeshWeaverRoot) references across 116 project files, against all 14 open PRs here:

This PR deletes Unconditional refs in Plugins
src/MeshWeaver.Maps/MeshWeaver.Maps.csproj 0 (11 total) ✅ already hardened with the Exists() fallback
src/MeshWeaver.ContentCollections.Indexing/…csproj 2 🔴
src/MeshWeaver.ContentCollections.Indexing.Graph/…csproj 2 🔴

The two red rows are:

  • MeshWeaver.Plugins → src/MeshWeaver.AI/MeshWeaver.AI.csproj lines 51–52
  • MeshWeaver.Plugins → src/Memex.Portal.Gui/Memex.Portal.Gui.csproj lines 103–104

Both reach for $(MeshWeaverRoot)/src/MeshWeaver.ContentCollections.Indexing{,.Graph} with no condition, while MeshWeaver.Plugins already carries its own copy of both projects. Neither repo's CI can see this: this repo does not build Plugins, and Plugins checks this repo out with no ref: at four sites in its ci.yml, so it builds against this repo's moving main.

When this lands, restore fails for the AI engine and for Memex.Portal.Gui — i.e. the Build + test the portal hosts job on the Plugins trunk.

The Maps references in that repo already carry the pattern that solves it (prefer the local ../ copy when it exists, fall back to $(MeshWeaverRoot) otherwise, with a comment saying to drop the fallback once this PR has merged). Applying the same two-line treatment to those four references ahead of the merge should close the window — but the sequencing is yours, so flagging rather than changing.

Not blocking anything from here; just making the downstream visible before it becomes a red trunk.

@rbuergi

rbuergi commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

Now safe in either order — all three of this PR's deletions are covered on the Plugins side.

My earlier comments only covered MeshWeaver.Maps. This PR deletes three projects, and I had audited for the one name in front of me. Hosting/RepoHealth's cross-repo rule (plugins#1101) found the other two on its first real run:

project unconditional refs on plugins main covered by
MeshWeaver.Maps 11 plugins#1092 (merged)
MeshWeaver.ContentCollections.Indexing 2 plugins#1104 (merged)
MeshWeaver.ContentCollections.Indexing.Graph 2 plugins#1104 (merged)

The two I missed were src/MeshWeaver.AI/MeshWeaver.AI.csproj:51-52 and src/Memex.Portal.Gui/Memex.Portal.Gui.csproj:103-104 — the AI engine and the portal host, so the failure would have landed on Build + test the portal hosts, which is now a required context on that repo.

All four now use the dual-path Exists() shape, anchored to $(MSBuildThisFileDirectory). Both projects already exist in Plugins, so they resolve locally the moment this lands.

Nothing further blocks this from my side.

@rbuergi
rbuergi removed this pull request from the merge queue due to a manual request Sep 1, 2026
@rbuergi
rbuergi added this pull request to the merge queue Sep 1, 2026
@rbuergi
rbuergi merged commit 58ac8ba into main Sep 1, 2026
25 checks passed
rbuergi added a commit that referenced this pull request Sep 2, 2026
…ch (#3066)

* #3022 is fixed — prove it, and guard the property CLASS, not one switch

Fixes #3022

## The identity fork is gone, measured the way it was found

Both promoted images of `71869075` pulled `--platform linux/amd64`, `/app/meshweaver-surface.manifest`
read out with `docker create` + `docker cp` (no execution, nothing published):

| | before the fix | after (`7186907`) |
|---|---|---|
| canonical names present in both manifests | 25 | 25 |
| of those, hashes EQUAL | 0 | 25 |

and the stamped attribute the fork lived in:

    memex-portal-ai   MeshWeaver.Utils.dll   3.0.0-rc9+71869075f5ace055629c7b1812b08d7334f871af
    mw-plugin-test    MeshWeaver.Utils.dll   3.0.0-rc9+71869075f5ace055629c7b1812b08d7334f871af

CD run 33587509969 — which built both images from `71869075` — says the same thing in its own words:
`framework-identity: MATCH`. So does 33591379356 against the promoted tags.

## Why it looked like it still failed

Run 33585729083 ran six minutes after the fix merged and carried `71869075` as its HEAD SHA. It did
not build that commit: `gate` resolves its own target and logged
`staging-3ac34af-33585729083` / `SHA: 3ac34af…` — the fix's PARENT. A CD run's head SHA is the
trigger ref, never a claim about what it built.

And the reported "second cause" — a 12-vs-20 hex commit suffix between the two legs — was a
30-character display truncation: both strings are exactly 30 characters long, and `.ci.7471` is what
pushed the suffix out of the window. `$(SourceRevisionId)` is the full 40-char SHA on both legs. One
cause, not two.

## What is actually left, and it is not this

`Plugins: bake + seal the publication for this identity` reds on
`CS0234: The type or namespace name 'Maps' does not exist in the namespace 'MeshWeaver'` for
`GoogleMaps/Gallery` and `OpenStreetMap/Gallery`. `MeshWeaver.Maps` left the content surface in
#2941 and has not started riding as a module yet — MeshWeaver.Plugins#1061 step 3, the cross-repo
half of a carve-out. Core's follow-up (adding Maps to `plugins-modules`/`plugins-bake`'s compose set)
is inert until that lands, because `src/platform-shipped.txt` still suppresses the assembly from the
bundle.

## The guard

`CdImageLegPropertiesDoNotForkTheIdentityGuard` generalises #3041's guard from one remembered switch
to the defect class. `main-cd.yml` publishes the two images from ONE commit with two different sets
of global `-p:` properties, and a global property reaches every project in the graph — so ANY of
them reaching a compiled attribute forks the address. The guard reads both `dotnet publish` commands
out of the workflow, probes the union of every `-p:` they carry (bar `CIRun`, which both pass and
which is supposed to select the commit-deterministic branch), and requires InformationalVersion /
AssemblyVersion / FileVersion to be identical; on a failure it re-probes one at a time so the
message names the culprit. Reading the workflow is what stops it going stale: a list written in the
test would have been right until the day `-p:Version=` was added to one leg, which is how this got
in.

Mutation-proved both ways, locally:
  * restoring `Condition="'$(Version)' == ''"` on the compiled-attributes group reds BOTH guards;
  * leaking `$(ContainerRepository)` into InformationalVersion reds the NEW guard alone —
    `-p:ContainerRepository= moves InformationalVersion: '3.0.0-rc9' -> '3.0.0-rc9-9.9.9-guard.ci.424242'` —
    while all three of #3041's tests stay green. Strictly greater cover, demonstrated.

`MsBuildPropertyProbe` holds the out-of-process evaluator both guards share, so the concurrent
pipe-draining and the 60s wedge bound live in one place.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SD7aiLSo59xng2TzU32xEa

* Review: drain the async readers before parsing, and reword one assertion

Copilot caught a real one. `WaitForExit(int)` waits only for the PROCESS; the
parameterless overload is what waits for the readers started by
BeginOutputReadLine/BeginErrorReadLine to finish flushing. The comment moved in
from #3041 asserted the opposite ("it is what flushes the final buffered lines"),
which is true of `WaitForExit()` and false of `WaitForExit(ms)`. A truncated
stdout would make the probe fail on a JSON parse error rather than on its
subject — a guard reporting the wrong thing, which is the failure this guard
exists to prevent. The process has already exited at that point, so the extra
call returns as soon as the readers drain.

Also: "propert(ies)" -> "switch(es)" in the control arm's message.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SD7aiLSo59xng2TzU32xEa

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@rbuergi
rbuergi deleted the feat/maps-indexing-leave-core 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

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants