Repository navigation
docs: a declined bundle risks stale TYPES, not just a slower boot (Plugins#1585) - #3893
Conversation
…ugins#1585) Records the 2026-09-10 measurement behind MeshWeaver.Plugins#1585 on memex.systemorph.com: MeshWeaver.AI served ModelDefinition without reasoningEffort (#1556) and ThreadMessage without timing (#1552) while the install record carried main's own file hashes, because the registry's AI bundle was never adopted at all — bundle_adoption reported FrameworkDeclined, so the content compiled in the mesh and the previously resolved build kept serving under #3844's same-MAJOR stale-but-serving rule. ModuleAdoptionPolicy already treats "no adopted bundle" as a boot-time cost; this adds the second consequence — the types served can lag the installed source with nothing red — plus the discriminator (bundle_adoption on /health) that separates it from the registry shelving stale bytes, which is what the issue had concluded. Verified: MeshWeaver.Documentation.Test Release -warnaserror, 0 Warning(s) 0 Error(s); 368/368 pass. Control: breaking the ExecuteTimeInterlock link and REBUILDING makes DocumentationLinkIntegrityTest fail naming that link (exit 1); restored, it passes. Pairs-with: none — documentation only, no public surface changes. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S25PJZbVeCbkWhCfMub9P7
…s Degraded The bundle_adoption check on /health is precisely the surface that DID report the problem, and naming it as one of the ones that stayed quiet undercut the point the section makes two paragraphs later. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S25PJZbVeCbkWhCfMub9P7
There was a problem hiding this comment.
🟡 Changes recommended
Final review comments request wording, scope, grammar, and documentation-convention updates.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
This documentation-only PR explains how declined bundles can leave stale types serving and how to diagnose this via bundle_adoption.
Changes:
- Documents the measured stale-type incident and its consequences.
- Distinguishes re-landing from version bumps.
- Adds
/healthdiagnostic guidance.
File summaries
| File | Summary |
|---|---|
src/MeshWeaver.Documentation/Data/Architecture/ModuleAdoptionPolicy.md |
Adds stale-type adoption guidance and operational diagnostics. |
Review details
Suppressed comments (3)
src/MeshWeaver.Documentation/Data/Architecture/ModuleAdoptionPolicy.md:110
FrameworkDeclinedis emitted byPluginBundleClient.Adoptfor the index-level prebuilt NodeType-content lane. The separateAdoptModulepath uses per-bundle metadata and is not represented by this ledger, so this observation rules out the registry's prebuilt-content bytes for these attempts, not necessarily all AI module bytes; narrow the claim accordingly.
The registry's bytes were therefore never in play. What served was the previously resolved build,
src/MeshWeaver.Documentation/Data/Architecture/ModuleAdoptionPolicy.md:135
BundleAdoptionLedgeris an append-only, process-scoped history, so oneFrameworkDeclinedoutcome describes only that attempt and does not prove that the registry's bytes were never adopted earlier. The stronger conclusion in this incident comes from the aggregate zero-adopted result above; keep that scope explicit before directing an operator toward the shelf.
`bundle_adoption` on `/health` — `FrameworkDeclined` means the registry's copy was never adopted,
so a fix aimed at the shelf would be aimed at bytes this instance never ran.
src/MeshWeaver.Documentation/Data/Architecture/ModuleAdoptionPolicy.md:89
- This page is embedded and served under
/Doc/Architecture, so the new operational guidance is user-visible. The repository convention requires a datedWhatsNewnode for user-visible changes, but this PR currently changes only the architecture page; add that entry or explicitly justify why this documentation is internal-only.
## A declined bundle risks stale TYPES, not just a slower boot
- Files reviewed: 1/1 changed files
- Comments generated: 2
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| can keep serving **types built from source older than the source the instance has installed**, | ||
| while every surface reports the package as installed, current and healthy. |
| `RefreshModules` re-land and two restarts each reloaded the identical generation and changed | ||
| nothing. What finally let fresh types through was a new `{package}@{version}` shelf entry — | ||
| `AI/index.json` 1.5 → 1.6 with **no source change** (Plugins#1586) — for which no previously | ||
| adopted build existed. Two minutes after that merged the instance installed `AI 1.6.0`, and the |
Test Results (shard 0)254 tests 254 ✅ 2m 13s ⏱️ Results for commit 054f4e5. |
Test Results (shard 1)496 tests 496 ✅ 43s ⏱️ Results for commit 054f4e5. |
Test Results (shard 3)389 tests 389 ✅ 1m 1s ⏱️ Results for commit 054f4e5. |
Test Results (shard 4)1 885 tests 1 885 ✅ 3m 18s ⏱️ Results for commit 054f4e5. |
Test Results (shard 2)1 213 tests 1 211 ✅ 3m 42s ⏱️ Results for commit 054f4e5. |
Test Results (shard 5) 6 files 6 suites 5m 0s ⏱️ Results for commit 054f4e5. |
Test Results 17 files 17 suites 15m 59s ⏱️ Results for commit 054f4e5. |
Opened as a draft on purpose — draft is the documented
auto-armopt-out, so nothing can merge this while the finding is reviewed.Why
Re-measuring MeshWeaver.Plugins#1585 this morning showed the symptom is already resolved, and that the issue's own conclusion is wrong in a way worth recording.
#1585 reported that
ModelDefinitionserved on memex lackedreasoningEffort(Plugins#1556) and thatThreadMessagelackedtiming(Plugins#1552), and concluded (comment, 03:16Z) that "the registry itself serves the stale bytes" forAI@1.5.1.The instance's own health falsifies that:
The registry's AI bundle was never adopted, so its bytes were never in play. What served was the previously resolved build, kept alive by the same-MAJOR stale-but-serving rule #3844 introduced the evening before (in this portal's core,
2287decb) — a moved source fingerprint is deliberately not a refusal. That is why a StoreRefreshModulesre-land and two restarts each reloaded the identical generation and changed nothing, and why the fix was a new{package}@{version}shelf entry (AI/index.json1.5 → 1.6, no source change, Plugins#1586) for which no previously adopted build existed.The layer matters: the model code was never at fault.
src/MeshWeaver.AI/ModelDefinition.cson Pluginsorigin/mainhashes to89fd0a2264…, byte-identical to what the portal's install record claims, and declarespublic string? ReasoningEffort { get; init; }at line 177.What changed
One section on Module Adoption Policy. The page already treats no adopted bundle as a cost paid in boot time ("the content compiles in the mesh… a missing bake is a cost, not a reason to hold a roll"). It adds the second consequence measured here — the types served can lag the installed source with nothing red on any surface — plus:
bundle_adoptionon/health, because from the consumer a stale adopted build and a stale registry shelf are identical — same[ModuleLoad]line, same generation, same mvid, and[ModuleLoad]never names the commit a bundle was built from.Documentation only. No code, no public surface, no in-mesh (
Source/*.cs) node sources.Verification and control
MeshWeaver.Documentation.Test, Release +-warnaserror, one project per invocation: 0 Warning(s), 0 Error(s); full suite 368/368 passed.Control (the gate is live, not vacuous): with
../ExecuteTimeInterlockchanged to../ExecuteTimeInterlockZZZand the project REBUILT (the doc is an embedded asset, so--no-buildwould have given a false verdict),DocumentationLinkIntegrityTestfails, exit 1, naming it:Restored and rebuilt, it passes. The rebuild also confirms the embedded
.mdreally does refresh, so the passing run is a real pass.Not done here
The residual class defect #1585 asks for —
[ModuleLoad]naming the assembly a NodeType's content type actually resolves to, and a bundle manifest recording its built-from commit — is real and unaddressed, but it is a core change in the #3583/#3732 delivery area rather than anything in the model, and it deserves its own scoped issue rather than riding a docs commit.Pairs-with: none — documentation only; no public type or member is removed or renamed.
🤖 Generated with Claude Code
https://claude.ai/code/session_01S25PJZbVeCbkWhCfMub9P7