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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
46 changes: 14 additions & 32 deletions .github/scripts/shard-assign.sh
Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,24 @@
# drifted the same way (Monolith 200→345, Data 25→73, PluginTester 60→8).
#
# The floor for ANY sharding is the heaviest single SCHEDULABLE UNIT — a project,
# or one part of a split one. Today that is Hosting.Monolith.Test's three thirds
# at ~221 s each. Adding shards below that buys nothing.
# or one part of a split one. Today that is Hosting.Orleans.Test at 269 s, which
# became the long pole when 17 suites moved to MeshWeaver.Plugins (#2276) and took
# Hosting.Monolith.Test (663 s / 3 parts) and PluginCatalog.Test (348 s / 2) with
# them. Adding shards below that floor buys nothing.
#
# SPLIT RULE — TWO independent triggers. Either one is sufficient.
#
# (1) BALANCE. Solo weight exceeds the ideal shard load (sum ÷ SHARD_TOTAL,
# currently 2526 ÷ 6 ≈ 421 s), because only then is the project the binding
# floor. Monolith (663 s) qualifies. (AI.Test's split was dropped under this
# rule before the suite itself moved to MeshWeaver.Plugins, #2276.)
# currently 731 ÷ 6 ≈ 122 s), because only then is the project the binding
# floor. (AI.Test's split was dropped under this rule before the suite itself
# moved to MeshWeaver.Plugins, #2276; Monolith's three parts and
# PluginCatalog's two left with the same migration.)
#
# 🚨 The remaining table is small enough that this trigger now fires on the
# four heaviest entries at once. It is NOT an instruction to split them: the
# table is a stale measurement of a tree that just lost two thirds of its
# weight, so RE-MEASURE against a real run before acting on it. Trigger (2)
# is the one with teeth, and nothing currently breaches it.
#
# (2) 🚨 HEADROOM AGAINST THE PER-PROJECT CAP (#2747). Solo weight exceeds ~60%
# of the `timeout 8m` = 480 s wall-clock cap each project runs under in
Expand Down Expand Up @@ -110,47 +119,20 @@ fi

# "<seconds> <project-name>", heaviest first.
WEIGHTS=$(cat <<'EOF'
663 MeshWeaver.Hosting.Monolith.Test 3
348 MeshWeaver.PluginCatalog.Test 2
269 MeshWeaver.Hosting.Orleans.Test
91 MeshWeaver.Data.Test
76 MeshWeaver.Messaging.Hub.Test
74 MeshWeaver.PluginTester.Test
69 MeshWeaver.Graph.Test
65 MeshWeaver.Persistence.Test
65 MeshWeaver.Content.Test
54 MeshWeaver.GitSync.Test
53 MeshWeaver.Acme.Test
51 MeshWeaver.FutuRe.Test
50 MeshWeaver.Query.Test
48 MeshWeaver.Autocomplete.Test
46 MeshWeaver.Security.Test
44 MeshWeaver.Auth.Test
26 MeshWeaver.Layout.Test
25 Memex.Portal.Shared.Test
18 MeshWeaver.NodeOperations.Test
13 MeshWeaver.Markdown.Test
10 MeshWeaver.PathResolution.Test
9 MeshWeaver.PythonDemo.Test
9 MeshWeaver.ContentCollections.Indexing.Graph.Test
8 MeshWeaver.Hosting.Test
7 MeshWeaver.ContentCollections.Test
6 MeshWeaver.Documentation.Test
6 MeshWeaver.AccessControl.Test
5 MeshWeaver.Todo.Test
5 MeshWeaver.MathDemo.Test
4 MeshWeaver.Serialization.Test
3 MeshWeaver.Json.Test
2 MeshWeaver.ContentCollections.Indexing.Test
2 MeshWeaver.Kernel.Test
2 MeshWeaver.Search.Test
2 MeshWeaver.Markdown.Collaboration.Test
2 MeshWeaver.PluginImage.Test
2 MeshWeaver.Portal.E2E.Test
2 MeshWeaver.Reactive.Assertions.Test
1 MeshWeaver.TestDomain
1 MeshWeaver.Data.TestDomain
1 MeshWeaver.Hub.Fixture
EOF
)

Expand Down
9 changes: 5 additions & 4 deletions .github/workflows/alc-unload-probe.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,9 @@
# original blocking-only form exercised only a path on which no crash has been observed.
# Full RCA: Doc/Architecture/DebuggingNativeCrashes → the 2026-08-06 section.
#
# Run from the Actions tab (workflow_dispatch). Re-dispatch with project=MeshWeaver.FutuRe.Test
# to probe the other crasher.
# Run from the Actions tab (workflow_dispatch). The default was MeshWeaver.Hosting.Monolith.Test
# until that suite moved to MeshWeaver.Plugins (#2276); FutuRe.Test is the other observed crasher
# and still lives here, so it is the default now. Re-dispatch with any other project name.
name: ALC unload probe (manual)

