Skip to content

move(deploy): the deployment reference leaves core for the public MeshWeaver.Deploy - #7127

Merged
rbuergi merged 6 commits into
mainfrom
move/chart-leaves-core
Oct 25, 2026
Merged

rbuergi merged 6 commits into
mainfrom
move/chart-leaves-core

Conversation

@rbuergi

@rbuergi rbuergi commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Refs core slimming. This PR is the DELETE half of moving the deployment reference out of core, into the new PUBLIC Systemorph/MeshWeaver.Deploy. The owner chose a public repository so that every reader stays credential-free; the estate's real values stay in its private deployments repository.

Pairs-with: Systemorph/MeshWeaver.Deploy#1
Pairs-with: Systemorph/MeshWeaver.Deploy#4
Pairs-with: Systemorph/MeshWeaver.Deploy#7
Pairs-with: Systemorph/MeshWeaver.Plugins#4155
Pairs-with: Systemorph/Memex#819

🚦 Ordering. The prerequisites have landed: MeshWeaver.Deploy#1, Plugins #4137 and #4155, Memex #819, and core #7119. Core #7120 is still open. Two pull requests port into MeshWeaver.Deploy every core-side change to this material made since the seed: MeshWeaver.Deploy#4 (merged) carries #7143, #7159, #7184, #7170, #7119 and #7180, and MeshWeaver.Deploy#7 carries #7179. This PR must land after MeshWeaver.Deploy#7. The Pairs-with: lines hold it until then. #7194 freezes the material here, with deletions allowed. This PR only deletes it, so it passes that gate.

Merged with main. Every modify/delete conflict resolved with the deletion winning. This PR now also deletes what main added to the material after it was cut:

The Memex.Portal.Shared files this PR had edited left core with #7125, so their edits are dropped. MeshWeaver.Plugins' copy of SetupProbeEndpointsTest still reads core's deploy/helm. It has to be re-pointed at MeshWeaver.Deploy.

Review finding (fixed, f30a584): the registry-retention gate now sweeps the chart's home for an executed deletion as well as core. ARM 33h plants one in that home's script and in its workflow, and both are RED. The negative control: with the extra sweep removed, the three new checks fail.

What leaves core

Removed here Now at (MeshWeaver.Deploy, same paths) Guard that moved with it
deploy/helm, deploy/helm-db same chart-gate.yml
deploy/aks/scripts, deploy/aks/manifests, deploy/aks/values.aks.yaml same chart-gate.yml; the operator RBAC case reads the manifests from there
deploy/homebrew, homebrew.yml (memex-local) same homebrew.yml (with the Linux gate that lived in hosting-operator.yml)
scripts/check-config-key-coverage.py same the estate's config-key-coverage
.github/scripts/test-bundle-registry.py, chart-gate.yml same runs core's publisher from a declared core checkout
chart- and memex-local-reading tests in MeshWeaver.Documentation.Test, MeshWeaver.Hosting.Test, MeshWeaver.Deployment.Contract.Test, Memex.Portal.Shared.Test test/MeshWeaver.Deploy.ChartGuards (25 classes, 88 tests) chart-guards.yml, built against a core checkout

What changes here

  • Registry retention gate (lock-pinned-digests.py --check-registry-retention, inside the required Consolidate test results chain):
    • A retention block may name a chartRepository. Without --chart-root the gate does NOT re-derive that chart, and says so by name; it never prints the clean sentence over zero charts.
    • instances.json names MeshWeaver.Deploy as the registry chart's home and declares it in repositories (42 overlay-pattern files there). Core's own entry is re-measured at 2 files (s1-extract, whisper).
    • MeshWeaver.Deploy's Registry retention job re-derives the chart against this record, reading it with no token.
    • New self-test ARM 33h. Negative control: forcing the chart base back to this repository reds ARM 33h. Against the real record and the Deploy checkout, a CronJob beside the registry is RED.
  • Comments, messages and docs name MeshWeaver.Deploy: main-cd.yml, the mirror list, the ORAS and publisher comments, the gate Dockerfiles, ProbeEndpoints, SetupOnlyHost, NodeTypeBakeGate, ShippedPrebuiltBundles, Readme.md and .gitignore. RepositoryTopology adds MeshWeaver.Deploy (public) to the table. ChartOwnershipAndRunnerPool gains an "Outcome" section.
  • Not swept: about 50 Architecture pages still cite deploy/helm/…, deploy/aks/scripts/… or deploy/homebrew/… as paths. The paths are unchanged in MeshWeaver.Deploy, but those are operational docs, and by the owner's rule they move with the code; that is a follow-up.

