Repository navigation
The indexing pipeline, the map control and Cornerstone leave the content surface - #2941
Conversation
Test Results (shard 0)764 tests 764 ✅ 3m 14s ⏱️ Results for commit b0f756e. ♻️ This comment has been updated with latest results. |
There was a problem hiding this comment.
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, andMeshWeaver.ContentCollections.Indexing.Graphprojects (and their tests) from this repository and solution, plus drop now-unneeded references from test/tool/portal projects. - Move
DocumentPathsintoMeshWeaver.Mesh.Contractwhile preserving theMeshWeaver.ContentCollections.Indexingnamespace 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.
| 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. |
| @@ -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. --> | |||
| 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. --> |
Test Results (shard 5) 7 files 7 suites 3m 51s ⏱️ Results for commit b0f756e. ♻️ This comment has been updated with latest results. |
Test Results (shard 4)1 427 tests 1 427 ✅ 4m 52s ⏱️ Results for commit b0f756e. ♻️ This comment has been updated with latest results. |
Test Results (shard 1)1 241 tests 1 241 ✅ 4m 7s ⏱️ Results for commit b0f756e. ♻️ This comment has been updated with latest results. |
Test Results (shard 2)2 597 tests 2 593 ✅ 6m 42s ⏱️ Results for commit b0f756e. ♻️ This comment has been updated with latest results. |
|
🚨 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 #2943 breaks the cycle by moving New order: #2943 → Plugins#1057 → this PR. This branch still carries the 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 Nothing here is landing today regardless — held pending a decision on flipping framework identity before Friday's talk. |
Test Results (shard 3)858 tests 858 ✅ 7m 43s ⏱️ Results for commit b0f756e. ♻️ This comment has been updated with latest results. |
Test Results 42 files 42 suites 30m 33s ⏱️ Results for commit b0f756e. ♻️ This comment has been updated with latest results. |
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
efb5412 to
b0f756e
Compare
|
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 nowThis PR removes And Plugins
The counterpart does not cover itPlugins #1057 brings Ordering
I am fixing the Plugins side now: the 11 references get the dual-path shape this repo already uses for the Dequeuing costs the three PRs ahead of this one a rebuild, which is the cheaper mistake. |
|
Correcting a number in my comment above: on Plugins The 11 was measured on #1057's head, which adds the reference to five migrated test suites as well. On The conclusion is unchanged — six unconditional 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. |
|
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 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 <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. |
|
Unblocked — re-arming. plugins#1092 has merged, so all 11 Plugins references to |
Downstream check: two of the three deleted projects still have unconditional references in
|
| 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.csprojlines 51–52MeshWeaver.Plugins→src/Memex.Portal.Gui/Memex.Portal.Gui.csprojlines 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.
|
Now safe in either order — all three of this PR's deletions are covered on the Plugins side. My earlier comments only covered
The two I missed were All four now use the dual-path Nothing further blocks this from my side. |
…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>
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.ContentSurfaceAssembliesis the boundary that matters. Wave A's two projects were outside it, which is why they cost a.csprojedit.MeshWeaver.Maps,ContentCollections.Indexingand.Indexing.Graphare inside it, so each is theMeshWeaver.AI/Markdown.Collaborationmove — 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.csbindsMapControl— and it is aSource/*.csmesh node, compiled at runtime in the portal, invisible todotnet build, and baked into the shipped image.🚨 That is why five test projects referenced
MeshWeaver.Mapswhile not one line of their own C# mentioned it: their test meshes compile that sample. The.csprojgraph misleads in both directions here — four references turned out to carry no code dependency at all (Memex.Portal.Sharedbuilds-warnaserrorclean withoutMaps,Indexing,.Indexing.GraphandObservability.Contract), while the consumer that actually pinned Maps appears in no project file.So the content travels with the module, exactly as
Markdown.Collaborationtook its Review sources. Cornerstone is aStore/Pluginpackage in the plugins repo now, and its six suites pass 114/114 there.The contract split
Mesh.Operationsstays here and needs exactly one type.DocumentPathsmoves toMeshWeaver.Mesh.Contract, keeping itsMeshWeaver.ContentCollections.Indexingnamespace — everyusingstill resolves and no consumer changed.Mesh.Contractrather thanContentCollectionsbecause the indexing base usesDocumentPathstoo (ContentChunkSearch), soContentCollectionswould 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 referenceMesh.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
.mdfiles.🚨 A guard that would have checked nothing
FrameworkBuildIdentityTest.SurfaceIdentity_RecordsAbsenceproved "a host missing a canonical assembly is a different surface" by removing"MeshWeaver.Maps"from the baseline. With Maps out of the baseline thatRemoveremoves 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
AddCornerstoneleavesSampleDataExtensions(declaration + itsAddAllSampleDataentry) — a one-lineIncludePartitionwrapper the moved suites call directly now.TestUserskeeps 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-warnaserror, 0 Warning(s) 0 Error(s)Content.Test,Persistence.Test,Hosting.Monolith.Test,PluginTesterFrameworkBuildIdentity.csproj/.slnxhitsThe 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