feat(rust): chat titles, BetterChat group styles, the voice and popups (phase 17) #19

Merged
whitlocktech merged 2 commits from feat/phase-17-integrations into edge 2026-09-25 23:31:45 +00:00
Member

Module-rust phase 17 (docs PLAN.md §33, D134–D144). Protocol 12. Core does not change, and MODULE_API does not move.

Chat titles (D135–D137)

  • Per-server rules (a stat, a top N, text and a colour) rank the current wipe. The mode is first, all, or up to N.
  • The answer is worked out once, in model/titles, and read three ways:
    • pushed whole to the game by titleSync.js, on a change, a restart or a wipe;
    • as titles on every leaderboard row;
    • as chips on the web leaderboard.

Group styles (D138, D139)

  • A site group can carry all twelve BetterChat fields.
  • Each field is sent with expect, from the pushed ledger, which gains a value column.
  • A field changed in game becomes a chat-field drift row holding the game's value. The operator can adopt it, or put the site's value back.
  • Deleting a style removes the group from BetterChat. default is never removed.

The voice (D140) and popups (D141, D142)

  • One fleet setting names a styled group. News lines and rust.announce chat lines are said in its title and colours, with no sender.
  • rust.announce gains an optional delivery and stays action version 1.
  • Each server's news gets a delivery choice beside its switch.
  • popup-unavailable is not retried.

Admin

  • On the servers page: a Chat titles form, an Optional mods check and an Announcement voice card.
  • On each permission group: a Chat style section.
  • Routes: PUT /servers/:id/titles, GET /servers/:id/integrations, GET/PUT /voice. routes.manifest.json was regenerated against the pinned core: 48 routes, all documented.

Checks: 386 server tests (18 new) and 56 client tests. check:imports, check:bundle, check:swagger, check:engagement and check:externals all pass.

Walked on both rigs against real core. All six §33.3 steps passed (§33.6). One fix came from the walk: a bad title mode is refused with a sentence rather than Invalid value.

For your review

  • The admin forms in a browser. They were walked only through the API, because signing in means typing an admin password.

  • Deviations from §33.2 and §33.4, listed in §33.5:

    • news delivery sits beside the news switch, as D142 words it, rather than on the servers page;
    • a format must hold {Message} exactly once;
    • the voice drops the colon after {Username};
    • a title also loses { and }.
  • AI-assisted: Claude Code (Claude Opus 5.5)

🤖 Generated with Claude Code

https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY

Module-rust phase 17 (docs PLAN.md §33, D134–D144). Protocol 12. **Core does not change, and `MODULE_API` does not move.** **Chat titles (D135–D137)** - Per-server rules (a stat, a top N, text and a colour) rank the current wipe. The mode is first, all, or up to N. - The answer is worked out once, in `model/titles`, and read three ways: - pushed whole to the game by `titleSync.js`, on a change, a restart or a wipe; - as `titles` on every leaderboard row; - as chips on the web leaderboard. **Group styles (D138, D139)** - A site group can carry all twelve BetterChat fields. - Each field is sent with `expect`, from the pushed ledger, which gains a `value` column. - A field changed in game becomes a `chat-field` drift row holding the game's value. The operator can adopt it, or put the site's value back. - Deleting a style removes the group from BetterChat. `default` is never removed. **The voice (D140) and popups (D141, D142)** - One fleet setting names a styled group. News lines and `rust.announce` chat lines are said in its title and colours, with no sender. - `rust.announce` gains an optional `delivery` and **stays action version 1**. - Each server's news gets a delivery choice beside its switch. - `popup-unavailable` is not retried. **Admin** - On the servers page: a *Chat titles* form, an *Optional mods* check and an *Announcement voice* card. - On each permission group: a *Chat style* section. - Routes: `PUT /servers/:id/titles`, `GET /servers/:id/integrations`, `GET/PUT /voice`. `routes.manifest.json` was regenerated against the pinned core: 48 routes, all documented. **Checks:** 386 server tests (18 new) and 56 client tests. `check:imports`, `check:bundle`, `check:swagger`, `check:engagement` and `check:externals` all pass. **Walked on both rigs** against real core. All six §33.3 steps passed (§33.6). One fix came from the walk: a bad title mode is refused with a sentence rather than *Invalid value*. **For your review** - **The admin forms in a browser.** They were walked only through the API, because signing in means typing an admin password. - **Deviations from §33.2 and §33.4**, listed in §33.5: - news delivery sits beside the news switch, as D142 words it, rather than on the servers page; - a format must hold `{Message}` exactly once; - the voice drops the colon after `{Username}`; - a title also loses `{` and `}`. - [x] AI-assisted: Claude Code (Claude Opus 5.5) 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
wtclaude added 2 commits 2026-09-25 23:26:50 +00:00
PLAN.md §33, D134-D143. Protocol 12.

- Chat titles (D135-D137): per-server rules (stat, top N, text, colour)
  that rank the current wipe, and a mode (first | all | up to N). Worked
  out once in model/titles and read three ways: pushed whole to the game by
  a new titleSync loop (on change, restart or wipe), and on every
  leaderboard row as `titles`. Admin: PUT /servers/:id/titles.
- Group styles (D138, D139): a site group may carry all twelve BetterChat
  fields (rust_perm_group_chat). They ride perm.sync with `expect` from the
  pushed ledger, which gains a value column; a field changed in game is a
  `chat-field` drift row with the game's value, adopted into the style or
  put back. A withdrawn style is one `chat-group` retirement, never for
  `default`, cleared from the ledger only once BetterChat removed it.
- The voice (D140): one fleet setting naming a styled group; news and
  rust.announce chat lines carry its format and the plugin says them with
  no sender. Admin: GET/PUT /voice.
- Popups (D141, D142): rust.announce gains `delivery` (still version 1,
  from rust.options.delivery); each server gains news_delivery beside the
  news switch; `popup-unavailable` is not retried.
- GET /servers/:id/integrations reads, live, which optional mods a server
  has loaded. README lists BetterChat and PopupNotifications as optional.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
fix(rust): a bad title mode reaches the form as a sentence
All checks were successful
PR Checks / client-build (pull_request) Successful in 22s
PR Checks / server-tests (pull_request) Successful in 27s
PR Checks / frozen-manifest (pull_request) Successful in 50s
0efd5644f6
The router's own isIn check answered a mode it did not know with
express-validator's "Invalid value" before titles.validateSettings could
say which words are allowed. Found on the walk; the router now checks shape
only, as every other phase-17 route does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
whitlocktech merged commit 36eae7ffa8 into edge 2026-09-25 23:31:45 +00:00
whitlocktech deleted branch feat/phase-17-integrations 2026-09-25 23:31:46 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RunicGateway/Module-Rust#19
No description provided.