on:
Expand All @@ -36,7 +37,7 @@ on:
project:
description: "Test project NAME whose native host to loop under the probe"
type: string
default: "MeshWeaver.Hosting.Monolith.Test"
default: "MeshWeaver.FutuRe.Test"
iterations:
description: "Max loop iterations (stops on the first native crash)"
type: string
Expand All @@ -55,7 +56,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 120
env:
PROBE_PROJECT: ${{ inputs.project || 'MeshWeaver.Hosting.Monolith.Test' }}
PROBE_PROJECT: ${{ inputs.project || 'MeshWeaver.FutuRe.Test' }}
PROBE_ITERS: ${{ inputs.iterations || '10' }}
DOTNET_ENVIRONMENT: Development
Logging__LogLevel__Default: Warning
Expand Down
13 changes: 7 additions & 6 deletions .github/workflows/flake-repro.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@
# wedge is diagnosable — i.e. it manufactures the repro the fix must be proven against.
#
# Run it from the Actions tab (workflow_dispatch). Defaults target CodeEditRecompile;
# re-dispatch with project=test/MeshWeaver.Hosting.Orleans.Test filter=FullyQualifiedName~PartitionRootActivationTest
# (etc.) for the others.
# The defaults pointed at CodeEditRecompileTest in test/MeshWeaver.Hosting.Monolith.Test until that
# suite moved to MeshWeaver.Plugins (#2276); they now name a suite that still lives here.
# Re-dispatch with any other project=/filter= pair for the others.
name: Flake repro (manual)

