Repository navigation
fix(modules): boot, landing and live swap measure the member half of the link probe (#6007) - #6196
Merged
Merged
Conversation
…the link probe (#6007) The runtime link probe checked TYPE references only. OpenAI 1.4.0 called ReasoningEffortLevels.IsBuiltIn(IEnumerable<string>) — a member the loaded MeshWeaver.AI lacked on a type it had — so it landed, loaded, and threw MissingMethodException on every chat round (memex 2026-10-02/03; every round on a customer instance on ci.9606). - MeshBuilder.TryLoad (boot), ModuleLandingService (landing + head re-check) and ModuleLiveUpdater (live swap) pass ModuleLinkOptions.WithMembers: their surface is this process's own files, so the member walk is determinate. A refusal falls back exactly as a type-level refusal does. The roll gate (published document, types only) and prebuilt NodeType adoption keep TypesOnly. - ModulePlatformLink.Check(byte[], ..., options) for the in-memory landing. - Fix a false refusal the blast-radius run found: the derivation walk stopped at a generic base defined in the platform assembly itself (InputBase`3 : FormComponentBase`3 : ... : BlazorView`2), so the image's own MeshWeaver.Blazor.EntityViews read 8 protected members as "no longer accessible". GenericDefinitionOf resolves TypeSpec-over-TypeDefinition bases in PlatformBasesOf and Supertypes. - Measured on image 3.0.0-ci.9984: 11 image modules + 4 deployed bundles, ~3,900 member refs, 0 refused (1 before the generic-base fix). - Doc: ModulePlatformLinkGate. Tests: landing refusal and boot parking of a module calling a member this platform lacks (with the type-only verdict as in-test negative control); protected member through generic platform bases is Linkable and runs. Neutralising each fix reds all three. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Contributor
Test Results 22 files ±0 22 suites ±0 44m 31s ⏱️ +56s Results for commit 7749fba. ± Comparison against base commit 8c08fa4. This pull request removes 29 and adds 14 tests. Note that renamed tests count towards both.♻️ This comment has been updated with latest results. |
Contributor
Contributor
Contributor
Contributor
Contributor
Contributor
Test Results (shard 4) 4 files ±0 4 suites ±0 15m 32s ⏱️ +40s Results for commit 7749fba. ± Comparison against base commit 8c08fa4. This pull request removes 29 and adds 13 tests. Note that renamed tests count towards both.♻️ This comment has been updated with latest results. |
rbuergi
disabled auto-merge
October 6, 2026 12:14
rbuergi
enabled auto-merge
October 6, 2026 12:14
This was referenced Oct 7, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refs #6007. It is sev:H, so it closes after verification, not when this merges.
Root cause
The runtime link probe checked type references only. Boot (
src/MeshWeaver.Mesh.Contract/MeshBuilder.cs,TryLoad), the landing (src/MeshWeaver.PluginCatalog/ModuleLandingService.cs,LinkVerdict/HeadDoesNotLoadHere) and the live swap (src/MeshWeaver.Graph/Configuration/ModuleLiveUpdater.cs,LoadAndCommit) all calledModulePlatformLink.Checkwith the defaultModuleLinkOptions.TypesOnly.ModulePlatformLinkGate.mdlisted member skew as a known blind spot.#6007 is exactly that blind spot:
ReasoningEffortLevels.IsBuiltIn(IEnumerable<string>), which was added toMeshWeaver.AIin Pluginsbd2164269.minMeshVersionadmitted it onto images whose AI predated that method.ReasoningEffortLevelsexists.MissingMethodException. That was about 200 occurrences on memex (2026-10-02 19:42Z to 10-03 06:19Z) and every round on a customer instance running3.0.0-ci.9606.Plugins fixed the floor at its source (
mesh-floors.pystamps floors). This PR closes the platform's half: the measured gate now sees the member.Fix
ModuleLinkOptions.WithMembers. Their surface is this process's own files, so the member walk gives a definite answer.TypesOnly, because its surface is a published document with type names only. Prebuilt NodeType adoption also keepsTypesOnly.ModulePlatformLink.Check(byte[], string, IReadOnlySet<string>, ModulePlatformSurface, ModuleLinkOptions)for the in-memory landing. A barecreftoCheckwas already ambiguous across the existing four overloads, so this adds no CS0419.PlatformBasesOfstopped at a generic base defined in the platform assembly itself: a TypeSpec over a TypeDefinition, as inInputBase3 : FormComponentBase3 : … : BlazorView2`.MeshWeaver.Blazor.EntityViewsread 8 protectedBlazorView2` members as "no longer accessible".GenericDefinitionOfnow resolves that shape inPlatformBasesOfand inSupertypes.ModulePlatformLinkGate.md.Blast radius, measured on real bytes before shipping
Surface: image
memex-portal-ai:d205295(3.0.0-ci.9984, the control instance's image), its/appplusmodules/, plus the local shared framework. Modules checked: the 11 image modules and the 4 deployed module bundles of that build's main-cd run (37295575134: AI, Markdown.Collaboration, Maps, Payments.Stripe). About 3,900 member references were checked.Tests
All run locally.
ModulePlatformLinkTest.AModuleCallingAMemberThisPlatformLacks_IsRefusedAtLanding_NamingTheMember: the OpenAI chat wire throws MissingMethodException — MeshWeaver.AI.OpenAI deployed against an incompatible MeshWeaver.AI build #6007 shape on the production surface. The realMeshWeaver.Mesh.Contractlacks a member that a stand-in carries.…_IsParkedAtBoot: the same bytes at boot are parked asIncompatibleModulenaming the member, and the sibling module installs.ModulePlatformMemberLinkTest.AProtectedMemberThroughGenericPlatformBases_IsAccessible_AndRuns: the static verdict is Linkable, and the bytes really run.GenericDefinitionOfturns all three tests red (3 of 3 failed).Memex.Portal.Shared.Testwith filterModule|LinkVerdict: 411 of 412 pass. The one failure isReleaseLinkGateTest.ALandedModuleThatLinksAgainstTheTarget_Clears, which threw a RoslynNullReferenceExceptioninside its own test helper'sCompilation.Emit(ModulePlatformSurfaceJsonTest.Emit). That is the roll-gate path, which this PR does not change, and no code in this diff runs there.MeshWeaver.Compiler.Pipeline.Testwith filterModule: 169 of 169 pass.Not established
Pairs-with: none — adds an overload; nothing removed or re-signed.
🤖 Generated with Claude Code