Define adjacent-release HA update qualification - #892
Conversation
🔐 Codex Security Review
Review SummaryOverall Risk: HIGH Findings[HIGH] Qualification depends on a missing baseline procedure
NotesThe reviewed diff changes HA update documentation only; it does not modify runtime code, credentials, pool configuration, or generated protocol code. Generated by Codex Security Review | |
0004870 to
d8d4b8e
Compare
5d225ac to
f9f03e7
Compare
c0e905e to
67ad6fa
Compare
f9f03e7 to
11776cf
Compare
67ad6fa to
fa15389
Compare
159afd9 to
7a681e5
Compare
0cf4fb7 to
3ea1c82
Compare
389e59b to
cab54f6
Compare
52b0191 to
f60cfb3
Compare
cab54f6 to
e90e38d
Compare
f60cfb3 to
8a99b7e
Compare
16742c0 to
7d4a40c
Compare
8a99b7e to
1367cee
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 86da4fd2fa
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| completed baseline reports from [QUALIFICATION.md](QUALIFICATION.md) for the | ||
| exact `N` and `N+1` artifacts, then install `N` for this procedure and load |
There was a problem hiding this comment.
Add or correct the baseline qualification link
This procedure depends on [QUALIFICATION.md](QUALIFICATION.md) for both the required baseline report and the recorder/gap rules, but that file is not present under deployment-files/ha or elsewhere in the repo (I searched for QUALIFICATION.md and the referenced recorder text). As written, operators cannot follow or audit the new HA update qualification because a required prerequisite procedure resolves to a missing document; either add the baseline qualification doc in this commit or point these references at the actual source of those rules.
Useful? React with 👍 / 👎.
Reviewable diff: +222/-0 across 2 files (excludes generated, test, and story files).
Summary
Defines the evidence required to support an adjacent-version HA application update from stable
Nto prereleaseN+1. The same target tag and assets become stable only after migration compatibility, passive-first update, mixed-version forced takeover, bounded completion and timeout recovery, bidirectional failover, command recovery, infrastructure preservation, deployment-swap, forward-activation, updater interruption, and reboot gates pass on both amd64 and arm64.Stack: #887 -> #888 -> #890 -> #891 -> #892. This documentation-only diff is relative to completion PR #891.
How it works
Operators publish the final
N+1tag and assets at the fixed official origin as a GitHub prerelease. HA does not offer UI-triggered updates, so qualification configures the root-owned updater environment to authorize only that exact target and then uses the explicit local operator command. The authorization is restored after every clean reinstall, verified before each update attempt, and removed after the run. The report requires clean-install qualification for the exact source and target artifacts and verifies that the target's reviewed qualification file and manifest metadata name the exact source. It first runs compatibility tests, then loads a sanitized production-scaleNdataset into the HA cluster so the real passive updater runs migrations under sustained traffic. Gap-free active-health and VIP ownership recording starts before the passive update. Authenticated reads and uniquely identified commands continue through passive-first update and completion, with bounded success gaps; every background command must reach SUCCESS, except the deliberately interrupted PROCESSING rows. The live handoff carries oneNPROCESSING row and PENDING successor intoN+1, proving the interrupted row fails without replay and the successor dispatches. A separate exact-artifact run pauses after the old application stops, makes the updated peer unavailable, proves the updater enters its takeover wait, and requires automaticNrecovery within 60 seconds. Rename-window and self-update faults require direct process and filesystem evidence before injection rather than inferring the window from an ambiguous durable marker. A client loaded fromNmust still work against theN+1VIP. Another cleanNbaseline forces the updatedN+1passive to take over before completion, then updates the oldNhost through the ordinary passive command. Public and database-backed probes measure normal interruption below 15 seconds; container identity, PostgreSQL start times, updater checks, and one-at-a-time reboots finish the evidence. Forward-activation interruption must resume target startup and migrations; self-update interruption passes only when the updater converges to the same version as the retained application deployment. Only after every gate passes does a final drift guard re-resolve both commits, re-download the complete source and target asset sets, compare their recorded digests, and promote the unchanged prerelease to stable.flowchart LR A["Verify N and N+1 artifacts"] --> P["Update passive"] P --> M["Exercise mixed versions"] M --> X["Force mixed-version takeover"] X --> C["Complete active within 15s"] C --> F["Fail over both directions"] F --> R["Reboot and verify"] R --> V{"Every gate passes?"}Areas of the code involved
deployment-files/ha/UPDATE_QUALIFICATION.mddeployment-files/ha/README.mdKey technical decisions & trade-offs
Testing & validation