docs(events): the cutover, the outage it survived, and the defect it exposed (Phase 16b cutover, 6 of 6) #231
Reference in New Issue
Block a user
No description provided.
Delete Branch "docs/events-p16b-cutover"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The Event System cutover, step 6 of 6 — the last step, and it goes last on purpose: it carries the 16b record, which could not be written until the re-verify had run.
EVENTS_PLAN.mdgains that record.102/1, content only — no CRLF rewrite (checked against--numstat).The cutover as executed
Six steps, and core lands before the module — which departs from the phase's own sentence and matches what the engagement cutover actually did, because
Module-uo'sci/core-ref.jsonhas to name a websitemainsha carrying MODULE_API 1.10.0 and that sha does not exist until core has landed. The protocol pair is one step, not two:bundle.yml's Gate 1 refuses a sidecar/overlay pair that disagrees on the protocol, so whichever lands first leaves a compose that cannot run.Four decisions, all as recommended: that order; the app merges with no
v*tag; the re-verify walks the whole delivery path; andedgestays standing in every repo. Releases: sidecar v2.2.0, overlay v1.2.0, bundle 2026.09.10 (protocol 7). No contract moves in this leg —MODULE_API_VERSIONandEVENTS.mdare untouched.Three things in the record worth more than the chronology
1. A job's log IS readable on this Gitea — through the web route, not the API.
/{owner}/{repo}/actions/runs/<n>/jobs/<j>/logswith a token, served astext/plain; step statuses come from the UI's own POST endpoint with a_csrfcookie. Every earlier phase diagnosed CI by reproducing jobs locally on the belief that logs were unreachable. Reading one turned four red jobs into four known causes in about ten minutes — and one of those causes was a log that did not exist, which is itself evidence: a job that dies inSet up jobnever uploads one.2. Three of the four reds were infrastructure. A ten-minute Cloudflare outage sat in the middle of the window and killed both release runs:
link's built every binary and died pushing the tag (error: 530),servuo-plugins' died insideSet up jobafter 11m52s. Neither pushed its tag before dying, so the orphaned-tag failure mode did not occur and a plainworkflow_dispatchrecovered both. The first to land left the pair mismatched and compose run 102 failed exactly as the PRs predicted; the second dispatched it again and 103 composed.link'srust-gatesreds werecurl: (6) Could not resolve host: sh.rustup.rsinside the runner.3. The seventh defect of this phase, and the worst-hidden.
server-testshad been red on every events PR since Phase 10 — eight PRs, every one# fail 1, always the same single test, merged over every time.announce.jsaskedIntl.DateTimeFormat('en-GB', { …, hour12: true }), and that is not the same request as a 12-hour clock: for a locale whose default cycle is h23, Node 20 resolves it toh11(hours 0–11) so midnight renders0:00 am, while Node 22+ resolves it toh12. Same ICU (78.2) on both sides — V8's ECMA-402 behaviour, not locale data, so no amount of matching the runner's locale would have found it. The image shipsnode:20-alpine; a dev machine is newer. So it rendered correctly for everyone who reviewed it and wrongly for every real recipient, whose midnight event mail read "0:00 am" beside a schedule editor reading "12:00 AM".The rule, now written down:
hour12is a request about a locale's preference,hourCycleis a request about the clock. Ask for the clock. Fixed inwebsite#200, the formrecurrence.jshad already adopted for the mirror-image case.The re-verify
The leg 16a could not do, since a locally built bundle cannot go through core's https-only, host-allowlisted installer:
The last row is 16a's calendar fix holding on
main— before it, a run that had already started or finished was absent and the page renderedentries: []. A freshBridge.cfgstill shipsEventsEnabled=falseandAdminWriteEnabled=false, confirmed from the released config rather than a working tree's.One thing checked and deliberately not reported as a defect: a cancelled run appears on the public calendar. It is meant to — the entry carries its own
statusand the page renders a past cancelled run as "Did not happen".The one leg still owed is the module's own install through core's installer, named as such in the record: it cannot run until
Module-uo#34cuts the release it would fetch.The record also notes that 16c is now unblocked —
checkFactsreadsmain, andmaincarries the engine, the module and the app, with the bundle triple the site quotes now fixed.Pairs with
link#40,servuo-plugins#26,website#199,website#200,Android-app#46,Module-uo#34andIntegration-kit#11.🤖 Generated with Claude Code
https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4