Merge pull request 'docs(safety): record USER_SAFETY step 5, the walk on a local copy of the demo' (#402) from docs/user-safety-step5-walk into main

Reviewed-on: #402
This commit is contained in:
2026-10-30 16:40:14 +00:00

View File

@@ -1,7 +1,8 @@
# Report, block and hide — user safety on the website and in the app # Report, block and hide — user safety on the website and in the app
**Status:** plan of record, 2026-10-29. Steps 2 (core), 3 (Module-Rust, Integration Kit) and 4 **Status:** plan of record, 2026-10-29. Steps 2 (core), 3 (Module-Rust, Integration Kit) and 4
(Android) built 2026-10-30 (§7); the rest not yet. (Android) built 2026-10-30, and step 5's walk done the same day on a local copy of the demo (§7);
step 6 not yet.
Each phase stops for the org lead before the next one starts. Built after account deletion Each phase stops for the org lead before the next one starts. Built after account deletion
([`ACCOUNT_DELETION.md`](ACCOUNT_DELETION.md)), which is why it is `MODULE_API` 1.21.0. §4 was ([`ACCOUNT_DELETION.md`](ACCOUNT_DELETION.md)), which is why it is `MODULE_API` 1.21.0. §4 was
amended by S11-S14 (§5) when the core was built. amended by S11-S14 (§5) when the core was built.
@@ -256,4 +257,58 @@ Play declarations gain "user-generated content: collected". M21 says so.
5. **A walk** on the demo after the next wipe: report, hide and block, each on the web and in the 5. **A walk** on the demo after the next wipe: report, hide and block, each on the web and in the
app; *Hide for everyone* from the queue; a blocked Steam ID that later links to an account stays app; *Hide for everyone* from the queue; a blocked Steam ID that later links to an account stays
blocked. blocked.
**Walked 2026-10-30 on a local copy of the demo, not on the demo itself** (org lead: check it
locally and leave the demo alone unless it needs something). The copy: website `main` (the
1.21.0 merge) with `DEMO_MODE=true`, Module-Rust `edge` (#72) in its modules directory, a
throwaway database seeded by `npm run seed:demo` from the demo's own `deploy/demo/seed.json`. The
rig has no players and a Steam ID can only be linked with `/link` in game, so the walk's data was
written into the tables instead (org lead: seed what the walk needs): nine chat lines and a death
on the `demo` server from four stand-in Steam IDs (two unlinked, demo-player's, and a new one
linked to demo-moderator), and that server's presence opened to `public`. S14's link was written
as `/link` writes it, to a player account demo-admin created (creating users is open on the demo).
- **API**, 30 rows, all passed, over bearer sign-ins as the demo's accounts. None of the routes is
demo-locked. Signed out: every line, no `canBlock`, a report refused 401. demo-player's
`canBlock` was true for the two unlinked speakers and false for its own line and
demo-moderator's. A report reached the queue with its snapshot, and a second report of the line
was refused 409; a death's id was 404. *Hide for me* hid one line for demo-player only.
Blocking an unlinked speaker made a Steam-ID block and took their chat, not their death, out of
demo-player's feed only. Blocking demo-moderator's line was `403 staff`. play-review blocking
demo-player's line made an account block. *Hide for everyone* from the queue actioned the
report and took the line out for members and signed-out readers; staff saw it marked, and the
line's own route showed it again (a player got 403); the activity log has both. A Steam-ID block
whose ID was then linked read back as an account block, and the lines stayed out (S14).
*Unblock* and *Show them again* undid everything.
- **Web**, in Chrome. Signed out, the `⋯` menu said *Sign in to report or block*. As
demo-player: *Report* (sent, "Reported to site staff"), *Hide for me*, *Block player* with its
confirmation; no *Block* on demo-moderator's line or its own. *Account → Blocked* listed the
Steam-ID block and the hidden item, then, after the link, the block as an account block on the
new account (S14). As demo-moderator, the Reports queue showed the line from its snapshot,
*Hide for everyone* actioned it, and the feed showed the line marked *Hidden by staff* with
*Show to everyone again*. No console errors.
- **App**, `edge` debug build on the `Medium_Phone_API_36.1` emulator, its data cleared. Signed
out, a long press offered only *Sign in*, which opened the login screen. As demo-player:
*Report* with a reason and a detail (the row has both, and the snapshot), *Hide for me*,
*Block player* with its confirmation (Ash's chat gone, Rook's death still there); no *Block*
on demo-moderator's line or its own. *Account → Blocked* listed the Steam-ID block, then the
account block after the link (S14), with the speaker's lines still out. As demo-moderator,
*Hide for everyone* dimmed the line and marked it *Hidden by staff*, a signed-out read lost it,
and *Show to everyone again* brought it back; the activity log has `rust.chat.hide` and
`rust.chat.unhide`.
**What the walk found about the demo itself** (none of it changed; each is the org lead's call):
- **W1. The demo shows no chat to members.** Its `demo` server inherits the fleet's presence
default, `staff`, so demo-player and a signed-out visitor see no feed at all. Only demo-admin,
demo-moderator and play-review do.
- **W2. There is no chat on the demo to report.** Chat lines come only from players on the rig,
and nobody plays there, so even the staff accounts have nothing to long-press. The walk's
lines were written into the tables.
- **W3. play-review is an admin**, so a Play reviewer is staff. They get *Hide for everyone* in
the menu and see staff-hidden lines, and the block refusal and *Not applied* (S8) do not apply
to them. They can still report, hide and block.
- **W4. The demo runs Module-Rust v0.6.3**, the newest release, which has neither this feature
nor account deletion's unlink (#70, #72 are on `edge`). The edge → `main` cutover was held so
the demo is not changed by its next wipe.
6. Then `android/PLAN.md` M8's cutover (S5). 6. Then `android/PLAN.md` M8's cutover (S5).