Repository navigation
ci(chart-freeze): the platform's chart copy is frozen — the chart lives in MeshWeaver.Deploy - #7194
Conversation
…es in MeshWeaver.Deploy
MeshWeaver.Deploy was seeded from this repository's chart material (Deploy#1). Both copies stayed
editable and both moved, so two pipelines baked hosting-operator:main from two different charts.
The paths Deploy#1 copied are now frozen here (policy chart-lives-in-deploy):
- scripts/check-chart-freeze.py refuses a pull request that adds, modifies, retypes or renames
into deploy/helm, deploy/helm-db, deploy/aks/{values.aks.yaml,manifests,scripts},
deploy/homebrew, chart-gate.yml, homebrew.yml, check-config-key-coverage.py or
test-bundle-registry.py, with "the chart lives in Systemorph/MeshWeaver.Deploy". A pure
deletion passes (that is how #7127 removes the copy). build-run.py and deploy/build-host/ stay
editable: main-cd builds the build-host image from them.
- Job "Chart frozen (lives in MeshWeaver.Deploy)" runs it on every pull request against the merge
base, self-test first, and is a need of the required check with its own fail step.
- The policy is registered and ChartOwnershipAndRunnerPool records the move.
Refs #7127.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
🟡 Changes recommended
The checker permits frozen-path bypasses and introduces violations of the existing Git path-listing guard.
3 open issues
What changed in this PR
This PR freezes core’s deployment chart material as ownership moves to Systemorph/MeshWeaver.Deploy, while allowing deletion of the old copy for #7127.
Changes:
- Adds a chart-freeze checker with self-tests and explicit build-host exemptions.
- Connects the new pull-request gate to
Consolidate test results. - Documents chart ownership and registers the freeze policy.
| File | Description |
|---|---|
src/MeshWeaver.Documentation/Data/Architecture/PolicyNotProse.md |
Registers the chart ownership and freeze policy. |
src/MeshWeaver.Documentation/Data/Architecture/ChartOwnershipAndRunnerPool.md |
Documents the move, frozen paths and exemptions. |
scripts/check-chart-freeze.py |
Adds diff validation and self-tests for the freeze. |
.github/workflows/dotnet-test.yml |
Adds the freeze job and propagates failure to the required check. |
Review effort: Balanced
Test Results 25 files ±0 25 suites ±0 56m 53s ⏱️ + 1m 21s Results for commit 5220ebc. ± Comparison against base commit f820aaf. This pull request removes 59 and adds 22 tests. Note that renamed tests count towards both.♻️ This comment has been updated with latest results. |
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… matches its own path Review findings on #7194: - git C-quotes a path with a non-ASCII byte, a quote or a control character, so an added deploy/helm/templates/café.yaml reached is_frozen() quoted and passed. The diff is now read with -z and parsed as status/path fields; check-git-path-listings.py is clean (0 of 130). - A frozen directory replaced by a tracked symlink produced D for its files and A deploy/helm, and the directory path itself matched no prefix. A frozen directory now matches its own path too. - The file input is --diff-file (a saved -z listing), so the listing guard no longer reads the option name as an unquoted listing. Self-test: 15 cases, including the non-ASCII addition, the directory-to-symlink swap, a rename into a frozen path, an unknown status and a dangling status. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
|
||
|
|
||
| def is_frozen(path: str) -> bool: | ||
| return _matches(path, FROZEN) and not _matches(path, EXEMPT) |
There was a problem hiding this comment.
That's true in principle, but I'm not changing this PR for it. The gate exists to stop well-meant edits to a copy that now lives in MeshWeaver.Deploy. Replacing deploy/aks with a symlink to a new editable tree is a deliberate, reviewable restructuring that nobody makes by accident. Also, #7127 has already deleted every frozen path from main (I checked: deploy/aks now holds only the docs, envs and infra), so nothing frozen sits behind such a symlink. Refusing a non-deletion at an ancestor of a frozen path, while keeping the exemptions, is tracked as hardening in triage (rbuergi/Feedback/20261025-chart-freeze-hardening).
| status = fields[i] | ||
| if not status or status[0] not in KNOWN_STATUS or i + 1 >= len(fields): | ||
| # Past an unreadable field the status/path pairing is lost, so nothing after it can be | ||
| # read either: one violation names where reading stopped. | ||
| out.append(("?", status)) | ||
| break | ||
| # A C or R entry carries two paths; --no-renames should never produce one, but read both. | ||
| width = 3 if status[0] in "CR" else 2 | ||
| for path in fields[i + 1:i + width]: | ||
| if is_frozen(path) and status[0] != "D": | ||
| out.append((status[0], path)) | ||
| i += width |
There was a problem hiding this comment.
I agree the reader should validate the whole status token and the path count. It isn't reachable on a realistic input, though. --diff-file is git's own -z output saved by CI, never written by hand, so neither a truncated R record nor a Dgarbage status occurs. The production path --base reads git directly. This is tracked together with the ancestor case in rbuergi/Feedback/20261025-chart-freeze-hardening.


The owner decided that this repository's chart is frozen: all chart edits go to Systemorph/MeshWeaver.Deploy, and #7127 deletes this copy. This PR adds a guard so the two copies cannot drift apart again.
Why
Systemorph/MeshWeaver.Deploy#1 seeded MeshWeaver.Deploy from this repository's chart material at
fdcbc25983. After that, both copies stayed editable, and both changed (#7143, #7159, #7184, #7170, #7119 here; Deploy#2 and Deploy#3 there). Two pipelines bakedhosting-operator:main, one from each copy, so:mainflapped between two charts. Systemorph/MeshWeaver.Deploy#4 ports this repository's changes since the seed into Deploy.What
scripts/check-chart-freeze.pyreadsgit diff --name-status --no-renames <merge base> HEAD. It refuses any frozen path that is added, modified, retyped, or renamed into, with the messagethe chart lives in Systemorph/MeshWeaver.Deploy. A pure deletion passes. A line it cannot parse counts as a violation, so it never passes by default.deploy/helm/,deploy/helm-db/,deploy/aks/values.aks.yaml,deploy/aks/manifests/,deploy/aks/scripts/,deploy/homebrew/.github/workflows/chart-gate.yml,.github/workflows/homebrew.ymlscripts/check-config-key-coverage.py,.github/scripts/test-bundle-registry.py.github/scripts/build-run.pyanddeploy/build-host/**. main-cd builds the build-host runner image from them here, and the Deploy chart gate reads them from a declared checkout of this repository.dotnet-test.ymlgets a new job,Chart frozen (lives in MeshWeaver.Deploy):needs:ofConsolidate test resultsand has its own!= 'success'fail step. It cannot be skipped into green.chart-lives-in-deployis added to the register. Chart Ownership and the Runner Pool records the move.Verified locally
check-chart-freeze.py --self-testpasses all 15 cases (the listing is read with-z, and a frozen directory matches its own path):--base fdcbc25983(the seed) against this branch's main reports 21 frozen paths changed and exits 1. Those changes are feat(build): standing build hosts — follow lane, sandboxed host runner, build-host chart, CD hand-over #7143, fix(build-hosts): host pods select workload=ci-build, the label the CI node pools carry #7159, feat(ocr): a local Tesseract OCR service (deploy/ocr) #7184, fix(homebrew): azure-cli is a cask now; the formula no longer depends on it #7170 and chore(operator): the hosting operator leaves core for MeshWeaver.Plugins (delete half) #7119, now ported by Deploy#4.--base origin/mainexits 0.check-workflow-timeouts: 124 jobs, 0 violations.check-workflow-yaml-keys,check-workflow-permission-pairingandcheck-workflow-shellreport no live finding.MeshWeaver.Documentation.Testbuilds Release-warnaserrorwith 0 errors. Its 14 workflow and doc guard classes (MainRunsAreNeverCancelled, SharedRuleExemptionIsOneEventPredicate, WorkflowJobIfContext, DocumentationFrontMatter, CiRestBudget, …) run 171 tests: 171 passed, 0 failed.What this means for other open work
deploy/helm/templates/build-host/*,deploy/aks/scripts/test-build-hosts.shand its testdata). They are frozen, so deleting them is the only change allowed.build-run.pyanddeploy/build-host/halves stay here and pass.Pairs-with: none — no public type or member is removed.
🤖 Generated with Claude Code