2026-08-11 - 2026-11-11
Overview
95 Pull requests merged by 1 user
Merged
#237 ci: clean up after image builds and demo wipes
Merged
#236 fix(events): core.lease keeps a module's retry: false on read/apply refusals
Merged
#234 fix(safety): team notifications skip members who block the author
Merged
#233 feat(safety): report, block and hide, MODULE_API 1.21.0
Merged
#232 feat(account): self-service account deletion, MODULE_API 1.20.0
Merged
#231 fix(demo): switch on the actions the seeded events use (DM28)
Merged
#230 feat(demo): seed the default set's events, NPCs and chat titles
Merged
#229 feat(demo): refuse a data: URI in any write body (DM25)
Merged
#228 fix(demo): chown modules/ and logs/ from a root container in the wipe
Merged
#226 fix(docker): move the app and bot images to Node 22.23.4 (Node2Shell)
Merged
#227 feat(demo): deploy/demo and the wipe + baseline workflows (step 5)
Merged
#225 fix(demo): refuse publishing the homepage hero (DM21)
Merged
#224 feat(demo): refuse an event step at save with demoRefuses (MODULE_API 1.19.0)
Merged
#223 feat(demo): DEMO_MODE lock, seed:demo and the demo banner (MODULE_API 1.18.0)
Merged
#221 fix(teams): say "game server", not "shard", on the never-synced Teams panel
Merged
#220 chore(release): cut edge over to main — Steam sign-in (MODULE_API 1.17.0) and the last fixes' core half
Merged
#219 fix(core): the last fixes' core half (W1 W2 W5 W19)
Merged
#218 feat(auth): sign in with Steam (MODULE_API 1.17.0)
Merged
#217 feat(events): a dry run carries a module's advice (MODULE_API 1.16.0)
Merged
#216 feat(events): a trigger can start a run (Rust §14.3 stage 9, D370)
Merged
#215 feat(events): a failed step may say when to retry (MODULE_API 1.15.0)
Merged
#213 feat(events): a param that holds several values (MODULE_API 1.14.0)
Merged
#212 feat(events): the step editor reworked, and event templates (MODULE_API 1.13.0)
Merged
#211 fix(events): the public phase label finds the phase by key (runicnpc D314)
Merged
#210 feat(events): an event action's progress() on a live run's public page (MODULE_API 1.12.0)
Merged
#209 feat(events): an expired ledger status and ctx.events.expired (MODULE_API 1.11.0)
Merged
#204 fix(modules): a site runs one module; the installer refuses a second
Merged
#208 feat(events): publish runId on a public calendar run entry (Rust D125)
Merged
#203 fix(admin): stop a long action name printing over the activity row beside it
Merged
#202 chore(tools): delete the cliloc converter the Asset Bridge replaced (Asset Bridge cutover, 2 of 5)
Merged
#201 chore(tools): delete the cliloc converter the Asset Bridge replaced (Phase 2)
Merged
#199 feat(events): the Event System — core (Phase 16b cutover, 2 of 6)
Merged
#200 fix(events): midnight in an announcement is 12:00 am on the Node we ship
Merged
#198 fix(events): the public calendar, a stranded revert, and three dropped facts (Phase 16a)
Merged
#197 fix(events): carry a module's own account of a successful step
Merged
#196 feat(events): the public calendar, event pages and participation history (Phase 14a)
Merged
#195 feat(events): the authoring UI proper (Phase 13)
Merged
#194 feat(events): targeted leases, value sets and searchable sources (Phase 12b)
Merged
#193 fix(events): give a lease's ledger row a reconcile path (Phase 11b)
Merged
#192 feat(events): the integrations — lifecycle triggers, participants, results (Phase 10)
Merged
#191 fix(engagement): the trigger manifest was stale, and its check was crying wolf
Merged
#190 feat(events): the resource ledger, leases and cleanup (Phase 8)
Merged
#189 feat(events): open the event contract to modules (Phase 7)
Merged
#188 feat(events): enablement, per-run caps and mayInvoke (Phase 6)
Merged
#187 feat(events): conditions, phase advancement and the diagnosis panel (Phase 5)
Merged
#186 feat(events): schedule, recurrence and the calendar (Phase 4)
Merged
#185 feat(events): the minimal admin surface (Phase 3)
Merged
#184 feat(events): the runner (Phase 2)
Merged
#183 feat(events): schema, CRUD and the core action registry (Phase 1)
Merged
#182 feat(engagement): retention — three sweeps and one recorded refusal (Phase 14)
Merged
#181 fix(engagement): claim the seed guard atomically, and let a rule name a digest body
Merged
#180 feat(engagement): the engagement system — cutover 3 of 7 (edge → main)
Merged
#179 fix(engagement): two defects the Phase 11b live walk found in core
Merged
#178 feat(engagement): let a module ship its own templates and rules (Phase 11b)
Merged
#177 feat(engagement): the admin ceiling and core's news.post emitter (Phase 11a)
Merged
#176 feat(engagement): deliverability — suppression, bounces and the verification gate (Phase 9)
Merged
#175 feat(engagement): the in-app channel, core and web (engagement Phase 7)
Merged
#174 feat(engagement): the email channel on the engine, and the Teams migration (engagement Phase 6)
Merged
#173 feat(engagement): the template editor, the trigger catalog and the send log (engagement Phase 5b)
Merged
#172 feat(engagement): templates — the email block family, renderer and seeded set (engagement Phase 5a)
Merged
#171 feat(engagement): Admin → Engagement → Rules and Audiences (engagement Phase 4b)
Merged
#170 feat(engagement): the rules engine, cooldowns and outbox (engagement Phase 4a)
Merged
#169 feat(notifications): per-channel preferences and the delivery-channel registry (engagement Phase 3)
Merged
#168 feat(modules): event triggers, audiences and the ceiling lattice (engagement Phase 2)
Merged
#167 feat(auth): unique, changeable, verifiable email addresses (engagement Phase 1b)
Merged
#166 refactor(api): collapse /admin/account and /player/account onto /auth/me/account
Merged
#165 feat(email): engagement Phase 1 — remove Gmail OAuth2, SMTP behind a transport registry
Merged
#164 fix(swagger): hoist the one inline predicate that makes the generator run away
Merged
#163 fix(env): the documented Compose deploy could not boot
Merged
#162 fix(admin): style the Teams admin screen with the site's own classes
Merged
#161 feat(teams): Teams as a platform primitive — MODULE_API 1.6.0 (Teams cutover 4/6)
Merged
#160 fix(modules): core offers a contribution, never a slot name
Merged
#159 feat(teams): phase 9 — one voice channel per Team, granted by a role
Merged
#158 feat(teams): phase 8 — the notifications bridge, and the gate §7.2 could not check
Merged
#157 feat(teams): phase 7 — the slash-command seam, and the bot's first tests
Merged
#156 feat(teams): phase 6 — notifications, and the email sink the web never had
Merged
#155 feat(teams): phase 5 — Forum 5b, discussion + moderation + reports
Merged
#154 fix(teams): four defects the live rig found in the phase 4 forum
Merged
#153 feat(teams): phase 4 — the forum access model, announcements and the operator's controls
Merged
#152 feat(teams): the activity feed, the roster projection, and the inverted slot
Merged
#151 feat(teams): Team core — the reconciler, the four authority paths, and the impersonation controls
Merged
#150 feat(modules)!: the module system cutover — a game-agnostic core reaches main
Merged
#149 chore(modules): declare the UO module for the UOMysticmoon instance
Merged
#148 feat(modules): PublicLayout takes a shell, MODULE_API_VERSION 1.5.0
Merged
#147 chore(modules): bump MODULE_API_VERSION to 1.4.0 — the sidecar rule
Merged
#146 fix(modules): stop a module before purging its tables
Merged
#145 test(login): stop the backoff-guard test racing its own one-second lock
Merged
#144 feat(modules): the declarative Docker path (phase 4, slice 3)
Merged
#143 feat(admin): the Modules screen (phase 4, slice 2)
Merged
#142 feat(modules): install, uninstall, purge and restart (phase 4, slice 1)
Merged
#141 feat(modules): merge module OpenAPI fragments into /api/docs.json (phase 3, slice 5)
Merged
#140 refactor(modules)!: de-UO core's copy, and enforce it (phase 3, slice 4)
Merged
#139 refactor(client): delete the UO client half (phase 3, slice 3)
Merged
#138 feat(modules): client extension slots (phase 3, slice 2)
Merged
#137 refactor(modules)!: move the UO server half out to module-uo (phase 3, slice 1)
2 Issues closed from 1 user
Closed
#206 events: core.lease drops a module's retry: false from read/apply refusals
Closed
#214 Sign in with Steam (a built-in provider, as Google and Discord)
6 Issues created by 1 user
Opened
#205 events: cleanup restores an orphaned lease row, and can write an old baseline over a later run's value
Opened
#206 events: core.lease drops a module's retry: false from read/apply refusals
Opened
#207 events: core.lease makes two module round trips under the default 10 s budget
Opened
#214 Sign in with Steam (a built-in provider, as Google and Discord)
Opened
#222 Demo mode for a public demo.runicgateway.com deployment
Opened
#235 demo: keep the demo rig's uMod plugins current (auto-update between wipes)