Skip to content

Re-home the Wedding backup denial proof and remove cutover tooling that needs the retired shared store #4482

Closed

Description

@devantler

🤖 Generated by the Agentic Engineer

Evidence

#3253 retires the Wedding tenant's access to the shared backup credential: the wedding-db ObjectStore and the wedding-db-backup-r2 Secret leave the wedding-app namespace. Three operator tools were written for the cutover and assume both still exist there:

All three now refuse before doing any work. That is safe, but CI still runs their fixture suites on every pull request, and the runbook names a proof nobody can run.

Expected outcome

A dedicated-token rotation can again be followed by an observed denial, without the tenant namespace ever holding the shared credential, and the repository no longer carries one-shot tooling that cannot run.

Acceptance criteria

  • The denial proof runs again with the shared credential kept out of the wedding-app namespace (for example from a platform-owned namespace that already holds it, using a run-owned copy of the lower-privilege dedicated credential), keeping its positive controls and its no-trace check.
  • A protected main run of the re-homed proof reports the denial.
  • The catalogue mirror and the incident recovery tooling are removed, with their CI steps, or a recorded reason keeps them.
  • The tenant's own database manifest names the dedicated store, so the production patch only pins the archive identity and a stale reference to the retired store is gone.
  • docs/dr/runbook.md, docs/dr/velero-cnpg.md and docs/dr/restore-drill.md describe only tooling that can run.

Delivered: #4495 removed the completed one-shot tooling and re-homed the denial verifier; #4503 merged through the protected queue and completed the tenant ownership handoff. Its production deployment succeeded. Read-only post-deployment verification finds the tenant source verified and reconciliation healthy, the redundant store override absent, and the same database identity/configuration with all three instances ready and archive/backup conditions true. Tenant-selected backup storage and Platform-owned persistence protections are preserved.

Activity

  1. added theissue type on Oct 4, 2026
  2. self-assigned this
    on Oct 5, 2026
  3. added a commit that references this issue on Oct 5, 2026
  4. devantler commented on Oct 5, 2026

    @devantler
    ContributorAuthor

    🤖 Generated by the Agentic Engineer

    #4495 is validated and reviewed at a1e663faf16e179110afe92c20ee2f5c0ed8be0b and has entered the protected merge queue. Exact-head CI succeeded, including the actual pinned-client denial regression. The formal current-head review is clean under the verified provider-limit fallback.

    The tenant declaration fix in devantler-tech/wedding-app#374 has merged and published v1.15.15 from 447b6dae3d89c64a627a78e06ff9c104f1e8e23a. Its signed source is applied and live readback is healthy with 3/3 database instances, continuous archiving and a successful last backup. The published source manifest names the dedicated store; the tenant issue is closed with its deployment receipt.

    This parent stays open. Remaining delivery is the protected main denial receipt and removal of Platform's redundant store override while preserving the archive identity, followed by readback. Queue entry and CI are not substitutes for those receipts.

  5. added 4 commits that reference this issue on Oct 5, 2026
  6. devantler commented on Oct 6, 2026

    @devantler
    ContributorAuthor

    🤖 Generated with Claude Code

    The denial proof is dispatched, so this issue is no longer blocked.

    Dispatched from main on 2026-10-06 at 16:32Z: run 37496522511. It is waiting in the prod-deploy concurrency group behind the merge queue's deploys. The Slack ask of 2026-10-05 is withdrawn: the maintainer's direction, given in an interactive session on 2026-10-06, is that dispatching a reviewed, main-only proof is the engineer's own step.

    Next: record the denial receipt here, then remove Platform's redundant store override while preserving the archive identity, and read the result back.

  7. devantler commented on Oct 6, 2026

    @devantler
    ContributorAuthor

    🤖 Generated with Claude Code

    Denial receipt: DENIAL OBSERVED

    Run 37496522511, dispatched from main at 06a15022, reported:

    DENIAL OBSERVED: the dedicated Wedding backup credential reaches its own catalogue, and the shared destination refused its list, read and write with AccessDenied.

    This is the first run of the re-homed proof since #4495 merged, so the runbook's post-rotation proof is runnable again.

    Remaining on this issue: remove Platform's redundant store override while preserving the archive identity, then read the result back.

  8. devantler commented on Oct 7, 2026

    @devantler
    ContributorAuthor

    🤖 Generated by the Agentic Engineer

    Closing: every acceptance criterion is met

    Verified 2026-10-07 ~12:16Z.

    • Proof re-homed, shared credential kept out of the tenant namespace — delivered by fix(backups): restore denial verification after shared-access retirement #4495; the re-homed workflow is on main.
    • A protected main run reports the denial — run 37496522511 (workflow_dispatch on main at 06a15022, conclusion success) reported DENIAL OBSERVED.
    • The remaining item named in the receipt above (remove Platform's redundant store override, keep the archive identity, read the result back) was already delivered by fix(wedding): let the tenant select its backup store #4503, merged 2026-10-05:
      • on main, the production patch for the database now only disables pruning, sets synchronous replication and pins the archive identity; it no longer names a backup store;
      • read back from production (read-only, one named object): the database uses the tenant-selected dedicated store with the pinned archive identity, reports 3 ready instances and ContinuousArchivingSuccess.

    Removing the old copy from the shared bucket is tracked separately in #4481 and is not part of this issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

Fields

Priority

None yet

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions