Repository navigation
fix(providers): bind pre-upgrade ledger receipts from live evidence - #10
Merged
Merged
Conversation
After #8 keyed the ZoneUnit ledger by recordSetUID, UID-less entries written before the upgrade were ignored entirely, so every record the provider had created for a still-existing claim became Programmed=False:ProviderConflict after the controller roll (observed on pmc-next 2026-09-12: 30/34 RecordSets). Deleting such a claim was stuck for the same reason, and the ledger never dropped entries whose spec item was gone. Route 53 and Cloudflare now treat a UID-less entry as a pre-upgrade receipt and bind it to the current claim incarnation in place when the receipt names exactly the desired record identity and the live record already equals the desired state; a differing live record stays a conflict. The same evidence authorizes deletion for a deleting claim. Mismatched non-empty UIDs still never transfer. Providers also prune orphaned ledger entries (no spec item) once they are spent: deletion completed, the named record is absent (Route 53), or no IDs are recorded (Cloudflare). Orphans that still name a live record are kept as the only evidence of a leaked record and because core can drop a spec item transiently.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
#8 keys
ZoneUnit.status.recordSets[]byrecordSetUID. Entries written before #8 have no UID and were ignored entirely, so after the controller roll every record the provider itself had created becameProgrammed=False:ProviderConflict(pmc-next 2026-09-12: 30/34 RecordSets, 13/14 EndpointRecordSets not Ready, all HTTPPublishdnsReady=false). Deleting such a claim was stuck the same way. No code ever dropped ledger entries whose spec item was gone (pmc-next: 68 entries for 32 claims).Change
ProviderConflict. The same evidence authorizes DELETE for a deleting claim whose retained values match. Mismatched non-empty UIDs still never transfer (TestZoneReconcileDoesNotUseNoncurrentRecordSetReceiptkeeps that case; its""case moved torecordset_ledger_test.goas the evidence-bound positive/negative cases).deletionCompleted, the named record absent from the hosted zone (Route 53), or no recorded IDs (Cloudflare). Orphans that still name a live record are kept: core can drop a spec item transiently (TestCloudflareZoneReconcilerCreatesARecordsThroughZoneUnitexercises that), and the entry is the only evidence of a leaked record.docs/design/core-api.md"UID cutover and legacy state" and theRecordSetUIDstatus comment/CRD description updated.Verification
go test ./internal/go/providers/... ./internal/go/core/...,go vet ./..., fullgo test(CItask testequivalent),gofmt -l,git diff --check: clean.controller-gen v0.17.2) and synceddeploy/charts/dns-api/crds(description-only delta).Related: appthrust/platform CRD delivery owner change (Argo must render
crds/so therecordSetUIDschema ships with the image).