Two guards, one number: bound the published check to the retention it must live with
gates / gates (push) Successful in 17s
gates / gates (push) Successful in 17s
Gates only. No release, no version bump, no binary published; the agent stays
v0.128.0 at 28ba8593b8 and nothing on a customer's machine changes.
THE COUPLING DEFECT. The registry stopped serving 0.120.0 and older while
check-published-versions.py demanded every tag still be downloadable. Both rules
are sensible and together they are impossible, so CI went red at a commit whose
own run had been GREEN the day before -- and would have gone red again at the
next publish when 0.121.0 was evicted. scripts/retention-policy.json is now THE
number and both readers take it from there.
WHAT CI NO LONGER COVERS, and it prints this on every run rather than leaving it
to be discovered: a released version older than the retention window is no longer
asserted downloadable. Its git tag and its config tree ARE still asserted -- only
the binary's presence is dropped. A missing policy file is INCONCLUSIVE (exit 2),
never silently unbounded.
THE NUMBER IS NOT A LOCATED RULING and the file says so in its own header. Ten is
what the registry demonstrably holds; no register row records a prune, R-210 says
"Nothing was deleted; this is a list, not an action" and concerns local Docker
images, and container packages hold 19 each. The principled bound is the hub's
vouched min_agent floor -- nothing can install below it -- and that is the
recorded follow-up.
check-release-complete.py is the tag half as a machine. release-agent.sh already
warned that "a released version without a git tag 404s a box mid-install, as
root" and the step was still missed, so this is a gate and not a reminder. Legs
1-2 need no network and run in --fast, so the pre-push hook is the earliest
catch. Red-proved by repointing the CHANGELOG head at an unreleased v0.129.0:
both legs convicted and each named its fix command.
Three controls run: green at 10 naming what it dropped; widened to 11 the evicted
version re-enters and convicts; policy removed gives INCONCLUSIVE naming the path.
This commit is contained in:
@@ -1,3 +1,27 @@
|
||||
### Gates only — 2026-08-09 (no release, no version bump, no binary published)
|
||||
|
||||
**Two guards, both owed since the 2026-08-09 install outage (R-273/R-287). Nothing that runs on a
|
||||
customer's box changed; `scripts/` only, and the agent stays v0.128.0.**
|
||||
|
||||
- **`scripts/retention-policy.json` — THE retention number, in one file.** The registry stopped
|
||||
serving `felhom-agent` 0.120.0 and older while `check-published-versions.py` demanded that every
|
||||
tag still be downloadable. Both rules are sensible; together they are impossible, and CI went red
|
||||
at a commit whose own run had been green the day before. The check now **reads the number from
|
||||
this file** and bounds its assertion to the newest N generic versions.
|
||||
**What CI no longer covers, said plainly rather than left to be discovered:** a released version
|
||||
older than the retention window is **no longer asserted downloadable**. Its git tag and its configs
|
||||
are still asserted — only the binary's presence is dropped. The check **prints exactly which
|
||||
versions it stopped covering** on every run, so the narrowing cannot become permanent by accident.
|
||||
**The number is an OBSERVED state, not a located ruling** — see the file's own header and R-287.
|
||||
A missing or unreadable policy file is **INCONCLUSIVE (exit 2), never silently unbounded.**
|
||||
- **`scripts/check-release-complete.py` — the tag half, as a machine.** Asserts that the version at
|
||||
the head of `CHANGELOG.md` is tagged, that the tag points into this history, and that its package
|
||||
is published. `release-agent.sh` already warned about this in as many words and the step was still
|
||||
missed on 2026-08-08, which is why this is a gate and not a reminder. Legs 1–2 need no network and
|
||||
therefore run in `--fast`, so the pre-push hook catches a missing tag at the earliest moment.
|
||||
Registered in `agent_gates.py`; red-proved by pointing the CHANGELOG head at an unreleased
|
||||
v0.129.0 — both legs convicted and each named its fix command.
|
||||
|
||||
## v0.128.0 — the escrow seed is asserted every tick, not remembered once (2026-08-08, R-221)
|
||||
|
||||
**A rebuilt box could not run the escrow ceremony at all, and there was no way forward from inside
|
||||
|
||||
Reference in New Issue
Block a user