Sweeps (move protocol step 3)

Nothing removed here is a C# public surface (YAML, shell, Python, test classes), so no NodeType source can call it.

Local gates

  • Release -warnaserror, one project per invocation, each 0 Error(s) and 0 Warning(s): MeshWeaver.Hosting, Memex.Portal.ServiceDefaults, Memex.Portal.Shared, MeshWeaver.Deployment.Contract.Test, MeshWeaver.Hosting.Test, Memex.Portal.Shared.Test, MeshWeaver.Documentation.Test.
  • Kept facts: PlatformBakeLaneGuard, MigrationWorkloadModelGuard and ReleaseDeliveryChainGuard 14/14. Earlier, on the trimmed tree: Contract 17, Hosting 1, Portal.Shared 19.
  • Passing: lock-pinned-digests.py --self-test, --check-registry-retention ., check-pr-secret-preflight, check-workflow-timeouts, check-workflow-yaml-keys.

Provisioning

None is needed in this repository. The owner's list for MeshWeaver.Deploy is on MeshWeaver.Deploy#1.

🤖 Generated with Claude Code

…re for MeshWeaver.Plugins

DELETE half. deploy/helm, deploy/helm-db, deploy/aks/scripts, deploy/aks/manifests,
deploy/aks/values.aks.yaml, scripts/check-config-key-coverage.py,
.github/scripts/test-bundle-registry.py and chart-gate.yml now live in MeshWeaver.Plugins at the
same paths, beside the hosting operator that bakes the chart (Plugins Hosting/ChartHome).

- Chart-reading test facts leave with the chart (to Plugins Memex.Hosts.Test/Chart); the facts
  that read only core code stay.
