Skip to content

content/ai gets a drift guard against its published master, and a leak guard (#1627) - #2263

Merged
rbuergi merged 3 commits into
mainfrom
fix/ai-content-pack-drift-guard
Aug 25, 2026
Merged

rbuergi merged 3 commits into
mainfrom
fix/ai-content-pack-drift-guard

Conversation

@rbuergi

@rbuergi rbuergi commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Closes the guard half of #1627.

The problem

content/ai is a mirror. The served master for the built-in agents and skills is the private Systemorph/MeshWeaver.Plugins pack (MeshWeaver.AI.csproj says so in as many words); this repo's copy is the in-memory fixture the framework's delegation / picker / tool-wiring suites run against. Nothing compared the two, so drift accumulated in both directions and was only ever found by measuring by hand.

Measured on this branch's base (core d6c198c0f, pack c29a0de), normalizing line endings — this supersedes the issue's own table:

file state what diverges
Agent/ToolsReference.md InSync the issue lists this as diverged; it has since been reconciled and now hashes identically
Agent/Assistant.md PackAhead the master carries one extra skill row
Agent/LogTriage.md CoreAhead core documents the current incident shape; the master, which serves, has the older text
Agent/Tutor.md CoreAhead core has the node-native course model; the master still describes the retired one
Agent/CommentingReference.md SanitisedOnly the only difference is a sanitised example namespace
the other 9 InSync —

Why a guard and not a sync

This repo is PUBLIC; the pack repo is PRIVATE. "Copy the master over" would publish a customer's node path here — that divergence is deliberate and permanent. So the guard pins the reconciliation point rather than demanding equality:

  • TestData/AiContentPackSync.json records per file: the normalized hash of this repo's copy, the attested hash of the master, a state (InSync / CoreAhead / PackAhead / SanitisedOnly / PackAbsent) and a note. A core edit that does not re-pin its entry fails the build — which is the moment someone has to say what they did about the master.
  • The sanitised entry must keep its placeholder and stay recorded as diverged, so a future sync cannot quietly "fix" it back.
  • The pack half genuinely cannot be checked from this repo's CI (private, no credential here). The ledger says so, and records the pack hashes as an attestation, not something the test verifies — rather than pretending to a check it cannot make.

🚨 The leak guard reports WHERE, never WHAT — please keep it that way

The deny-list is stored as hashes, and a hit is reported as file:line only. A list that spelled the name out, or a failure message that echoed the token, would publish in this public repo — and in its public CI log — exactly what the guard exists to keep out. Please do not "helpfully" add the value to the error message later; the author already knows what is on the line.

It found three live instances, all fixed here

All in example text, none a credential — a company name used where a placeholder belongs:

  • content/ai/Skill/og-card.md — the /og-card skill's example path
  • test/MeshWeaver.Graph.Test/OpenGraphHtmlParserTest.cs — a fixture URL (assertions do not depend on the segment)
  • one migration doc comment

All three now use the Acme/AIConsulting/FinalReport placeholder the rest of the section uses.

Proof the guard fires — restoring the pre-fix og-card.md and running only the leak guard:

Expected collection to be empty because Systemorph/MeshWeaver.Plugins is PRIVATE and this
repository is PUBLIC. … (The token is deliberately not printed.
Sites: Skill/og-card.md:19, Skill/og-card.md:20), but found 2 item(s).

Two sites, named precisely, token withheld. Six in-suite controls drive the same scanner over an invented company name in every spelling it could take (one word, spaced, hyphenated, inside a path segment, embedded in a longer camel-cased identifier) and require a hit; three more require it to stay quiet on the real placeholder and on ordinary prose.

Scope — deliberately not in this PR

  • The content reconciliation itself. Changing agent instructions is a behaviour change needing its own review. The four diverged files are recorded, with which side is ahead, and left open for the maintainer.
  • Skills are roster- and leak-checked only, not hash-compared. The master still stores its skills as typed Skill/*.json nodes, so there is no byte comparison to make against this repo's .md-with-front-matter files. Recorded in the ledger's notes.

What's New

Skipped deliberately: this is a test guard plus example-text sanitisation, with no user-visible behaviour change.

Verification

  • dotnet build -c Release -warnaserror — 0 Error(s) for MeshWeaver.AI.Test, MeshWeaver.Graph.Test, Memex.Database.Migration
  • AiContentPackDriftTest — 15/15 pass (section scan ~70 ms)
  • AiContent* / BuiltInSkillCatalog / SkillMarkdownRoundTrip / SkillNodeType — 50/50 pass
  • OpenGraphHtmlParserTest — 18/18 pass

🤖 Generated with Claude Code

…k guard (#1627)

`content/ai` is a MIRROR: the served master for the built-in agents and skills is
the private `Systemorph/MeshWeaver.Plugins` pack, and this repo's copy is the
in-memory fixture the framework suites run against. Nothing compared the two, so
drift accumulated in BOTH directions and was only ever found by measuring by hand.

Measured on this branch's base (core d6c198c, pack c29a0de), normalizing line
endings: 10 of 14 agent files are byte-identical, and exactly 4 diverge —
`Assistant.md` (pack ahead), `LogTriage.md` and `Tutor.md` (core ahead, so the
SERVED text is the older one), and `CommentingReference.md`, whose ONLY difference
is a sanitised example namespace. Note this supersedes the issue's own table:
`ToolsReference.md` has since been reconciled and now matches exactly.

Why a guard and not a sync. This repo is PUBLIC and the pack repo is PRIVATE, so
"copy the master over" would publish a customer's node path here. That one
divergence is deliberate and permanent. The guard therefore pins the
reconciliation point rather than demanding equality:

- `TestData/AiContentPackSync.json` records, per file, the normalized hash of this
  repo's copy, the attested hash of the master, a state (InSync / CoreAhead /
  PackAhead / SanitisedOnly / PackAbsent) and a note. A core edit that does not
  re-pin its entry fails the build — which is the moment someone has to say what
  they did about the master.
- The sanitised entry must keep its placeholder AND stay recorded as diverged, so
  a future sync cannot quietly "fix" it back to the customer name.
- A leak guard refuses any content carrying a forbidden identifier. The deny-list
  is stored as HASHES and a hit is reported as `file:line` only — a list that
  spelled the name out, or a failure message that echoed it, would publish in this
  public repo (and its public CI log) exactly what it exists to keep out.

The guard found three live instances of that name already committed here, all in
example text, all fixed in this commit: the `/og-card` skill's example path, an
OpenGraph parser test fixture URL, and one migration doc comment. All three now
use the `Acme/AIConsulting/FinalReport` placeholder the rest of the section uses.
Restoring the pre-fix `og-card.md` makes the guard report exactly
`Skill/og-card.md:19, Skill/og-card.md:20` and nothing else.

Skills are roster- and leak-checked only, not hash-compared: the master still
stores its skills as typed `Skill/*.json` nodes, so there is no byte comparison to
make against this repo's `.md`-with-front-matter files. Recorded in the ledger.

Content reconciliation itself is deliberately NOT in this commit — changing agent
instructions is a behaviour change that needs its own review.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

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

Adds CI guards to keep content/ai (the public fixture copy) aligned with the privately-served Systemorph/MeshWeaver.Plugins master, and prevents leaking private/customer identifiers via example text. This strengthens long-term maintainability of built-in agent/skill fixtures by making drift and accidental “unsanitised copy” changes fail fast in tests.

Changes:

  • Introduces AiContentPackDriftTest plus a pinned ledger (AiContentPackSync.json) to enforce a stable reconciliation point and a hashed “leak” deny-list (reported as file:line only).
  • Sanitises example namespaces/paths in content/ai/Skill/og-card.md and in related test/doc text to use the placeholder Acme/AIConsulting/FinalReport.
  • Updates an existing migration doc comment to remove customer/engagement identifiers from public history.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
test/MeshWeaver.Graph.Test/OpenGraphHtmlParserTest.cs Replaces a customer-like example URL/path segment with the standard Acme/AIConsulting/FinalReport placeholder.
test/MeshWeaver.AI.Test/TestData/AiContentPackSync.json Adds the pinned pack-sync ledger (core hash, attested pack hash, state, notes) plus hashed forbidden identifiers.
test/MeshWeaver.AI.Test/AiContentPackDriftTest.cs Adds drift-guard + leak-guard tests enforcing the pinned reconciliation point and scanning content/ai for forbidden identifiers.
memex/aspire/Memex.Database.Migration/Migrations/V53_RetypeBuiltinSlideDeckToPublish.cs Sanitises a doc comment to remove customer/engagement identifiers from public source.
content/ai/Skill/og-card.md Sanitises example OgCard area references to use the Acme/AIConsulting/FinalReport placeholder.

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

…po (review)

The section header claimed repository-wide coverage while Section() enumerates
content/ai/**/*.md only. That is the surface this guard is about — the tree that
MIRRORS the private pack, where copying the master over is how a customer name
gets in — but a future maintainer reading the old header would have believed a
repo-wide secret scan existed. Scope is now stated in both the class summary and
the section, including what it explicitly does NOT cover.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 5)

   10 files  ±0     10 suites  ±0   5m 52s ⏱️ -1s
