Repository navigation
docs: chart ownership and the runner pool become state of record (#2923, #2926) - #3025
Conversation
…, #2926) Two questions raised during the 2026-08-31 CI overhaul, both larger than they look, neither belonging in an issue thread. Measured, not restated from the issues: * Chart Gate triggers on pull_request with NO paths: filter, so every core PR renders every values combination — including PRs that cannot touch the chart. Chart Drift is schedule-only and costs nothing per PR. * The relocation checklist is seven consumers, each of which breaks silently if left behind — including homebrew.yml, which PATH-FILTERS on deploy/helm/** so a chart change is what triggers a tap rebuild, and the hosting operator, which carries its own baked copy at a pinned path. * A drift already exists independent of any move: the self-updater and its RBAC target memex-migration-deployment, a workload the chart does not render — helm template emits a Job. That is the #1788 shape. 🚨 The cheap interim is UNSAFE and the page says so. Path-filtering the chart jobs while Chart Gate is a required context makes "did not need to run" and "did not run" the same green tick, because a SKIPPED or absent required context counts as SATISFIED here. And the gate asserts a CROSS-FILE property — a template change can break an unchanged values file — so the reasoning that makes a filter look safe does not hold either. The runner pool is recorded with an honest trade rather than as a plan: it converts a variable per-job cost into a fixed standing one, and until CI volume makes the per-job seconds dominate, the caching already in place is most of the benefit for none of the standing cost. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SD7aiLSo59xng2TzU32xEa
There was a problem hiding this comment.
🟢 Approval recommended
Documentation-only change with consistent front matter and valid internal doc links, and no functional code impact.
Pull request overview
Adds a new architecture “state-of-record” documentation page capturing the measured rationale for why the Helm chart gate currently lives in core (and what must move together if relocated), and records the proposed self-hosted runner pool shape and tradeoffs; then links it from the Architecture catalog so it’s discoverable.
Changes:
- Added a new architecture doc page: Chart Ownership and the Runner Pool.
- Extended the Architecture index to include the new page under Deployment & ops.
File summaries
| File | Description |
|---|---|
| src/MeshWeaver.Documentation/Data/Architecture/ChartOwnershipAndRunnerPool.md | New architecture page documenting measured chart-gate ownership rationale, relocation checklist, and runner-pool proposal/tradeoffs. |
| src/MeshWeaver.Documentation/Data/Architecture.md | Adds the new page to the Architecture catalog under Deployment & ops for discoverability. |
Review details
- Files reviewed: 2/2 changed files
- Comments generated: 0
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Test Results (shard 2)534 tests 532 ✅ 1m 31s ⏱️ Results for commit 40055d5. ♻️ This comment has been updated with latest results. |
Test Results (shard 5) 3 files 3 suites 1m 6s ⏱️ Results for commit 40055d5. ♻️ This comment has been updated with latest results. |
Test Results (shard 0)222 tests 222 ✅ 2m 57s ⏱️ Results for commit 40055d5. ♻️ This comment has been updated with latest results. |
Test Results (shard 3)586 tests 586 ✅ 55s ⏱️ Results for commit 40055d5. ♻️ This comment has been updated with latest results. |
Test Results (shard 1)420 tests 420 ✅ 1m 25s ⏱️ Results for commit 40055d5. ♻️ This comment has been updated with latest results. |
Test Results (shard 4)1 735 tests 1 735 ✅ 1m 51s ⏱️ Results for commit 40055d5. ♻️ This comment has been updated with latest results. |
Test Results 14 files 14 suites 9m 48s ⏱️ Results for commit 40055d5. ♻️ This comment has been updated with latest results. |
…and-runners # Conflicts: # src/MeshWeaver.Documentation/Data/Architecture.md
Closes #2923, closes #2926 — converting both to a committed state-of-record page, per the maintainer's disposition for the programs bucket.
(Note the keyword repetition:
Closes #A, #Bonly parses the first, which is how #2193/#2550/#2802 stayed open after #3015 and had to be closed by hand.)Measured, not restated
Chart Gatetriggers onpull_requestwith nopaths:filter, so every core PR renders every values combination and asserts every config key is read by a template — including PRs that cannot touch the chart.Chart Driftisschedule-only and costs nothing per PR. That is the real per-PR cost The helm chart (and its gates) live in core, but core no longer contains the application they deploy — relocate with the operator or the hosts #2923 is about.homebrew.yml, which path-filters ondeploy/helm/**so a chart change is what triggers a tap rebuild, and the hosting operator, which carries its own baked copy at${HOSTING_CHART:-/opt/hosting/chart}.memex-migration-deployment— a workload the chart does not render (helm template deploy/helmemits aJob). That is the memex-migration CrashLoopBackOff in all three prod namespaces (50/53/38 restarts) — run-once workload modelled as a Deployment #1788 shape, and worth fixing whether or not the chart relocates.self-hostedmatches in the repo are prose.🚨 The cheap interim is unsafe, and the page says so rather than recommending it
#2923 offers path-filtering the PR-triggered chart jobs as an optional interim. Not while
Chart Gateis a required context. ASKIPPEDor absent required context counts as SATISFIED here, so a filter makes "the chart gate did not need to run" and "the chart gate did not run" the same green tick.And the reasoning that makes a filter look safe — "a chart that didn't change cannot newly break" — does not hold: the gate asserts a cross-file property, so a change to a template can break an unchanged values file, which is exactly the class the filter would stop watching.
The runner pool, with the trade stated
Recorded so it can be picked up rather than re-derived — ARC on a dedicated node pool, a PV carrying a bare git mirror per repo (delta fetch →
git worktree add→ worktree deleted at job end), a warm layer store via a pre-pull DaemonSet, runner labels for per-repo opt-in — along with the constraints (private cluster, config in the private deployments repo, changes routed through the operator).And the honest half: it converts a variable per-job cost into a fixed standing one — a node pool that exists whether or not CI runs, a controller to keep alive, and the failure mode of a stateful mirror (a diverged mirror fails every job at once, where a fresh checkout fails none). Worth doing when CI volume makes the per-job seconds dominate; until then the caching already in place is most of the benefit for none of the standing cost.
Verification
Full project, not a filter:
MeshWeaver.Documentation.Test171 passed, 0 failed, includingDocumentationLinkIntegrityTest.dotnet build -c Release -warnaserror: 0 Warning(s), 0 Error(s).🤖 Generated with Claude Code
https://claude.ai/code/session_01SD7aiLSo59xng2TzU32xEa