Repository navigation
refactor(actual-budget): make user namespaces permanent and retire the pilot component - #5857
Conversation
…e pilot component The Actual Budget user-namespace pilot passed its runtime verdict on #3604. Replace its temporary component with two ordinary production patches, the namespace label and the hostUsers post-renderer, that render the same objects byte for byte. Adapt the render regression to the permanent setting while keeping its rollback and storage checks, and document the setting next to the patches. Fixes #3605 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review 🤖 Generated with Claude Code |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Codex Review: Didn't find any major issues. Hooray! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
|
Tried as a user, at
🤖 Generated with Claude Code |
|
Status: held as a draft. The Codex review at the current head is clean. This change can't merge yet for two reasons outside it:
Next steps: once #5853 merges, update this branch from 🤖 Generated with Claude Code |
❌MegaLinter analysis: Error❌ REPOSITORY / betterleaks - 11 errors❌ REPOSITORY / checkov - 27 errors❌ HTML / djlint - 8 errors❌ REPOSITORY / grype - 38 errors❌ DOCKERFILE / hadolint - 1 error❌ HTML / htmlhint - 21 errors❌ REPOSITORY / osv-scanner - 1 error❌ GO / revive - 1 error❌ REPOSITORY / secretlint - 1 error❌ BASH / shellcheck - 1 error❌ REPOSITORY / trivy - 1 error❌ YAML / v8r - 1 error❌ YAML / yamllint - 293 errors❌ ACTION / zizmor - 40 errors
|
Blocker: none Cleared 2026-11-04: platform#5853 merged 2026-11-04T08:01Z; the organization Go workflow passes on main again and pull requests can pass their required checks (platform#5852 status 2026-11-04) Previous record (historical): |
…permanent-user-namespaces-3605 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review 🤖 Generated with Claude Code |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
devantler
left a comment
There was a problem hiding this comment.
🤖 Generated by the Agentic Engineer (interactive Claude Code session)
Self-review (fallback — CodeRabbit, Codex and Cursor Bugbot unavailable)
Reviewed commit: 16999ba
- CodeRabbit: rate-limited for this organisation since 2026-11-03 09:04Z (batch lane check); not requested.
- Codex: answered the 2026-11-04 request for this head with its code-review usage-limit message instead of a review.
- Cursor Bugbot: reached its usage limit at 2026-11-04 00:28Z; no review since.
Scope: the whole diff against main at this head, including the main merge. The retired component's two JSON patches are now two ordinary production patches with the same targets and values (namespace label; appended hostUsers: false post-renderer on the Actual Budget HelmRelease only). kubectl kustomize k8s/providers/hetzner/apps is byte-identical to main, so production applies nothing new and the pod does not restart. No file still references the removed component path. The regression now pins each patch entry exactly once and the pod patch's exact target, and its rollback/re-enable round trip still passes. Not blocking: scripts/read-actual-budget-userns-maps.sh's header still calls the setting a pilot; that is wording only.
Verdict: no P0/P1 findings
🤖 Generated with Claude Code
|
Tried as a user, at
🤖 Generated with Claude Code |

Why
Actual Budget has run in its own user namespace (
hostUsers: false) since 17 September, as a pilot. Its runtime verdict passed on #3604: the kernel id maps of both containers were read from the live pod and are not the host's. The pilot was always meant to end with the setting made permanent and its temporary component retired, in a separate reviewed change. This is that change.What
hostUsers: false. They render exactly the same objects as before. The apps layer build is byte-identical tomain, so production sees no change and the pod does not restart.The database volume, container identities, mounts, authentication settings and the single-writer
Recreatestrategy are unchanged.Validation
kubectl kustomize k8s/providers/hetzner/appsis byte-identical before and after (cmp).bash scripts/tests/test-actual-budget-user-namespaces.shpasses. Four negative controls fail as intended: a missing label patch, a widened patch target, a patch that no longer setshostUsers: false, and a duplicated label patch.ksail workload validateandksail --config ksail.prod.yaml workload validatepass with no failures (138 kustomizations, 770 files).shellcheckand the organization naming validator pass.Fixes #3605
🤖 Generated with Claude Code