- The registry retention gate learns `chartRepository`: without --chart-root it re-derives
  nothing for that registry and SAYS so by name; with it (Plugins' Registry retention job) it
  re-derives exactly as before. ARM 33h pins all four shapes.
- instances.json names the chart's home and declares MeshWeaver.Plugins as an overlay-carrying
  repository; core's own entry is re-measured (5 files).
- Homebrew (interim, owner decision open): the tarball vendors the chart from a Plugins checkout,
  packed deterministically at deploy/helm so the formula is unchanged.
- Comments, messages and the topology / chart-ownership docs name the new home.

Refs core slimming.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Test Results

    25 files  ± 0      25 suites  ±0   57m 38s ⏱️ + 2m 21s
11 656 tests  - 66  11 654 ✅  - 66  2 💤 ±0  0 ❌ ±0 
11 682 runs   - 66  11 680 ✅  - 66  2 💤 ±0  0 ❌ ±0 

Results for commit 9131e0a. ± Comparison against base commit 6a356fd.

This pull request removes 129 and adds 26 tests. Note that renamed tests count towards both.

   --- End of inner exception stack trace ---
   --- End of inner exception stack trace ---, expected: True)
   --- End of inner exception stack trace ---, kind: "Timeout", layer: null)
 ---> (Inner Exception #1) MeshWeaver.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.<---
 ---> (Inner Exception #1) MeshWeaver.Messaging.Hub.Test.InfrastructureFaultTest+ProviderException (0x80004005): Failed to connect to 10.42.18.4:5432<---
 ---> (Inner Exception #1) MeshWeaver.Messaging.HubDisposingException: Hub node/a is shutting down — cannot create "x". The address may reactivate (recycle / restart); retry to get the authoritative answer.
 ---> (Inner Exception #1) System.ArgumentException: Value does not fall within the expected range.<---
 ---> (Inner Exception #1) System.InvalidOperationException: boom<---
 ---> (Inner Exception #1) System.InvalidOperationException: source B is misconfigured<---
…
MeshWeaver.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "a stall as an aggregate's FIRST member", fault: System.AggregateException: One or more errors occurred. (Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.)
 ---> MeshWeaver.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.
   --- End of inner exception stack trace ---, expected: True)
MeshWeaver.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "a stall as an aggregate's SECOND member", fault: System.AggregateException: One or more errors occurred. (The operation has timed out.) (Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.)
 ---> System.TimeoutException: The operation has timed out.
   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) MeshWeaver.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.<---
, expected: True)
MeshWeaver.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "a stall nested in an aggregate inside a wrapper", fault: System.InvalidOperationException: outer
 ---> System.AggregateException: One or more errors occurred. (Value does not fall within the expected range.) (Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.)
 ---> System.ArgumentException: Value does not fall within the expected range.
   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) MeshWeaver.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.<---

   --- End of inner exception stack trace ---, expected: True)
MeshWeaver.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "a stall wrapped as InnerException", fault: System.InvalidOperationException: outer
 ---> MeshWeaver.Mesh.QueryProviderStalledException: Query provider(s) [pg] did not emit an Initial within the query fan-in's 16s bound for query 'nodeType:NodeType' (user 'system'). The merged Initial gates on EVERY provider, so this query has NO snapshot to answer with — it is reported as unavailable (retryable) rather than left hanging with no error. This is an availability failure, never a permission verdict: a consumer deciding access must fail CLOSED and say it could not establish the answer. Fix the stalled provider; never bump the consumer's timeout.
   --- End of inner exception stack trace ---, expected: True)
MeshWeaver.Compiler.Pipeline.Test.SourcesWatcherStallBackoffTest ‑ The_production_classifier_recognises_a_stall_through_every_wrapping(because: "an aggregate of unrelated faults", fault: System.AggregateException: One or more errors occurred. (The operation has timed out.) (Value does not fall within the expected range.)
 ---> System.TimeoutException: The operation has timed out.
   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) System.ArgumentException: Value does not fall within the expected range.<---
