Record the last four milestone units in TODO.md
All checks were successful
check / check (push) Successful in 6s

Adds Completed Steps for the receiver aggregate rate limit, the documentation accuracy pass, the CI gate repair and the RETENTION_SWEEP_INTERVAL bound. Drops the commit hash that pinned the Status paragraph to a specific next head, and rewrites Next Step now that the gate repair it named has landed.
This commit was merged in pull request #148.
This commit is contained in:
2026-08-12 13:21:38 +02:00
parent 95161c7768
commit 339548d794

50
TODO.md
View File

@@ -24,22 +24,52 @@ event retention (#63), the database archiving target (#43), the admin
password change flow (#65), policy compliance (#6), pinned lint tooling password change flow (#65), policy compliance (#6), pinned lint tooling
(#55), and fail-loud configuration parsing (#80). (#55), and fail-loud configuration parsing (#80).
`next` (9bfd033) holds the completed 1.0.0 milestone: every issue in it `next` holds the completed 1.0.0 milestone: every issue in it is closed,
is closed, and it is verified green by cache-defeated container runs and it is verified green both by CI and by cache-defeated container
rather than by the CI badge, which can pass without executing anything runs. The two were only made to mean the same thing this cycle — before
(#119). Note: TODO.md was deliberately deleted from this repo in f9a9569 #119, a warm layer cache let the gate report success without executing
(2026-03-01, #6); its content was folded into the README TODO section, anything, and replayed the previous build's console log so the lie
which this draft reconstructs as of 2026-07-06. looked like a real run. Note: TODO.md was deliberately deleted from this
repo in f9a9569 (2026-03-01, #6); its content was folded into the README
TODO section, which this draft reconstructs as of 2026-07-06.
# Next Step # Next Step
Tag 1.0.0 from `main` once the milestone PR merges, then repair the CI Merge the milestone PR to `main` and tag 1.0.0 from it.
gate (#119) before the next cycle's work lands — a gate that can report
success without running is the one thing every other guarantee here Two decisions are open and belong to the owner, neither blocking the
rests on. tag: #115 (mask the `http` target's destination URL, implemented
speculatively and awaiting a yes or no) and #125 (whether IPv6
rate-limit keys should bucket by `/64`).
# Completed Steps # Completed Steps
- 2026-08-12 Bound the receiver rate limit per client IP across the
whole `/webhook/*` route. The existing limiter keyed on the request
path and `/webhook/{uuid}` matches any single segment, so a client
that invented a fresh path per request minted a fresh bucket per
request: the limit on the only unauthenticated endpoint bounded
nothing in aggregate, and every request still cost an entrypoint
lookup before it 404ed. An outer limiter keyed on the client address
alone now bounds that, chained in front of the unchanged
per-entrypoint limiter (#139)
- 2026-08-12 Correct release-blocking documentation inaccuracies: the
README promised manual redelivery in the present tense in three
places when nothing implements it (the same false claim also sat in
the doc comment that was its source text), the env table omitted
`RETENTION_SWEEP_INTERVAL`, and `TODO.md` itself omitted five landed
units (#141)
- 2026-08-12 Make the CI gate execute the checks it reports on. The
workflow now writes a build-context fingerprint before calling
`script/cibuild`, so a code commit invalidates the `COPY` layer of
the lint and builder stages while a docs-only commit still replays
from cache; a superseding run also rewrites the `failure` status
Gitea leaves on commits it cancelled and never tested. Verified by
pushing a deliberately broken test and watching CI go red (#119)
- 2026-08-12 Require a positive `RETENTION_SWEEP_INTERVAL`: a
non-positive value reached `time.NewTicker` in both the retention
reaper and the archive sweeper, panicking two goroutines with no
recover after startup had already reported success (#140)
- 2026-08-12 Bound the `X-Forwarded-For` scan's allocation to the hop - 2026-08-12 Bound the `X-Forwarded-For` scan's allocation to the hop
cap: the reverse walk cuts entries with `strings.LastIndexByte` cap: the reverse walk cuts entries with `strings.LastIndexByte`
instead of joining and splitting, so a 1 MB header allocates 16 bytes instead of joining and splitting, so a 1 MB header allocates 16 bytes