Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude/skills/sigsegv/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ the process happened to be. Where the evidence lives:
`TEST_START` / `TEST_END` window markers and `[FAULT]` records with stacks, joinable by `pid=`.
A `TEST_START` with no `TEST_END` names the test a killed host was stuck in.
🚨 Records are rate-bounded — `grep FAULT-BUDGET` before reasoning from an *absence*.
- **`test-logs/teardown-stragglers.log`** (`src/MeshWeaver.Fixture/TeardownStragglerCapturer.cs`) —
- **`test-logs/teardown-stragglers.log`** (`test/MeshWeaver.Fixture/TeardownStragglerCapturer.cs`) —
`FirstChanceException` dumps every straggler with a stack, **including the caught ones invisible
everywhere else**. This is the diagnostic for "all tests pass, host exits non-zero". Run the
native host the way CI does (`dotnet <Suite>.dll -trx …` from the bin dir); `dotnet test` is not
Expand Down
6 changes: 3 additions & 3 deletions MeshWeaver.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,15 @@
<Project Path="src/MeshWeaver.Data/MeshWeaver.Data.csproj" />
<Project Path="src/MeshWeaver.Documentation/MeshWeaver.Documentation.csproj" />
<Project Path="src/MeshWeaver.Domain/MeshWeaver.Domain.csproj" />
<Project Path="src/MeshWeaver.Fixture/MeshWeaver.Fixture.csproj" />
<Project Path="test/MeshWeaver.Fixture/MeshWeaver.Fixture.csproj" />
<Project Path="src/MeshWeaver.Reactive.Assertions/MeshWeaver.Reactive.Assertions.csproj" />
<Project Path="src/MeshWeaver.Maps/MeshWeaver.Maps.csproj" />
<Project Path="src/MeshWeaver.Hosting.AspNetCore/MeshWeaver.Hosting.AspNetCore.csproj" />
<Project Path="src/MeshWeaver.Graph/MeshWeaver.Graph.csproj" />
<Project Path="src/MeshWeaver.GitSync/MeshWeaver.GitSync.csproj" />
<Project Path="src/MeshWeaver.Hosting.Monolith/MeshWeaver.Hosting.Monolith.csproj" />
<Project Path="src/MeshWeaver.Hosting.Orleans/MeshWeaver.Hosting.Orleans.csproj" />
<Project Path="src/MeshWeaver.Hosting.Orleans.TestBase/MeshWeaver.Hosting.Orleans.TestBase.csproj" />
<Project Path="test/MeshWeaver.Hosting.Orleans.TestBase/MeshWeaver.Hosting.Orleans.TestBase.csproj" />
<Project Path="src/MeshWeaver.Hosting.Embeddings/MeshWeaver.Hosting.Embeddings.csproj" />
<Project Path="src/MeshWeaver.Hosting/MeshWeaver.Hosting.csproj" />
<Project Path="src/MeshWeaver.Kernel.Hub/MeshWeaver.Kernel.Hub.csproj" />
Expand All @@ -74,7 +74,7 @@
<File Path="test/appsettings.json" />
<File Path="test/Directory.Build.props" />
<File Path="test/Directory.Packages.props" />
<Project Path="src/MeshWeaver.Hosting.Monolith.TestBase/MeshWeaver.Hosting.Monolith.TestBase.csproj" />
<Project Path="test/MeshWeaver.Hosting.Monolith.TestBase/MeshWeaver.Hosting.Monolith.TestBase.csproj" />
<Project Path="test/MeshWeaver.Content.Test/MeshWeaver.Content.Test.csproj" />
<Project Path="test/MeshWeaver.ContentCollections.Test/MeshWeaver.ContentCollections.Test.csproj" />
<Project Path="test/MeshWeaver.ContentCollections.Indexing.Test/MeshWeaver.ContentCollections.Indexing.Test.csproj" />
Expand Down
9 changes: 0 additions & 9 deletions scripts/type-forwards.allow
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,3 @@
# pre-split). A forwarder is impossible here: the base would have to reference the AI assembly,
# which references the base (the documented reference-cycle case).

# #2771 — ObservableAwait leaves MeshWeaver.Fixture for MeshWeaver.Messaging.Hub (namespace
# MeshWeaver.Fixture → MeshWeaver.Messaging), so product code gets the deadlock-safe bridge. No
# shipped package can hold the TypeRef: the type was added 2026-08-30 by #2750, one day AFTER the
# last release (v3.0.0-rc8, 2026-08-29), and the shipped MeshWeaver.Fixture 3.0.0-rc8 nupkg was
# pulled from nuget.org and inspected — it contains no ObservableAwait (control: HubTestBase,
# TestBase, ConfigureMesh all present in the same DLL). Fixture is in no module bundle or bake
# surface; its only consumers are TestBase assemblies and test projects that compile from source.
# A forwarder is impossible without keeping `namespace MeshWeaver.Fixture` inside a product
# assembly, which would tell product code to `using MeshWeaver.Fixture` — the wrong direction.
Original file line number Diff line number Diff line change
Expand Up @@ -515,7 +515,7 @@ Use `FullyQualifiedName~` — it is the only `--filter` property this repo uses
## Test Project Layout

