docs(events): Phase 5 as built — conditions, phase advancement and the panel #213

Merged
whitlocktech merged 1 commits from docs/events-phase-5 into edge 2026-09-03 03:26:13 +00:00
Member

The docs half of Event System Phase 5. Code: RunicGateway/website#187.

EVENTS.md

§C — the condition language. The paragraph promising engagement/conditions.js gains the note that it was reused unchanged, and what Phase 5 actually added: not a grammar, but a place the words are read. The same labels that fill the rule editor's dropdowns render the diagnosis panel, so gte says "is at least" in both places because there is only one place it is written down.

§D — the eleventh table. event_run_phase_gates, and why it is a table rather than a query: it holds the one fact in this feature that is not derivable from a row somebody already wrote. { on: …, count: 3 } counts things that happen between two ticks, and the runner is not running when they happen.

The count said "nine" over a list of ten from the revision that added event_series until this phase counted them. It says eleven now, and says so.

§E — a new subsection, Advance conditions, and the two writers a gate has. The two closed shapes with their field grammars and the normalisation argument ('120m' is stored as '2h', for the reason days is normalised into week order). Then the three things §E could not say before:

  • The two writers, and why that division is the design. The emit path closes an on gate because a firing between two ticks is not observable from either of them, and a tally in a process's memory is one a restart silently zeroes. The tick closes an after gate and reads both.
  • The clock and the tally start at phase ENTRY, not when the steps finish — what makes a gate predictable from the authored spec alone.
  • A gate that never opens is held, and made loud. No timeout and no disposition, with the reason; EVENT_PHASE_STALL_MS, health: 'stalled', and why it must be loud (a held run keeps its concurrency key, so every later occurrence goes missed behind it). Plus health as a high-water mark, now enforced rather than observed, and a dormant gate on the rule a dormant action already follows.

Also, one line in the tick's description: a phase advances on every step terminal and, if it authored one, its gate — additional, never a replacement.

§I — the panel and the seventh control. The "six exist, two do not" note becomes "seven exist, one does not", with advance's three refusals written out as the design they are. Then the panel itself: why it sits above the step list, why the near miss is the valuable half, and why its sentence is rendered on the server — the one place this feature hands the client text rather than a vocabulary.

§L — one new row. A phase's advance condition never fires, with the consequence that makes it more than cosmetic.

§ API surface. advance leaves the not-built list with its guard described; catalog gains the trigger catalog and the adminOnly-vs-admin, editor reason it is served there rather than borrowed. The derived-field note gains a third member, gates.

§ Observability. The panel is marked built, and two rows join the recording table — the gate row itself, and the three new log kinds.

The phase table. P5 ticked.

EVENTS_PLAN.md

