docs(engagement): MODULE_API 1.8.0, the UO trigger catalogue, the news publish path #195

Merged
whitlocktech merged 1 commits from docs/engagement-phase-11a into edge 2026-09-01 05:05:04 +00:00
Member

The documentation half of Phase 11a — website#177 and Module-uo#22. Three files, each carrying one obligation from §6.0b's Phase 11a row.

Independent of docs#194 (the six decisions), which touches only ENGAGEMENT.md. Either can merge first.

website/MODULE_API.md → 1.8.0

A seventh audience ceiling, admin, as a child of staff. One addition and no removal, so minor: every declaration valid under 1.7.0 is valid now, no stored value changes, and module-uo's range still resolves.

§2.4's ceiling bullet now names seven values rather than six, and says the thing a module author actually needs beyond the new name: admin is the only pair in the whole lattice with real containment — every admin is staff, which is exactly what every other pair of branches lacks — so it is the only place permits is true between two values below authenticated. permits('staff', 'admin') holds; the reverse does not, and neither direction holds against owner, members or subscribers.

Also corrects two §2.3 rows that had gone stale rather than wrong: ctx.inbox.push has not thrown since Phase 7, and both engagement members now name the consumer that actually calls them.

modules/uo/API.md gains §5 — the full trigger catalogue

§6.0b asked for this in as many words: "the full trigger catalogue, its audiences and its ceilings, not one entry". It is a §5 rather than a route table because it is not an HTTP surface — and it belongs on this page anyway, because it is the other thing the module registers with core and the one an operator interacts with by name.

  • §5.1 — the 24 triggers grouped by ceiling, with why each ceiling. uo.cheat.detected at staff is the declaration the lattice was written for; the three operator-facing ones sit at admin because staff means admin, editor and moderator.
  • §5.2 — the four rows that deliberately do not ship, each with its recorded reason. Phase 11 inverted the burden of proof, so an absent row needs one.
  • §5.3 — the two that need a running patch tier (uo.vendor.sale, silently dormant on a shard that declined it) or a v5 overlay, including why an absent estimatedCollapse means "not knowable" and never "not yet read".
  • §5.4 — the three things a rule cannot express, and are therefore in the mapper: transitions, thresholds, and the per-firing members audience.
  • §5.5 — the three registered audiences, and how they differ from the members audience the guild triggers use.
  • §5.6 — the ingest ordering, which is load-bearing: the fan-out runs before the state write because three mappings read a row that write is about to delete.

website/BACKEND_DESIGN.md — the news publish path

It described a direct pushDispatch.publish('news.post', …) from the create/publish-post path. That call is gone. It is an emit through the engagement engine now, so news push rides a rule like every other channel, and core seeds that rule enabled = 0.

The new note states it as the operator-visible upgrade step it is (news push stops until the rule is switched on), names the separate one-shot settings key and why it exists, and — as importantly — states what did not change: the announce legs and the post hooks are different kinds of thing and still fire exactly as they did.


AI disclosure

  • This contribution was AI-assisted (Claude Code / Claude Opus 5). Commits carry a Co-Authored-By: Claude trailer.

🤖 Generated with Claude Code