- Framework code lives in `src/`, tests in `test/`, with one `*.Test` project per production project where it makes sense.
- Shared fixtures live in `src/MeshWeaver.Hosting.Monolith.TestBase` and the Orleans test base.
- Shared fixtures live in `test/MeshWeaver.Hosting.Monolith.TestBase` and the Orleans test base.
- NodeType tests live in the NodeType's `Test/` namespace (`Namespace/Type/Test/TypeTest.cs`).

---
Expand All @@ -528,4 +528,4 @@ Use `FullyQualifiedName~` — it is the only `--filter` property this repo uses
- [Asynchronous Calls](/Doc/Architecture/AsynchronousCalls) — why hub-reachable code is `IObservable<T>`, never `Task<T>`
- [CQRS — Queries vs. Content Access](/Doc/Architecture/CqrsAndContentAccess) — why `ReadNode` is the right read after a write
- [Debugging Message Flow](/Doc/Architecture/DebuggingMessageFlow) — reading the framework's own trace when a test hangs
- `src/MeshWeaver.Hosting.Monolith.TestBase/MonolithMeshTestBase.cs` — the base every monolith test inherits
- `test/MeshWeaver.Hosting.Monolith.TestBase/MonolithMeshTestBase.cs` — the base every monolith test inherits
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,10 @@ The `.csproj` needs a handful of standard references. Use `test/MeshWeaver.Acme.
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\MeshWeaver.Fixture\MeshWeaver.Fixture.csproj" />
<!-- test-support only: lives under test/ (never packed or published) since 2026-08-30 -->
<ProjectReference Include="..\MeshWeaver.Fixture\MeshWeaver.Fixture.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Hosting.Monolith\MeshWeaver.Hosting.Monolith.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Hosting.Monolith.TestBase\MeshWeaver.Hosting.Monolith.TestBase.csproj" />
<ProjectReference Include="..\MeshWeaver.Hosting.Monolith.TestBase\MeshWeaver.Hosting.Monolith.TestBase.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Hosting\MeshWeaver.Hosting.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Graph\MeshWeaver.Graph.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Layout\MeshWeaver.Layout.csproj" />
Expand Down
18 changes: 0 additions & 18 deletions src/MeshWeaver.Fixture/MeshWeaver.Fixture.csproj

This file was deleted.

This file was deleted.

4 changes: 3 additions & 1 deletion test/BlockingBridgeSites.allow
Original file line number Diff line number Diff line change
Expand Up @@ -88,9 +88,11 @@ test/MeshWeaver.ContentCollections.Test/ObservableCollectionSurfaceTest.cs 2
test/MeshWeaver.Documentation.Test/BlockingBridgeSelfDeadlockMechanismTest.cs 1
test/MeshWeaver.Graph.Test/NodeTypeAdoptionRegistryTest.cs 3
test/MeshWeaver.Graph.Test/NodeTypeBakeStatusTest.cs 2
test/MeshWeaver.Graph.Test/OverlayReEvaluationReadTest.cs 3
test/MeshWeaver.Hosting.Orleans.Test/OrleansEventSubscriptionTimerTest.cs 1
test/MeshWeaver.Hosting.Test/AlcLeaseRegistryTest.cs 3
test/MeshWeaver.Messaging.Hub.Test/SystemScopeDoesNotEscapeTest.cs 3
test/MeshWeaver.PluginCatalog.Test/FeatureFlagReaderTest.cs 7
test/MeshWeaver.PluginCatalog.Test/PackageParameterResolutionTest.cs 1
# Moved here from ProductionBlockingBridgeSites.allow on 2026-08-30 with the Orleans TestBase (src/ → test/):
# the same single site, now under the test tree this ratchet scans — not a new bridge.
test/MeshWeaver.Hosting.Orleans.TestBase/OrleansClusterDisposal.cs 1
14 changes: 10 additions & 4 deletions test/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -83,13 +83,19 @@
<ItemGroup>
<!-- Global project reference: every test project gets the assertion library. -->
<ProjectReference Include="$(MSBuildThisFileDirectory)..\src\MeshWeaver.Reactive.Assertions\MeshWeaver.Reactive.Assertions.csproj" />
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="xunit.v3" />
<PackageReference Include="xunit.runner.visualstudio">
<!-- The three test-SUPPORT libraries (MeshWeaver.Fixture and the two TestBase assemblies) moved
here from src/ on 2026-08-30 so they are never packed or published again. They are
LIBRARIES: no test SDK, no xunit runner, no generated entry point — a generated
XunitAutoGeneratedEntryPoint in a library duplicates the consumer's (CS0436) and turns
every referenced base into a second test host. They opt out with
MeshWeaverTestSupportLibrary=true; everything else under test/ is a test project. -->
<PackageReference Include="Microsoft.NET.Test.Sdk" Condition="'$(MeshWeaverTestSupportLibrary)' != 'true'" />
<PackageReference Include="xunit.v3" Condition="'$(MeshWeaverTestSupportLibrary)' != 'true'" />
<PackageReference Include="xunit.runner.visualstudio" Condition="'$(MeshWeaverTestSupportLibrary)' != 'true'">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="xunit.v3.runner.console">
<PackageReference Include="xunit.v3.runner.console" Condition="'$(MeshWeaverTestSupportLibrary)' != 'true'">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
Expand Down
4 changes: 2 additions & 2 deletions test/Memex.Portal.Shared.Test/Memex.Portal.Shared.Test.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
cancellation raised by the CALLER is reported as a database verdict (#1183). -->
<!-- LocalMeshApiRoutesTest asserts the headless sidecar maps the same /api/mesh/* verbs the JS
shells call — an unmapped one there answers the SPA fallback with a 200, not a 404 (#1474). -->
<ProjectReference Include="..\..\src\MeshWeaver.Fixture\MeshWeaver.Fixture.csproj" />
<ProjectReference Include="..\MeshWeaver.Fixture\MeshWeaver.Fixture.csproj" />
<!-- ViewPackModuleTest asserts on each view pack's module attribute, and all of them left
Memex.Portal.Shared's closure when they flipped to modules/ (#1974) — so the test anchors
the packs itself rather than riding portal references that no longer exist. Safe here
Expand All @@ -39,6 +39,6 @@
DbVersion.Latest drift shipped a dead image while main stayed green (V53, 2026-08-14). -->
<!-- OAuthCodeStoreTest runs against a full monolith mesh (the store persists
authorization codes as mesh nodes — the multi-replica safety contract). -->
<ProjectReference Include="..\..\src\MeshWeaver.Hosting.Monolith.TestBase\MeshWeaver.Hosting.Monolith.TestBase.csproj" />
<ProjectReference Include="..\MeshWeaver.Hosting.Monolith.TestBase\MeshWeaver.Hosting.Monolith.TestBase.csproj" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\MeshWeaver.Hosting.Monolith.TestBase\MeshWeaver.Hosting.Monolith.TestBase.csproj" />
<ProjectReference Include="..\MeshWeaver.Hosting.Monolith.TestBase\MeshWeaver.Hosting.Monolith.TestBase.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Layout\MeshWeaver.Layout.csproj" />
</ItemGroup>
</Project>
4 changes: 2 additions & 2 deletions test/MeshWeaver.Acme.Test/MeshWeaver.Acme.Test.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\MeshWeaver.Fixture\MeshWeaver.Fixture.csproj" />
<ProjectReference Include="..\MeshWeaver.Fixture\MeshWeaver.Fixture.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Hosting.Monolith\MeshWeaver.Hosting.Monolith.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Markdown\MeshWeaver.Markdown.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Hosting\MeshWeaver.Hosting.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Hosting.Monolith.TestBase\MeshWeaver.Hosting.Monolith.TestBase.csproj" />
<ProjectReference Include="..\MeshWeaver.Hosting.Monolith.TestBase\MeshWeaver.Hosting.Monolith.TestBase.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Layout\MeshWeaver.Layout.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Graph\MeshWeaver.Graph.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Mesh.Contract\MeshWeaver.Mesh.Contract.csproj" />
Expand Down
2 changes: 1 addition & 1 deletion test/MeshWeaver.Auth.Test/MeshWeaver.Auth.Test.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<ItemGroup>
<ProjectReference Include="..\..\memex\Memex.Portal.Shared\Memex.Portal.Shared.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Graph\MeshWeaver.Graph.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Hosting.Monolith.TestBase\MeshWeaver.Hosting.Monolith.TestBase.csproj" />
<ProjectReference Include="..\MeshWeaver.Hosting.Monolith.TestBase\MeshWeaver.Hosting.Monolith.TestBase.csproj" />
</ItemGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,11 @@
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\MeshWeaver.Fixture\MeshWeaver.Fixture.csproj" />
<ProjectReference Include="..\MeshWeaver.Fixture\MeshWeaver.Fixture.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Hosting.Monolith\MeshWeaver.Hosting.Monolith.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Hosting\MeshWeaver.Hosting.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Mesh.Contract\MeshWeaver.Mesh.Contract.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Hosting.Monolith.TestBase\MeshWeaver.Hosting.Monolith.TestBase.csproj" />
<ProjectReference Include="..\MeshWeaver.Hosting.Monolith.TestBase\MeshWeaver.Hosting.Monolith.TestBase.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Layout\MeshWeaver.Layout.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Graph\MeshWeaver.Graph.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Documentation\MeshWeaver.Documentation.csproj" />
Expand Down
4 changes: 2 additions & 2 deletions test/MeshWeaver.Content.Test/MeshWeaver.Content.Test.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,12 @@
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\MeshWeaver.Fixture\MeshWeaver.Fixture.csproj" />
<ProjectReference Include="..\MeshWeaver.Fixture\MeshWeaver.Fixture.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Hosting.Monolith\MeshWeaver.Hosting.Monolith.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Hosting\MeshWeaver.Hosting.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Kernel.Hub\MeshWeaver.Kernel.Hub.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Mesh.Contract\MeshWeaver.Mesh.Contract.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Hosting.Monolith.TestBase\MeshWeaver.Hosting.Monolith.TestBase.csproj" />
<ProjectReference Include="..\MeshWeaver.Hosting.Monolith.TestBase\MeshWeaver.Hosting.Monolith.TestBase.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Layout\MeshWeaver.Layout.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Graph\MeshWeaver.Graph.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Documentation\MeshWeaver.Documentation.csproj" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<ProjectReference Include="..\..\src\MeshWeaver.ContentCollections\MeshWeaver.ContentCollections.csproj" />
<!-- Real workspace + mesh: MonolithMeshTestBase. -->
<ProjectReference Include="..\..\src\MeshWeaver.Hosting.Monolith\MeshWeaver.Hosting.Monolith.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Hosting.Monolith.TestBase\MeshWeaver.Hosting.Monolith.TestBase.csproj" />
<ProjectReference Include="..\MeshWeaver.Hosting.Monolith.TestBase\MeshWeaver.Hosting.Monolith.TestBase.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Graph\MeshWeaver.Graph.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Mesh.Contract\MeshWeaver.Mesh.Contract.csproj" />
<!-- Layout-area rendering (DocumentBlocksAreaRenderTest): LayoutAreaReference + the
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

<ItemGroup>
<ProjectReference Include="..\..\src\MeshWeaver.ContentCollections.Indexing\MeshWeaver.ContentCollections.Indexing.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Fixture\MeshWeaver.Fixture.csproj" />
<ProjectReference Include="..\MeshWeaver.Fixture\MeshWeaver.Fixture.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DocumentFormat.OpenXml" />
<ProjectReference Include="..\..\src\MeshWeaver.Fixture\MeshWeaver.Fixture.csproj" />
<ProjectReference Include="..\MeshWeaver.Fixture\MeshWeaver.Fixture.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.ContentCollections\MeshWeaver.ContentCollections.csproj" />
</ItemGroup>
<ItemGroup>
Expand Down
2 changes: 1 addition & 1 deletion test/MeshWeaver.Data.Test/MeshWeaver.Data.Test.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\MeshWeaver.Data\MeshWeaver.Data.csproj" />
<ProjectReference Include="..\..\src\MeshWeaver.Fixture\MeshWeaver.Fixture.csproj" />
<ProjectReference Include="..\MeshWeaver.Fixture\MeshWeaver.Fixture.csproj" />
<!-- IMeshChangeFeed / MeshChangeEvent live here. src/MeshWeaver.Data resolves them by
reflection (to avoid a Data→Mesh.Contract→Layout→Data prod cycle); a leaf TEST
project referencing them directly is cycle-free and lets the test drive the feed. -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ public class BlockingBridgeInTestRatchetGuard(ITestOutputHelper output)
/// the shape; this stops the list as a WHOLE from growing — including by the trick of adding a
/// new file's line. Lower it whenever you delete or lower an entry.
/// </summary>
private const int TotalBudget = 38;
private const int TotalBudget = 36;

/// <summary>
/// <c>test/</c> only — this guard exists because tests were treated as exempt from the
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -287,8 +287,11 @@ private static bool IsHarnessFile(string relative)
// The shared test bases and the fixture library they are built on.
"src" => parts[1].EndsWith(".TestBase", StringComparison.Ordinal)
|| parts[1].Contains(".Fixture", StringComparison.Ordinal),
// Fixtures only — test BODIES are bounded by their base class's join (see the remarks).
"test" => parts[1].Contains(".Fixture", StringComparison.Ordinal)
// The shared test bases and the fixture library (under test/ since 2026-08-30, so they
// are never packed or published) plus fixtures — test BODIES are bounded by their base
// class's join (see the remarks).
"test" => parts[1].EndsWith(".TestBase", StringComparison.Ordinal)
|| parts[1].Contains(".Fixture", StringComparison.Ordinal)
|| parts[^1].Contains("Fixture", StringComparison.Ordinal),
_ => false,
};
Expand Down
Loading
Loading