on:
Expand All @@ -19,11 +20,11 @@ on:
project:
description: "Test project to loop"
type: string
default: "test/MeshWeaver.Hosting.Monolith.Test"
default: "test/MeshWeaver.Hosting.Orleans.Test"
filter:
description: "dotnet test --filter expression (the suspect test)"
type: string
default: "FullyQualifiedName~CodeEditRecompileTest.PressingCompileButton_SetsRequestedReleaseAt_AndProducesNewRelease"
default: "FullyQualifiedName~PartitionRootActivationTest"
iterations:
description: "Max loop iterations (stop-on-first-failure mode stops early; rate mode always runs all of them)"
type: string
Expand Down Expand Up @@ -60,8 +61,8 @@ jobs:
timeout-minutes: 60
# Effective params: workflow_dispatch inputs when present, else push-trigger defaults.
env:
REPRO_PROJECT: ${{ inputs.project || 'test/MeshWeaver.Hosting.Monolith.Test' }}
REPRO_FILTER: ${{ inputs.filter || 'FullyQualifiedName~CodeEditRecompileTest.PressingCompileButton_SetsRequestedReleaseAt_AndProducesNewRelease' }}
REPRO_PROJECT: ${{ inputs.project || 'test/MeshWeaver.Hosting.Orleans.Test' }}
REPRO_FILTER: ${{ inputs.filter || 'FullyQualifiedName~PartitionRootActivationTest' }}
REPRO_ITERS: ${{ inputs.iterations || '80' }}
REPRO_MODE: ${{ inputs.mode || 'hunt' }}
DOTNET_ENVIRONMENT: Development
Expand Down
27 changes: 0 additions & 27 deletions MeshWeaver.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -71,45 +71,18 @@
<File Path="test/Directory.Build.props" />
<File Path="test/Directory.Packages.props" />
<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.Data.Test/MeshWeaver.Data.Test.csproj" />
<Project Path="test/MeshWeaver.Documentation.Test/MeshWeaver.Documentation.Test.csproj" />
<Project Path="test/MeshWeaver.Data.TestDomain/MeshWeaver.Data.TestDomain.csproj" />
<Project Path="test/MeshWeaver.Hosting.Monolith.Test/MeshWeaver.Hosting.Monolith.Test.csproj" />
<Project Path="test/MeshWeaver.Hosting.Orleans.Test/MeshWeaver.Hosting.Orleans.Test.csproj" />
<Project Path="test/MeshWeaver.Json.Test/MeshWeaver.Json.Test.csproj" />
<Project Path="test/MeshWeaver.Layout.Test/MeshWeaver.Layout.Test.csproj" />
<Project Path="test/MeshWeaver.Markdown.Test/MeshWeaver.Markdown.Test.csproj" />
<Project Path="test/MeshWeaver.MathDemo.Test/MeshWeaver.MathDemo.Test.csproj" />
<Project Path="test/MeshWeaver.PythonDemo.Test/MeshWeaver.PythonDemo.Test.csproj" />
<Project Path="test/MeshWeaver.Messaging.Hub.Test/MeshWeaver.Messaging.Hub.Test.csproj" />
<Project Path="test/MeshWeaver.NodeOperations.Test/MeshWeaver.NodeOperations.Test.csproj" />
<Project Path="test/MeshWeaver.PluginCatalog.Test/MeshWeaver.PluginCatalog.Test.csproj" />
<Project Path="test/MeshWeaver.Search.Test/MeshWeaver.Search.Test.csproj" />
<Project Path="test/MeshWeaver.Security.Test/MeshWeaver.Security.Test.csproj" />
<Project Path="test/MeshWeaver.Security.MeshTest/MeshWeaver.Security.MeshTest.csproj" />
<Project Path="test/MeshWeaver.TestDomain/MeshWeaver.TestDomain.csproj" />
<Project Path="test/MeshWeaver.Graph.Test/MeshWeaver.Graph.Test.csproj" />
<Project Path="test/MeshWeaver.GitSync.Test/MeshWeaver.GitSync.Test.csproj" />
<Project Path="test/MeshWeaver.Hosting.Test/MeshWeaver.Hosting.Test.csproj" />
<Project Path="test/MeshWeaver.Hub.Fixture/MeshWeaver.Hub.Fixture.csproj" />
<Project Path="test/MeshWeaver.Kernel.Test/MeshWeaver.Kernel.Test.csproj" />
<Project Path="test/MeshWeaver.PluginImage.Test/MeshWeaver.PluginImage.Test.csproj" />
<Project Path="test/MeshWeaver.PluginTester.Test/MeshWeaver.PluginTester.Test.csproj" />
<Project Path="test/MeshWeaver.Auth.Test/MeshWeaver.Auth.Test.csproj" />
<Project Path="test/MeshWeaver.FutuRe.Test/MeshWeaver.FutuRe.Test.csproj" />
<Project Path="test/MeshWeaver.AccessControl.Test/MeshWeaver.AccessControl.Test.csproj" />
<Project Path="test/MeshWeaver.Acme.Test/MeshWeaver.Acme.Test.csproj" />
<Project Path="test/MeshWeaver.Todo.Test/MeshWeaver.Todo.Test.csproj" />
<Project Path="test/MeshWeaver.PathResolution.Test/MeshWeaver.PathResolution.Test.csproj" />
<Project Path="test/MeshWeaver.Persistence.Test/MeshWeaver.Persistence.Test.csproj" />
<Project Path="test/MeshWeaver.Autocomplete.Test/MeshWeaver.Autocomplete.Test.csproj" />
<Project Path="test/MeshWeaver.Query.Test/MeshWeaver.Query.Test.csproj" />
<Project Path="test/MeshWeaver.Reactive.Assertions.Test/MeshWeaver.Reactive.Assertions.Test.csproj" />
<Project Path="test/MeshWeaver.Testcontainers.Test/MeshWeaver.Testcontainers.Test.csproj" />
<Project Path="test/MeshWeaver.Portal.E2E.Test/MeshWeaver.Portal.E2E.Test.csproj" />
<Project Path="test/MeshWeaver.Serialization.Test/MeshWeaver.Serialization.Test.csproj" />
<Project Path="test/Memex.Portal.Shared.Test/Memex.Portal.Shared.Test.csproj" />
</Folder>
<Folder Name="/tools/">
Expand Down
3 changes: 0 additions & 3 deletions test/BlockingBridgeSites.allow
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@
# helper that might accidentally deadlock the suite, it IS the deadlock, constructed on a private
# single-threaded SynchronizationContext and proven via a BOUNDED wait from a genuinely separate
# thread. It exists to pin the mechanism this whole ratchet is about; see the file's own remarks.
test/MeshWeaver.ContentCollections.Indexing.Graph.Test/ContentChunkAutocompleteProviderTest.cs 2
test/MeshWeaver.ContentCollections.Indexing.Test/ChunkNavigationStoreTest.cs 2
test/MeshWeaver.ContentCollections.Indexing.Test/ContentChunkSearchTest.cs 6
test/MeshWeaver.ContentCollections.Indexing.Test/ContentSearchHitContractTest.cs 2
Expand All @@ -91,8 +90,6 @@ test/MeshWeaver.Graph.Test/NodeTypeBakeStatusTest.cs 2
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

This file was deleted.

This file was deleted.

Loading
Loading