The documentation half of **Phase 11a** — website#177 and Module-uo#22. Three files, each carrying one obligation from §6.0b's Phase 11a row. **Independent of docs#194** (the six decisions), which touches only `ENGAGEMENT.md`. Either can merge first. ## `website/MODULE_API.md` → 1.8.0 A seventh audience ceiling, **`admin`, as a child of `staff`**. One addition and no removal, so minor: every declaration valid under 1.7.0 is valid now, no stored value changes, and `module-uo`'s range still resolves. §2.4's ceiling bullet now names seven values rather than six, and says the thing a module author actually needs beyond the new name: **`admin` is the only pair in the whole lattice with real containment** — every admin is staff, which is exactly what every other pair of branches lacks — so it is the only place `permits` is true between two values below `authenticated`. `permits('staff', 'admin')` holds; the reverse does not, and neither direction holds against `owner`, `members` or `subscribers`. Also corrects two §2.3 rows that had gone stale rather than wrong: `ctx.inbox.push` has not thrown since Phase 7, and both engagement members now name the consumer that actually calls them. ## `modules/uo/API.md` gains §5 — the full trigger catalogue §6.0b asked for this in as many words: *"the full trigger catalogue, its audiences and its ceilings, not one entry"*. It is a §5 rather than a route table because it is not an HTTP surface — and it belongs on this page anyway, because it is the other thing the module registers with core and the one an operator interacts with **by name**. - **§5.1** — the 24 triggers grouped by ceiling, with *why* each ceiling. `uo.cheat.detected` at `staff` is the declaration the lattice was written for; the three operator-facing ones sit at `admin` because `staff` means admin, editor *and* moderator. - **§5.2** — the four rows that deliberately do **not** ship, each with its recorded reason. Phase 11 inverted the burden of proof, so an absent row needs one. - **§5.3** — the two that need a running patch tier (`uo.vendor.sale`, **silently dormant** on a shard that declined it) or a v5 overlay, including why an absent `estimatedCollapse` means "not knowable" and never "not yet read". - **§5.4** — the three things a rule cannot express, and are therefore in the mapper: transitions, thresholds, and the per-firing `members` audience. - **§5.5** — the three registered audiences, and how they differ from the `members` audience the guild triggers use. - **§5.6** — the ingest **ordering**, which is load-bearing: the fan-out runs before the state write because three mappings read a row that write is about to delete. ## `website/BACKEND_DESIGN.md` — the news publish path It described a direct `pushDispatch.publish('news.post', …)` from the create/publish-post path. **That call is gone.** It is an emit through the engagement engine now, so news push rides a rule like every other channel, and core seeds that rule `enabled = 0`. The new note states it as the **operator-visible upgrade step** it is (news push stops until the rule is switched on), names the separate one-shot settings key and why it exists, and — as importantly — states what did **not** change: the announce legs and the post hooks are different kinds of thing and still fire exactly as they did. --- ### AI disclosure - [x] This contribution was AI-assisted (Claude Code / Claude Opus 5). Commits carry a `Co-Authored-By: Claude` trailer. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
wtclaude added 1 commit 2026-09-01 01:34:56 +00:00
The documentation half of Phase 11a (website#177, Module-uo#22). Three files,
each carrying one obligation from 6.0b's Phase 11a row.

**MODULE_API.md -> 1.8.0.** A seventh audience ceiling, `admin`, as a child of
`staff`. One addition, no removal, so minor -- every declaration valid under
1.7.0 is valid now and no stored value changes. 2.4's ceiling bullet now names
seven values rather than six, and says the thing a module author actually needs:
`admin` is the ONLY pair in the whole lattice with real containment, so
`permits('staff','admin')` holds and it is the only place `permits` is true
between two values below `authenticated`.

Also corrects two 2.3 rows that were stale rather than wrong: `ctx.inbox.push`
has not thrown since Phase 7, and both members now name the consumer that
actually calls them.

**modules/uo/API.md gains 5**, the full trigger catalogue -- which 6.0b asked for
in as many words ("the full trigger catalogue, its audiences and its ceilings,
not one entry"). The 24 triggers grouped by ceiling with the reason for each
ceiling; the four rows that deliberately do NOT ship with their recorded reasons;
the two that need a patch tier or a v5 overlay; the three things a rule cannot
express and are therefore done in the mapper; the three registered audiences; and
the ingest ORDERING, which is load-bearing rather than incidental.

**BACKEND_DESIGN.md -- the news publish path.** It described a direct
`pushDispatch.publish('news.post', ...)` from the create/publish-post path. That
call is gone: it is an emit through the engagement engine now, so news push rides
a rule, and core seeds that rule disabled. The note says so as an operator-visible
upgrade step, names the separate one-shot settings key and states what did NOT
change -- the announce legs and the post hooks still fire exactly as they did.

Co-Authored-By: Claude <noreply@anthropic.com>
whitlocktech merged commit 055236d0ad into edge 2026-09-01 05:05:04 +00:00
whitlocktech deleted branch docs/engagement-phase-11a 2026-09-01 05:05:05 +00:00
Sign in to join this conversation.
No description provided.