docs(ci): close out the hardening -- land the scripts, correct a claim that shipped wrong
The branch-protection + PR-gate + sidecar sequence is complete and verified. This records the finished state and fixes what the sequence itself proved wrong. CORRECTS A FALSE CLAIM I SHIPPED. PR #7 said the sidecar conversion would remove the one-per-start dockerd line "http: TLS handshake error from 127.0.0.1: EOF". It does NOT. Exactly one still appears, immediately after "API listen on [::]:2376" -- it is now the startupProbe's FIRST attempt, landing microseconds after dockerd begins listening and cut off by timeoutSeconds: 1; the next poll succeeds. Cosmetic, and deliberately not chased: raising the timeout to hide one benign startup line would slow every subsequent poll. The manifest comment now states this instead of the wrong prediction. Lands infra/gitea/require-gate.sh and verify-then-enforce.sh, which drove the rollout from a session temp dir. verify-then-enforce.sh merges nothing -- merging is a human's reviewed act -- but forces the reconcile and ABORTS unless the pod is healthy, a runner is online, and a real workflow goes green on it, before enabling enforcement and probing the push. Re-run it after any future act-runner change. Trims the now-obsolete feat/ rationale from claim-ship.sh: per-branch push triggers were deleted, so no prefix produces a duplicate run any more. CLAUDE.md's enforcement table flips from "weaker than this rule" to machine-enforced, with all four rows marked verified and the push rejection noted as PROVOKED rather than assumed. It also now states what a green PR does NOT prove: CLUSTER_AVAILABLE is unset, so L2/L3 never runs in CI and only the L0/L1 offline subset is covered. infra/gitea/README.md marks the sequence done and names the root cause that remains unfixed: Gitea repo settings live in its own database, invisible to Flux and unreadable by the conformance gate, so NOTHING detects drift from what this directory declares. These scripts assert desired state; they are not a detector. The check that reads the live API and fails on divergence is the highest-value work left, and it is the difference between this being fixed and this being unable to recur. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
1 parent
00efd4b828
commit
b2d9883958
7 files changed
+252
-16
No files matched your search
@@ -4870,3 +4870,57 @@ That theory was mine and it was wrong: the pipeline was never too slow, it simpl
|
||||
FOLLOW-UP note in `apps/wave-1/gitea-actions.yaml`. It deletes both hand-rolled wait loops and
|
||||
the envsubst hazard. Land it ALONE — it is the merge gate for the whole repo.
|
||||
6. Create the Plex libraries over `/media/movies`, `/media/tv`, `/media/photos`.
|
||||
|
||||
## 2026-09-29 (later) — the merge gate is now real, enforced, and proven. **PM HANDOFF.**
|
||||
|
||||
Closes the gap opened by the earlier entry today. Eight PRs, all gated; every claim below was
|
||||
measured against the live API or cluster, not inferred from this repository.
|
||||
|
||||
### Final state
|
||||
|
||||
| | Verified |
|
||||
|---|---|
|
||||
| `main` protected | `protected:true`, `user_can_push:false` — and a direct push as site-admin `gitea-admin` was **provoked and rejected** (`pre-receive hook declined`) |
|
||||
| Gate required | `enable_status_check:true`, contexts `["gate / gate (pull_request)"]` |
|
||||
| Approvals | `required_approvals:1`; `jakman85` holds `owner` |
|
||||
| Runner | `incluster-dind` online, now a **native sidecar** (`initContainers`, `restartPolicy: Always`, TLS-verified `docker info` startupProbe) |
|
||||
| Gate time | ~1m35s |
|
||||
| Plex | claimed 2026-09-29; `PlexOnlineToken` present on the `plex-config` PVC |
|
||||
|
||||
### What was corrected in the documentation
|
||||
|
||||
`CLAUDE.md` §2b — *never infer platform state from this repository* — is the durable outcome.
|
||||
The 2026-08-31 entry asserting an enforced gate is now annotated **in place**. The "Phase 0 /
|
||||
no cluster exists" framing across `ci/`, `clusters/` and `conformance/` READMEs is banner-marked
|
||||
as describing a live gap rather than a stage. All 37 runbooks now describe the PR flow. Two
|
||||
`.sops.yaml` headers and `catalog/plex.yaml` were corrected (comment edits verified not to break
|
||||
the SOPS MAC, and not to move the rendered golden).
|
||||
|
||||
### A claim of mine that shipped wrong, and is now corrected in place
|
||||
|
||||
PR #7 stated the sidecar conversion would remove the one-per-start dockerd line
|
||||
`http: TLS handshake error from 127.0.0.1: EOF`. **It does not.** Exactly one still appears,
|
||||
immediately after `API listen on [::]:2376` — it is now the startupProbe's first attempt,
|
||||
landing microseconds after dockerd begins listening and cut off by `timeoutSeconds: 1`; the
|
||||
next poll succeeds. Cosmetic, and deliberately not chased: raising the timeout to hide one
|
||||
benign startup line would slow every subsequent poll. The manifest comment now says so.
|
||||
|
||||
### The root cause nobody has fixed yet
|
||||
|
||||
Gitea's repo settings live in its own database — invisible to Flux and unreadable by the
|
||||
conformance gate. **No check exists that could have caught "protection off, runner gone."**
|
||||
`infra/gitea/` declares and can re-assert the desired state, but it is not a detector. A
|
||||
conformance check that reads the live Gitea API and fails on divergence is the highest-value
|
||||
remaining work in this repo, and it is the difference between this having been fixed and this
|
||||
being unable to recur.
|
||||
|
||||
### Next steps
|
||||
|
||||
1. **Write that Gitea-settings conformance check.** Everything else here is a symptom.
|
||||
2. Wire `vars.CLUSTER_AVAILABLE` + `secrets.CONFORMANCE_TRIGGER_KUBECONFIG` so **L2/L3 runs in
|
||||
CI**. A green PR currently proves the L0/L1 offline subset only — runtime behaviour is
|
||||
unverified on every merge.
|
||||
3. Re-run `infra/gitea/verify-then-enforce.sh` after any future act-runner change.
|
||||
4. `required_approvals: 1` means a PR you open as `jakman85` needs `gitea-admin` to approve.
|
||||
If that friction bites, either open agent work as `gitea-admin` and review as `jakman85`, or
|
||||
drop back to relying on the status check alone.
|
||||
Reference in new issue
Block a user