1 298 tests +9  1 297 ✅ +10  1 💤 ±0  0 ❌  - 1 
1 299 runs  +9  1 298 ✅ +10  1 💤 ±0  0 ❌  - 1 

Results for commit 11f9937. ± Comparison against base commit 8906cad.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 4)

2 063 tests   - 109   1 763 ✅  - 112   8m 33s ⏱️ - 1m 41s
    9 suites ±  0     300 💤 +  3 
    9 files   ±  0       0 ❌ ±  0 

Results for commit 11f9937. ± Comparison against base commit 8906cad.

This pull request removes 627 and adds 518 tests. Note that renamed tests count towards both.
MeshWeaver.AI.Test.AiContentSourcesTest ‑ AddBuiltInAiContentSources_bundles_every_AI_static_repo_source
MeshWeaver.AI.Test.AiContentSourcesTest ‑ All_built_in_AI_sources_default_to_Additive_sync_mode
MeshWeaver.AI.Test.AiContentSourcesTest ‑ ContentPartitions_cover_the_four_AI_content_partitions
MeshWeaver.AI.Test.AiSettingsTest ‑ BuildDefaults_EnabledHarnesses_AreTheRegisteredHarnessIds_OrderedByDefinitionOrder
MeshWeaver.AI.Test.AiSettingsTest ‑ Effective_EmptyFieldsFallBackToDefaults_PerField
MeshWeaver.AI.Test.AiSettingsTest ‑ Effective_NullNode_ReturnsDefaults
MeshWeaver.AI.Test.AiSettingsTest ‑ ResolveQueries_SubstitutesPresentTokens_AndDropsTemplatesWithEmptyTokens
MeshWeaver.AI.Test.AnchoredEditContentTest ‑ ApplyAnchoredEdit_AmbiguousMatch_ThrowsAmbiguousAnchor_WithOccurrenceCount
MeshWeaver.AI.Test.AnchoredEditContentTest ‑ ApplyAnchoredEdit_Code_ReplacesCode_PreservingConfiguration
MeshWeaver.AI.Test.AnchoredEditContentTest ‑ ApplyAnchoredEdit_Markdown_ReplacesAndRerenders_PreservingMetadata
…
MeshWeaver.AI.Test.AiContentSectionTest ‑ EmbeddedFallback_ShipsExactlyTheAuthoredFiles(section: \"Agent\")
MeshWeaver.AI.Test.AiContentSectionTest ‑ EmbeddedFallback_ShipsExactlyTheAuthoredFiles(section: \"Skill\")
MeshWeaver.AI.Test.AiResolutionSeamAuditTest ‑ AllowList_NamesOnlyFilesThatExist_WithAReason
MeshWeaver.AI.Test.AiResolutionSeamAuditTest ‑ EveryResolutionEntryPoint_GoesThroughTheSeam
MeshWeaver.AI.Test.AiResolutionSeamAuditTest ‑ NoResolutionLiteral_OutsideTheAllowList
MeshWeaver.AI.Test.AiSourceCatalogTest ‑ Defaults_AreNamedAndDescribed_ForEveryKind
MeshWeaver.AI.Test.AiSourceCatalogTest ‑ Defaults_ReproduceTheHistoricalQueries_Exactly
MeshWeaver.AI.Test.AiSourceCatalogTest ‑ Expand_DropsWhenAPlaceholderHasNoValue_NeverHalfExpanded
MeshWeaver.AI.Test.AiSourceCatalogTest ‑ Expand_RefusesUnanchoredAndUnknownPlaceholders
MeshWeaver.AI.Test.AiSourceCatalogTest ‑ Expand_SubstitutesNewAndLegacyPlaceholders
…

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 3)

    9 files  ±  0      9 suites  ±0   5m 21s ⏱️ -6s
1 823 tests +130  1 819 ✅ +133  4 💤  - 3  0 ❌ ±0 
2 347 runs  +132  2 343 ✅ +135  4 💤  - 3  0 ❌ ±0 

Results for commit 11f9937. ± Comparison against base commit 8906cad.

This pull request removes 512 and adds 642 tests. Note that renamed tests count towards both.
MeshWeaver.AI.Test.AiContentSectionTest ‑ EmbeddedFallback_ShipsExactlyTheAuthoredFiles(section: \"Agent\")
MeshWeaver.AI.Test.AiContentSectionTest ‑ EmbeddedFallback_ShipsExactlyTheAuthoredFiles(section: \"Skill\")
MeshWeaver.AI.Test.AiResolutionSeamAuditTest ‑ AllowList_NamesOnlyFilesThatExist_WithAReason
MeshWeaver.AI.Test.AiResolutionSeamAuditTest ‑ EveryResolutionEntryPoint_GoesThroughTheSeam
MeshWeaver.AI.Test.AiResolutionSeamAuditTest ‑ NoResolutionLiteral_OutsideTheAllowList
MeshWeaver.AI.Test.AiSourceCatalogTest ‑ Defaults_AreNamedAndDescribed_ForEveryKind
MeshWeaver.AI.Test.AiSourceCatalogTest ‑ Defaults_ReproduceTheHistoricalQueries_Exactly
MeshWeaver.AI.Test.AiSourceCatalogTest ‑ Expand_DropsWhenAPlaceholderHasNoValue_NeverHalfExpanded
MeshWeaver.AI.Test.AiSourceCatalogTest ‑ Expand_RefusesUnanchoredAndUnknownPlaceholders
MeshWeaver.AI.Test.AiSourceCatalogTest ‑ Expand_SubstitutesNewAndLegacyPlaceholders
…
MeshWeaver.AI.Test.AiContentPackDriftTest ‑ EveryEntry_DeclaresACoherentState
MeshWeaver.AI.Test.AiContentPackDriftTest ‑ EveryFile_StillHashesToItsPinnedReconciliationPoint
MeshWeaver.AI.Test.AiContentPackDriftTest ‑ NoForbiddenIdentifier_AppearsInTheContentSection
MeshWeaver.AI.Test.AiContentPackDriftTest ‑ ReSyncingASanitisedFileFromTheMaster_TripsBothPins
MeshWeaver.AI.Test.AiContentPackDriftTest ‑ SanitisedFiles_KeepTheirPlaceholder_AndStayDivergedOnPurpose
MeshWeaver.AI.Test.AiContentPackDriftTest ‑ TheLeakGuard_FiresOnACustomerName(line: \"- Pass the canonical node path (`@/GlobalReinsuran\"···)
MeshWeaver.AI.Test.AiContentPackDriftTest ‑ TheLeakGuard_FiresOnACustomerName(line: \"@@(\\\"area:OgCard/GlobalReinsuranceAg/EslProposalQa\"···)
MeshWeaver.AI.Test.AiContentPackDriftTest ‑ TheLeakGuard_FiresOnACustomerName(line: \"Mirrors the **Global Reinsurance Ag** space into t\"···)
MeshWeaver.AI.Test.AiContentPackDriftTest ‑ TheLeakGuard_FiresOnACustomerName(line: \"a MyGlobalReinsuranceAgReport node under the custo\"···)
MeshWeaver.AI.Test.AiContentPackDriftTest ‑ TheLeakGuard_FiresOnACustomerName(line: \"const string nested = \\\"https://portal.example.org\"···)
…

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 0)

1 313 tests  ±0   1 313 ✅ ±0   17m 14s ⏱️ + 1m 11s
    9 suites ±0       0 💤 ±0 
    9 files   ±0       0 ❌ ±0 

Results for commit 11f9937. ± Comparison against base commit 8906cad.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 1)

1 877 tests  +10   1 877 ✅ +10   8m 4s ⏱️ -21s
   10 suites ± 0       0 💤 ± 0 
   10 files   ± 0       0 ❌ ± 0 

Results for commit 11f9937. ± Comparison against base commit 8906cad.

This pull request removes 97 and adds 107 tests. Note that renamed tests count towards both.
MeshWeaver.Hosting.Monolith.Test.RecursiveDeleteAuthoritativeTest ‑ RecursiveDelete_DescendantsBehindNodelessSegments_AreDeleted_AndStorageVerifiedEmpty
MeshWeaver.Hosting.Monolith.Test.RecursiveDeleteAuthoritativeTest ‑ RecursiveDelete_NodeCreatedMidFlightBypassingGuard_IsDrainedBeforeSuccess
MeshWeaver.Hosting.Monolith.Test.RecursiveDeleteAuthoritativeTest ‑ Write_UnderSubtreeBeingDeleted_IsRefused_AndNodeDoesNotSurvive
MeshWeaver.Hosting.Monolith.Test.RecycleSurvivesItsOwnDisposeTest ‑ TheHubThatConfirmsTheRecycle_OutlivesTheHubItRecycles
MeshWeaver.Hosting.Monolith.Test.RefusedWriteOwnerRebaseTest ‑ LiveOwnerBehindTheDurableRow_RebasesOnRefusal_AndSubsequentWritesLand
MeshWeaver.Hosting.Monolith.Test.ReleaseRequestSatisfiedByCurrentBuildTest ‑ ReleaseRequest_OnACurrentBuild_IsSatisfiedWithoutCompiling_UnlessForced
MeshWeaver.Hosting.Monolith.Test.RequirePrebuiltParkTest ‑ AValidTypeWithNoAdoptedAssembly_ParksWithTheNamedRefusal_AndNeverCompiles
MeshWeaver.Hosting.Monolith.Test.RouterTrafficTest ‑ NodeCreate_IsNeverIssuedByTheRouter
MeshWeaver.Hosting.Monolith.Test.RouterTrafficTest ‑ SignalRTokenValidation_IsNeverIssuedByTheRouter
MeshWeaver.Hosting.Monolith.Test.ScheduledPostWatcherTest ‑ APostWithNoAuthorProfile_IsNotArmed
…
MeshWeaver.Hosting.Monolith.Test.PostDeleteReadVerdictTest ‑ ReadRacingDeletedNodeTeardown_ReachesDefinitiveNotFound
MeshWeaver.Hosting.Monolith.Test.RecursiveDeletePermissionTest ‑ RecursiveDelete_DeniedOnDescendant_RefusedAtomically_NothingDeleted
MeshWeaver.Hosting.Monolith.Test.RecursiveDeletePermissionTest ‑ RecursiveDelete_PlanContainsCallersOwnAccessGrant_CompletesFully
MeshWeaver.Hosting.Monolith.Test.RedriveObservationReplayTest ‑ TheNewNegativeAssertion_AcceptsAQuietWindow
MeshWeaver.Hosting.Monolith.Test.RedriveObservationReplayTest ‑ TheNewNegativeAssertion_CatchesADriveThatOnlyTheMirrorSaw
MeshWeaver.Hosting.Monolith.Test.RedriveObservationReplayTest ‑ TheOldForgeBarrier_IsSatisfiedByTheReplayedPreForgeSnapshot
MeshWeaver.Hosting.Monolith.Test.RedriveObservationReplayTest ‑ TheOldNegativeAssertion_IsSatisfiedByAReplayThatHidesAWholeReDrive
MeshWeaver.Hosting.Monolith.Test.RedriveObservationReplayTest ‑ TheWatermarkRejectsOnlyTheReplay
MeshWeaver.Hosting.Monolith.Test.ReleaseArtifactLinkTest ‑ CompiledRelease_CarriesAnArtifactResolvableInTheProducingLane
MeshWeaver.Hosting.Monolith.Test.ReleaseRequestWatcherHighWaterTest ‑ BurstOfTwoReleaseTriggers_SecondTriggerIsNotLost
…

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 2)

3 280 tests   - 5   3 280 ✅  - 5   9m 24s ⏱️ +41s
    8 suites ±0       0 💤 ±0 
    8 files   ±0       0 ❌ ±0 

Results for commit 11f9937. ± Comparison against base commit 8906cad.

This pull request removes 107 and adds 102 tests. Note that renamed tests count towards both.
MeshWeaver.Hosting.Monolith.Test.PostDeleteReadVerdictTest ‑ ReadRacingDeletedNodeTeardown_ReachesDefinitiveNotFound
MeshWeaver.Hosting.Monolith.Test.RecursiveDeletePermissionTest ‑ RecursiveDelete_DeniedOnDescendant_RefusedAtomically_NothingDeleted
MeshWeaver.Hosting.Monolith.Test.RecursiveDeletePermissionTest ‑ RecursiveDelete_PlanContainsCallersOwnAccessGrant_CompletesFully
MeshWeaver.Hosting.Monolith.Test.RedriveObservationReplayTest ‑ TheNewNegativeAssertion_AcceptsAQuietWindow
MeshWeaver.Hosting.Monolith.Test.RedriveObservationReplayTest ‑ TheNewNegativeAssertion_CatchesADriveThatOnlyTheMirrorSaw
MeshWeaver.Hosting.Monolith.Test.RedriveObservationReplayTest ‑ TheOldForgeBarrier_IsSatisfiedByTheReplayedPreForgeSnapshot
MeshWeaver.Hosting.Monolith.Test.RedriveObservationReplayTest ‑ TheOldNegativeAssertion_IsSatisfiedByAReplayThatHidesAWholeReDrive
MeshWeaver.Hosting.Monolith.Test.RedriveObservationReplayTest ‑ TheWatermarkRejectsOnlyTheReplay
MeshWeaver.Hosting.Monolith.Test.ReleaseArtifactLinkTest ‑ CompiledRelease_CarriesAnArtifactResolvableInTheProducingLane
MeshWeaver.Hosting.Monolith.Test.ReleaseRequestWatcherHighWaterTest ‑ BurstOfTwoReleaseTriggers_SecondTriggerIsNotLost
…
Memex.Portal.Shared.Test.EaConsentControllerActivationTest ‑ EaGraphAuth_IsRegistered_EvenWithMailDisabled
Memex.Portal.Shared.Test.EaConsentControllerActivationTest ‑ NoControllerDependency_DependsOnADeploymentFlag
Memex.Portal.Shared.Test.EaConsentControllerActivationTest ‑ TheSweep_CoversTheConsentController
MeshWeaver.Hosting.Monolith.Test.PostCreationNodeIsAnnouncedTest ‑ ANodeWrittenByAPostCreationHandler_IsAnnouncedOnTheMeshChangeFeed
MeshWeaver.Hosting.Monolith.Test.PostCreationNodeIsAnnouncedTest ‑ APathProbedBeforeItExisted_IsReachableRightAfterTheHandlerWritesIt
MeshWeaver.Hosting.Monolith.Test.RecursiveDeleteAuthoritativeTest ‑ RecursiveDelete_DescendantsBehindNodelessSegments_AreDeleted_AndStorageVerifiedEmpty
MeshWeaver.Hosting.Monolith.Test.RecursiveDeleteAuthoritativeTest ‑ RecursiveDelete_NodeCreatedMidFlightBypassingGuard_IsDrainedBeforeSuccess
MeshWeaver.Hosting.Monolith.Test.RecursiveDeleteAuthoritativeTest ‑ Write_UnderSubtreeBeingDeleted_IsRefused_AndNodeDoesNotSurvive
MeshWeaver.Hosting.Monolith.Test.RecycleSurvivesItsOwnDisposeTest ‑ TheHubThatConfirmsTheRecycle_OutlivesTheHubItRecycles
MeshWeaver.Hosting.Monolith.Test.RefusedWriteOwnerRebaseTest ‑ LiveOwnerBehindTheDurableRow_RebasesOnRefusal_AndSubsequentWritesLand
…

@github-actions

Copy link
Copy Markdown
Contributor

Test Results

    55 files  ± 0      55 suites  ±0   54m 30s ⏱️ -18s
11 654 tests +35  11 349 ✅ +36  305 💤 ±0  0 ❌  - 1 
12 179 runs  +37  11 874 ✅ +38  305 💤 ±0  0 ❌  - 1 

Results for commit 11f9937. ± Comparison against base commit 8906cad.

@rbuergi
rbuergi merged commit 84af9fa into main Aug 25, 2026
25 checks passed
@rbuergi
rbuergi deleted the fix/ai-content-pack-drift-guard branch August 28, 2026 08:56
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