Repository navigation
cr.meshweaver.cloud: the rule is declared (nothing-deletes, cleanup unauthorized) — read the storage account's lifecycle policy and decide whether unbounded growth is accepted #6499
Description
(re-filed 2026-10-11; replaces a deleted issue, formerly number 4230; originally by @rbuergi on 2026-09-13)
Split out of #3438 at the coordinator's request. #3438 and everything under it — the lock lane,
the tag lock, the index closure, the 30-day window, #3859's interlock — are about one registry:
meshweaver.azurecr.io. This is the same question asked about the second one.
What is true today
cr.meshweaver.cloud is the fleet's own container registry, hosted by MeshWeaver as part of the
memex-cloud release (#3697 — registry.host: cr.meshweaver.cloud, serving from
ghcr.io/distribution/distribution). It is the default for newly provisioned instances (the
new-deployment path pulls from it, not from ACR).
acr purge cannot reach it, and no retention rule we have is about it. #3842's policy (at least
30 days by age, no build-count quota) is implemented in three places — PrebuiltBundleRetention,
AssemblyCacheRetention, and the ACR task record — and all three are about the portal's own stores
or about the ACR. Nothing states what keeps, or deletes, an image in cr.meshweaver.cloud.
Measured 2026-09-13 (read-only)
Every deployment overlay in Systemorph/Memex (twelve files), run through this repository's own
shipped extractors on the committed bytes:
| installation | pins in meshweaver.azurecr.io |
pins in another registry |
|---|---|---|
build (build.meshweaver.cloud, LIVE, answers /api/version with core c84c6c0) |
0 | 2 → cr.meshweaver.cloud (memex-portal-ai:3.0.0-ci.8411, memex-migration:3.0.0-ci.8411) |
client-b (declared not-installed, no DNS record) |
0 | 2 → cr.meshweaver.cloud (…:3.0.0-ci.8080) |
memex |
6 | 0 |
memex-cloud |
3 | 1 → ghcr.io (distribution/distribution — the registry service's own image, third-party) |
So exactly one live installation runs entirely from cr.meshweaver.cloud today, and it is the
build server. client-b will be the second the day it is provisioned, and every instance provisioned
after it.
This surfaced because the nightly protection lane refused on it: AXIS 3 — installation 'build' runs core c84c6c0 and its overlay pins no image at all (run
34730206406). That sentence was
false — the overlay pins two images — and #4221 fixes the reading. What #4221 does not do, and
says so in as many words, is claim that anything protects them.
What is unknown
- Does anything delete from
cr.meshweaver.cloud? A timer, a registry-side GC, a
distributiongarbage-collect job, a volume that simply fills — nobody has looked. Both
readings are dangerous in different ways: unbounded growth, or a deletion nobody can see. - If something does, what is protected from it? There is no lock concept, no pin scan and no
closure walk on that registry. The manifest lock this fleet relies on
(changeableAttributes.deleteEnabled) is an ACR feature. - What is the storage bound? ACR's is measured (2,936 manifests on 2026-09-13). This one is
not.
What would close it
Any of these, stated rather than assumed:
- a declaration that nothing deletes and nothing needs to — with the storage bound measured and
a threshold that would change the answer; or - a retention policy for
cr.meshweaver.cloudexpressed the way No platform pins in module repos — build against the released platform, and be TOLERANT of drift (same major serves) #3842's is, plus the protection
that makes it safe (the equivalent of the lock: something that keeps what live installations and
committed pins reference); or - a decision that instances move back to the ACR, which makes the question moot.
The current state is recorded, not papered over: .github/acr-retention/instances.json (#4221)
declares cr.meshweaver.cloud as fleet-unlockable with a reason that says what retains it is
established by nothing, and the protection run prints its out-of-scope installations on their own
line reading "NOT locked here, and whether anything retains that registry is UNVERIFIED". That
makes the gap visible; it does not close it.
Not this issue
- SelfUpdate refuses cr.meshweaver.cloud because the plugin registry is on memex.meshweaver.cloud — every fleet-registry instance cannot self-update (measured on build, 2026-09-12) #4093 (self-update refuses
cr.meshweaver.cloudbecause the plugin registry is elsewhere) and
#4123 (deriving the registry/validator pairing) are about reaching and trusting that registry. - An image's closure is still not queryable mesh data — /app is asserted by a shell script (the unwired mirror, item 1, was deleted in #4573) #4066 (
MeshWeaver.ContainerImagesunwired; an image's closure is not mesh data) is adjacent and
would give this question its instrument, but does not ask it. - Retention: the locks hold nightly — apply the decided 30-day window to the paused purge-old-images, read production back, and inventory bundles/active builds as consumers #3438 / Retention: interlock cleanup with protection updates and active publication #3859 stay about the ACR.
Design context: Doc/Architecture/ArtifactRetentionInterlock → A second registry.
Measured 2026-09-13 (date -u), read-only throughout: the twelve committed overlays, the run
log over REST, and az role definition list. No purge, no lock, no dry run, no registry mutation of
any kind, on either registry.
Activity
rbuergi commentedon Oct 11, 2026
(re-posted 2026-10-11; originally by @rbuergi on 2026-09-14)
Answered, and the answer is the SECOND of the two readings this issue names — #4315
It is unbounded growth. Nothing deletes a manifest, a tag or a referenced blob from
cr.meshweaver.cloud, and nothing collects its garbage. That is a cost rather than an incident, andit is the safe direction to be wrong in — the hazard is the fix, which is what the rest of this
is about.
Design, committed:
Doc/Architecture/FleetRegistryRetention.1. The enumeration — measured 2026-09-14 (
date -u), coreorigin/main192bb073b8Read-only throughout: no registry call of any kind, no purge, no dry run, no deletion. 409 files
under
deploy/and.github/swept, and the sweep pattern was proven to fire on a syntheticcontrol first — a grep that matches nothing is not evidence until it has been shown able to match
something.
maintenance.uploadpurgingage: 168h,interval: 24h,dryrun: false)registry garbage-collect(blob GC)Job, noCronJob(8 objects rendered under the registry chart, none a Job) and no invocation anywhere. Blobs are never collectedDELETEdocker_authgrantsdeleteto exactly one account, the publisher. An installation holding an instance key cannot delete whatever it asksacr purgeThis answers the issue's questions 1 and 3 (question 3, the storage bound, is measured by
nobody and stays open — §4).
2. 🚨 The finding, and it is why "port the ACR lane one registry along" is wrong
distributionhas NO LOCK.changeableAttributes.deleteEnabledis an ACR feature, so there isno object a protected set can be written into ahead of a deleter. On the ACR the protected set is
persistent registry state, written by a different process on a different clock — an incomplete
nightly run writes fewer locks and last night's still hold. Here the derivation is the entire
safety margin, with nothing behind it: an incomplete run deletes what it could not see, in the same
act.
So the rule (R0–R6 on the page) is deliberately stricter than #3438's, not equivalent. The two
clauses that matter: an incomplete derivation deletes nothing (not less), and the protected set
is derived — age only ever narrows the complement, never defines it, which is #3438's own root
cause stated as a rule instead of a window.
3. What landed
This closes the issue's third bullet — "a retention policy for
cr.meshweaver.cloudexpressed theway #3842's is, plus the protection that makes it safe" — with the protection expressed as the one
form a lock-less registry admits.
registriesentry in.github/acr-retention/instances.jsonnowanswers the second question as well as the first, so a registry joining the fleet cannot enter
undeclared.
nothing-deletesrequires adeletersenumeration with at least onepresent: true— an enumeration in which nothing is present inspected nothing, and readsexactly like a clean one.
lock-pinned-digests.py --check-registry-retention, credential-free, on every pullrequest (in
dotnet-test.yml'sworkflow-shelljob, aneeds:ofConsolidate test results).🚨 The arm that is not about JSON: it re-reads the committed chart — a
Job/CronJobbesidethe registry, a moved
maintenance:window, a new key in that stanza, an ACL rule grantingdeleteto anyone but the publisher, or an executable deletion anywhere, each goes RED while therecord still reads "nothing deletes". A
reasonfield alone would read identically on that day.every committed reference to this registry and then discarded them. It now prints them —
repository, tag, and the file that pins each — plus its own incompleteness on its own line:
committed pins are a floor, the plugin-bundle family is not derivable at all today, and no
cleanup may run against it.
Nothing was deleted and no cleanup that runs was written. R0 is that nothing deletes and
nothing may, until a protected set can be derived over what the registry holds.
4. What stays open, and it is three reads rather than a design
registry.storage.accountName, provisioned outside this chart, so no committed file can answerit. 🚨 A lifecycle rule over a content-addressed store is not old data expiring — it deletes a
layer a live manifest still names, and the image reads as present until something pulls it.
In the record this is
present: "unverified"with averifiedBy, it prints on every run, and itkeeps
cleanupAuthorizedfalse by mechanism.(2,936 manifests on 2026-09-13); this one has never been measured — the issue's question 3.
push/pull/delete to
registry.notifications.url; it defaults to""and no receiver exists.That is the difference between a cleanup that can ever be safe and one that cannot. Filed against
An image's closure is still not queryable mesh data — /app is asserted by a shell script (the unwired mirror, item 1, was deleted in #4573) #4066, where the rest of "an image's closure as mesh data" lives.
Leaving this open for those three. The question it was filed on — what is established about
retention there — is answered and committed.
Measured 2026-09-14 (
date -u), read-only: the committed chart, the committed extractors andthe task record. No purge, no lock, no dry run, no registry mutation of any kind, on either
registry.
🤖 Generated with Claude Code
rbuergi commentedon Oct 11, 2026
(re-posted 2026-10-11; originally by @rbuergi on 2026-09-14)
🚨 The premise of this issue is REVERSED, and the title and body now describe a defect that does not exist
Landed in #4315 (
e73047d3233cc4816fd15735528a4766feb8d8d5). Before anything else, the thing a future reader must not be misled by:So the title — "Retention for cr.meshweaver.cloud is established by nothing" — was right about the
gap in the record and wrong about the shape of the hazard it implied. The body's framing
(images at risk, an
acr purgeequivalent needed, protection to be built before something eats apin) describes a defect that is not there. What is there is a registry that keeps every image and
every bundle ever pushed to it, plus every blob, for ever, and has never collected any of it.
That reversal is not a technicality: it changes what is urgent. Nothing is being lost. The hazard
is the FIX — the day somebody adds a cleanup, there is nothing to stop it deleting what a live
portal still runs, because (see below) this registry has no lock to protect anything with.
What was measured
2026-09-14 (
date -u), coreorigin/main192bb073b8, read-only throughout: no registry call ofany kind, no purge, no dry run, no deletion.
maintenance.uploadpurgingdryrun: false)registry garbage-collectJob, noCronJob(8 objects rendered under the registry chart, none a Job), no invocation anywhere. Blobs are never collectedDELETEdelete, and its match names the publisheracr purge"unverified"— a state of its own in the record, not afalseTwo denominators, stated as two: the hand sweep that produced this table read all 409 files
under
deploy/and.github/; the gate sweeps the 246 that can actually run a command and namesthe 3 it skips. Both ran with the deleter pattern proven to fire on a synthetic control first —
a grep that matches nothing is not evidence until it has been shown able to match something.
One row's provenance is different and is flagged as such: what
uploadpurgingdeletes isdistribution's documented behaviour, not something measured here. The chart pins the image bydigest, so the version that statement is true of is pinned beside it.
The finding: this registry has NO LOCK, so the rule is stricter than #3438's
changeableAttributes.deleteEnabledis an ACR feature. There is no object here a protected setcan be written into ahead of a deleter — so
lock-pinned-digests.pydoes not port one registryalong, and the difference is structural rather than an implementation gap:
Hence R0–R6 on the page, and the two clauses the gate enforces rather than describes: an incomplete
derivation deletes NOTHING (not less), and the protected set is derived — age only ever narrows
the complement, never defines it, which is #3438's own root cause stated as a rule instead of a
window.
What CLOSES with this
cr.meshweaver.cloudexpressed the way No platform pins in module repos — build against the released platform, and be TOLERANT of drift (same major serves) #3842's is, plus the protection that makes it safe" — in the only form a
lock-less registry admits: a declared rule plus the derivation of what it protects, not a
cleanup with a longer window. 🚨 Nothing was deleted and no cleanup that runs was written. R0
is that nothing deletes and nothing may, until a protected set can be derived over what the
registry holds.
re-reads the chart rather than the claim: a
Job/CronJobbeside the registry, a movedmaintenance:window, a new key in that stanza, an ACL rule grantingdeleteto anyone but thedeclared principal, or an executable deletion anywhere each goes RED while the record still
reads "nothing deletes". Credential-free, on every pull request. Seven sabotages, each firing
exactly its own arms.
printed instead of discarded: the nightly run lists every committed reference to this registry
(repository, tag, and the file that pins it) with its own incompleteness on its own line.
cr.meshweaver.cloud") — closed there and movedhere; that thread keeps its ACR items unchanged.
instances.jsonentry no longer says "established by nothing" — but the lane'sout-of-scope report line still says UNVERIFIED, and must: this lane still protects nothing
there.
What stays OPEN, and why this issue is not closed
Question 3 — the storage bound — is still measured by nobody. The ACR's is (2,936 manifests on
2026-09-13); this one has never been. Since the answer above is unbounded growth, that number is
now the whole of the remaining risk, and it is not one I can take: it needs a read on the storage
account.
Design, committed:
Doc/Architecture/FleetRegistryRetention.Related: #3438 (the ACR side, unchanged), #4066 (what is missing to derive the protected set from
mesh data — stated precisely there, including that
ContainerImageRecordcannot supply the registryinventory whichever way #4066's item 1 is decided).
🧑 Needs the maintainer — the only part of this that needs a human
"unverified"row. 🚨 A lifecycle rule over a content-addressed store is not old dataexpiring — it deletes a layer a live manifest still names, and the image reads as present until
something pulls it. The account is
registry.storage.accountName; nothing committed can answerit. Until it is answered the record keeps
cleanupAuthorized: false, by mechanism.that would change the answer — this issue's own question 3, and now its only live risk.
POST every push / pull / delete to
registry.notifications.url; it defaults to""and noreceiver exists. It is the difference between a cleanup that can ever be safe and one that
cannot.
MapContainerImagesin a host, or deletesrc/MeshWeaver.ContainerImages.Nothing here depends on the answer; the finding on that thread removes a reason to wire it, not a
reason to delete it.
registry and the disabling of a destructive schedule) and applying the decided window to the
disabled task, which is the same act as lifting the pause.
Measured 2026-09-14 (
date -u), read-only: the committed chart, the committed extractors andthe task record. No purge, no lock, no dry run, no registry mutation of any kind, on either
registry. No cluster access and no token value read, printed or stored.
🤖 Generated with Claude Code
rbuergi commentedon Oct 11, 2026
(re-posted 2026-10-11; originally by @rbuergi on 2026-09-15)
The one
"unverified"row is now a single command — the storage account is named in committed sourcesRead-only,
origin/mainb8da52e054, 2026-09-15. Nothing here changes the verdict: the rule is declared and gated (#4315e73047d323→.github/acr-retention/instances.jsonregistries["cr.meshweaver.cloud"].retention=rule: "nothing-deletes",cleanupAuthorized: false, fivedeletersrows, enforced credential-free bylock-pinned-digests.py --check-registry-retentionatdotnet-test.yml:2287), andcleanupAuthorized: falseis held by mechanism while any"unverified"row stands.What this adds: the record and the design page both decline to name the storage account, so maintainer item 1 reads as a hunt. It is not — the value is committed in two places.
deploy/helm/values.registry.example.yaml:17-19:and the same pair in
Systemorph/Memexmesh/Deployments/memex-cloud.json(content.registry.storageAccountName/storageContainer). So the blob-lifecycle row — the onedeletersentry sitting atpresent: "unverified"— is answered by:plus the container's own lifecycle rules. That is the instrument, and it is the only thing standing between the record and a fully verified
nothing-deletesclaim. The same account answers the issue's question 3 (the storage bound), which has never been measured: blob-service metrics oraz storage blob listonmeshweaverregistry/registry, or a/v2/_catalog+ per-repo tag walk as the publisher. Both are outside every repo, which is why this stays open.Two commits landed after the last comment here and touch the same table:
76dbb637da fix(#4323)andd081c3f619 fix(#4324 review)(2026-09-14T14:11–14:17Z). They added the third question (publishes) to theregistriesrecord and corrected a falseghcr.iodeclaration that had read "Nothing this fleet produces is stored on ghcr.io" whilemain-cd.ymlpushes twelve tags there per promoting run — worth knowing, since it is the same file this issue's record lives in and the same class of error the"unverified"row is guarding against.Question 2 (whether to build the last-pulled receiver) is unchanged and filed against #4066:
registry.notifications.urldefaults""(deploy/helm/values.yaml:840) and_registry.tpl:49-52requires a vault secret object the moment a URL is set.rbuergi commentedon Oct 11, 2026
(re-posted 2026-10-11; originally by @rbuergi on 2026-09-17)
2026-09-17 re-measurement — nothing has drifted, and one maintainer item closed elsewhere
Read-only on core
main0ec37cf2fc:e73047d3233cc4816fd15735528a4766feb8d8d5) left it:.github/acr-retention/instances.json:200-202→rule: "nothing-deletes",cleanupAuthorized: false,statedAt: "2026-09-14";:239→ the blob-lifecycle row is still"present": "unverified". Last touch to that directory was193e54ed4f(09-15), so no drift.dotnet-test.yml:2367runslock-pinned-digests.py --check-registry-retention, with the record arm at:2349and nightly atlock-pinned-digests.yml:291. Run here credential-free, EXIT=0: "3 registry(ies) declared …262 executable file(s) swept for a deleter … cr.meshweaver.cloud: 1 mechanism(s) UNVERIFIED — an
Azure blob lifecycle / management policy on the registry's storage container; no cleanup may be
authorized here while that stands".
edeefa808a83d9839eb50cd891ec9847e8e7d751(2026-09-17 09:50) deletedsrc/MeshWeaver.ContainerImagesand its chart block. §7 ofDoc/Architecture/FleetRegistryRetentionrecords it struck through; a fifth item has appeared at §8.5 (the chart's default
ghcr.io/systemorph/…:latestimages).https://cr.meshweaver.cloud/v2/and/v2/_catalogboth answer 401 today — publisher-credential-only. The bound needsaz storage account management-policy showon the registry's storage account, or a/v2/_catalogwalk as the publisher.
🚨 The title still states the reversed premise. This issue asked which of two dangers was real —
"unbounded growth, or a deletion nobody can see" — and the answer, settled on 2026-09-14, is the
first: nothing deletes there, the hazard is the fix, and
cleanupAuthorized: falseholds it bymechanism rather than by memory. Retitling to what is actually left, which is two decisions and one
azread, not a defect. The durable record isDoc/Architecture/FleetRegistryRetention(584 lines, R0–R6 at
:92-182, the maintainer's items at:344), not this thread.rbuergi commentedon Oct 11, 2026
(re-posted 2026-10-11; originally by @rbuergi on 2026-09-18)
Triage 2026-09-18 — still open, and the body's "exactly one live installation" is now TWO
Read-only: core
origin/mainb76f57a79d,Systemorph/Memex@mainover REST, and two unauthenticated/api/versionGETs. No registry call of any kind, no purge, no dry run, no mutation.The open item has not moved
.github/acr-retention/instances.jsononmaintoday is exactly as #4315 left it:registries["cr.meshweaver.cloud"].retention→"rule": "nothing-deletes","cleanupAuthorized": false,"statedAt": "2026-09-14""present": "unverified",verifiedBynaming the oneaz storage account management-policy showread onmeshweaverregistrySo the single remaining instrument is still the maintainer's one Azure read, and the storage bound (question 3) is still unmeasured. Nothing to adjudicate into a close.
🚨 What changed:
client-bis live, so the second fleet-registry-only installation exists nowThe body's table says "exactly one live installation runs entirely from
cr.meshweaver.cloudtoday, and it is the build server.client-bwill be the second the day it is provisioned", and listsclient-bas "declarednot-installed, no DNS record".That day was 2026-09-16. Measured 2026-09-18 06:14Z:
Systemorph/Memex@mainmesh/Deployments/client-b.json:status: "Live"(f86d9cc78, 2026-09-16 — "provisioned end to end through the Hosting plugin"),updatePolicy: "Continuous"(bdf675ddf, 2026-09-17),pinnedImageTag: "3.0.0-ci.8080",host: "client-b.meshweaver.cloud"— and its overlay's two pins are incr.meshweaver.cloud, per the body's own table.Why it bears on this issue rather than being bookkeeping. The registry where nothing deletes, nothing may, and nothing can be locked now backs two serving portals instead of one, one of them on
Continuous. That does not change the verdict (unbounded growth, the hazard is the fix) — it raises the cost of getting the eventual cleanup wrong, and it movesclient-bfrom "a pin to protect" to "a running portal whose bytes must not be collected".It also leaves a stale exemption upstream:
.github/acr-retention/instances.json:306-310still declaresclient-b"state": "not-installed"on the reason "client-b.meshweaver.cloud has no DNS record (measured 2026-09-12)", whose own text says "Delete this entry the day it is provisioned." While it stands, the nightly AXIS 3 accounting skips a live installation. Recorded in more detail on #3438, whose lane reads that roster.Unchanged and still owed here
One
az storage account management-policy show --account-name meshweaverregistry, plus the storage bound (/v2/_cataloganswers 401 to anyone but the publisher). Both outside every repo, which is why this stays open.Read-only triage 2026-09-18 by Claude Opus 5 (1M context).
rbuergi commentedon Oct 11, 2026
(re-posted 2026-10-11; originally by @rbuergi on 2026-09-21)
Triage 2026-09-21: left open,
chore, no severityBlocked on: reading the storage account's lifecycle policy — which needs Azure access this side of the portal API — and then a decision about whether unbounded growth on
cr.meshweaver.cloudis accepted. Both halves are outside what an agent should settle: the first because operations go through the control instance's Hosting API and a storage-account lifecycle policy has no Hosting surface, the second because "accept unbounded growth" is a cost decision.The rule as declared — nothing deletes, cleanup unauthorized — is the safe default and is the reason the question is open rather than urgent: an over-retaining registry costs money, an under-retaining one destroys a pinned digest, and this backlog has a live instance of the second (#3438:
mw-plugin-testpassed Memex#122's "would anything recreate this tag?" test and was purged anyway, wedging MeshWeaver.Education entirely, because--keep 10is measured in newer builds).Two neighbouring findings that bear on it and are deliberately not folded in:
lock-pinned-digests.py's AXIS 3 in the same pass.🚨 And the locking half cannot be automated as things stand:
--delete-enabled falseneedsrepositories/metadata/write(Container Registry Repository Writer), held by none of the registry's three service principals — recorded on #3438 as "the last production action" and still outstanding. So a decision to retain by locking has a provisioning prerequisite that is nobody's code change.rbuergi commentedon Oct 11, 2026
(re-posted 2026-10-11; originally by @rbuergi on 2026-09-22)
Disposition: HANDED BACK — two acts, neither an agent's, and both named exactly
Re-measured read-only on core
origin/main94689968ef(2026-09-22). The record is unchanged since #4315 and its last touch (cceb637676) only tightened the check that reads it:So the verdict recorded on this thread stands — nothing deletes, the hazard is the fix — and
cleanupAuthorized: falseis held by mechanism (lock-pinned-digests.py --check-registry-retention, wired ondotnet-test.ymland the nightly) while that one row readsunverified. Nothing here is code work, and this thread has been correct about that for eight days. What is left is exactly two acts:az storage account management-policy show --account-name meshweaverregistry -g <rg>plus theregistrycontainer's own rules — and flip that row topresent: true(with the policy quoted) orpresent: false. Account and container names are committed (deploy/helm/values.registry.example.yaml:17-19;Systemorph/Memexmesh/Deployments/memex-cloud.jsoncontent.registry.storageAccountName)./v2/_cataloganswers 401 unauthenticated, so it is a publisher-credential walk or a blob-service metric), or authorize a cleanup — whichdistributioncannot make safe today, because it has no lock and the "last-pulled receiver" that would stand in for one is unbuilt (#4066).unverified, by designTwo things an agent must not do here, stated so the next triage does not re-derive them: not port the ACR purge lane one registry along (no lock exists to protect a pin from it), and not close this on the strength of the record — the record says the question is open, which is the correct state.
Left
chore, no severity. The durable text isDoc/Architecture/FleetRegistryRetention; this comment only names the two acts and their owners.rbuergi commentedon Oct 11, 2026
(re-posted 2026-10-11; originally by @rbuergi on 2026-10-09)
Left open. Needs: (1) a read of the storage account's lifecycle policy, which needs Azure access and has no Hosting surface, and (2) a cost decision: is unbounded growth on
cr.meshweaver.cloudaccepted? Both are owner acts. No code is owed until (2) is answered.rbuergi commentedon Oct 11, 2026
(re-posted 2026-10-11; originally by @rbuergi on 2026-10-09)
Implementing the maintainer's decision (2026-10-09): "cr.meshweaver.cloud: NOT unbounded — a lifecycle rule that never deletes anything a lock/active build references (inventory consumers first, per #3438), applied via the governed infra path (InstanceAction/InfraDeploy what-if first)."
Recorded as policy
fleet-registry-bounded(core #6379;Doc/Architecture/FleetRegistryRetention→ The decided rule, §7 item 2 struck): a lifecycle rule whose protected set is DERIVED every run from the consumer inventory and which deletes nothing when any part of it cannot be read; through an InstanceAction, what-if first; never a blob lifecycle policy (it cannot see references). The record keepsrule: nothing-deletes,cleanupAuthorized: falseuntil that cleanup exists — the gate refusestruewhile the lifecycle row isunverified.First governed step, built: the
RegistryRetentionaction's read-only mode (MeshWeaver.Plugins#3251, Memex#712) reads the management policy of every registry storage account the committed records name — the oneunverifiedrow — as hosting-operator, through the subscriptionReaderincludeAuditReaderalready declares. Once those PRs are merged and rolled,RegistryRetentiondryRun: trueon control answers it (::hosting:: registry_lifecycle=<account> present=true|false); then the row flips ininstances.json.Not built yet (stated, not hidden): the deleting cleanup itself. Its protected set needs the image-closure inventory as mesh data (#4066, decided separately the same day); building a deleter on a registry with no lock before that inventory exists would make the run's own derivation the whole safety margin. Left open for it.
rbuergi commentedon Oct 11, 2026
(re-posted 2026-10-11; originally by @rbuergi on 2026-10-10)
Status after the #3438 merges. Maintainer decision (2026-10-09): "#4230 cr.meshweaver.cloud: NOT unbounded — a lifecycle rule that never deletes anything a lock/active build references (inventory consumers first, per #3438), applied via the governed infra path (InstanceAction/InfraDeploy what-if first)."
fleet-registry-boundedin the PolicyNotProse register (core fix(retention): lock lane joins each installation's record; apply refuses behind a red lock lane; governed path recorded (#3438, #4230) #6379).RegistryRetentiondry run (Plugins fix(#3060): a layout area can name the viewer it is rendering for #3251, Memex Package install: make re-install of an unchanged snapshot actually write ZERO #712) reads back the lifecycle policy of themeshweaveregistrystorage account behind cr.meshweaver.cloud. That gives the current state from production before anything changes.Next acts: the maintainer runs the
RegistryRetentiondry run on control (step 4 on #3438) to read the current lifecycle state. Once #4066's inventory lands, the rule is added to the infra template and applied via InfraDeploy what-if, then deploy.Leaving this open.
rbuergi commentedon Oct 11, 2026
The one
unverifiedrow is answered: the registry's storage account carries no lifecycle policy. Measured 2026-10-11 through the governed read, not a handazcall.Ops/Actions/registry-retention-verify-20261011-3438on the control instance (RegistryRetention,dryRun: true, unattended), operations-lane run 38141799080.::hosting:: registry_lifecycle=meshweaverregistry present=false.present=falseonly on Azure's ownManagementPolicyNotFoundanswer. A read it cannot make is a red run naming the account.#6502 flips the record's row from
"unverified"topresent: false, naming this measurement, and updatesDoc/Architecture/FleetRegistryRetention(§1, §6, §7 item 1).cleanupAuthorizedstaysfalse. With the row answered, the gate no longer refusestrueover an unverified mechanism on this registry; what holds it is policyfleet-registry-bounded.What is left on this issue is the cleanup itself, and it is blocked on its inventory:
main-cddelivered, on a header-case defect. Fix in Image closure ingest: read the signature header the endpoint verified, whatever its case #6504.Leaving this open for the cleanup.