Repository navigation
fix: the surface manifest never survived publish — images now carry it, portals adopt the CI bake at boot (#1699) - #1705
Conversation
There was a problem hiding this comment.
Pull request overview
This PR fixes a publishing pipeline gap where meshweaver-surface.manifest was generated during build but not included in published outputs (including container images), preventing portals from adopting CI-baked content at startup.
Changes:
- Adjusts the MSBuild target hook so
meshweaver-surface.manifestis added to@(ResolvedFileToPublish)early enough to be copied into publish outputs (and thus into shipped images). - Adds a “What’s New” entry documenting the startup improvement from adopting CI-compiled bundles at boot.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
Directory.Build.props |
Moves the publish hook to AfterTargets="ComputeFilesToPublish" so the surface manifest is actually included in published outputs/images. |
src/MeshWeaver.Documentation/Data/WhatsNew/2026-08-17-startup-in-minutes-not-hours.md |
Documents the user-visible effect (startup time reduction) from images carrying the manifest and boot adopting the published bake. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Test Results (shard 0)920 tests 919 ✅ 11m 12s ⏱️ Results for commit c016dd9. ♻️ This comment has been updated with latest results. |
Test Results (shard 5)1 371 tests 1 370 ✅ 6m 0s ⏱️ Results for commit c016dd9. ♻️ This comment has been updated with latest results. |
Test Results (shard 4)1 607 tests 1 601 ✅ 7m 22s ⏱️ Results for commit c016dd9. ♻️ This comment has been updated with latest results. |
Test Results (shard 3) 11 files 11 suites 5m 7s ⏱️ Results for commit c016dd9. ♻️ This comment has been updated with latest results. |
Test Results (shard 2)2 375 tests 2 371 ✅ 6m 52s ⏱️ Results for commit c016dd9. ♻️ This comment has been updated with latest results. |
…ComputeFilesToPublish, not before the copy orchestrator _MeshWeaverAddSurfaceManifestToPublish hooked BeforeTargets="CopyFilesToPublishDirectory" — but the actual copying is done by that target's DEPENDENCIES (_ComputeResolvedFilesToPublishTypes splits @(ResolvedFileToPublish), then _CopyResolvedFilesToPublish* copy the split lists), and a BeforeTargets hook on the orchestrator runs AFTER its dependencies. Traced in a detailed publish log: the copy targets ran at lines 157345/158114, the hook at 158126 — the item was added once everything had been copied, on EVERY publish shape (plain -o and -t:PublishContainer alike). Consequence (#1699): every shipped image lacked meshweaver-surface.manifest, portals resolved the commit identity g<sha> while the CI bake publishes under the surface identity s<hash>, and SeedPublishedRoot never found a directory to adopt — every pod recompiled all shipped content at boot, making startup scale with the full content rebuild instead of minutes. Fix: AfterTargets="ComputeFilesToPublish" — the documented publish extension point, after the list is computed and before it is split; PublishContainer consumes the same list. Verified: the manifest now lands in a plain publish AND inside a locally published container image (/app/meshweaver-surface.manifest, correct per-assembly surface hashes). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
6141dce to
c016dd9
Compare
Test Results (shard 1)2 240 tests 2 137 ✅ 7m 45s ⏱️ Results for commit c016dd9. |
Test Results 65 files 65 suites 44m 20s ⏱️ Results for commit c016dd9. ♻️ This comment has been updated with latest results. |
Fixes #1699 — the missing piece between the CI bake publication and minutes-level portal startup.
Defect
_MeshWeaverAddSurfaceManifestToPublishhookedBeforeTargets="CopyFilesToPublishDirectory", butthe copying is performed by that target's dependencies (
_ComputeResolvedFilesToPublishTypessplits
@(ResolvedFileToPublish)into the Always/PreserveNewest lists, then_CopyResolvedFilesToPublish*copy them) — and aBeforeTargetshook on the orchestrator runsafter its dependencies. Traced in a detailed publish log (copy targets at 157345/158114, the
hook at 158126): the item was added after every copy, on every publish shape. So every shipped
image lacked
meshweaver-surface.manifest, portals resolvedg<sha>while the CI bake iss<hash>-keyed,SeedPublishedRootnever matched, and each pod recompiled all shipped contentat boot.
Fix + proof
AfterTargets="ComputeFilesToPublish"(the documented publish extension point — after the listis computed, before it is split;
PublishContainerconsumes the same list). Verified locally:With this, the first post-merge release ships manifest-bearing images: portal + mw-plugin-test
resolve the same
s<hash>as the Build-and-Test bake artifact and the (now-sealing, #1702)publication — pods seed the published bundles at boot and compile only what CI did not bake.
Startup becomes minutes, and stays warm across internal-only merges by construction.
Related: #1700, #1702 (merged), task #74 (satellite publications — consistent on the same key).
🤖 Generated with Claude Code