Phase 5 marked complete, in the shape Phases 0–4 use: the four org-lead decisions, the three things the build settled, the MariaDB left-to-right SET-evaluation defect that only a real database found (and it was this phase's own statement), the two things that had to change underneath, the verified numbers, the live walk, and the three defects that walk turned up. The Trap paragraph keeps its warning and gains a line saying how it was held.

Phase 6's note gains one clause: advance took its gate in Phase 5.

Checked by hand

docs has no CI, so: every anchor this touches resolves, and every route, column, env var and file path named here exists on website#187 — including the new ### Advance conditions… heading, which nothing links to yet. Diff is 132/29 across the two files with no CRLF artefact, verified against the real content diff rather than --numstat alone.


  • AI-assisted: authored with Claude Code (Claude Opus).
The docs half of Event System **Phase 5**. Code: **RunicGateway/website#187**. ## `EVENTS.md` **§C — the condition language.** The paragraph promising `engagement/conditions.js` gains the note that it was reused **unchanged**, and what Phase 5 actually added: not a grammar, but a *place the words are read*. The same labels that fill the rule editor's dropdowns render the diagnosis panel, so `gte` says *"is at least"* in both places because there is only one place it is written down. **§D — the eleventh table.** `event_run_phase_gates`, and why it is a table rather than a query: it holds **the one fact in this feature that is not derivable from a row somebody already wrote**. `{ on: …, count: 3 }` counts things that happen *between* two ticks, and the runner is not running when they happen. > The count said **"nine" over a list of ten** from the revision that added `event_series` until this phase counted them. It says eleven now, and says so. **§E — a new subsection, *Advance conditions, and the two writers a gate has*.** The two closed shapes with their field grammars and the normalisation argument (`'120m'` is stored as `'2h'`, for the reason `days` is normalised into week order). Then the three things §E could not say before: - **The two writers, and why that division is the design.** The emit path closes an `on` gate because a firing between two ticks is not observable from either of them, and a tally in a process's memory is one a restart silently zeroes. The tick closes an `after` gate and reads both. - **The clock and the tally start at phase ENTRY**, not when the steps finish — what makes a gate predictable from the authored spec alone. - **A gate that never opens is held, and made loud.** No timeout and no disposition, with the reason; `EVENT_PHASE_STALL_MS`, `health: 'stalled'`, and why it must be loud (a held run keeps its concurrency key, so every later occurrence goes `missed` behind it). Plus **health as a high-water mark**, now enforced rather than observed, and **a dormant gate** on the rule a dormant action already follows. Also, one line in the tick's description: a phase advances on every step terminal **and**, if it authored one, its gate — additional, never a replacement. **§I — the panel and the seventh control.** The "six exist, two do not" note becomes "seven exist, one does not", with `advance`'s **three refusals written out** as the design they are. Then the panel itself: why it sits above the step list, why the near miss is the valuable half, and **why its sentence is rendered on the server** — the one place this feature hands the client text rather than a vocabulary. **§L — one new row.** *A phase's advance condition never fires*, with the consequence that makes it more than cosmetic. **§ API surface.** `advance` leaves the not-built list with its guard described; `catalog` gains the trigger catalog and the `adminOnly`-vs-`admin, editor` reason it is served there rather than borrowed. The derived-field note gains a third member, `gates`. **§ Observability.** The panel is marked built, and two rows join the recording table — the gate row itself, and the three new log kinds. **The phase table.** P5 ticked. ## `EVENTS_PLAN.md` Phase 5 marked **complete**, in the shape Phases 0–4 use: the four org-lead decisions, the three things the build settled, **the MariaDB left-to-right SET-evaluation defect that only a real database found** (and it was this phase's own statement), the two things that had to change underneath, the verified numbers, the live walk, and the three defects that walk turned up. The **Trap** paragraph keeps its warning and gains a line saying how it was held. Phase 6's note gains one clause: `advance` took its gate in Phase 5. ## Checked by hand `docs` has no CI, so: every anchor this touches resolves, and every route, column, env var and file path named here exists on website#187 — including the new `### Advance conditions…` heading, which nothing links to yet. Diff is 132/29 across the two files with **no CRLF artefact**, verified against the real content diff rather than `--numstat` alone. --- - [x] AI-assisted: authored with Claude Code (Claude Opus).
wtclaude added 1 commit 2026-09-03 03:13:02 +00:00
EVENTS.md gains the eleventh table, a new SS-E subsection on advance conditions
and the two writers a gate has, the diagnosis panel in SS-I, the "a condition
never fires" row in SS-L, and the observability rows for the gate table and its
three new log kinds. The `advance` route leaves the not-built list; the catalog
route now serves triggers.

The SS-D count said "nine" over a list of ten from the revision that added
`event_series`; with the gate table it is eleven, and it now says so.

EVENTS_PLAN.md marks Phase 5 complete in the shape Phases 0-4 use: the four
org-lead decisions, the three things the build settled, the MariaDB
left-to-right SET evaluation defect that only a real database found, the live
walk, and the three defects that walk turned up.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T6t8mrAWhZU5vnyYgZTMtL
whitlocktech merged commit 4d72514a69 into edge 2026-09-03 03:26:13 +00:00
whitlocktech deleted branch docs/events-phase-5 2026-09-03 03:26:14 +00:00
Sign in to join this conversation.
No description provided.