, expected: False)
MeshWeaver.Documentation.Test.CiRestBudgetGuard ‑ EveryFetchedScriptThatImportsTheSharedClient_IsFetchedWithIt(lane: "node-repo-cap-debt.yml")
MeshWeaver.Documentation.Test.CiRestBudgetGuard ‑ EveryJobThatCallsTheReader_InstallsItFirst(lane: "node-repo-cap-debt.yml")
MeshWeaver.Documentation.Test.CiRestBudgetGuard ‑ NoLane_ReadsThePlatformThroughTheRestContentsApi(lane: "node-repo-cap-debt.yml")
MeshWeaver.Messaging.Hub.Test.FaultClassifierTest ‑ Classifies(shape: "a bare disposed object with no context — not prova"···, exception: System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'MemoryStream'., kind: "Fault", layer: null)
MeshWeaver.Messaging.Hub.Test.FaultClassifierTest ‑ Classifies(shape: "a cancellation whose timeout cause sits at aggrega"···, exception: System.OperationCanceledException: t
 ---> System.AggregateException: One or more errors occurred. (x) (The operation has timed out.)
 ---> System.InvalidOperationException: x
   --- End of inner exception stack trace ---
 ---> (Inner Exception #1) System.TimeoutException: The operation has timed out.<---

   --- End of inner exception stack trace ---, kind: "Timeout", layer: null)
…

♻️ This comment has been updated with latest results.

rbuergi and others added 2 commits October 24, 2026 18:27
…-local leaves with it

The owner chose a new public repository for the deployment reference instead of the private
MeshWeaver.Plugins, so every reader stays credential-free.

- memex-local (deploy/homebrew, homebrew.yml) and its guards (MemexLocalRepoPathGuard,
  MemexLocalSurfacesAzureErrorsGuard, MemexLocalDiscoversNodeRepoSiblingsGuard,
  LocalOverlayAsksInsteadOfAnsweringTest, PlatformBakeLaneGuard's local-defaults fact) move to
  MeshWeaver.Deploy beside the chart they vendor. The interim tarball change is gone with them.
- instances.json: chartRepository and the declared overlay repository are MeshWeaver.Deploy (42
  files there); core re-measured at 2 (s1-extract, whisper).
- Comments, messages, Readme, .gitignore and the topology / chart-ownership docs name
  MeshWeaver.Deploy.

Refs core slimming.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@rbuergi rbuergi changed the title move(deploy): the reference chart, its manifests and tooling leave core for MeshWeaver.Plugins move(deploy): the deployment reference leaves core for the public MeshWeaver.Deploy Oct 24, 2026
@rbuergi
rbuergi requested a balanced review from Copilot October 25, 2026 12:11

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The retention gate does not scan the external deployment checkout for executable deletion commands, weakening the existing safety check.

1 open issue
What changed in this PR

This is the deletion half of moving deployment reference material from core to the public MeshWeaver.Deploy repository, keeping core focused on the framework while preserving credential-free access.

Changes:

  • Removes deployment charts, scripts, manifests and fixtures for relocation with their guards.
  • Declares the external chart repository in registry-retention accounting.
  • Updates documentation, comments and diagnostic messages to identify the new ownership.
File Description
test/​MeshWeaver.Documentation.Test/​HomeAppSourceReachesTheConfigMapGuard.cs Removes the relocated app-source chart guard.
test/​MeshWeaver.Documentation.Test/​DevLoginConfigBindingTest.cs Removes the relocated DevLogin chart guard.
test/​MeshWeaver.Deployment.Contract.Test/​RequiredModuleAuthorityTest.cs Removes the chart-dependent fact; retains contract checks.
test/​Memex.Portal.Shared.Test/​HealthCensusTest.cs Updates a comment naming the relocated probe test.
test/​Memex.Portal.Shared.Test/​DeploymentPathsSupplyStorageTest.cs Removes the chart storage fact.
src/​MeshWeaver.Hosting/​ShippedPrebuiltBundles.cs Updates chart ownership in documentation comments.
src/​MeshWeaver.Hosting/​NodeTypeBakeGate.cs Updates the chart reference in documentation comments.
src/​MeshWeaver.Documentation/​Data/​Architecture/​RepositoryTopology.md Documents the public deployment repository and consumers.
src/​MeshWeaver.Documentation/​Data/​Architecture/​ChartOwnershipAndRunnerPool.md Records the ownership decision and guard relocation.
Readme.md Points local-stack users to MeshWeaver.Deploy.
memex/​Memex.Portal.Shared/​Setup/​SetupOnlyHost.cs Updates chart ownership in probe comments.
memex/​aspire/​Memex.Portal.ServiceDefaults/​ProbeEndpoints.cs Updates the chart reference in probe comments.
deploy/​python-gate/​README.md Identifies the new home of matching chart defaults.
deploy/​python-gate/​Dockerfile Updates the chart-defaults comment only.
deploy/​node-gate/​README.md Identifies the new home of matching chart defaults.
deploy/​node-gate/​Dockerfile Updates the chart-defaults comment only.
deploy/​homebrew/​share/​values.local.self-registry.yaml Removes the relocated self-registry overlay.
deploy/​homebrew/​share/​port-forward.sh Removes the relocated port-forward helper.
deploy/​homebrew/​share/​com.memex.local.plist Removes the relocated launch agent.
deploy/​homebrew/​scripts/​render-formula.sh Removes the relocated formula renderer.
deploy/​homebrew/​scripts/​make-tarball.sh Removes the relocated packaging script.
deploy/​helm/​values.registry.example.yaml Removes the relocated registry example.
deploy/​helm/​templates/​registry/​secretproviderclass.yaml Removes the relocated registry secret template.
deploy/​helm/​templates/​registry/​ingress.yaml Removes the relocated registry ingress template.
deploy/​helm/​templates/​ollama/​service.yaml Removes the relocated external Ollama service template.
deploy/​helm/​templates/​memex-postgres/​statefulset.yaml Removes the relocated Postgres workload template.
deploy/​helm/​templates/​memex-postgres/​service.yaml Removes the relocated Postgres service template.
deploy/​helm/​templates/​memex-postgres/​secrets.yaml Removes the relocated Postgres secret template.
deploy/​helm/​templates/​memex-postgres/​config.yaml Removes the relocated Postgres configuration template.
deploy/​helm/​templates/​memex-portal/​serviceaccount.yaml Removes the relocated portal identity template.
deploy/​helm/​templates/​memex-portal/​service.yaml Removes the relocated portal service template.
deploy/​helm/​templates/​memex-portal/​scaledobject.yaml Removes the relocated autoscaling template.
deploy/​helm/​templates/​memex-portal/​rbac.yaml Removes the relocated self-update permissions template.
deploy/​helm/​templates/​memex-portal/​pvc.yaml Removes the relocated portal storage template.
deploy/​helm/​templates/​memex-portal/​pdb.yaml Removes the relocated disruption-budget template.
deploy/​helm/​templates/​memex-portal/​instances-rbac.yaml Removes the relocated instance-discovery permissions.
deploy/​helm/​templates/​memex-portal/​bundle-fetch.yaml Removes the relocated bundle-fetch configuration template.
deploy/​helm/​templates/​memex-portal/​_portal-next.tpl Removes the relocated front-end mode helper.
deploy/​helm/​templates/​memex-migration/​secrets.yaml Removes the relocated migration secret template.
deploy/​helm/​templates/​memex-migration/​config.yaml Removes the relocated migration configuration template.
deploy/​helm/​templates/​k8s-dashboard/​service.yaml Removes the relocated dashboard service template.
deploy/​helm/​templates/​k8s-dashboard/​deployment.yaml Removes the relocated dashboard workload template.
deploy/​helm/​Chart.yaml Removes the relocated portal chart metadata.
deploy/​helm-db/​templates/​cluster.yaml Removes the relocated database cluster template.
deploy/​helm-db/​templates/​backup.yaml Removes the relocated database backup template.
deploy/​helm-db/​templates/​_helpers.tpl Removes the relocated database validation helpers.
deploy/​helm-db/​Chart.yaml Removes the relocated database chart metadata.
deploy/​aks/​scripts/​values.deploy.example.yaml Removes the relocated deployment overlay example.
deploy/​aks/​scripts/​tls.sh Removes the relocated TLS setup script.
deploy/​aks/​scripts/​testdata/​values.two-replicas-pod-local-data.yaml Removes the relocated shared-storage refusal fixture.
deploy/​aks/​scripts/​testdata/​values.two-replicas-no-keda.yaml Removes the relocated two-replica fixture.
deploy/​aks/​scripts/​testdata/​values.record-render-no-vault-half.yaml Removes the relocated partial-record render fixture.
deploy/​aks/​scripts/​testdata/​values.portal-next-override.yaml Removes the relocated front-end override fixture.
deploy/​aks/​scripts/​testdata/​values.portal-next-bundled.yaml Removes the relocated bundled front-end fixture.
deploy/​aks/​scripts/​testdata/​values.plugin-source-credentials.yaml Removes the relocated source-credential fixture.
deploy/​aks/​scripts/​testdata/​values.operator-signs-alone-shadowed.yaml Removes the relocated approval-shadowing refusal fixture.
deploy/​aks/​scripts/​testdata/​values.operator-signs-alone-quoted.yaml Removes the relocated approval-type refusal fixture.
deploy/​aks/​scripts/​testdata/​values.operator-maintainer-blank.yaml Removes the relocated blank-maintainer fixture.
deploy/​aks/​scripts/​testdata/​values.operator-executor-misspelled.yaml Removes the relocated executor refusal fixture.
deploy/​aks/​scripts/​testdata/​values.operator-actions-executor.yaml Removes the relocated Actions executor fixture.
deploy/​aks/​scripts/​testdata/​values.mirror-consumer.yaml Removes the relocated mirror-consumer fixture.
deploy/​aks/​scripts/​testdata/​values.memex-local-registry.yaml Removes the relocated local registry fixture.
deploy/​aks/​scripts/​testdata/​values.keyvault-connection-string.yaml Removes the relocated vault-backed database fixture.
deploy/​aks/​scripts/​testdata/​values.ingress-session-affinity.yaml Removes the relocated session-affinity fixture.
deploy/​aks/​scripts/​testdata/​values.ingress-session-affinity-disabled.yaml Removes the relocated affinity-disabled fixture.
deploy/​aks/​scripts/​testdata/​values.ingress-preprovisioned.yaml Removes the relocated preprovisioned TLS fixture.
deploy/​aks/​scripts/​testdata/​values.ingress-no-issuer.yaml Removes the relocated missing-issuer refusal fixture.
deploy/​aks/​scripts/​testdata/​values.ingress-issuer.yaml Removes the relocated certificate-issuer fixture.
deploy/​aks/​scripts/​testdata/​values.incluster-db-release.yaml Removes the relocated separate-database-release fixture.
deploy/​aks/​scripts/​testdata/​values.global-admins.yaml Removes the relocated administrator configuration fixture.
deploy/​aks/​scripts/​testdata/​values.external-db-no-host.yaml Removes the relocated missing-database-host refusal fixture.
deploy/​aks/​scripts/​testdata/​values.external-db-explicit-in-cluster-host.yaml Removes the relocated conflicting-database-host fixture.
deploy/​aks/​scripts/​testdata/​values.eu-ai-residency.yaml Removes the relocated AI residency fixture.
deploy/​aks/​scripts/​testdata/​values.db-release-with-bundled-postgres.yaml Removes the relocated conflicting-database refusal fixture.
deploy/​aks/​scripts/​testdata/​values.crash-dumps-root-is-data.yaml Removes the relocated dump-root refusal fixture.
deploy/​aks/​scripts/​testdata/​values.crash-dumps-root-escapes-data.yaml Removes the relocated escaping-path refusal fixture.
deploy/​aks/​scripts/​testdata/​values.crash-dumps-root-double-slash.yaml Removes the relocated malformed-path refusal fixture.
deploy/​aks/​scripts/​testdata/​values.crash-dumps-dedicated-claim.yaml Removes the relocated dedicated dump-storage fixture.
deploy/​aks/​scripts/​testdata/​values.bundle-fetch.yaml Removes the relocated bundle-fetch fixture.
deploy/​aks/​scripts/​testdata/​values.bake-gate-armed.yaml Removes the relocated armed-readiness-gate fixture.
deploy/​aks/​scripts/​testdata/​values.adonet-external-db-no-connection-string.yaml Removes the relocated missing-connection refusal fixture.
deploy/​aks/​scripts/​testdata/​chart-drift/​drifted/​release-manifest.yaml Removes the relocated drifted release baseline.
deploy/​aks/​scripts/​testdata/​chart-drift/​drifted/​record.json Removes the relocated drifted deployment record.
deploy/​aks/​scripts/​testdata/​chart-drift/​drifted/​live-scaledobjects.json Removes the relocated drifted autoscaler snapshot.
deploy/​aks/​scripts/​testdata/​chart-drift/​drifted/​live-poddisruptionbudgets.json Removes the relocated drifted disruption-budget snapshot.
deploy/​aks/​scripts/​testdata/​chart-drift/​drifted/​live-configmap.json Removes the relocated drifted configuration snapshot.
deploy/​aks/​scripts/​testdata/​chart-drift/​drifted/​expect-patch.json Removes the relocated drifted-case expected patch.
deploy/​aks/​scripts/​testdata/​chart-drift/​drifted/​envfrom-source-keys.txt Removes the relocated drifted environment-key inventory.
deploy/​aks/​scripts/​testdata/​chart-drift/​desired.yaml Removes the relocated desired-state fixture.
deploy/​aks/​scripts/​testdata/​chart-drift/​clean/​release-manifest.yaml Removes the relocated clean release baseline.
deploy/​aks/​scripts/​testdata/​chart-drift/​clean/​record.json Removes the relocated clean deployment record.
deploy/​aks/​scripts/​testdata/​chart-drift/​clean/​live-scaledobjects.json Removes the relocated clean autoscaler snapshot.
deploy/​aks/​scripts/​testdata/​chart-drift/​clean/​live-poddisruptionbudgets.json Removes the relocated clean disruption-budget snapshot.
deploy/​aks/​scripts/​testdata/​chart-drift/​clean/​live-deployment.json Removes the relocated clean workload snapshot.
deploy/​aks/​scripts/​testdata/​chart-drift/​clean/​live-configmap.json Removes the relocated clean configuration snapshot.
deploy/​aks/​scripts/​testdata/​chart-drift/​clean/​expect-patch.json Removes the relocated clean-case expected patch.
deploy/​aks/​scripts/​testdata/​chart-drift/​clean/​envfrom-source-keys.txt Removes the relocated clean environment-key inventory.
deploy/​aks/​scripts/​import-dashboards.sh Removes the relocated dashboard importer.
deploy/​aks/​scripts/​aks-extras.yaml Removes the relocated storage resources.
deploy/​aks/​manifests/​storageclass-azurefile.yaml Removes the relocated Azure Files storage class.
deploy/​aks/​manifests/​postgres-pvc-patch.yaml Removes the relocated Postgres storage patch.
deploy/​aks/​manifests/​portal-ingress.yaml Removes the relocated portal ingress example.
deploy/​aks/​manifests/​pgbackrest/​serviceaccount.yaml Removes the relocated backup identity manifest.
deploy/​aks/​manifests/​pgbackrest/​configmap.yaml Removes the relocated backup configuration manifest.
deploy/​aks/​manifests/​observability/​otel-pvc.yaml Removes the relocated telemetry storage manifest.
deploy/​aks/​manifests/​hosting-operator/​operator-serviceaccount.yaml Removes the relocated operator identity manifest.
deploy/​aks/​manifests/​hosting-operator/​namespace.yaml Removes the relocated operator namespace manifest.
deploy/​aks/​manifests/​hosting-operator/​jobrunner.yaml Removes the relocated job-runner permissions manifest.
deploy/​aks/​manifests/​db-platform/​storageclass-premiumv2.yaml Removes the relocated database storage class.
deploy/​aks/​manifests/​db-platform/​README.md Removes the relocated database-platform setup guide.
.gitignore Removes exceptions for the relocated Homebrew CLI.
.github/​workflows/​main-cd.yml Updates deployment paths in diagnostic messages.
.github/​scripts/​push-bundle-publication.sh Updates the test-harness ownership comment.
.github/​scripts/​install-oras.sh Updates the chart-harness ownership comment.
.github/​scripts/​control-image-acceptance.sh Updates the probe-budget source comment.
.github/​dockerhub-mirror.list Updates chart references in comments; preserves image pins.
.github/​acr-retention/​instances.json Declares the external chart home and repository inventory.

Review effort: Balanced

"design": "Doc/Architecture/FleetRegistryRetention",
"reason": "Measured 2026-09-14 over core origin/main 192bb073b8, read-only: NOTHING deletes a manifest, a tag or a referenced blob from cr.meshweaver.cloud, and nothing collects its garbage — so the registry grows without bound. That is the safe direction to be wrong in; the hazard is the FIX. 🚨 `distribution` HAS NO LOCK: ACR's `changeableAttributes.deleteEnabled` is an ACR feature, so there is no object here that a protected set can be written INTO ahead of a deleter. A cleanup's own derivation would therefore be the entire safety margin, with nothing behind it — where on the ACR an incomplete run merely writes fewer locks and last night's still hold. Until a cleanup can derive a protected set over what this registry HOLDS (and nothing enumerates that as data today — MeshWeaver#4066), none may be added.",
"chart": "deploy/helm/templates/registry",
"chartRepository": "Systemorph/MeshWeaver.Deploy",

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, this was a real gap. It is fixed in f30a584.

check_registry_retention now sweeps the chart_root checkout for a deleter as well as core, whenever a record's chartRepository chart was re-derived from that checkout. A hit there is reported with the repository name as a prefix (Systemorph/MeshWeaver.Deploy:deploy/aks/scripts/…). Each checkout's denominator is printed on its own line:

deleter sweep per checkout: this repository (264 swept, 3 skipped); Systemorph/MeshWeaver.Deploy (164 swept, 0 skipped)

That line comes from the real record against a MeshWeaver.Deploy checkout, which exits 0. The existing registry retention: …; 1 chart(s) re-derived; … sentence is unchanged, so Deploy's Registry retention job still matches it.

ARM 33h now has three more cases, next to the CronJob case:

  • Clean control: the chart's home passes, and the sweep-coverage line names it.
  • Negative control 1: registry garbage-collect in the chart home's deploy/aks/scripts/gc.sh is RED.
  • Negative control 2: the same command in the chart home's .github/workflows/gc.yml is RED.

To show the new cases can fail, I removed the extra sweep root and re-ran the self-test: all three new checks failed, with exit code 1. With the fix restored, --self-test exits 0.

rbuergi and others added 2 commits October 25, 2026 13:40
Every conflict resolved so the deletion wins: the chart files main changed (#7143, #7159, #7184,
#7170, #7119; all ported to MeshWeaver.Deploy by Deploy#4), the chart-reading guards main moved
onto RepoPaths (#7111), and the Memex.Portal.Shared files main moved to MeshWeaver.Plugins (#7125).
Also deleted: the build-host chart files main added after this branch was cut (frozen, in Deploy
now) and memex-local.yml (#7119), whose Linux gate is Deploy's homebrew.yml linux job. Kept from
main: instances.json's re-measured MeshWeaver.Deploy row.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…rived

When a record names a chartRepository and the Chart Gate there hands its checkout as
--chart-root, check_registry_retention re-derived the external templates but swept only core for an
executed deletion. A `registry garbage-collect` in that repository's scripts or workflows therefore
no longer invalidated `nothing-deletes`. The external checkout is now swept too, each checkout's
denominator is printed on its own line, and ARM 33h plants a deleter in the chart home's script and
in its workflow (both RED) beside the clean control.

Negative control: with the extra sweep root removed, the three new ARM 33h checks fail.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…-local; #7179's change ported in MeshWeaver.Deploy#7)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@rbuergi
rbuergi marked this pull request as ready for review October 25, 2026 12:44
@rbuergi
rbuergi enabled auto-merge (squash) October 25, 2026 12:44
@github-actions
github-actions Bot requested a balanced review from Copilot October 25, 2026 12:44

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

The acknowledged Plugins chart-reading consumer must be migrated before its core input is deleted, and cross-repository landing still needs confirmation.

1 open issue

Review effort: Balanced

@rbuergi
rbuergi merged commit c0414b8 into main Oct 25, 2026
51 checks passed
rbuergi added a commit that referenced this pull request Oct 25, 2026
…es in MeshWeaver.Deploy (#7194)

* ci(chart-freeze): the platform's chart copy is frozen — the chart lives 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>

* fix(chart-freeze): read the listing NUL-delimited; a frozen directory 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>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@rbuergi
rbuergi deleted the move/chart-leaves-core branch October 31, 2026 09:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants