docs(events): Phase 0 — the eleven decisions, and the two documents they reach into #208
Reference in New Issue
Block a user
No description provided.
Delete Branch "docs/events-decisions"
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?
What & why
Closes the second half of
EVENTS_PLAN.mdPhase 0. The design of record landed in #207; this is the part that was still open — the decisions. All ofEVENTS.md§N1–N11 were answered by the org lead on 2026-09-01, before any code, which lifts the ⚠ gate from P11 and P12 and unblocks P1.EVENTS.md§N is renamed "N — Decisions" and each entry keeps the recommendation it was decided against, so the reasoning survives alongside the answer.Nine went as recommended. Two did not, and each changes a phase.
N2 — publishing a version and starting a run are
adminonly. A moderator keeps live control of a run already in flight (cancel, abort) and nothing more.The asymmetry is the point: starting commits the deployment to everything a definition contains, unattended, up to every cap it declares — it wants the narrowest gate there is. Cancelling is incident response, and the incident is "the event is doing something wrong at 2am" — it wants the widest. Gating the stop button on the same role as the start button reads consistent and behaves badly in exactly the case the moderator role exists for. This is the one place the split departs from the
requireRole('admin','moderator')shape module-uo uses.Updated: §K's role table (the normative statement), the API surface table, and P3 + P6 in the plan.
N4 — this deployment is single-instance and not planned to change, so P2 does not build the
--scale app=2test.Every claim path in §E is built exactly as specified regardless, and the doc says so in as many words, because this decision must not be read as licence to drop a CAS: the unique index and the CAS equally protect a tick that overruns into the next one, and the lease and its reclaim recover a step whose process died mid-dispatch. Both happen with one container. What changes is the test, not the design — the multi-instance property becomes true-by-construction rather than proved, and §E now records that scaling this deployment (or adopting a rolling deploy) is the trigger to build the rig that was skipped here.
N1 was taken in full, and it reverses two lines of §8, not one
ADMIN_CONTROLS.md§8's cut list names "item/gold grants" explicitly and separately from world building. Reading the creation reopening as carrying grants along with it would be precisely the silent reversal the plan said not to make, so the new §8a amendment says both out loud — three permitted rows (event-owned creation; leased mutation; item and gold grants), and the four properties that make them a different proposition from what §8 refused: declared not typed, cap-bounded in a conditionalUPDATE, ledgered before confirmation, and idempotent on the wire.§8's bullet is left standing verbatim — it is the decision that was actually taken — with a pointer to the amendment above it, and §1's thesis paragraph gets the same pointer since it makes the same argument. Loot-table changes and arbitrary
[set/[get/[addstay permanently excluded, along with the rest of the Tier-H moderation verbs; this amendment is about what an event may create and borrow, not about restoring them.N3 gives an orphaned row an owner
ENGAGEMENT.md§7.1 Q6 read "no evaluator yet" since 2026-08-29. The Event System runner becomes thekind: 'scheduled'evaluator, built in that workstream's P2 — one scheduler rather than two that disagree. Nothing in the engagement contract changes: ascheduleddeclaration means today exactly what it meant then, andctx.events.emitstill refuses to fire one.One consequence derived rather than decided — worth a look
POST /admin/events/:id/verifymoves toadmin, editorrather than staying withstart. N2 settled that a moderator loses publish and start; it did not say where the dry run lands. A dry run dispatches nothing, and the author who wrote the definition is exactly who should be able to price it against the caps before asking an admin to publish it — but that is my inference from N2, not the answer to it. Say the word and it becomesadminonly.How it was tested
EVENTS.md,EVENTS_PLAN.md,ENGAGEMENT.mdandADMIN_CONTROLS.md, including the renamed §N anchor (#n--decisions, updated at both call sites) and the new#8a-amendment--2026-09-01. Thedocsrepo has no CI workflow at all, so the plan's "docs CI link check" line describes something that does not exist; this was run by hand instead.core.autocrlf=true. Two scripted passes introduced\r\r\nand a mixed-ending full-file rewrite; both were caught by comparinggit diff --numstatagainst the real content diff and repaired, so the diff is 274 insertions over 32 deletions rather than a 2,400-line rewrite ofEVENTS.md.edgeandmainare the same commit in all eight repos, and this PR still reportsmergeableagainstedgewith the same four files.Checklist
AI-assisted contributions (required)
Claude Code (Opus 5). I have reviewed and understand every change, and take responsibility for it. AI-authored commits are marked with aCo-Authored-Bytrailer.License