docs(teams): phase 7 as built — five amendments to §7.1 #161

Merged
whitlocktech merged 2 commits from feature/teams-phase7-slash-commands into edge 2026-08-19 00:15:17 +00:00
Member

The documentation half of Teams phase 7. Pairs with website#157 and Module-uo#14.

TEAMS.md §7.1 — five amendments, four forced by the tree

  1. The example command is /guild, registered by module-uo, and core registers none. §7.1 wrote /team as a core command. Phase 3 settled that Teams is a contract primitive with no core surface — core does not own the word for a Team, which is why four core Team pages were deleted — and a core /team publishes that same invented noun into a channel.
  2. The deep link comes from pageUrlTemplate, because /teams/:slug does not exist. The snippet's ${siteBaseUrl}/teams/${slug} names a page phase 3 deleted — the same hole phase 6 found in the mail path and closed with the ninth contract member.
  3. The re-register nudge is its own bot endpoint, not a ride on /internal/config, whose body carries the decrypted bot token.
  4. actor carries role as well as isStaff — a module with its own audience rungs cannot place a caller from a boolean. Same pair projectRoster's viewer already carried, so not a new class of disclosure.
  5. "Deregistration is free" needed a second half. It holds across the restart an uninstall asks for, not across the runtime toggle: the registries have no removal path, so a disabled module would keep a live handler behind a command Discord still advertises.

The envelope also gained notice — a private aside beside a public answer, which is how §9 answer 5's "public projection plus an ephemeral prompt to link" is actually expressible.

MODULE_API.mdregisterSlashCommands stops throwing

Every member of 1.6.0 is live now; the staged rollout is over. The member gets a full entry: the signature, the actor table, why the handler runs in the website process, the twice-enforced access with only the server half as the gate, the restricted option schema, why a bad definition must fail at register() (the whole-set PUT), why commands are not namespaced, and the liveness rule.

§0.4 and BACKEND_DESIGN

§0.4's inventory of the two internal channels gains /internal/refresh-commands and the two /internal/commands* routes. BACKEND_DESIGN.md's route-artifact table loses its hardcoded counts: they said 166 public / 2 internal against a live 208 / 4 — stale from earlier phases, not from this one. I dropped the numbers rather than silently re-snapshotting the mirrored api-route-inventory.json, which is a separate pass worth doing deliberately.

The rig walk is recorded

Including the two defects it found — a refusal posted publicly because ephemerality is fixed at the deferral, and a link prompt offered on a shard gated to staff where linking reaches player and stops.


  • AI-assisted: Claude Code (Claude Opus 5)

🤖 Generated with Claude Code

https://claude.ai/code/session_01WnDSWzpUjw8t8C2hghysNz

The documentation half of Teams phase 7. Pairs with **website#157** and **Module-uo#14**. ## `TEAMS.md` §7.1 — five amendments, four forced by the tree 1. **The example command is `/guild`, registered by module-uo, and core registers none.** §7.1 wrote `/team` as a core command. Phase 3 settled that Teams is a contract primitive with no core surface — core does not own the word for a Team, which is why four core Team pages were deleted — and a core `/team` publishes that same invented noun into a channel. 2. **The deep link comes from `pageUrlTemplate`, because `/teams/:slug` does not exist.** The snippet's `${siteBaseUrl}/teams/${slug}` names a page phase 3 deleted — the same hole phase 6 found in the mail path and closed with the ninth contract member. 3. **The re-register nudge is its own bot endpoint**, not a ride on `/internal/config`, whose body carries the decrypted bot token. 4. **`actor` carries `role` as well as `isStaff`** — a module with its own audience rungs cannot place a caller from a boolean. Same pair `projectRoster`'s viewer already carried, so not a new class of disclosure. 5. **"Deregistration is free" needed a second half.** It holds across the restart an uninstall asks for, not across the runtime toggle: the registries have no removal path, so a disabled module would keep a live handler behind a command Discord still advertises. The envelope also gained **`notice`** — a private aside beside a public answer, which is how §9 answer 5's "public projection plus an ephemeral prompt to link" is actually expressible. ## `MODULE_API.md` — `registerSlashCommands` stops throwing Every member of 1.6.0 is live now; the staged rollout is over. The member gets a full entry: the signature, the actor table, why the handler runs in the website process, the twice-enforced access with only the server half as the gate, the restricted option schema, why a bad definition must fail at `register()` (the whole-set PUT), why commands are not namespaced, and the liveness rule. ## §0.4 and BACKEND_DESIGN §0.4's inventory of the two internal channels gains `/internal/refresh-commands` and the two `/internal/commands*` routes. `BACKEND_DESIGN.md`'s route-artifact table loses its hardcoded counts: they said 166 public / 2 internal against a live 208 / 4 — **stale from earlier phases, not from this one**. I dropped the numbers rather than silently re-snapshotting the mirrored `api-route-inventory.json`, which is a separate pass worth doing deliberately. ## The rig walk is recorded Including the two defects it found — a refusal posted publicly because ephemerality is fixed at the deferral, and a link prompt offered on a shard gated to `staff` where linking reaches `player` and stops. --- - [x] AI-assisted: Claude Code (Claude Opus 5) 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01WnDSWzpUjw8t8C2hghysNz
wtclaude added 2 commits 2026-08-19 00:10:19 +00:00
The command that proves the seam is the MODULE's `/guild`, not core's `/team`:
§7.1 was written before phase 3 settled that Teams is a contract primitive with
no core surface, and a core `/team` publishes the same invented noun that got
core's Team pages deleted. Its deep link comes from `pageUrlTemplate` for the
same reason — `/teams/:slug` does not exist.

The re-register nudge is its own bot endpoint rather than a ride on
`/internal/config`, whose body carries the decrypted bot token. `actor` carries
`role` beside `isStaff`, since a module with its own audience rungs cannot place
a caller from a boolean. And "deregistration is free" needed a second half: it
holds across the restart an uninstall asks for, not across the runtime toggle,
so liveness is asked at both the pull and the dispatch.

MODULE_API.md stops saying `registerSlashCommands` throws and documents it —
every member of 1.6.0 is live now.

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
whitlocktech merged commit f5c121b02a into edge 2026-08-19 00:15:17 +00:00
whitlocktech deleted branch feature/teams-phase7-slash-commands 2026-08-19 00:15:18 +00:00
Sign in to join this conversation.
No description provided.