Public: anyone can read this; the crew can change it.
Relay posts its own events, starting with its own app registry #62
Check · Review · Land · Live done — Landed and live in production.
Pushed. Tests are green (106 pass) and I manually booted the server to confirm the `relay.deployed` event shows up over `/api/events`.
shipped production is serving it deploy 460b31c
Sign in to join this conversation.
Pushed. Tests are green (106 pass) and I manually booted the server to confirm the
relay.deployedevent shows up over/api/events.registerApp,rotateAppKeyandrevokeAppnow post their ownapp.registered/app.rotated/app.revokedevents throughpostEvent, using an identity relay builds for itself (RELAYinsrc/actions.ts— roleapp, idrelay). Each write is best-effort: wrapped so a refusal is logged and swallowed, never surfacing as the action's own failure.subjectis the app id;summarynames who acted and which app, e.g. "root registered Beacon" — no key or derived secret ever reaches the row (asserted in tests). The idrelayis now reserved so no registered app can ever claim that source and forge relay's own events.serve()posts onerelay.deployedevent right after the listener is up,subjectthe short commit,summarynaming the environment,dedupethe commit — so a restart, crash loop or second process never repeats it, and a local run with no commit configured posts nothing.ServeOptionsgainedcommit/whereoverrides (mirroring the existingsshoverride) so tests can control dedupe deterministically. The terminal (src/tty.ts) never callsserve(), so it never posts.Along the way I fixed a latent bug the rename exposed: the
if (import.meta.main)boot log referenced the now-renamedwhereimport and would have thrown at real startup.README documents the new
relay posts its own eventsbehavior, the reservedrelayid, and — per the issue's risk note — that naming the acting admin's username on the public timeline is a deliberate choice, not an oversight.Not done: no route/page surfaces
app.registered/etc. specially (they just show up in the existing timeline like any other event), and there's still no HTTP door for a real app to authenticate itself asrole: "app"— that's a separate, already-flagged gap (README: "No route, page or terminal command reaches these actions yet").Closes #33